initial EPL conversion
authordpodwall
Tue, 12 Jan 2010 13:17:53 -0600
changeset 0 61163b28edca
child 1 7ff23301fe22
initial EPL conversion
creatorextension/build.xml
creatorextension/com.nokia.carbide.extension.creator/build.properties
creatorextension/com.nokia.carbide.extension.creator/feature.xml
creatorextension/com.nokia.carbide.extension.creator/license.txt
creatorextension/com.nokia.s60tools.creator.help/META-INF/MANIFEST.MF
creatorextension/com.nokia.s60tools.creator.help/about.html
creatorextension/com.nokia.s60tools.creator.help/book.css
creatorextension/com.nokia.s60tools.creator.help/build.properties
creatorextension/com.nokia.s60tools.creator.help/html/concepts/components.htm
creatorextension/com.nokia.s60tools.creator.help/html/concepts/concepts.htm
creatorextension/com.nokia.s60tools.creator.help/html/concepts/contact_set.htm
creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/Thumbs.db
creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/contact_set.png
creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/random_box.png
creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/sample_view.png
creatorextension/com.nokia.s60tools.creator.help/html/contexts.xml
creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/GS_index.htm
creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/overview.htm
creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/walk_through.htm
creatorextension/com.nokia.s60tools.creator.help/html/images/Thumbs.db
creatorextension/com.nokia.s60tools.creator.help/html/images/green_fade_left_68_165_28.png
creatorextension/com.nokia.s60tools.creator.help/html/index.xml
creatorextension/com.nokia.s60tools.creator.help/html/legal.htm
creatorextension/com.nokia.s60tools.creator.help/html/nokia.css
creatorextension/com.nokia.s60tools.creator.help/html/plugin.xml
creatorextension/com.nokia.s60tools.creator.help/html/reference/calendar.htm
creatorextension/com.nokia.s60tools.creator.help/html/reference/contacts.htm
creatorextension/com.nokia.s60tools.creator.help/html/reference/generic_items.htm
creatorextension/com.nokia.s60tools.creator.help/html/reference/messages.htm
creatorextension/com.nokia.s60tools.creator.help/html/reference/references.htm
creatorextension/com.nokia.s60tools.creator.help/html/release_notes.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/adding_components.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/creating_xml_file.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/modifying_components.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/run_in_device.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/Thumbs.db
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/add_components.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/adding_comp.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/contact_set_id.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/container.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/creator_preferences.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/edit_components.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/file_type.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/landmark.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/log.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/mailbox.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/mode1.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/project_.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/random_.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/random_box.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/set_random.png
creatorextension/com.nokia.s60tools.creator.help/html/tasks/setting_creator_preferences.htm
creatorextension/com.nokia.s60tools.creator.help/html/tasks/tasks.htm
creatorextension/com.nokia.s60tools.creator.help/html/toc.htm
creatorextension/com.nokia.s60tools.creator.help/html/tocConcepts.xml
creatorextension/com.nokia.s60tools.creator.help/html/tocGettingStarted.xml
creatorextension/com.nokia.s60tools.creator.help/html/tocReference.xml
creatorextension/com.nokia.s60tools.creator.help/html/tocTasks.xml
creatorextension/com.nokia.s60tools.creator.help/html/toolTOC.xml
creatorextension/com.nokia.s60tools.creator.help/plugin.xml
creatorextension/com.nokia.s60tools.creator/.classpath
creatorextension/com.nokia.s60tools.creator/.settings/org.eclipse.jdt.core.prefs
creatorextension/com.nokia.s60tools.creator/META-INF/MANIFEST.MF
creatorextension/com.nokia.s60tools.creator/about.html
creatorextension/com.nokia.s60tools.creator/about.ini
creatorextension/com.nokia.s60tools.creator/about.mappings
creatorextension/com.nokia.s60tools.creator/about.properties
creatorextension/com.nokia.s60tools.creator/build.properties
creatorextension/com.nokia.s60tools.creator/ccbuild.xml
creatorextension/com.nokia.s60tools.creator/icons/creator_16x16.png
creatorextension/com.nokia.s60tools.creator/icons/creator_55x46.png
creatorextension/com.nokia.s60tools.creator/icons/empty_banner.png
creatorextension/com.nokia.s60tools.creator/plugin.xml
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/CreatorActivator.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/CreatorHelpContextIDs.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/Product.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/ProductInfoRegistry.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/product.properties
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractComponent.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/ComponentServices.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/Components.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/IComponentServices.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/UnknownCompoment.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/UnknownValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/Bookmark.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolder.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolderValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolderVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/Calendar.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/CalendarValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/CalendarVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethod.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethodValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethodVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/Contact.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroup.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroupValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroupVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSet.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSetValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSetVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileType.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileTypeValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileTypeVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServer.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServerValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServerVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/Landmark.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/LandmarkValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/LandmarkVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/Log.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/LogValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/LogVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBox.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBoxValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBoxVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/Message.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MessageValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MessageVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/Note.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/NoteValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/NoteVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPage.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolder.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolderValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolderVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageValue.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageVariables.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/core/CreatorEditorSettings.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/AbstractDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/BookmarkDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/BookmarkFolderDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/CalendarDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ConnectionMethodDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactGroupDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactSetDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/CreatorMessageBox.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/DialogLauncher.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/FileTypeDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/IMPSServerDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/LandmarkDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/LogDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/MailBoxDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/MessageDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/NoteDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/SavedPageDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/SavedPageFolderDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/CreatorScriptEditor.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/IAddComponentListener.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/IComponentProvider.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/RunInDeviceSelectionListener.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/ConfirmFileReplaceDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/CreatorJobManager.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/IJobCompletionListener.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/IManageableJob.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/RunInDeviceJob.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/ShutdownCreatorInDeviceDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/WatchDeviceInformationDialog.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferenceConstants.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferenceInitializer.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferencePage.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferences.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/resources/Messages.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/resources/messages.properties
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/ui/actions/ToolsMenuAction.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/util/CreatorEditorConsole.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/wizards/CreatorScriptNewWizard.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/wizards/CreatorScriptNewWizardPage.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorScriptNotValidException.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorXML.java
creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorXMLParser.java
frameworkplugins/ccbuild.xml
frameworkplugins/com.nokia.s60tools.extensions.framework/build.properties
frameworkplugins/com.nokia.s60tools.extensions.framework/feature.xml
frameworkplugins/com.nokia.s60tools.extensions.framework/license.txt
frameworkplugins/com.nokia.s60tools.sdk/.classpath
frameworkplugins/com.nokia.s60tools.sdk/.settings/org.eclipse.core.resources.prefs
frameworkplugins/com.nokia.s60tools.sdk/.settings/org.eclipse.jdt.core.prefs
frameworkplugins/com.nokia.s60tools.sdk/META-INF/MANIFEST.MF
frameworkplugins/com.nokia.s60tools.sdk/about.html
frameworkplugins/com.nokia.s60tools.sdk/build.properties
frameworkplugins/com.nokia.s60tools.sdk/build.xml
frameworkplugins/com.nokia.s60tools.sdk/ccbuild.xml
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/RVCTToolChainInfo.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkEnvInfomationResolveFailureException.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkInformation.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkManager.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkUtils.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/Messages.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/SdkPlugin.java
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/messages.properties
frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/package.html
frameworkplugins/com.nokia.s60tools.sdk/src/overview.html
frameworkplugins/com.nokia.s60tools.ui/.classpath
frameworkplugins/com.nokia.s60tools.ui/.settings/org.eclipse.core.resources.prefs
frameworkplugins/com.nokia.s60tools.ui/.settings/org.eclipse.jdt.core.prefs
frameworkplugins/com.nokia.s60tools.ui/META-INF/MANIFEST.MF
frameworkplugins/com.nokia.s60tools.ui/about.html
frameworkplugins/com.nokia.s60tools.ui/build.properties
frameworkplugins/com.nokia.s60tools.ui/build.xml
frameworkplugins/com.nokia.s60tools.ui/ccbuild.xml
frameworkplugins/com.nokia.s60tools.ui/icons/empty_banner.png
frameworkplugins/com.nokia.s60tools.ui/icons/preferences.png
frameworkplugins/com.nokia.s60tools.ui/icons/s60tools_action_icon.png
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/AbstractTextClipboardCopyHandler.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/AbstractUIComposite.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/ICopyActionHandler.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/IImageProvider.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/IStringProvider.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/ProgrammaticSelection.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60TableColumnSelectionListener.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTable.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTableColumnData.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTableFactory.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsUIConstants.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsViewerSorter.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/SimpleAlphabeticSorter.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/StringArrayClipboardCopyHandler.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/UiUtils.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyFromStringProviderToClipboardAction.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyFromTableViewerAction.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyImageToClipboardAction.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/OpenPreferencePageAction.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/S60ToolsBaseAction.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/package.html
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/dialogs/S60ToolsListBoxDialog.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/dialogs/package.html
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/Messages.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/S60ToolsUiPlugin.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/messages.properties
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/resources/Messages.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/resources/messages.properties
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/package.html
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/preferences/PreferenceUtils.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/DebugMetadataWizardPage.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/IS60ToolsWizardPage.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/S60ToolsWizard.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/S60ToolsWizardPage.java
frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/package.html
frameworkplugins/com.nokia.s60tools.ui/src/overview.html
frameworkplugins/com.nokia.s60tools.util/.classpath
frameworkplugins/com.nokia.s60tools.util/.settings/org.eclipse.core.resources.prefs
frameworkplugins/com.nokia.s60tools.util/.settings/org.eclipse.jdt.core.prefs
frameworkplugins/com.nokia.s60tools.util/META-INF/MANIFEST.MF
frameworkplugins/com.nokia.s60tools.util/about.html
frameworkplugins/com.nokia.s60tools.util/build.properties
frameworkplugins/com.nokia.s60tools.util/build.xml
frameworkplugins/com.nokia.s60tools.util/ccbuild.xml
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/CmdLineCommandExecutorFactory.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/CmdLineExeption.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/DefaultLineReader.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutor.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutorObserver.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutorObserver2.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICustomLineReader.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/UnsupportedOSException.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/Win32CmdLineCommandExecutor.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/AbstractProductSpecificConsole.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/ConsoleWindowUtility.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/IConsolePrintUtility.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/debug/DbgUtility.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/debug/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/exceptions/JobCancelledByUserException.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/Messages.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/UtilPlugin.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/messages.properties
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/python/PythonUtilities.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/FileFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/FileUtils.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/IFileFinderFileFilter.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/IFileFinderObserver.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/serial/ComPortUtil.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/serial/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/CannotFoundFileException.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/IProjectFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ISourceFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ISourcesFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ProjectFinderFactory.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ProjectUtils.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/SourceFileLocation.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/SourceFinderFactory.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/MapSourceFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranCMDLinePrintUtility.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranDumpCMDLineRunner.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranDumpLineReader.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/ProjectFinder.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/package.html
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/xml/XMLIndentor.java
frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/xml/package.html
frameworkplugins/com.nokia.s60tools.util/src/overview.html
htiextension/com.nokia.carbide.extensions.hticonnection/build.properties
htiextension/com.nokia.carbide.extensions.hticonnection/feature.xml
htiextension/com.nokia.carbide.extensions.hticonnection/license.txt
htiextension/com.nokia.s60tools.hticonnection.help/.classpath
htiextension/com.nokia.s60tools.hticonnection.help/.settings/org.eclipse.jdt.core.prefs
htiextension/com.nokia.s60tools.hticonnection.help/META-INF/MANIFEST.MF
htiextension/com.nokia.s60tools.hticonnection.help/about.html
htiextension/com.nokia.s60tools.hticonnection.help/book.css
htiextension/com.nokia.s60tools.hticonnection.help/build.properties
htiextension/com.nokia.s60tools.hticonnection.help/html/concepts/concepts.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/concepts/hti.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/contexts.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/GS_index.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/overview.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/prerequisites.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/walk_through.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/images/Thumbs.db
htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_01.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_02.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_03.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_04.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_05.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/clear_co.gif
htiextension/com.nokia.s60tools.hticonnection.help/html/images/com.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/connection_type.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/context_menu.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/delete_connection.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/environment_co.gif
htiextension/com.nokia.s60tools.hticonnection.help/html/images/environment_co.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/green_fade_left_68_165_28.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/hti_preferences.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/lock_co.gif
htiextension/com.nokia.s60tools.hticonnection.help/html/images/new_connection_1.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/new_connection_2.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/remote_connections_view.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/run_exc.gif
htiextension/com.nokia.s60tools.hticonnection.help/html/images/run_exc_arrow.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/stop.gif
htiextension/com.nokia.s60tools.hticonnection.help/html/images/tcpip.png
htiextension/com.nokia.s60tools.hticonnection.help/html/images/toolbar.png
htiextension/com.nokia.s60tools.hticonnection.help/html/index.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/legal.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/reference/references.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/reference/toolbar.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/reference/troubleshooting.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/release_notes.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_bt.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_emulator.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_usb.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/set_preferences.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/tasks.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/viewing_remote_connections.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/toc.htm
htiextension/com.nokia.s60tools.hticonnection.help/html/tocConcepts.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/tocGettingStarted.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/tocReference.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/tocTasks.xml
htiextension/com.nokia.s60tools.hticonnection.help/html/toolTOC.xml
htiextension/com.nokia.s60tools.hticonnection.help/plugin.xml
htiextension/com.nokia.s60tools.hticonnection.help/src/com/nokia/s60tools/hticonnection/help/HelpPlugin.java
htiextension/com.nokia.s60tools.hticonnection.help/src/com/nokia/s60tools/hticonnection/help/HelpPlugin.java.orig
htiextension/com.nokia.s60tools.hticonnection/.classpath
htiextension/com.nokia.s60tools.hticonnection/.settings/org.eclipse.jdt.core.prefs
htiextension/com.nokia.s60tools.hticonnection/META-INF/MANIFEST.MF
htiextension/com.nokia.s60tools.hticonnection/about.html
htiextension/com.nokia.s60tools.hticonnection/about.ini
htiextension/com.nokia.s60tools.hticonnection/about.mappings
htiextension/com.nokia.s60tools.hticonnection/about.properties
htiextension/com.nokia.s60tools.hticonnection/build.properties
htiextension/com.nokia.s60tools.hticonnection/conf/htiapilogging.properties
htiextension/com.nokia.s60tools.hticonnection/docs/logging_readme.txt
htiextension/com.nokia.s60tools.hticonnection/htiapi.jar
htiextension/com.nokia.s60tools.hticonnection/icons/clear_co.gif
htiextension/com.nokia.s60tools.hticonnection/icons/hti_console.png
htiextension/com.nokia.s60tools.hticonnection/icons/htiapi_tsk.png
htiextension/com.nokia.s60tools.hticonnection/icons/lock_co.gif
htiextension/com.nokia.s60tools.hticonnection/icons/preferences.png
htiextension/com.nokia.s60tools.hticonnection/icons/s60tools_action_icon.png
htiextension/com.nokia.s60tools.hticonnection/icons/start_datagateway.png
htiextension/com.nokia.s60tools.hticonnection/icons/stop_datagateway.png
htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/DataGateway.exe
htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/datagateway.ini
htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/ipcommplugin.ini
htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/serialplugin.ini
htiextension/com.nokia.s60tools.hticonnection/plugin.xml
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/HtiApiActivator.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/HtiConnectionHelpContextIDs.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/ClearScreenAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/MainViewOpenAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/NewConnectionAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/OpenPreferencePageAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/S60ToolsBaseAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/ScrollLockAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/SelectAllAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/SelectConnectionAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/StartStopGatewayAction.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/Product.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/Product.properties
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/ProductInfoRegistry.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectedService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectedServiceFactory.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectionStatus.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/AbstractRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/HtiConnection.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/RequestQueueManager.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/RequestResult.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/ConnectionException.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/HTIErrorDetails.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/HTIException.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/RequestFailedException.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/ServiceShutdownException.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/DataGatewayConstants.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/DataGatewayManager.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/ProcessHolder.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/listener/HtiConnectionManager.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/listener/IHtiConnectionListener.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferenceConstants.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferencePage.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferences.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/IHtiApiPreferences.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/ImageKeys.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/ImageResourceManager.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/Messages.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/messages.properties
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/AppStatus.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/DriveInfo.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/FileInfo.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIScreenMode.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServiceConstants.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServiceFactory.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServices.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIVersion.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IApplicationControlService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IConnectionTestService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPListener.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPRequestManager.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IKeyEventService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IScreenCaptureService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/ApplicationControlService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/GetApplicationStatusByNameRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/GetApplicationStatusByUidRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartApplicationByNameRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartApplicationByUidRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartCommandByNameRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StopApplicationByNameRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StopApplicationByUidRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ConnectionTestRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ConnectionTestService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/GetVersionRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ListServiceRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/AbstractFileTransferRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/CopyFileDirRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DeleteDirRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DeleteFileRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DownloadFileRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/FTPService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListDirsRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListDrivesRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListFilesAndDetailsRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListFilesRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/MakeDirRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/MoveFileDirRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/RenameFileDirRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/UploadFileRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/AbstractKeyRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/HoldKeyRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/KeyEventService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/PressKeyLongRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/PressKeyRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/ReleaseKeyRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TapAndDragRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TapScreenRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TypeTextRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/GetScreenModeRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/ScreenCaptureRequest.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/ScreenCaptureService.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/dialogs/ErrorDialogWithHelp.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/dialogs/HtiApiMessageBox.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/ConnectionMenuCreator.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/LogDocument.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainTextViewer.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java
htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/util/HtiApiConsole.java
imakerplugin/Doxyfile.template
imakerplugin/build.xml
imakerplugin/build_imaker_plugin.xml
imakerplugin/com.nokia.carbide.extensions.imaker/.project
imakerplugin/com.nokia.carbide.extensions.imaker/build.properties
imakerplugin/com.nokia.carbide.extensions.imaker/build.xml
imakerplugin/com.nokia.carbide.extensions.imaker/compile.com.nokia.carbide.extensions.imaker.xml
imakerplugin/com.nokia.carbide.extensions.imaker/feature.xml
imakerplugin/com.nokia.carbide.extensions.imaker/license.txt
imakerplugin/com.nokia.s60tools.imaker.doc.user/.classpath
imakerplugin/com.nokia.s60tools.imaker.doc.user/.project
imakerplugin/com.nokia.s60tools.imaker.doc.user/META-INF/MANIFEST.MF
imakerplugin/com.nokia.s60tools.imaker.doc.user/build.properties
imakerplugin/com.nokia.s60tools.imaker.doc.user/build.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/book.css
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/concepts.htm
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/configuration.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/imaker.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/preferences.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/contexts.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/getting_started.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/images/green_fade_left_68_165_28.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/index.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/legal.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/reference/references.htm
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/release_notes.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/build_image.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/debug_tab.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginBuild.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginPreferences.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginPreferencesDetails.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginSaveAction.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginSelectPreferences.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPreference.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/platsim_tab.png
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/manage_settings.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/steps.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/taskPreferences.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/tasks.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocConcepts.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocReference.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocTasks.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tool.html
imakerplugin/com.nokia.s60tools.imaker.doc.user/html/toolTOC.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/plugin.properties
imakerplugin/com.nokia.s60tools.imaker.doc.user/plugin.xml
imakerplugin/com.nokia.s60tools.imaker.doc.user/src/com/nokia/s60tools/imaker/help/internal/Activator.java
imakerplugin/com.nokia.s60tools.imaker.doc.user/src/com/nokia/s60tools/imaker/help/internal/HelpPlugin.java
imakerplugin/com.nokia.s60tools.imaker.tests.feature/.project
imakerplugin/com.nokia.s60tools.imaker.tests.feature/build.properties
imakerplugin/com.nokia.s60tools.imaker.tests.feature/build.xml
imakerplugin/com.nokia.s60tools.imaker.tests.feature/feature.xml
imakerplugin/com.nokia.s60tools.imaker.tests.feature/pdebuild-myant.jar
imakerplugin/com.nokia.s60tools.imaker.tests.feature/runImakerPluginTests.bat
imakerplugin/com.nokia.s60tools.imaker.tests.feature/test.xml
imakerplugin/com.nokia.s60tools.imaker.tests/.classpath
imakerplugin/com.nokia.s60tools.imaker.tests/.project
imakerplugin/com.nokia.s60tools.imaker.tests/META-INF/MANIFEST.MF
imakerplugin/com.nokia.s60tools.imaker.tests/build.properties
imakerplugin/com.nokia.s60tools.imaker.tests/build.xml
imakerplugin/com.nokia.s60tools.imaker.tests/plugin.properties
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/AllTests.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ConfigurationElementTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ConfigurationTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/IMakerTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/InterfaceTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ResultTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/SettingTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/TargetTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/model/iContent/tests/AllTests.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/model/iContent/tests/ImageContentTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/Activator.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/AllTests.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/CarbideProjectTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/EnvironmentTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerAPITest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerCoreTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerWrapperTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IQRFWrapperTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ImakerPropertiesTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/PatternsTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/PlatsimManagerTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ProjectBuilder.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ProjectManagerTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/SettingsViewerTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/UIConfigurationTest.java
imakerplugin/com.nokia.s60tools.imaker.tests/testdata/test1.imp
imakerplugin/com.nokia.s60tools.imaker.tests/testdata/test2.imp
imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub.pl
imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub_091402.pl
imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub_093701.pl
imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMaker_imp.pl
imakerplugin/com.nokia.s60tools.imaker/.classpath
imakerplugin/com.nokia.s60tools.imaker/.project
imakerplugin/com.nokia.s60tools.imaker/.settings/org.eclipse.jdt.ui.prefs
imakerplugin/com.nokia.s60tools.imaker/META-INF/.classpath
imakerplugin/com.nokia.s60tools.imaker/META-INF/.project
imakerplugin/com.nokia.s60tools.imaker/META-INF/.settings/org.eclipse.core.resources.prefs
imakerplugin/com.nokia.s60tools.imaker/META-INF/MANIFEST.MF
imakerplugin/com.nokia.s60tools.imaker/about.html
imakerplugin/com.nokia.s60tools.imaker/about.ini
imakerplugin/com.nokia.s60tools.imaker/about.mappings
imakerplugin/com.nokia.s60tools.imaker/about.properties
imakerplugin/com.nokia.s60tools.imaker/build.properties
imakerplugin/com.nokia.s60tools.imaker/build.xml
imakerplugin/com.nokia.s60tools.imaker/content/concept1.xhtml
imakerplugin/com.nokia.s60tools.imaker/content/concept2.xhtml
imakerplugin/com.nokia.s60tools.imaker/content/link_obj.gif
imakerplugin/com.nokia.s60tools.imaker/content/root.css
imakerplugin/com.nokia.s60tools.imaker/content/root.xhtml
imakerplugin/com.nokia.s60tools.imaker/content/shared.css
imakerplugin/com.nokia.s60tools.imaker/content/titlebanner.gif
imakerplugin/com.nokia.s60tools.imaker/doc/Test_Summary_ iMakerPlugin_2_2_4.xls
imakerplugin/com.nokia.s60tools.imaker/doc/change_log_2_2_4.txt
imakerplugin/com.nokia.s60tools.imaker/icons/Build_All_Targets_16x16.png
imakerplugin/com.nokia.s60tools.imaker/icons/alt_window_16.gif
imakerplugin/com.nokia.s60tools.imaker/icons/alt_window_32.gif
imakerplugin/com.nokia.s60tools.imaker/icons/checked.gif
imakerplugin/com.nokia.s60tools.imaker/icons/debug.gif
imakerplugin/com.nokia.s60tools.imaker/icons/delete_file_ds.gif
imakerplugin/com.nokia.s60tools.imaker/icons/delete_file_en.gif
imakerplugin/com.nokia.s60tools.imaker/icons/error.gif
imakerplugin/com.nokia.s60tools.imaker/icons/imaker_dialog.gif
imakerplugin/com.nokia.s60tools.imaker/icons/imaker_dialog.png
imakerplugin/com.nokia.s60tools.imaker/icons/imakerdialog.png
imakerplugin/com.nokia.s60tools.imaker/icons/imakermenu16.png
imakerplugin/com.nokia.s60tools.imaker/icons/imakerplugin_icon.png
imakerplugin/com.nokia.s60tools.imaker/icons/nw_file_ds2020.gif
imakerplugin/com.nokia.s60tools.imaker/icons/nw_file_en2020.gif
imakerplugin/com.nokia.s60tools.imaker/icons/platsim.png
imakerplugin/com.nokia.s60tools.imaker/icons/preferences.gif
imakerplugin/com.nokia.s60tools.imaker/icons/preferences.png
imakerplugin/com.nokia.s60tools.imaker/icons/rm_file_ds2020.gif
imakerplugin/com.nokia.s60tools.imaker/icons/rm_file_en2020.gif
imakerplugin/com.nokia.s60tools.imaker/icons/run_wiz.png
imakerplugin/com.nokia.s60tools.imaker/icons/sample.gif
imakerplugin/com.nokia.s60tools.imaker/icons/settings.gif
imakerplugin/com.nokia.s60tools.imaker/icons/unchecked.gif
imakerplugin/com.nokia.s60tools.imaker/icons/warning.gif
imakerplugin/com.nokia.s60tools.imaker/imaker.product
imakerplugin/com.nokia.s60tools.imaker/introContent.xml
imakerplugin/com.nokia.s60tools.imaker/license.txt
imakerplugin/com.nokia.s60tools.imaker/model/debug.ecore
imakerplugin/com.nokia.s60tools.imaker/model/debug.genmodel
imakerplugin/com.nokia.s60tools.imaker/model/iQRF.ecore
imakerplugin/com.nokia.s60tools.imaker/model/iQRF.genmodel
imakerplugin/com.nokia.s60tools.imaker/plugin.properties
imakerplugin/com.nokia.s60tools.imaker/plugin.xml
imakerplugin/com.nokia.s60tools.imaker/splash.bmp
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/CancelObserver.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/Confml.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IEnvironment.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IEnvironmentManager.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IIMakerWrapper.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerBuildLogEditor.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerConsoleLogger.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerKeyConstants.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerPlugin.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerUtils.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/ImageFlasherHelpContextIDs.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/Messages.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/PixelConverter.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/SWTFactory.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/StatusHandler.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UIConfiguration.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UITarget.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UIVariable.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreAlreadyRunningException.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreCancelledException.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreExecutionException.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreNotFoundException.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerPluginPreferencesException.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/actions/EditorClearActionDelegate.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/actions/Flashmenu.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/console/IMakerConsole.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/console/IMakerJob.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/dialogs/LaunchIMakerDialog.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/dialogs/ProductSelectionDialog.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/Application.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationActionBarAdvisor.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationWorkbenchAdvisor.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationWorkbenchWindowAdvisor.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/Perspective.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Configuration.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/ConfigurationElement.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IMaker.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IQRFFactory.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IQRFPackage.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Interface.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Result.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Setting.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Target.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ConfigurationElementImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ConfigurationImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IMakerImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IQRFFactoryImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IQRFPackageImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/InterfaceImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ResultImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/SettingImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/TargetImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFAdapterFactory.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFSwitch.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFUtil.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/wrapper/IQRFWrapper.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/EnvironmentManager.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/ProjectManager.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/Environment.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/FileToImage.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/IObserver.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/ImakerProperties.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IContentFactory.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IContentPackage.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IMAGESECTION.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IbyEntry.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/ImageContent.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IContentFactoryImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IContentPackageImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IbyEntryImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/ImageContentImpl.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/util/IContentAdapterFactory.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/util/IContentSwitch.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/preferences/ImageFlasherPreferencePage.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/preferences/PreferenceConstants.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/CheckBoxEditingSupport.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/ComboEditingSupport.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/IbyEntryEditingSupport.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/SettingsColumnLabelProvider.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/SettingsEditingSupport.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/TextEditingSupport.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/AddEditFileToTransferDialog.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/DebugTab.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/IMakerTabsViewer.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/IPropertyViewer.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/ISettingViewer.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/PlatsimTab.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/PreferencesTab.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/SettingsTab.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/SettingsViewer.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/StatusInfo.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wizards/NewImakerFileWizard.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wizards/NewImakerFileWizardPage.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/IMakerWrapper.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/IMakerWrapperPreferences.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/PlatsimManager.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/StreamGobbler.java
imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/messages.properties
imakerplugin/common.properties
imakerplugin/feature.properties
imakerplugin/generatedoc-build.xml
imakerplugin/install.properties
imakerplugin/plugin-build-template.xml
imakerplugin/publish.properties
imakerplugin/publish.xml
metadataeditor/.DS_Store
metadataeditor/com.nokia.carbide.extensions.metadataeditor/.project
metadataeditor/com.nokia.carbide.extensions.metadataeditor/build.properties
metadataeditor/com.nokia.carbide.extensions.metadataeditor/feature.xml
metadataeditor/com.nokia.carbide.extensions.metadataeditor/license.txt
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.classpath
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.project
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.settings/org.eclipse.jdt.core.prefs
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/META-INF/MANIFEST.MF
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/book.css
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/build.properties
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/book.css
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/concepts/concepts.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/concepts/metadata_file.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/contexts.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/gettingstarted/GS_index.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/images/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/images/gold_header.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/index.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/legal.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/nokia.css
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/release_notes.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/converting_metadata.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/create_metadata.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/create_new_project.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/edit_metadata.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/ME_overview.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/convert.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/import_07.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/sample_v1_0.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/sample_v2_0.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/step_07.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/step_11.png
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/import_project.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/tasks.htm
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/toc.html
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tocConcepts.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tocTasks.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/toolTOC.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/plugin.xml
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/metadataeditor/.DS_Store
metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/metadataeditor/doc/user/MetadataEditorHelpActivator.java
metadataeditor/com.nokia.s60tools.metadataeditor/.classpath
metadataeditor/com.nokia.s60tools.metadataeditor/.project
metadataeditor/com.nokia.s60tools.metadataeditor/.settings/org.eclipse.jdt.core.prefs
metadataeditor/com.nokia.s60tools.metadataeditor/META-INF/MANIFEST.MF
metadataeditor/com.nokia.s60tools.metadataeditor/about.html
metadataeditor/com.nokia.s60tools.metadataeditor/about.ini
metadataeditor/com.nokia.s60tools.metadataeditor/about.mappings
metadataeditor/com.nokia.s60tools.metadataeditor/about.properties
metadataeditor/com.nokia.s60tools.metadataeditor/build.properties
metadataeditor/com.nokia.s60tools.metadataeditor/ccbuild.xml
metadataeditor/com.nokia.s60tools.metadataeditor/data/metadataeditor.properties
metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_16.png
metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_55.png
metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_75.png
metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_file.png
metadataeditor/com.nokia.s60tools.metadataeditor/plugin.xml
metadataeditor/com.nokia.s60tools.metadataeditor/readme_build.txt
metadataeditor/com.nokia.s60tools.metadataeditor/resources/metadata_template.metaxml
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorActivator.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorHelpContextIDs.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorPropertiesSetter.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/Product.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/ProductInfoRegistry.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/product.properties
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/core/MetadataEditorSettings.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/dialogs/AddLibraryDialog.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/dialogs/RenameFileConfirmStatusDialog.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/editors/APIMetadataEditor.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/ui/actions/ToolsMenuAction.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/util/MetadataEditorConsole.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/util/MetadataFilenameGenerator.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/wizards/APIMetadataFileNewWizard.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/wizards/APIMetadataFileNewWizardPage.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/APIIDGenerator.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataNotValidException.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataXML.java
metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataXMLParser.java
remotecontrol/.DS_Store
remotecontrol/com.nokia.carbide.extensions.remotecontrol/build.properties
remotecontrol/com.nokia.carbide.extensions.remotecontrol/feature.xml
remotecontrol/com.nokia.carbide.extensions.remotecontrol/license.txt
remotecontrol/com.nokia.s60tools.remotecontrol.help/.DS_Store
remotecontrol/com.nokia.s60tools.remotecontrol.help/.classpath
remotecontrol/com.nokia.s60tools.remotecontrol.help/.settings/org.eclipse.jdt.core.prefs
remotecontrol/com.nokia.s60tools.remotecontrol.help/META-INF/MANIFEST.MF
remotecontrol/com.nokia.s60tools.remotecontrol.help/about.html
remotecontrol/com.nokia.s60tools.remotecontrol.help/book.css
remotecontrol/com.nokia.s60tools.remotecontrol.help/build.properties
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/.DS_Store
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/concepts.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/context_menus.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/file_transfer_mode.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/images/context_menu_file.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/images/context_menu_zoom.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/screen_capture_mode.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/touch_ui.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/contexts.xml
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/GS_index.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/overview.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/walk_through.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/Thumbs.db
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/green_fade_left_68_165_28.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/run_exc.gif
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/run_exc_arrow.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/stop.gif
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/toolbar.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/toolbar_filetransfer.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/index.xml
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/legal.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/reference/references.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/reference/toolbar.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/release_notes.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_RC_preferences.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Save_single_screenshot.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Show_navi_keys.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Start_multiple_screenshots.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Stop_multiple_screenshots.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Switch_keyboard_layout.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_2.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_drives.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_shot.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_file_replace.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_kb_bindings.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_navi.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_qwerty.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_simple.png
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/saving_screenshots.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/setting_preferences.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/tasks.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/transferring_files.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/using_pc_keyboard.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/using_virtual_keyboard.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/toc.htm
remotecontrol/com.nokia.s60tools.remotecontrol.help/html/toolTOC.xml
remotecontrol/com.nokia.s60tools.remotecontrol.help/plugin.xml
remotecontrol/com.nokia.s60tools.remotecontrol.help/src/com/nokia/s60tools/remotecontrol/help/HelpPlugin.java
remotecontrol/com.nokia.s60tools.remotecontrol/.classpath
remotecontrol/com.nokia.s60tools.remotecontrol/.settings/org.eclipse.jdt.core.prefs
remotecontrol/com.nokia.s60tools.remotecontrol/META-INF/MANIFEST.MF
remotecontrol/com.nokia.s60tools.remotecontrol/about.html
remotecontrol/com.nokia.s60tools.remotecontrol/about.ini
remotecontrol/com.nokia.s60tools.remotecontrol/about.mappings
remotecontrol/com.nokia.s60tools.remotecontrol/about.properties
remotecontrol/com.nokia.s60tools.remotecontrol/build.properties
remotecontrol/com.nokia.s60tools.remotecontrol/ccbuild.xml
remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_dimmed.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_external_drives.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_other_types.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/download.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/download_and_open.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/download_as.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/file_transfer.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/folder.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/go_to_directory.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/keyboard_switch_layout.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/keyboard_view.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_down.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_left.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_right.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_up.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_keys_icon.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/new_folder.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/preferences.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/refresh.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/remote_control.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/remotecontrol_tsk.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/s60tools_action_icon.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/save_screenshot.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/screen_capture.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/screenshots_start_taking.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/screenshots_stop_taking.png
remotecontrol/com.nokia.s60tools.remotecontrol/icons/upload.png
remotecontrol/com.nokia.s60tools.remotecontrol/plugin.xml
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/RemoteControlActivator.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/RemoteControlHelpContextIDs.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/actions/MainViewOpenAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/actions/OpenPreferencePageAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/Product.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/Product.properties
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/ProductInfoRegistry.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/CopyAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/CutAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DeleteAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAndOpenAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAsAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/MakeDirAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/PasteAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/RefreshAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/RenameAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/UploadFileAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FileDropTargetListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpDriveObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpFileObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpFolderObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpNamedObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpUplinkObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpUtils.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpView.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/IConnectionStatusProvider.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/IFtpObject.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/PathComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerComparator.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerDoubleClickListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerSelectionChangedListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/ViewContentProvider.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/ViewLabelProvider.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/DeleteDirJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/DeleteFileJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/FileDownloadJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/FileUploadJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/IJobCompletionListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/IManageableJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/MakeDirJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/PasteJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/RemoteControlJobManager.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/RenameJob.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/StatusCheckerThread.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/BufKeyEvent.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/IKeyboardMediator.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/KeyboardMediator.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/KeyboardViewOpenAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/NaviPaneAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/SwitchKeyboardAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/BaseKeyboardComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KbKey.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardKeyListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardMouseListener.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardView.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/NaviPaneComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/QwertyKeyboardComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/SimpleKeyboardComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/AddButtonSelectionAdapter.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/BrowseButtonSelectionAdapter.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/FtpPreferencesUI.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferenceConstants.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferencePage.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferences.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/ScreenCapturePreferencesUI.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/ImageKeys.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/ImageResourceManager.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/Messages.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/messages.properties
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/OpenKeyboardAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/SaveMultiScreenshotsAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/SaveSingleScreenshotAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/ZoomAction.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/AppKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/BaseCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/ClearKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/EditKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/EndKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/GripClosedKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/GripOpenKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/LeftSoftKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviCenterKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviEastKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviNorthKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviSouthKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviWestKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/PowerKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/RightSoftKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/SendKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/SideKeyCommandHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenSaverThread.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenSettings.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenView.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/TouchScreenHandler.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/AbstractUiFractionComposite.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/ConfirmDeleteDialog.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/ConfirmReplaceDialog.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/DriveNameDialog.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/FolderNameDialog.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/RemoteControlMessageBox.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/RenameDialog.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/views/main/MainView.java
remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/util/RemoteControlConsole.java
sftemplateswizard/.DS_Store
sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/.project
sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/build.properties
sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/feature.xml
sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/license.txt
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/.project
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/META-INF/MANIFEST.MF
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/about.html
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/book.css
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/build.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/contexts.xml
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/images/contextmenu.png
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/images/gold_header.png
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/legal.htm
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/overview.htm
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/release_notes.htm
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/s60templatesTOC.xml
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/toc.htm
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/plugin.xml
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.classpath
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.project
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.settings/org.eclipse.core.resources.prefs
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/META-INF/MANIFEST.MF
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.html
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.ini
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.mappings
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/build.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/Bld_inf_Definition_file.png
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/MMP_Definition_file.png
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/New_MMP_file_wizard_banner.png
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newcfile_wiz.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newcfile_wiz_banner.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newclass_wiz.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newclass_wiz_banner.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newfile_wiz.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newfile_wiz_banner.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newhfile_wiz.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newhfile_wiz_banner.gif
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/plugin.xml
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/SymbianFoundationTemplates.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/actions/MMPSourceUserIncPaths.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/actions/OpenWizardAction.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/BaseEngine.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/OriginalTemplate.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/TransformedTemplate.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/S60Engine.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/S60TransformKeys.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/s60transformkeys.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/HelpContextIDs.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/Images.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/LastUsedData.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/Messages.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/PreferenceConstants.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/TemplateFiles.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/images.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/messages.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/templatefiles.properties
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/.DS_Store
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/BaseTemplateWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/BaseTemplateWizardPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/FileSelectionControl.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/FolderSelectionControl.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplatePageType.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplateWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplateWizardPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/CClassWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/ClassPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/MClassWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/RClassWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/TClassWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/CHeaderWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/HeaderPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/MHeaderWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/RHeaderWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/THeaderWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/BuildInfoPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/BuildInfoWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/IconPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/IconWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/MMPPage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/MMPWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/resourcewizards/ResourcePage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/resourcewizards/ResourceWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/sourcewizards/SourcePage.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/sourcewizards/SourceWizard.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/util/Util.java
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/build_info_template.inf
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_build_info_template.inf
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_icons_extra.mk
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_icons_menu.mk
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.hrh
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.loc
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.rh
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.rss
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_source_template.cpp
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/icons_extra.mk
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/icons_menu.mk
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/inline_template.inl
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.hrh
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.loc
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.rh
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.rss
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/source_template.cpp
sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/.classpath
sftemplateswizard/com.nokia.s60tools.templates.tests/.project
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/build_info_template.inf
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_build_info_template.inf
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons_aif_bitmaps.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons_aif_scalable.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.hrh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.loc
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.rh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.rss
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_source_template.cpp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons_aif_bitmaps.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons_aif_scalable.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/inline_template.inl
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.hrh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.loc
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.rh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.rss
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/source_template.cpp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/build_info_template.inf
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_build_info_template.inf
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_c_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons_aif_bitmaps.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons_aif_scalable.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.hrh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.loc
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.rh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.rss
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_source_template.cpp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons_aif_bitmaps.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons_aif_scalable.mk
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/inline_template.inl
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/m_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/project_specification_template.mmp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/r_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.hrh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.loc
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.rh
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.rss
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/source_template.cpp
sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/t_class_header_template.h
sftemplateswizard/com.nokia.s60tools.templates.tests/readme.txt
sftemplateswizard/com.nokia.s60tools.templates.tests/src/com/nokia/s60tools/symbianfoundationtemplates/engine/AllPureJunitTests.java
sftemplateswizard/com.nokia.s60tools.templates.tests/src/com/nokia/s60tools/symbianfoundationtemplates/engine/EngineTest.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,162 @@
+  
+<project name="com.nokia.s60tools.creator" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="Creator"/>
+  <property name="project.name" value="com.nokia.carbide.extensions.creator" />
+  <property name="jar.filename" value="${ant.project.name}.jar"/>
+  
+  <!-- Folder definitions -->
+  <property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+  
+  <property name="carbide.folder" value="C:/Carbide_internal" />
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	
+  <property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<!-- Folders -->
+	<delete dir="${instr.folder}"/>
+	<mkdir dir="${instr.folder}"/>
+	
+	<delete dir="${reports.folder}"/>
+	<mkdir dir="${reports.folder}"/>
+	
+	<!-- Carbide_classpath -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+  <!-- Delete old plugins and features -->
+  <target name="delete">
+	  <delete dir="plugins" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+	  <delete dir="${ant.project.name}/bin" failonerror="false"/>
+  </target>
+ 
+ 
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.creator" depends="">
+  
+  <!-- Copy necessary resources -->
+		<copy todir="${ant.project.name}/bin" failonerror="true" overwrite="false">
+			<fileset dir="${ant.project.name}/src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+  
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}.help" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+                
+  <!-- Build MultiTestRunner feature -->
+  <buildFeature workspace="${workspace.path}"
+               targetPlatformLocation="${carbide.folder}"
+               projectname="${project.name}"
+               buildPluginTarget="build.plugin"
+               destDir="${destination.path}" />
+               
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+  
+  
+  <!-- Instrumentation target, depends on build.mtrunner -->
+	<target name="instr" depends="build.creator">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${ant.project.name}/bin" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+  
+  
+  <target name="create.zip">
+  
+  	<delete dir="${binaries.folder}/nightly_builds"/>
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+  	
+ 		 <!-- Zip jars to MultiTestRunner.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}.${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia.carbide.extensions.*/"/>
+  </target>
+  
+  <!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd shortFileNames="true">
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="com.nokia.s60tools.creator/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<target name="copy_to_carbide">
+	<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+		</copy>
+  </target>
+  
+  <!-- Target Build all -->
+  <target name="build.all" depends="delete, build.creator, instr, create.zip, analyze, copy_to_carbide" />
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.carbide.extension.creator/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.carbide.extension.creator/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.creator"
+      label="Carbide.c++ Extensions - Creator Script Editor"
+      version="1.2.0"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.creator">
+
+   <description>
+      Creator Script Editor is an editor for creating scripts to S60 RnD
+application Creator.
+   </description>
+
+   <copyright>
+      Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
+      All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+   </copyright>
+
+   <license url="license.txt">
+Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.ui.console"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="com.nokia.carbide.cdt.builder" version="2.0.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.help"/>
+      <import plugin="com.nokia.s60tools.ui" version="1.1.9" match="greaterOrEqual"/>
+      <import plugin="com.nokia.s60tools.util" version="1.1.10" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.creator"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.creator.help"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.carbide.extension.creator/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Creator Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.creator.help;singleton:=true
+Bundle-Version: 1.2.0
+Bundle-Vendor: Nokia
+Bundle-Activator: com.nokia.s60tools.creator.CreatorActivator
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.help,
+ org.eclipse.core.runtime,
+ org.eclipse.ui 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”>
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content=”text/html; charset=ISO-8859-1”>
+</head>
+<body lang=”EN-US”>
+<h2>About This Content</h2>
+ 
+<p>February 5, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2007-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.<p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.	
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+/* 	20070523-Removed top margin size to close gap between location breadcrumbs and page title	*/
+html {
+	margin: 0px 10px 10px 10px;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(html/images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+               html/,\
+               plugin.xml,\
+               book.css,\
+               about.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/concepts/components.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Components</h2>
+<p>The scripts created with Creator Carbide.c++ Extension contain various types of components, such as phonebook items (contacts and contact groups), messages, notes, bookmarks, files, and appointments.</p>
+<p>You can add as many components to the scripts as needed. See the following example of the component view in the <b>Creator Script Editor</b>:</p>
+<p><img src="screenshots\sample_view.png"></p>
+<p>For more information on the specific issues related to component types, see the following references: </p>
+<ul>
+<li><a href="../reference/generic_items.htm">Generic component reference</a></li>
+<li><a href="../reference/contacts.htm">Contact components</a></li>
+<li><a href="../reference/messages.htm">Message components</a></li>
+<li><a href="../reference/calendar.htm">Calendar components</a></li>
+</ul>
+
+<h3><a name="random"></a>Random component values</h3>
+<p>You have two choices for entering component information in Creator Script Editor. You can either directly type in the values of your choice in the <b>Item value</b> field, or select them from the <b>Mode</b> drop-down list. The number of choices in the <b>Mode</b> field depends on the type of the value:</p>
+<ul>
+<li>There is 0 choices with Contact set reference</li>
+<li>Two choices when fixed values in combos</li>
+<li>Four choices when values are in text fields</li>
+<li>Five choices when Phone number Log, Contact, message components</li>
+</ul>
+<p>Using random values means that when the script file is run on the device, the S60 Creator tool randomly generates the component values (such as contact names, phone numbers or to-do items), using a pre-defined resource file.</p>
+<p>The length of an entry for random values can be selected as follows in the <b>Mode</b> drop-down list: </p>
+<ul>
+<li><b>Edit mode</b>: User can edit the field data</li>
+<li><b>Random &ndash; Default length</b>: Random data, default length</li>
+<li><b>Random &ndash; Custom length:</b> Random data, user edits the data length</li>
+<li><b>Random &ndash; Max length:</b> Random data, maximum length for the data</li>
+<li><b>Increase for each copy:</b> applied only with phone number fields in contacts, messages and logs. This mode is used together with the "amount" attribute. When the Increase for each copy mode is selected, phone number will increase for each copy of component created. For example, if phone number "12300" is given, the first copy will have phone number "123000", and the second copy will have "12301", third "12302" and so on. If the Amount attribute of Phone number is used, each copy will have a different phone number.</li>
+</ul>
+<p>In each component dialog, you can save time by applying random values (Edit mode, Random &ndash; Default length, Random &ndash; Custom length, Random &ndash; Max length) for all items and let Creator generate the test data.</p>
+<p><b>Note:</b> When filling in the values manually, ensure that you enter the data in correct format due to a limited data validation in this tool.</p>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="contact_set.htm">Contact set</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/adding_components.htm">Adding components</a></li>
+<li><a href="../tasks/modifying_components.htm">Modifying components</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/concepts/concepts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Concepts</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Concepts</h2>
+<p>The following topic provides information on the basic component-related concepts in Creator: </p> 
+<ul>
+<li><a href="components.htm">Components</a></li>
+<li><a href="contact_set.htm">Contact set</a></li> 
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/concepts/contact_set.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Contact set</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Contact set</h2>
+<p>In Creator, <i>contact set</i> is a technical term that is not visible on actual S60 devices. Contact sets can be created for associating contacts with contact groups, message items and calendar items. For creating new Contact sets, there is an <b>Add new Contact-set</b> button in the Creator Script Editor.</p>
+<p>The practical use of the contact set element is to enable the creation of advanced test data combinations. You can, for example, associate contacts as senders or recipients of a message, or associate them as the attendees in an appointment entry. You can create as many contact sets as needed for different purposes. Each contact set is identified by a unique ID number that is generated automatically. See the following figure for an example:</p>
+<p><img src="screenshots\contact_set.png"></p>
+<p>For more information on using contact sets with components, see the reference topics <a href="../reference/contacts.htm">Contact components</a>, <a href="../reference/messages.htm">Message components</a>, and <a href="../reference/calendar.htm">Calendar components</a>.</p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/adding_components.htm">Adding components</a></li>
+<li><a href="../tasks/modifying_components.htm">Modifying components</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="components.htm">Components</a>
+</li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/Thumbs.db has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/contact_set.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/random_box.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/concepts/screenshots/sample_view.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+<!-- An example context definition in contexts.xml file:
+ 
+ <context id="TOOL_NAME_MAIN_VIEW">
+   
+  <topic label="Adding components" href="html/tasks/adding_components.htm" />    	
+  <topic label="Creating the script file" href="html/tasks/creating_xml_file.htm" />    	
+  <topic label="Modifying components" href="html/tasks/modifying_components.htm" />    	
+  
+  <topic label="Calendar components" href="html/reference/calendar.htm" />
+  <topic label="Contact components" href="html/reference/contacts.htm" />
+  <topic label="Message components" href="html/reference/message.htm" />
+  <topic label="Generic component reference" href="html/reference/generic_items.htm" />
+  
+  <topic label="Components" href="html/concepts/components.htm" />
+  <topic label="Random component values" href="html/concepts/html/concepts/components.htm#random" />
+  <topic label="Contact set" href="html/concepts/contact_set.htm" />
+  
+  <description>Creator TOC</description>	    
+  <topic label="Creator Online Help" href="toc.htm" />
+   
+ </context>	  
+
+-->
+
+ <context id="CREATOR_HELP_TOC">
+  
+  <description>Creator TOC</description>	    
+  <topic label="Creator TOC" href="toc.htm" />
+   
+ </context>	 
+
+ <context id="CREATOR_HELP_ADD_COMPONENT">
+   
+  <description>Adding components</description>
+  <topic label="Adding components" href="html/tasks/adding_components.htm" />    	
+ </context>	  
+
+ <context id="CREATOR_HELP_MODIFY_COMPONENT">
+   
+   <description>Modifying components</description>
+  <topic label="Modifying components" href="html/tasks/modifying_components.htm" />    	
+ </context>	  
+  
+ <context id="CREATOR_HELP_CREATE_SCRIPT">
+   
+   <description>Creating the script file</description>
+  <topic label="Creating the script file" href="html/tasks/creating_xml_file.htm" />    	
+ </context>	  
+ 
+
+
+
+ <context id="CREATOR_HELP_CALENDAR">
+   
+   <description>Editing Calendars</description>
+  <topic label="Calendar components" href="html/reference/calendar.htm" />
+  <topic label="Generic component reference" href="html/reference/generic_items.htm" />
+
+ </context>	 
+ 
+ <context id="CREATOR_HELP_CONTACTS">
+   
+   <description>Editing Contacts</description>
+  <topic label="Contact components" href="html/reference/contacts.htm" />
+  <topic label="Generic component reference" href="html/reference/generic_items.htm" />
+  
+ </context>	 
+ <context id="CREATOR_HELP_MESSAGES">
+   
+   <description>Editing Messages</description>
+  <topic label="Message components" href="html/reference/messages.htm" />
+  <topic label="Generic component reference" href="html/reference/generic_items.htm" />
+  
+  
+ </context>	 
+ <context id="CREATOR_HELP_GENERIC_COMPONENT">
+   
+   <description>Editing components</description>
+  <topic label="Generic component reference" href="html/reference/generic_items.htm" />
+  
+ </context>	 
+ 
+ 
+ <context id="CREATOR_HELP_COMPONENTS">
+   
+   <description>Components</description>
+  <topic label="Components" href="html/concepts/components.htm" />
+
+ </context>	   
+
+ <context id="CREATOR_HELP_RANDOM_VALUES">
+   
+   <description>Editing random values</description>
+  <topic label="Random component values" href="html/concepts/components.htm#random" />
+   
+ </context>	   
+
+ <context id="CREATOR_HELP_CONTACT_SET">
+   
+   <description>Understanding Contact sets</description>
+  <topic label="Contact set" href="html/concepts/contact_set.htm" />
+   
+ </context>	   
+
+ <context id="CREATOR_HELP_PREFERENCES">
+   
+   <description>Setting Creator preferences</description>
+  <topic label="Setting Creator preferences" href="html/tasks/setting_creator_preferences.htm" />    
+   
+ </context>	   
+
+ <context id="CREATOR_HELP_RUN_IN_DEVICE">
+   <description>Running script in device</description>
+  <topic label="Running script in device" href="html/tasks/run_in_device.htm" />    
+   
+ </context>	   
+     		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/GS_index.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting started</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Getting started</h2>
+<p> The information in this section will help you get started quickly using the basic features of the Creator extension for Carbide.c++.</p>
+<p>Topics in this section include: </p>
+<ul>
+<li><a href="overview.htm">Overview</a></li>
+<li><a href="walk_through.htm">Basic walk-through</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/overview.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Overview</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Overview</h2>
+<p>The Creator Carbide.c++ Extension is a useful application for any software developer who needs to create test data into a device. The data can be, for example, contacts, SMS messages, bookmarks, appointments and to-dos).</p>
+<p>In specific, the Creator tool simplifies the creation of certain types of test data such as Access Points, which may be time-consuming to create manually. It also can save time in test data creation when, for example:</p>
+<ul>
+<li>a device should be saving high amounts of data, </li>
+<li>the data is saved to a device several times, </li>
+<li>the data is saved to multiple devices at the same time. </li>
+</ul>
+<p>Test data configurations are stored as an XML-format script file, identified by <i>.creatorxml</i> file extension. The <i>.creatorxml</i> file is used as input for the S60 Creator tool that works on an S60 device or an emulator. You can transfer the Creator file into the device in the same way as any other file, for example, via a USB cable or a Bluetooth connection. On the device, the default location of the <i>.creatorxml</i> file is in <i>c:\data</i>, or at the root of the memory card.</p>
+<p>To make the creation of data entries faster in the Creator Script Editor, you can define all or some of the field values to be <b>Random</b> instead of typing in the values manually. With this option, the S60 Creator tool will randomly pick the needed values based on a pre-defined resource file. </p><p>For more information on the script usage in the device, see <i>S60 Creator User's Guide</i> available in the S60 platform releases under: <i>\s60\tools\commontools\creator\doc</i></p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/gettingstarted/walk_through.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Basic walk-through</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>Basic walk-through</h3>
+<p>You can start the Creator Carbide.c++ Extension by selecting <b>File > New > Other > Carbide Extensions > Creator script file</b> or <b>Carbide > Creator Script Editor</b>.</p>
+<p>The basic steps for using Creator are:</p>
+<ol>
+<li><a href="../tasks/creating_xml_file.htm">Create the script file</a> as part of your project in Carbide.c++. </li>
+<li><a href="../tasks/adding_components.htm">Add components</a> (for example, contacts, messages, to-do items) into the script.</li>
+<li><a href="../tasks/run_in_device.htm">Upload the <i>.creatorxml</i> script file to a target device and run the script in the device</a>, or just send the <i>.creatorxml</i> file to the device (for example, via a Bluetooth or USB cable connection) and run it using the Creator S60 device application.</li>
+</ol>
+<p>You can edit scripts in the Creator tool at any time by modifying the component data or removing one or more components. For instructions, see <a href="../tasks/modifying_components.htm">Modifying components</a>.</p>
+<p><b>Tip:</b> Script files that have already been created are listed in the Project Explorer view of your workspace. In this case, you can also start the tool by right-clicking the XML file and selecting <b>Open With > Creator Script Editor</b>.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file creatorextension/com.nokia.s60tools.creator.help/html/images/Thumbs.db has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/images/green_fade_left_68_165_28.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/index.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.index"?>
+
+	<!-- INDEX INSTRUCTIONS
+	
+	Use the index.xml file to define the index entries for the plugin's 
+	help contents. In Eclipse 3.2 and beyond an Index tab appears in the Help
+	viewer making it possible for user to more easily locate subjects of
+	interest to them.
+		
+	In brief, every file used in the help documentation should have at least one
+	associated index entry for it. Ideally, it's simple to make two entries per
+	page by simply re-wording the subject slightly. For example, a view could
+	be indexed twice like this, 1) Breakpoint view, and 2) Views/Breakpoint.
+	
+	See ??? for details on creating indexes.
+	
+	-->
+
+<index>
+
+	<!-- AAAAAAAA -->
+
+	<entry keyword="adding script components" >
+		<topic href="html/tasks/adding_components.htm" />
+	</entry>
+
+	<!-- BBBBBBBB -->	
+
+	<!-- CCCCCCCC -->	
+
+	<entry keyword="calendar items in Creator" >
+		<topic href="html/reference/calendar.htm" />
+	</entry>
+
+	<entry keyword="contact items in Creator" >
+		<topic href="html/reference/contacts.htm" />
+	</entry>
+
+	<entry keyword="contact set component" >
+		<topic href="html/reference/contacts.htm" />
+	</entry>
+
+	<entry keyword="contact set, overview" >
+		<topic href="html/concepts/contact_set.htm" />
+	</entry>
+
+	<entry keyword="Creator script" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry>
+
+	<entry keyword="Creator overview" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry>
+
+	<entry keyword="component types in Creator" >
+		<topic href="html/release_notes.htm" />
+	</entry>
+
+	<entry keyword="Creator walk-through" >
+		<topic href="html/gettingstarted/walk_through.htm" />
+	</entry>
+
+
+	<!-- DDDDDDDD -->		
+
+	<!-- EEEEEEEE -->	
+
+	<!-- FFFFFFFF -->
+
+	<!-- GGGGGGGG -->	
+	
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+	<!-- MMMMMMMM -->
+	
+	<entry keyword="message items in Creator" >
+		<topic href="html/reference/messages.htm" />
+	</entry>
+
+	<entry keyword="modifying script components" >
+		<topic href="html/tasks/modifying_components.htm" />
+	</entry>
+
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+	
+	<!-- PPPPPPPP -->
+	
+	<!-- QQQQQQQQ -->
+	
+	<!-- RRRRRRRR -->
+	
+	<!-- SSSSSSSS -->
+
+	<entry keyword="script files, XML" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry>
+
+	
+	<!-- TTTTTTTT -->
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+	
+	<!-- XXXXXXXX -->
+
+	<entry keyword="XML script file" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry>
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/legal.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>License Information</title>
+    <link href="../book.css" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+<h3>License Information</h3>
+
+<h5>COPYRIGHT</h5>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0" which accompanies this distribution and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+<p>Initial Contributors:<br>
+Nokia Corporation - initial contribution</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/nokia.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,165 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: "http://www.eclipse.org/legal/epl-v10.html".
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+html {
+	margin: 10px;
+	/* fixes gray backgrounds when displayed in external browsers */
+	background-color:#FFFFFF;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: plain;
+}
+
+/*	Use sans-serif fonts for all title styles and Nokia blue	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Arial, Helvetica, sans-serif;
+	color: #333;	
+	}
+
+strong{
+	color: #333;	
+	}
+
+/*	For headlines at the top of a view, add space and a gray line underneath	*/
+h2, h3	{
+	padding:10px 0px;	
+	border-bottom:1px solid #BBB;
+	}
+	
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;	
+	}
+
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	color: #333;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 12px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: 1px solid #999;
+	table-layout: auto;
+	}
+
+td, th	{
+	border: 1px solid #999;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+th	{
+	background-color:#999;
+	color:#FFF;
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light gray background */
+div h5, div h4	{
+	padding: 5px;
+	background-color: #EEE;
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top:1px solid #BBB;
+	border-bottom:1px solid #BBB;
+}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+}
+
+/*	red background and white text for things that need fixing before release	*/
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #333;
+	}
+	
+.titleSmall {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+.copyrightStatement {
+	font-size: 11px;
+	color:			#006699;             /* Symbian blue */
+	}
+
+div.Footer table, div.Footer td, div.Footer th {
+	border: 0px none #000;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            file="toc.xml"
+            primary="true">
+      </toc>
+      <toc
+            file="tocconcepts.xml">
+      </toc>
+      <toc
+            file="tocgettingstarted.xml">
+      </toc>
+      <toc
+            file="toctasks.xml">
+      </toc>
+
+      <toc
+            file="tocreferences.xml">
+      </toc>
+
+   </extension>
+
+	<extension point="org.eclipse.help.index" >
+        <index file="index.xml"/>
+    </extension>
+
+	<extension point="org.eclipse.help.contexts">
+      <contexts
+            file="contexts.xml"
+            plugin="com.nokia.s60tools.ToolName.help"/>
+   </extension>
+
+<!-- =================================================================================== -->
+<!-- Universal Intro support for welcome pages                                           -->
+<!-- =================================================================================== -->
+	<extension
+		point="org.eclipse.ui.intro.configExtension">
+		
+		<configExtension
+			configId="org.eclipse.ui.intro.universalConfig" 
+			content="html/intro/overviewAppDepExtContent.xml" /> 
+		 
+		<configExtension
+			configId="org.eclipse.ui.intro.universalConfig"
+			content="html/intro/whatsnewAppDepExtContent.xml" /> 
+		 
+	</extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/reference/calendar.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Calendar components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Calendar components</h2>
+<p>The Calendar component types are:</p>
+<ul>
+<li>To-do</li>
+<li>Appointment</li>
+<li>Event</li>
+<li>Reminder</li>
+<li>Anniversary.</li>
+</ul>
+<p>You can either type in the needed values directly into the fields or select the <b>Random</b> options to let the S60 Creator tool generate message items randomly. </p><p>Note the following specifics about calendar items:</p>
+<table width="500" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="42*">
+<col width="157*"></colgroup>
+<tbody>
+<tr>
+<td><b>Date, time</b></td>
+<td>
+<ul>
+<li>In date and time fields, the data should be entered as:
+<ul>
+<li><i>YYYY-MM-DD</i> (for year-month-date), </li>
+<li><i>T</i> (a separator between date and time), </li>
+<li><i>HH:MM:SS</i> (for hour-minute-second). </li>
+</ul>
+</li>
+<li>For example: <i>2008-03-03T12:45:30</i></li>
+</ul></td>
+</tr>
+<tr>
+<td><b>Appointment</b></td>
+<td><ul>
+<li><b>Attendee:</b> defines the contact names to be used as meeting attendees. In this field, the attendee email is mandatory, whereas the attendee name is optional. To use both of them, enter them in the following format: <br><i>attendee email | attendee common name</i> <br><i>john.smith@company.com | John Smith</i> </li>
+<li><b>Attendee Contact set ID:</b> takes the attendees from a specific Contact set ID. </li>
+</ul></td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/contact_set.htm">Contact set</a></li>
+</ul>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="generic_items.htm">Generic component reference</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/reference/contacts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Contact components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Contact components</h2>
+<p>The Contact component types are: </p>
+<ul>
+<li>Contact</li>
+<li>Contact group</li>
+<li>Contact set.</li>
+</ul>
+<p>These describe the contact items that should be created into the device&rsquo;s database. You can either type in the needed values directly into the fields or select the <b>Random</b> options to let the S60 Creator tool generate contact items randomly. </p><p><b>Tip:</b> Instead of creating these items separately, you can also use the contact data that already exist in the Phonebook of your device. </p><p>Note the following specifics about contacts and contact sets:</p>
+<table width="500" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="48*">
+<col width="150*"></colgroup>
+<tbody>
+<tr>
+<td><b>Contact</b></td>
+<td><ul>
+<li><b>Contact set ID:</b> links this contact to a specific Contact set ID.
+</li>
+<li>A contact can have several fields of the same type, for example, multiple <b>Email</b> fields.</li>
+</ul></td>
+</tr>
+<tr>
+<td><b>Contact Group</b></td>
+<td><ul>
+<li><b>Contact set ID:</b> members of the group are taken from the defined
+contact set ID.</li>
+</ul></td>
+</tr>
+<tr>
+<td><b>Contact set</b></td>
+<td><p><b>Note:</b> The Contact set concept is a technical term that is only used to link contacts with messages and calendar items. It has no equivalent on the device.</p><ul>
+<li><b>Number of existing contacts:</b> uses contacts that already exist in the device's Phonebook. For example, value 5 here will include the first five Phonebook entries in the test data. </li>
+<li>ID numbers for contact sets are assigned automatically. </li>
+<li>On the Creator Script Editor view, each contact set is on a row of its own and does not contain other data except for the ID and Number of existing contacts.</li>
+</ul>
+<p>You can add new contact sets by clicking the <b>Add new Contact-set </b> button in the Creator Script Editor.</p></td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/contact_set.htm">Contact set</a></li>
+</ul>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="generic_items.htm">Generic component reference</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/reference/generic_items.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Generic component reference</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Generic component reference</h2>
+<p>The following fields are included for all component types in Creator Script Editor: </p>
+
+<table width="500" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="53*">
+<col width="146*"></colgroup>
+<tbody>
+<tr>
+<td><b>Amount</b> </td>
+<td><p>Defines how many entries of the selected component are created on the script. If this field is empty, the default is one entry. </p></td>
+</tr>
+<tr>
+<td><b>Set all values as random with length</b></td>
+<td><p>Defines how the S60 Creator tool will randomly pick the values for all items: </p><ul>
+<li><b>Default:</b> the typical length of an item, for example, the length of a contact's name. </li>
+<li><b>Maximum:</b> S60 Creator tool will generate as much data as allowed for a given component type. </li>
+<li><b>Custom length:</b> the value is show in the <b>Item value</b> field. You can add the custom length manually in the Item value field, or select from the <b>Mode</b> drop-down list.</li>
+</ul></td>
+</tr>
+</tbody>
+</table>
+<p></p>
+<p>The following table provides more information on specific handling of some fields. Note that it is important to enter data in the correct format, unless you use random values.</p>
+<p><b>Tip:</b> For additional guidance, follow the instructions available on the Creator component dialogs.</p>
+
+<table width="500" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="40*">
+<col width="159*"></colgroup>
+<tbody>
+<tr>
+<td><b>Date time</b></td>
+<td><p>In date and time fields, the data should be entered as:</p><ul>
+<li><i>YYYY-MM-DD</i> (for year-month-date), </li>
+<li><i>T</i> (a separator between date and time), </li>
+<li><i>HH:MM:SS</i> (for hour-minute-second). </li>
+</ul><p>For example: <i>2008-03-03T12:45:30</i></p></td>
+</tr>
+<tr>
+<td><b>Landmark</b></td>
+<td><p>For the geographical coordinates of the location, enter the numerical values in the following format: <i>-nn.nnnn - nn.nnnn</i>, which is used in XML. </p><ul>
+<li><b>Latitude:</b> positive value means North, negative value means South, and zero is the Equator. </li>
+<li><b>Longitude:</b> positive value means East, negative value means West, and zero is the Prime Meridian. </li>
+<li><b>Altitude:</b> zero point is the sea level. </li>
+</ul><p>For example: <i>139.9194 35.6361</i> </p></td>
+</tr>
+<tr>
+<td><b>Files</b></td>
+<td><ul>
+<li><b>Directory:</b> defines which types of files are created to the device. By default, the directory path is <i>c:\data</i>. To change the location, type the new directory here. </li>
+<li><b>Type:</b> defines the file format and identification for the file types created on the device. For example, in the case of the JPEG file format, three different identifications are possible: 200kB, 25kB and 500kB. For a list of supported file types in the current release, see the <a href="../release_notes.htm#features">Release Notes</a>. You can also add <b>DRM encryption</b> to files in the <b>Item type</b> field. <b>Note!</b> For the <b>Accumulated</b> and <b>Interval </b> fields, only the following format for duration is supported: <b>PnYnMnDTnHnMnS.</b> For example,  "P3Y6M4DT12H30M5S" represents a duration of "three years, six months, four days, twelve hours, thirty minutes, and five seconds".</li>
+<li>If you leave the <b>Type</b> field empty, an empty directory is created.
+</li>
+</ul></td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="contacts.htm">Contact components</a></li>
+<li><a href="messages.htm">Message components</a></li>
+<li><a href="calendar.htm">Calendar components</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/reference/messages.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Message components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Message components</h2>
+<p>The Message component types are: </p>
+<ul>
+<li>SMS</li>
+<li>MMS</li>
+<li>AMS</li>
+<li>Email</li>
+<li>Smart message</li>
+<li>Infrared (IR) message</li>
+<li>BT (Bluetooth) message</li>
+</ul>
+<p>You can either type in the needed values directly into the fields or select the <b>Random</b> component value options to let the S60 Creator tool generate message items randomly. </p><p>You can choose the <b>Item values</b> from the <b>Mode</b> field:</p>
+<ul>
+<li><b>Edit mode</b>: User can edit the field data</li>
+<li><b>Random &ndash; Default length</b>: Random data, default length</li>
+<li><b>Random &ndash; Custom length:</b> Random data, user edits the data length</li>
+<li><b>Random &ndash; Max length:</b> Random data, maximum length for the data</li>
+<li><b>Increase for each copy:</b> applied only with phone number fields in contacts, messages and logs. This mode is used together with the "amount" attribute. When the Increase for each copy mode is selected, phone number will increase for each copy of component created. For example, if phone number "12300" is given, the first copy will have phone number "123000", and the second copy will have "12301", third "12302" and so on. If the Amount attribute of Phone number is used, each copy will have a different phone number.</li>
+</ul>
+<p>Note the following specifics about file usage and contact sets: </p>
+<table width="500" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="42*">
+<col width="157*"></colgroup>
+<tbody>
+<tr>
+<td><b>SMS</b><br><b>Smart messages</b><br><b>IR messages</b><br><b>BT messages
+</b></td>
+<td>
+<ul>
+<li><b>From</b> (sender) and <b>To</b> (recipient): data can be taken from Contact sets. </li>
+</ul></td>
+</tr>
+<tr>
+<td><b>MMS</b><br><b>AMS</b><br><b>Email</b></td>
+<td><ul>
+<li><b>Attachment path</b> defines the path from which an attached file is created on the device (by default, <i>c:\data</i>). </li>
+<li><b>Attachment file ID:</b> defines the format and identification for the attached file that is created on the device. For example, in the case of the JPEG file format, three different identifications are possible: 200kB, 25kB and 500kB. For a list of supported file types in the current release, see the <a href="../release_notes.htm#features">Release Notes</a>. </li>
+<li><b>From</b> (sender) and <b>To</b> (recipient): data can be taken from Contact sets. </li>
+</ul></td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/contact_set.htm">Contact set</a></li>
+</ul>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="generic_items.htm">Generic component reference</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/reference/references.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>References</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>References</h2>
+<p>The following references are available for this tool. </p><p><b>Note:</b> The handling of Contact, Message and Calendar components is a special case due to their linkage to the Contact set concept. For the remaining component types, the generic guidelines apply. </p>
+<ul>
+<li><a href="generic_items.htm">Generic component reference</a></li>
+<li><a href="contacts.htm">Contact components</a></li>
+<li><a href="messages.htm">Message components</a></li>
+<li><a href="calendar.htm">Calendar components</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/release_notes.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release notes</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+<style type="text/css"></style>
+</head>
+<body>
+
+<h2>Release notes</h2>
+
+<h4>Creator Carbide.c++ Extension &ndash; Version 1.2.0</h4>
+<p>Released 27th November 2009</p>
+<ul>
+	<li><a href="#description">Product description</a></li>
+	<li><a href="#features">Main features</a></li>
+	<li><a href="#newfeatures">What's new</a></li>
+	<li><a href="#installation">Installation notes</a></li>
+	<li><a href="#requirements">System requirements</a></li>
+	<li><a href="#compissues">Compatibility issues</a></li>
+	<li><a href="#issues">Known issues</a></li>
+</ul>
+
+<h3><a name="description"></a>Product description</h3>
+<p>The Creator tool is used to create different kinds of test data (for example, contacts, messages or calendar entries) into a device. Creator is a useful tool for testing situations where a device is saving high amounts of data, or the data is either saved to a device several times or to multiple devices at the same time. </p>
+<p>The test data itself is contained in XML scripts, identified by the <i>.creatorxml</i> file extension. The Creator Carbide.c++ Extension automates and simplifies the creation of these scripts by enabling you to add components such as contacts, messages, notes, and files in the Carbide IDE. You can also create advanced test data combinations that associate, for example, contact data with messaging data. </p>
+<p>The Creator extension can be started by selecting <b>File > New > Other > Carbide Extensions > Creator script file</b> or <b>Carbide > Creator Script Editor</b>.</p>
+
+<h3><a name="features"></a>Main features</h3>
+<ul>
+	<li>UI for creating an XML format script file. </li>
+	<li>UI for adding the following types of components to the script:
+	<ul>
+		<li>phonebook items: contacts, contact sets, contact groups</li>
+		<li>connection methods</li>
+		<li>calendar items: to-dos, appointments, events, reminders, anniversaries</li>
+		<li>mail boxes</li>
+		<li>message items: text messages (SMS), multimedia messages (MMS), audio messages (AMS), emails, smart messages (such as vCards and ringing tones), infra-red (IR) messages, Bluetooth (BT) messages</li>
+		<li>notes</li>
+		<li>browser items: bookmarks and bookmark folders, saved pages and saved page folders</li>
+		<li>log entries: sent or received calls, call duration</li>
+		<li>instant messaging and presence service (IMPS) servers</li>
+		<li>landmarks (for location identification purposes) </li>
+		<li>files in the following formats and identifications: 3GPP-70kB, AAC-100kB, AMR-20kB, XLS-15kB, GIF-2kB, JPEG-200kB. JPEG-25kB, JPEG-500kB, MIDI-10kB, MP3-250kB, PNG-15kB, PPT-40kB, RM-95kB, RNG-1kB, TXT-10kB, TXT-70kB, WAV-20kB, DOC-20kB, SWF-15kB, JAD-1kB, JAR-10kB, TIF-25kB, MXMF-40kB, BMP-25kB, JP2-25kB, SVG-15kB, HTML-20kB, VCF-1kB, VCS-1kB, MP4-200kB, SISX-10kB, RAM-1kB,  WMV-200kB, WMA-50kB.</li>
+	</ul>
+	</li>
+</ul>
+
+<h3><a name="newfeatures"></a>What's new</h3>
+<ul>
+	<li>Feature: It is now possible to upload a script file to a target device and run it in the device via an HTI connection.</li>
+	<li>Feature: Added Run in device via HTI connection.</li>
+</ul>
+
+<h3><a name="installation"></a>Installation notes</h3>
+<h5>How to upgrade from the older versions</h5>
+<p>New version of the extension comes with the updated versions of common utility plug-ins. Once you have installed the new set of plug-ins, perform the following steps:</p>
+<ol>
+<li>Open 'Command Prompt'.</li>
+<li>Go to the Carbide.c++ installation directory (for example <i>C:\Program Files\Nokia\Carbide.c++ v2.0</i>).</li>
+<li>Start Carbide.c++ with the following command line: "Carbide.c++.exe" -clean</li>
+</ol>
+<p>The starting of Carbide.c++ with the clean option ensures that the latest versions of plug-ins are loaded.</p>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic requirements:</p>
+<ul>
+	<li>Windows 2000, Windows XP</li>
+	<li>Minimum Platform/SDK build PC.</li>
+	<li>Normal Platform/SDK build PC.</li>
+</ul>
+<p>Additional requirements:</p>
+<ul>
+	<li> N/A </li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+<li>N/A</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>   <ul>
+<li>N/A</li>
+</ul>
+
+<h3>Version history</h3>
+<h5>Version 1.2.0 &ndash; 5th February 2009</h5>
+<ul>
+	<li>Feature: It is now possible to upload a script file to a target device and run it in the device via an HTI connection.</li>
+	<li>Feature: Added Run in device via HTI connection.</li>
+</ul>
+
+<h5>Version 1.1.0 &ndash; 3rd November 2008</h5>
+<ul>
+<li>Feature: It is possible to define random length by selecting <b>Mode > Random -
+Custom length</b>, and define value to the <b>Item value</b> field.</li>
+<li>With File, DRM encryption added.</li>
+<li>Feature: Dialogs for Component that can have reference to Contact-set has now a
+button to create Contact-Sets. Those components are: Contact, Messages (SMS,
+MMS, AMS, Email, Smart Message, IR message, BT message), Appointment and Contact
+Group.</li>
+<li>Feature: All Item values that can have only known values has now fixed values in
+combos instead of text field. For example in SMS, Folder has values: "Sent",
+"Inbox", "Draft" and "Outbox" and Status has values: "Read" and "New".</li>
+<li>Feature: New Mode <b>Increase for each copy</b> added. The Increase for each copy
+mode is applied only with phone number fields in contacts, messages and logs.
+This mode is used together with the "amount" attribute. When the Increase
+for each copy mode is selected, phone number will increase for each copy of
+component created. For example, if phone number "12300" is given, the first
+copy will have phone number "123000", and the second copy will have "12301",
+third "12302" and so on. If the Amount attribute of Phone number is used,
+each copy will have a different phone number. For more information, see Creator
+Help or User's Guide.</li>
+<li>Feature: Added limitation that if element's max occurence is defined, it is not
+possible to add more than one row of that element to script with the Script
+Editor. For example, Connection method can have only one Connection Name.
+</li>
+<li>Feature: Added usage logging and update site URL.</li>
+<li>Feature: With File, new types added: WMV-200kB and WMA-50kB.</li>
+<li>Feature: Editor area contains an own button for creating Contact-Sets instead of selecting type from combo.</li>
+<li>Feature: Wizard selects automatically a project where new Creator Script file will be created if the project is selected in Project Explorer or only one project exists in workspace.</li>
+<li>Change: 'Random' column header changed to 'Mode. Under 'Mode', there is also Increase for each Copy mode.</li>
+<li>Change: Several minor UI updates.</li>
+<li>Fix: Unable to start Wizard for creating a new Creator Script file if no projects exist in workspace.</li>
+</ul>
+
+<h5>Version 1.0.0 &ndash; 29th April 2008</h5>
+<p>The first version.</p>
+
+<div id="footer">
+Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies).<br>
+All rights reserved. <br>
+This component and the accompanying materials are made available <br>
+under the terms of "Eclipse Public License v1.0" <br>
+which accompanies this distribution and is available <br>
+at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+<br><br>
+Initial Contributors:<br>
+Nokia Corporation - initial contribution
+<br><br>
+Contributors:<br>
+Description:
+
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/adding_components.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Adding components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Adding components</h2>
+
+<h5>Before you start</h5>
+<p>In general, you can add as many components (for example, contacts, messages, to-dos, appointments and so on) to the script as needed. Note the following things: </p>
+<ul>
+<li>Working with contact sets is a special case compared to other component items. For more information, see <a href="../concepts/contact_set.htm">Contact set</a>. </li>
+<li>Selecting random values for component items can save you a lot of time in the creation of the script. For a description, see <a href="../concepts/components.htm#random">Random component values</a>.</li>
+</ul>
+<p>To add components to the script, follow these basic steps: </p>
+<ol>
+<li>From the <b>Select component to add</b> list box, select the item of your choice. <p></p><p><img src="screenshots\adding_comp.png"></p></li>
+<li>Click <b>Add</b>. <p>The dialog for the selected component type is displayed.</p></li>
+<li>In the <b>Amount</b> field, type in the amount of entries you want to create of this component type. <p>If you leave this field empty, one entry
+is created by default. </p></li>
+<li>(Optional), add new contact set by clicking the <b>Add new Contact-set</b> button. <p><b>Note:</b> Dialogs for components that can have reference to Contact-set has this button for creating Contact-Sets. Those components are: Contact, Messages (SMS, MMS, AMS, Email, Smart Message, IR message, BT message), Appointment, and Contact Group.</p></li>
+<li>To enter the component values, do any of the following:
+<ul>
+<li>Enter the values of your choice in the <b>Item value</b> field, and how many of these items should be created in the <b>Amount</b> field. <p><b>Note:</b> When filling in the values manually, follow the instructions in the dialogs to enter the data in correct format. </p></li>
+<li><p>The length of an entry for random values can be selected from the <b>Mode</b> drop-down list as follows: </p><img src="screenshots\mode1.png">
+<ul>
+<li><b>Edit mode</b>: User can edit the field data</li>
+<li><b>Random &ndash; Default length</b>: Random data, default length</li>
+<li><b>Random &ndash; Custom length:</b> Random data, user edits the data length</li>
+<li><b>Random &ndash; Max length:</b> Random data, maximum length for the data</li>
+<li><b>Increase for each copy:</b> applied only with phone number fields in contacts, messages and logs. This mode is used together with the "amount" attribute. When the Increase for each copy mode is selected, phone number will increase for each copy of component created. For example, if phone number "12300" is given, the first copy will have phone number "123000", and the second copy will have "12301", third "12302" and so on. If the Amount attribute of Phone number is used, each copy will have a different phone number.</li>
+</ul>
+</li>
+<li>Generate random values for all items at once: select either <b>Default</b> or <b>Max</b>, and click <b>Set random</b>.<p><img src="screenshots\random_.png"></p></li>
+</ul>
+</li>
+<li>To save the script, select <b>File > Save</b>. </li>
+</ol>
+
+<h5>Useful to know</h5>
+<p>The <i>.creatorxml</i> file is used as input for the S60 Creator tool that works on an S60 device or an emulator. You can transfer the Creator file into the device in the same way as any other file, for example, via a USB cable or a Bluetooth connection. On the device, the default location of the file is in <i>c:\data</i>, or at the root of the memory card. </p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="modifying_components.htm">Modifying components</a></li>
+</ul>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="../reference/generic_items.htm">Generic component reference</a></li>
+<li><a href="../reference/contacts.htm">Contact components</a></li>
+<li><a href="../reference/messages.htm">Message components</a></li>
+<li><a href="../reference/calendar.htm">Calendar components</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/creating_xml_file.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Creating the script file</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Creating the script file</h2>
+<p>To create a new XML script file as part of your project in Carbide, do the following: </p>
+<ol>
+<li>Select <b>File > New > Other > Carbide Extensions > Creator script file</b> or <b>Carbide > Creator Script Editor</b>.</li>
+<li>Click <b>Next</b>. </li>
+<li>In the <b>Project</b> field, click <b>Browse</b> to locate your project.</li>
+<li>In the <b>File name</b> field, enter a name for the <i>.creatorxml</i> file, as shown in the following example: <p></p>
+<p><img src="screenshots\project_.png"></p></li>
+<li>Click <b>Finish</b>. <p>The Creator Script Editor tab opens and you can now start adding components to the script. </p><p>For the next steps, see <a href="adding_components.htm">Adding components</a>.</p></li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/modifying_components.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Modifying components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Modifying components</h2>
+<p>You can modify the <i>.creatorxml</i> files in Creator Script Editor at any time, by editing the values of individual components or removing components from the script. Also note that the Editor view may not show all the details defined for a component. To view the full details, click <b>Edit</b> to open the component's dialog. </p>
+<p><img src="screenshots\edit_components.png"></p>
+
+<h3>Editing component values</h3>
+<p>To edit a component:</p>
+<ol>
+<li>Select it from the list in the Script Editor and click <b>Edit</b>. </li>
+<li>The component-specific dialog is displayed, in which you can do any of
+the following: <ul>
+<li>To change an item's type, select the type from the <b>Item Type</b> drop-down list.<p>This may be necessary, for example, for contact components since the dialog may not list all the available fields by default.</p> </li>
+<li>To add more rows to the component, click <b>Add Row</b>. You can do this, for example, to define multiple <b>Email</b> fields for a contact. </li>
+<li>To remove items and their values, click <b>Clear</b> at the end of each row. </li>
+</ul>
+</li>
+<li>Click <b>OK</b> to save.</li>
+</ol>
+
+<h3>Removing components</h3>
+<p>To remove components from the script, select one or more components from the list and click <b>Remove</b>.</p>
+
+<h5>Related references</h5>
+<ul>
+<li><a href="../reference/generic_items.htm">Generic component reference</a></li>
+<li><a href="../reference/contacts.htm">Contact components</a></li>
+<li><a href="../reference/messages.htm">Message components</a></li>
+<li><a href="../reference/calendar.htm">Calendar components</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/run_in_device.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Running script in device</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Running script in device</h2>
+
+<h5>Before you start</h5>
+<p>Make sure that you have a <i>.creatorxml</i> script file you want to run in a target device, and that you have an HTI connection to the target device. For more instructions on configuring the HTI connection, see the <a href="../../../com.nokia.s60tools.hticonnection.help/html/toc.htm">HTI Connection Help</a>.</p>
+<p>Check also the version of the Creator S60 device application. The Run in device functionality requires version 5.0.3 or newer. <b>Note</b>: It is suggested to always use the latest version of Creator S60 device application.</p>
+
+<p>To upload and run script files in a target device, do the following:</p>
+<ol>
+<li>Prepare and select a script file in the Creator Script Editor, and connect to the target device via HTI.</li>
+<li>Click <b>Run in device via HTI</b>. This uploads the script file to the target device folder specified in the Creator preferences.</li>
+<li>If prompted, confirm to run the script in the device.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="setting_creator_preferences.htm">Setting Creator preferences</a></li>
+<li><a href="creating_xml_file.htm">Creating the script file</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/Thumbs.db has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/add_components.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/adding_comp.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/contact_set_id.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/container.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/creator_preferences.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/edit_components.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/file_type.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/landmark.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/log.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/mailbox.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/mode1.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/project_.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/random_.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/random_box.png has changed
Binary file creatorextension/com.nokia.s60tools.creator.help/html/tasks/screenshots/set_random.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/setting_creator_preferences.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Setting Creator preferences</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Setting Creator preferences</h2>
+<p>In the Creator <b>Preferences</b> dialog, you can set a default target folder for uploading script files to a target device.</p><p>To modify the settings, do the following:</p>
+<ol>
+<li>Go to <b>Window > Preferences > Carbide Extensions > Creator Script Editor Preferences</b>.
+<p><img src="screenshots\creator_preferences.png" alt="Creator Script Editor Preferences"></p></li>
+<li>In <b>Upload scripts in S60 device to folder:</b>, enter a folder in the target device. The default folder is <b>c:\data</b>.When you after this select <b>Run in device</b> in the Creator Script Editor Carbide.c++ Extension, the selected script file will be uploaded to this folder in the target device.</li>
+<li>If you want to replace files without a confirmation, select the option <b>Always replace existing file in S60 device without confirmation</b>.</li>
+<li>If you do not want Creator to show an information dialog when a script is executed, select the option <b>Don't show an information dialog when script is executed</b>.</li>
+<li>If you want the Creator S60 application to close without a confirmation dialog, select the options <b>Always close Creator application in S60 device without confirmation</b>.</li>
+<li>Click <b>OK</b>.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="run_in_device.htm">Running script in device</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tasks/tasks.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>Tasks</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet"></head>
+<body>
+
+<h2>Tasks</h2>
+<p>The following tasks are available for this tool:</p>
+<ul>
+	<li><a href="creating_xml_file.htm">Creating the script file</a></li>
+	<li><a href="adding_components.htm">Adding components</a></li>
+	<li><a href="modifying_components.htm">Modifying components</a></li>
+	<li><a href="run_in_device.htm">Running script in device</a></li>
+	<li><a href="setting_creator_preferences.htm">Setting Creator preferences</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/toc.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>Table of Contents</title>
+	<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+
+<body>
+<h1>Creator Online Help</h1>
+<p><a href="release_notes.htm">Release notes</a></p>
+
+<p><a href="gettingstarted/GS_index.htm">Getting started</a>
+<ul>
+	<li><a href="gettingstarted/overview.htm">Overview</a></li>
+	<li><a href="gettingstarted/walk_through.htm">Basic walk-through</a></li>
+</ul></p>
+
+<p><a href="concepts/concepts.htm">Concepts</a>
+<ul>
+	<li><a href="concepts/components.htm">Components</a></li>
+	<li><a href="concepts/contact_set.htm">Contact set</a></li> 
+</ul></p>
+
+<p><a href="tasks/tasks.htm">Tasks</a>
+<ul>
+	<li><a href="tasks/creating_xml_file.htm">Creating the script file</a></li>
+	<li><a href="tasks/adding_components.htm">Adding components</a></li>
+	<li><a href="tasks/modifying_components.htm">Modifying components</a></li>
+	<li><a href="tasks/run_in_device.htm">Running script in device</a></li>
+	<li><a href="tasks/setting_creator_preferences.htm">Setting Creator preferences</a></li>
+</ul></p>
+
+<p><a href="reference/references.htm">References</a>
+<ul>
+	<li><a href="reference/generic_items.htm">Generic component reference</a></li>
+	<li><a href="reference/contacts.htm">Contact components</a></li>
+	<li><a href="reference/messages.htm">Message components</a></li>
+	<li><a href="reference/calendar.htm">Calendar components</a></li>
+</ul></p>
+
+<p><a href="legal.htm">Legal</a></p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tocConcepts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts">
+	
+	<!-- Enter topic entries here for Concepts section of help -->
+	
+	<topic label="Components" href="html/concepts/components.htm" />
+	<topic label="Contact set" href="html/concepts/contact_set.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tocGettingStarted.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Getting started"> 
+	
+	<topic label="Overview" href="html/gettingstarted/overview.htm" />
+	<topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+		
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tocReference.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Reference">
+	
+	<!-- Enter topic entries here for References section of help -->
+	
+	<topic label="Generic component reference" href="html/reference/generic_items.htm" />
+	<topic label="Contact components" href="html/reference/contacts.htm" />
+	<topic label="Message components" href="html/reference/messages.htm" />
+	<topic label="Calendar components" href="html/reference/calendar.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/tocTasks.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks">
+	
+	<!-- Enter topic entries here for Tasks section of help -->
+	
+	<topic label="Creating the script file" href="html/tasks/creating_xml_file.htm" />
+	<topic label="Adding components" href="html/tasks/adding_components.htm" />
+	<topic label="Modifying components" href="html/tasks/modifying_components.htm" />
+	<topic label="Running script in device" href="html/tasks/run_in_device.htm" />
+	<topic label="Setting Creator preferences" href="html/tasks/setting_creator_preferences.htm" />
+
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/html/toolTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!-- 
+	Links tool docs to main TOC for Carbide help in the defined location. 
+	NOTE: Tool name seems to be ignored here for display purposes but needed to
+	make the link_to section work.
+-->
+
+<!-- Current link_to attribute works on top of Carbide 1.3 -->
+<toc label="Creator" 
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+	
+<!-- 
+    This is old link_to attribute working on top of Carbide 1.2:
+	link_to="../com.nokia.carbide.cpp/nokiaTOC.xml#anchorCarbideFeature">
+	-->
+
+	<!--
+		Define the Creator as it should appear in the TOC. The tool.htm page
+		is the cover page for the tool help.
+	-->
+	<topic label="Creator" href="html/toc.htm" >
+		
+	   <!--
+		   Following the Eclipse guidelines, the tool help is arranged as Concepts,
+		   References, and Tasks. Each has their own associated XML file to make it
+		   easy to edit each section as well as an overview page.
+	   -->
+	   <topic label="Release Notes" href="html/release_notes.htm" />
+		
+	   <topic label="Getting started" href="html/gettingstarted/GS_index.htm">
+     		   <link toc="html/tocGettingStarted.xml" />
+	   </topic>
+   
+	   <topic label="Concepts" href="html/concepts/concepts.htm" >
+     		   <link toc="html/tocConcepts.xml" />
+	   </topic>
+			  
+	   <topic label="Tasks" href="html/tasks/tasks.htm" >
+     		   <link toc="html/tocTasks.xml" />
+	   </topic>
+	   
+	   <topic label="Reference" href="html/reference/references.htm" >
+     		   <link toc="html/tocReference.xml" />
+	   </topic>
+		   
+       <topic label="Legal" href="html/legal.htm" />
+   		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator.help/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+	<extension point="org.eclipse.help.toc">
+		<toc
+			file="html/toolTOC.xml"
+			primary="true"/>
+  <toc
+        file="html/tocConcepts.xml"
+        primary="false"/>
+  <toc
+        file="html/tocReference.xml"
+        primary="false"/>
+  <toc
+        file="html/tocTasks.xml"
+        primary="false"/>
+  <toc
+        file="html/tocGettingStarted.xml"
+        primary="false"/>
+     
+	</extension>
+   
+	
+	<!-- Carbide.c++ cheatsheets extension -->
+	<!--
+	<extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+		<category
+			id="com.nokia.carbide.ide.cheatsheets"
+			name="Carbide.c++" />
+		<cheatsheet
+			category="com.nokia.carbide.ide.cheatsheets"
+			contentFile="html/cheatsheets/getStarted_cs.xml"
+			id="com.nokia.cdt.debug.help.getStarted"
+			name="HelloCarbide Project Example"/>
+	</extension>
+    -->
+	
+	<!-- CONTEXT IDs for CONTEXTUAL HELP in windows, dialogs, and views -->
+	
+	<extension point="org.eclipse.help.contexts" >
+
+       <contexts file="html/contexts.xml"
+       		plugin="com.nokia.s60tools.creator.help" />
+
+	</extension>
+	
+	
+	<extension point="org.eclipse.help.index" >
+        <index file="html/index.xml"/>
+    </extension>
+
+	
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Fri Sep 12 16:56:45 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Creator Script Editor
+Bundle-SymbolicName: com.nokia.s60tools.creator; singleton:=true
+Bundle-Version: 1.2.0
+Bundle-Activator: com.nokia.s60tools.creator.CreatorActivator
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.ide,
+ com.nokia.s60tools.ui,
+ com.nokia.s60tools.util,
+ com.nokia.s60tools.hticonnection;bundle-version="1.0.0";resolution:=optional,
+ com.nokia.carbide.cdt.builder;bundle-version="2.0.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”>
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content=”text/html; charset=ISO-8859-1”>
+</head>
+<body lang=”EN-US”>
+<h2>About This Content</h2>
+ 
+<p>January 9, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2007-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/appdep.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - Creator Script Editor \n\
+\n\
+Version: 1.2\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+All rights reserved. License: "http://www.eclipse.org/legal/epl-v10.html".\n\
+\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               about.html,\
+               about.mappings,\
+               about.properties,\
+               about.ini
+javacSource=1.5
+javacTarget=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.creator" default="cc" basedir=".">
+
+	<!-- Targets -->
+	<target name="cc" depends="clean-test,jar, instr,feature, analyze, zip" description="Build, instrument, run unit tests and analyze code"/>
+
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	
+	<property name="help.project.name" value="${ant.project.name}.help"/>
+	<property name="feature.project.name" value="com.nokia.carbide.extension.creator"/>
+	<property name="feature.name" value="Creator"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	
+	<!-- Folder definitions -->
+	<property name="feature.project.folder" location="../com.nokia.carbide.extension.creator"/>
+	<property name="binaries.folder" location="../${feature.name}.binaries"/>
+	
+	<!-- Carbide layouts -->
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.adt.folder" location="c:/Carbide_ADT/plugins"/>
+	
+	<property name="reports.folder" location="../reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="../instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>	
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<!-- Select Carbide layout -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<delete dir="../plugins"/>
+		<mkdir dir="../plugins"/>
+		
+		<!-- Delete build folders -->
+		<delete dir="${basedir}/com"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+	
+		<!-- Build the source -->
+		<javac destdir="" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+	</target>
+
+	
+	<!-- JAR target -->
+	<target name="jar" depends="build" description="Create JAR">
+
+		<!-- Create JARs -->
+		<zip destfile="../plugins/${jar.filename}">
+				<fileset dir="${build.result.folder}">
+						  <include name="com/**"/>
+					    <include name="icons/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="about.ini"/> 
+					    <include name="about.mappings"/> 
+					    <include name="about.properties"/> 
+				</fileset>
+		</zip>
+		
+
+	</target>
+	
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="../plugins/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+	
+	
+
+	<!-- Feature target -->
+	<target name="feature" depends="jar" description="Create feature">
+		<property name="feature.folder" location="${binaries.folder}/feature"/>
+		
+		
+		<mkdir dir="${feature.folder}"/>
+		<mkdir dir="${feature.folder}/plugins"/>
+		<mkdir dir="${feature.folder}/features/${feature.project.name}"/>
+		<mkdir dir="${binaries.folder}/nightly_builds"/>		
+				
+		<!-- Create help JAR -->
+		<zip destfile="../plugins/${help.jar.filename}" basedir="../${help.project.name}" excludes="src/,.*"/>
+		
+		<!-- Copy feature stuff to the temp folder -->
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/feature.xml"/>
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/license.txt"/>
+		
+		<!-- Set version numbers to plugins jar packages -->
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.help"/>
+		</exec>	
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}"/>
+		</exec>
+		
+		<!-- Copy the actual plug-in to the feature folder -->
+		<copy todir="${feature.folder}/plugins">
+			<fileset dir="../plugins"/>
+		</copy>
+		
+		
+		<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		<copy todir="${carbide.adt.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		
+	</target>
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			<formatter type="html" toFile="${reports.folder}/report.pmd.html"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+					<include name="**/*.java"/>
+			</fileset>
+			
+		</pmd>
+	</target>
+			
+	<!-- Clean tests target -->
+  	<target name="clean-test" description="Clean test">
+	    	<delete dir="${instr.folder}"/>
+	    	<delete dir="${reports.folder}"/>
+  	</target>
+  
+	
+	<!-- Make zip package of the feature and plugins -->
+	<target name="zip">
+	
+			<!-- Create the feature zip -->
+			<zip destfile="${binaries.folder}/${feature.name}.zip" basedir="${feature.folder}"/>
+			
+			<delete dir="${feature.folder}"/>
+			
+			<!-- Nightly build -->
+			<tstamp>
+			   <format property="timestamp" pattern="dd-MM-yyyy" />
+			</tstamp>
+	
+			<delete dir="${binaries.folder}/nightly_builds"/>
+	  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+	
+			<copy tofile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip" file="${binaries.folder}/${feature.name}.zip"/>
+			
+	</target>
+	
+</project>
Binary file creatorextension/com.nokia.s60tools.creator/icons/creator_16x16.png has changed
Binary file creatorextension/com.nokia.s60tools.creator/icons/creator_55x46.png has changed
Binary file creatorextension/com.nokia.s60tools.creator/icons/empty_banner.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            name="Creator Script Editor"
+            extensions="creatorxml"
+            icon="icons/creator_16x16.png"
+            class="com.nokia.s60tools.creator.editors.CreatorScriptEditor"
+            id="com.nokia.s60tools.creator.editors.CreatorScriptEditor">
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.newWizards">
+      <category
+            name="Carbide Extensions"
+            id="com.nokia.s60tools">
+      </category>
+      <wizard
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.creator.wizards.CreatorScriptNewWizard"
+            descriptionImage="icons/creator_55x46.png"
+            icon="icons/creator_16x16.png"
+            id="com.nokia.s60tools.creator.wizards.CreatorScriptNewWizard"
+            name="Creator script file">
+         <description>
+            Create a Creator script file
+         </description>
+      </wizard>
+   </extension>
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.ui.ide.workbench"
+            name="Creator">
+         <property
+               name="appName"
+               value="Carbide.c++ Extensions - Creator">
+         </property>
+      </product>
+   </extension>
+   
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="Creator Actions"
+            id="com.nokia.s60tools.creator.ui.actionSet"
+            label="New Creator script"
+            visible="true">
+         <action
+               class="com.nokia.s60tools.creator.ui.actions.ToolsMenuAction"
+               icon="icons/creator_16x16.png"
+               id="com.nokia.s60tools.creator.ui.actions.ToolsMenuAction"
+               label="Creator Script Editor"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               style="push"
+               tooltip="%view.Tooltip"/>
+         <menu
+               id="com.nokia.carbide.cpp.ui.CarbideMenu"
+               label="Carbide"
+               path="additions">
+            <groupMarker name="additions"/>
+         </menu>
+      </actionSet>
+   </extension>  
+   
+       <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            name="Creator Script Editor Preferences"
+            class="com.nokia.s60tools.creator.preferences.CreatorPreferencePage"
+            category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage"
+            id="com.nokia.s60tools.creator.preferences.CreatorPreferencePage">
+      </page>
+   </extension>   
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/CreatorActivator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.creator;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+import com.nokia.s60tools.ui.UiUtils;
+
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class CreatorActivator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.creator";
+	
+	public static final String CREATOR_SCRIPT_EDITOR_ICON = "creator_16x16.png";
+	public static final String NOKIA_TOOLS_BANNER = "empty_banner.png";
+	public static final String CREATOR_SCRIPT_LARGE_ICON = "creator_55x46.png";	
+
+	// The shared instance
+	private static CreatorActivator plugin;
+
+	/**
+	 * Storing preferences
+	 */
+	private static IPreferenceStore prefsStore;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;	
+	
+	/**
+	 * The constructor
+	 */
+	public CreatorActivator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		
+		pluginInstallLocation = getPluginInstallPath();
+		//This startup debug println has been left into the code in purpose
+		System.out.println("pluginInstallLocation: " +  pluginInstallLocation); //$NON-NLS-1$
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static CreatorActivator getDefault() {
+		return plugin;
+	}
+	
+	/**
+	 * Gets images path relative to given plugin install path.
+	 * @return Path were image resources are located.
+	 */
+	private String getImagesPath(){
+		return pluginInstallLocation
+				+ File.separatorChar
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}		
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
+     */
+    protected void initializeImageRegistry(ImageRegistry imgReg) {
+    	
+    	//
+    	// Storing images to plugin's image registry
+    	//
+    	Display disp = Display.getCurrent();
+    	Image img = null;
+    	
+    	img = new Image( disp, getImagesPath() + "\\" +CREATOR_SCRIPT_EDITOR_ICON );        	 //$NON-NLS-1$
+        imgReg.put( CREATOR_SCRIPT_EDITOR_ICON, img );
+
+    	img = new Image( disp, getImagesPath() + "\\" +NOKIA_TOOLS_BANNER );        	 //$NON-NLS-1$
+        imgReg.put( NOKIA_TOOLS_BANNER, img );
+
+    	img = new Image( disp, getImagesPath() + "\\" +CREATOR_SCRIPT_LARGE_ICON);        	 //$NON-NLS-1$
+        imgReg.put( CREATOR_SCRIPT_LARGE_ICON, img );
+    	
+    }		
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+	
+	/**
+	 * Returns image descriptor for the given key from the plugin's image registry.
+	 * @param key Key to search descriptor for.
+	 * @return Image descriptor for the given key from the plugin's image registry.
+	 */
+	public static ImageDescriptor getImageDescriptorForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}		
+	
+	/**
+	 * Returns image for the given key from the plugin's image registry.
+	 * @param key Key to search image for.
+	 * @return Image for the given key from the plugin's image registry.
+	 */
+	public static Image getImageForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();    	
+    	return  imgReg.get(key);		
+	}	
+	
+	
+	/**
+	 * @return path where plug-in is installed
+	 * @throws IOException
+	 */
+	public String getPluginInstallPath() throws IOException{
+		 // URL to the plugin's root ("/")
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		//	Converting into local path
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		//	Getting install location in correct form
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+				
+		return pluginInstallLocation;		
+	}	
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return Currently active workbench page.
+	 */
+	public static IWorkbenchPage getCurrentlyActivePage(){
+		return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+	}	
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return The shell of the currently active workbench window..
+	 */
+	public static Shell getCurrentlyActiveWbWindowShell(){
+		IWorkbenchPage page = getCurrentlyActivePage();
+		if(page != null){
+			return page.getWorkbenchWindow().getShell();
+		}
+		return null;
+	}
+
+	/**
+	 * Get Wizard icon with banner
+	 * @return
+	 */
+	public static ImageDescriptor getWizardImage() {
+		return UiUtils.getBannerImageDescriptor(getImageDescriptorForKey(CREATOR_SCRIPT_LARGE_ICON));
+
+	}	
+	
+	/**
+	 * Returns the PreferenceStore where plugin preferences are stored
+	 * 
+	 * @return the PreferenceStore where plugin preferences are stored
+	 */
+	public static IPreferenceStore getPrefsStore(){
+		if (prefsStore == null){
+			prefsStore = getDefault().getPreferenceStore();
+		}
+		
+		return prefsStore;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/CreatorHelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator;
+
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class CreatorHelpContextIDs {
+
+	/**
+	 * The plug-in ID. Copy from CreatorActivator.PLUGIN_ID
+	 * to here to avoid runtime dependency to help project 
+	 */	 
+	private static final String CREATOR_HELP_PROJECT_PLUGIN_ID = "com.nokia.s60tools.creator.help";
+	
+	
+	/**
+	 * ID to Metadata Editor Help TOC
+	 */
+    public static final String CREATOR_HELP_TOC = 
+  		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_TOC";
+    
+    /**
+     * ID to Editing a component
+     */
+    public static final String CREATOR_HELP_MODIFY_COMPONENT = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_MODIFY_COMPONENT";
+
+    /**
+     * ID to Adding and component
+     */
+    public static final String CREATOR_HELP_ADD_COMPONENT = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_ADD_COMPONENT";
+
+    
+    /**
+     * ID to Contacts
+     */
+    public static final String CREATOR_HELP_CONTACTS = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_CONTACTS";
+
+    
+    /**
+     * ID to Contact set
+     */
+    public static final String CREATOR_HELP_CONTACT_SET = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_CONTACT_SET";
+    
+    /**
+     * ID to Calendar
+     */
+    public static final String CREATOR_HELP_CALENDAR = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_CALENDAR";
+    
+    /**
+     * ID to Messages
+     */
+    public static final String CREATOR_HELP_MESSAGES = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_MESSAGES";
+    
+    /**
+     * ID to generic component
+     */
+    public static final String CREATOR_HELP_GENERIC_COMPONENT = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_GENERIC_COMPONENT";    
+    
+    /**
+     * ID to create new script (With wizard)
+     */
+    public static final String CREATOR_HELP_CREATE_SCRIPT = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_CREATE_SCRIPT";      
+
+    /**
+     * ID to random values
+     */
+    public static final String CREATOR_HELP_RANDOM_VALUES = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_RANDOM_VALUES";     
+    
+    /**
+     * ID to components
+     */
+    public static final String CREATOR_HELP_COMPONENTS = 
+		  CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_COMPONENTS";
+
+
+    /**
+     * ID to preference page
+     */
+	public static final String PREF_PAGE = CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_PREFERENCES";    
+
+    /**
+     * ID to run in device
+     */
+	public static final String RUN_IN_DEVICE_PAGE = CREATOR_HELP_PROJECT_PLUGIN_ID +".CREATOR_HELP_RUN_IN_DEVICE";    
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/Product.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.common;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Product {
+
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.creator.common.product"; //$NON-NLS-1$
+	
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Product() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/ProductInfoRegistry.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.common;
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information in one place.
+ */
+public class ProductInfoRegistry {
+
+	private static final String PRODUCT_NAME = Product.getString("ProductInfoRegistry.Product_Name"); //$NON-NLS-1$
+	private static final String CONSOLE_WINDOW_NAME = PRODUCT_NAME + " " + Product.getString("ProductInfoRegistry.Console_Window_Name_Postfix");	 //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.Images_Directory");	 //$NON-NLS-1$
+	private static final String RESOURCES_RELATIVE_PATH = Product.getString("ProductInfoRegistry.Resources_Relative_Path");	 //$NON-NLS-1$
+	private static final String DATA_DIRECTORY = Product.getString("ProductInfoRegistry.Data_Directory");	 //$NON-NLS-1$
+	private static final String PROPERTIES_FILE_NAME = Product.getString("ProductInfoRegistry.Properties_File_Name");	 //$NON-NLS-1$
+	private static final String CREATOR_TEMPLATE_FILE_NAME = Product.getString("ProductInfoRegistry.Creator_Template_File_Name");	 //$NON-NLS-1$
+	
+	
+	/**
+	 * @return Returns the CONSOLE_WINDOW_NAME.
+	 */
+	public static String getConsoleWindowName() {
+		return CONSOLE_WINDOW_NAME;
+	}
+	/**
+	 * @return Returns the PRODUCT_NAME.
+	 */
+	public static String getProductName() {
+		return PRODUCT_NAME;
+	}
+	
+	/**
+	 * @return Returns the IMAGES_DIRECTORY.
+	 */
+	public static String getImagesDirectoryName() {
+		return IMAGES_DIRECTORY;
+	}
+	/**
+	 * @return Returns the RESOURCES_RELATIVE_PATH.
+	 */
+	public static String getResourcesRelativePath() {
+		return RESOURCES_RELATIVE_PATH;
+	}
+	
+	/**
+	 * @return Returns the CREATOR_TEMPLATE_FILE_NAME.
+	 */
+	public static String getCreatorTemplateFileName() {
+		return CREATOR_TEMPLATE_FILE_NAME;
+	}	
+		
+	/**
+	 * @return Returns the DATA_DIRECTORY.
+	 */
+	public static String getDataDirectoryName() {
+		return DATA_DIRECTORY;
+	}	
+	/**
+	 * @return Returns the PROPERTIES_FILE_NAME.
+	 */
+	public static String getPropertiesFileName() {
+		return PROPERTIES_FILE_NAME;
+	}		
+	/**
+	 * @return Returns the Creator Symbian executable name.
+	 */
+	public static String getCreatorSymbianExcecutableName() {
+		return Product.getString("ProductInfoRegistry.CreatorSymbianExecutableName"); //$NON-NLS-1$;
+	}	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/common/product.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+ProductInfoRegistry.Product_Name=Creator Script Editor
+ProductInfoRegistry.Console_Window_Name_Postfix=Console
+ProductInfoRegistry.Images_Directory=icons
+ProductInfoRegistry.Data_Directory=data
+ProductInfoRegistry.Properties_File_Name=creator.properties
+ProductInfoRegistry.Resources_Relative_Path=resources
+ProductInfoRegistry.Metadata_Template_File_Name=creator_template.creatorxml
+ProductInfoRegistry.CreatorSymbianExecutableName=creator
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractComponent.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,508 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.contact.ContactValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+
+
+/**
+ * Abstract entry base class that contains only id for the
+ * entry and method that are common for all entry types.
+ * 
+ * To be subclassed in order to create concrete entry types.
+ */
+public abstract class AbstractComponent {
+	
+	/**
+	 * White space
+	 */
+	public static final String WHITE_SPACE = " ";
+	/**
+	 * Separator for components ("|")
+	 */
+	public static final String COMPONENT_TYPE_SEPARATOR = " | ";
+	/**
+	 * Separator for items (comma ",")
+	 */
+	public static final String COMPONENT_ITEM_SEPARATOR = ", ";
+	/**
+	 * Separator for between component label and value ("=")
+	 */
+	public static final String COMPONENT_LABEL_VALUE_SEPARATOR = "=";
+	
+	/**
+	 * ID what is not set
+	 */
+	public static final int NULL_ID = 0;
+	/**
+	 * If Max Occur for item is not defined, it's unbounded (infinite).
+	 * Value for  is <code>-1</code>.
+	 */
+	public static final int MAX_OCCURS_UNBOUNDED = -1;
+	/**
+	 * Id for type
+	 */
+	public static final String TYPE_PARAMETER_ID = "type";
+	/**
+	 * ID for id
+	 */
+	public static final String ID_PARAMETER_ID = "id";
+	/**
+	 * ID for name
+	 */
+	public static final String NAME_PARAMETER_ID = "name";
+	/**
+	 * incvalueforeachcopy value in XML. 
+	 * @see AbstractValue#RANDOM_TEXT_INC_FOR_EACH_COPY
+	 */
+	public static final String INCVALUEFOREACHCOPY_PARAMETER_ID = "incvalueforeachcopy";
+	/**
+	 * String value for <code>true</code>
+	 */
+	public static final String TRUE = "true";
+	/**
+	 * ID for number of existing contacts 
+	 */
+	public static final String NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID ="numberofexistingcontacts";
+	/**
+	 * UI text for Contacts (amount)
+	 */
+	public static final String NUMBER_OF_EXISTING_CONTACTS = "Contacts (amount)";
+	
+	/**
+	 * UI text for adding existing contacts to contact-set 
+	 */
+	public static final String NUMBER_OF_EXISTING_CONTACTS_DIALOG_TEXT = "Add existing contacts in device to this Contact-set (amount):";	
+	/**
+	 * User configurable id for the entry. The entries
+	 * are identified by there unique id per search method 
+	 * configuration storage.
+	 */
+	private int id;
+	
+	/**
+	 * Storage for attributes
+	 */
+	private Map<String, Vector<AbstractValue>> attributes;
+
+	
+	/**
+	 * Amount
+	 */
+	private int amount;
+	
+
+	/**
+	 * If component has additional parameters, like type
+	 */
+	private Map<String, String>additionalParameters = null;
+	
+	/**
+	 * If component have a reference to another component
+	 */
+	private AbstractComponent referenceToAnotherComponent = null;
+	
+	/**
+	 * Constructor
+	 * @param id Entry id.that is unique per search method. 
+	 * @param isSelected Is the entry used for queries by default.
+	 */
+	protected AbstractComponent(int id){
+		this.id = id;
+		this.amount = 0;
+	}
+	
+
+	/**
+	 * @return the id for the entry.
+	 */
+	public int getId() {
+		return id;
+	}
+
+
+	
+	/**
+	 * Notifies storage object that this entry has been modified.
+	 * @param eventType Event type of the modification.
+	 */
+	protected void notifyModification(int eventType){
+	}
+	
+
+	/**
+	 * Get Component type
+	 * @return type
+	 */
+	public abstract String getType();
+	
+	/**
+	 * Get Component type used in XML 
+	 * @return type <xs:complexType>
+	 */
+	public abstract String getXMLElementName();	
+
+
+	/**
+	 * Get all attributes
+	 * @return attributes
+	 */
+	public Map<String, Vector<AbstractValue>> getAttributes() {
+		if(attributes == null){
+			attributes = new LinkedHashMap<String, Vector<AbstractValue>>();
+		}
+		return attributes;
+	}
+
+	/**
+	 * Set all attributes
+	 * @param attributes
+	 */
+	public void setAttributes(Map<String, Vector<AbstractValue>> attributes) {
+		this.attributes = attributes;
+	}
+	
+	/**
+	 * Set one attribute to attributes
+	 * @param key
+	 * @param value
+	 */
+	public void setAttribute(String key, Vector<AbstractValue> value){
+		getAttributes().put(key, value);
+	}
+	
+	/**
+	 * Get one attribute
+	 * @param key
+	 * @return value, null if not found or value is empty
+	 */
+	public Vector<AbstractValue> getAttribute(String key) {		
+		return getAttributes().get(key);
+	}
+
+
+	/**
+	 * Get component keys (e.g. entry item labels) 
+	 * @return a key (label)
+	 */
+	public Set<String> getKeys() {
+		return getAttributes().keySet();
+	}
+
+
+	/**
+	 * Check if component is valid or not. 
+	 * @return trie od
+	 */
+	public abstract boolean isValid();
+	
+
+
+	/**
+	 * Get amount attribute in component.
+	 * <xs:attribute =”amount” use=”optional” type=”xs:positiveInteger”/>
+	 * @return amount
+	 */
+	public int getAmount() {
+		return amount;
+	}
+
+
+	/**
+	 * Set amount attribute in component.
+	 * <xs:attribute =”amount” use=”optional” type=”xs:positiveInteger”/>
+	 * @param amount
+	 */
+	public void setAmount(int amount) {
+		this.amount = amount;
+	}
+	
+	/**
+	 * Get number of attributes (items) added to this component
+	 * @return count
+	 */
+	public int getAttributeCount(){
+		return getAttributes().size();
+	}
+	
+	/**
+	 * Get showable UI value by XML element name
+	 * @param id -element name in XML
+	 * @return value -element name in UI
+	 */
+	public abstract String getValueById(String id);	
+	
+	/**
+	 * Get XML element name by showable UI value
+	 * @param value -element name in UI
+	 * @return id -element name in XML
+	 */
+	public abstract String getIdByValue (String value);
+
+
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	public String toString() {
+	
+		Set<String> componentKeys = getKeys();
+		//Collection<String> values = comp.getAttributes().values();
+		
+		StringBuffer allFieldsB = new StringBuffer();
+		allFieldsB.append(getType());			
+		allFieldsB.append( COMPONENT_TYPE_SEPARATOR);
+		
+		//reference to another component
+		if(hasReferenceToAnotherComponent()){
+			allFieldsB.append( referenceToAnotherComponent.getType() );
+			allFieldsB.append( WHITE_SPACE );
+			allFieldsB.append( ID_PARAMETER_ID );			
+			allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR );
+			allFieldsB.append( referenceToAnotherComponent.getId() );
+			allFieldsB.append( COMPONENT_TYPE_SEPARATOR);			
+		}
+		
+		//Amount (how many of this component will be added)
+		if(getAmount() > 0){
+			allFieldsB.append(" amount=");
+			allFieldsB.append(getAmount());
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+		}
+		
+		
+		String itemlabel = new String();
+		Vector<AbstractValue> itemValue;
+		//Looping through one component, founding all fields from that component
+		for (Iterator<String> compValuesIt = componentKeys.iterator(); compValuesIt.hasNext();) {
+			itemlabel = (String) compValuesIt.next();
+			itemValue = getAttribute(itemlabel);
+			//get all values from values vector
+			for (Iterator<AbstractValue> iterator = itemValue.iterator(); iterator.hasNext();) {
+				AbstractValue val = iterator.next();
+	
+				allFieldsB.append(itemlabel);
+				allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+				//If value is random value, showing in UI only short description (<RND>)
+				if(val.isRandom()){
+					allFieldsB.append(ContactValue.RANDOM_TEXT);
+				}else{
+										
+					//Add value 
+					allFieldsB.append(val.getValue());
+					//adding incvalueforeachcopy parameter
+					if(val.getModeType() == ModeTypes.ModeTypeIncValueForEachCopy){
+						allFieldsB.append(" ");
+						allFieldsB.append(AbstractValue.RANDOM_TEXT_INC_FOR_EACH_COPY_SHORT);
+					}					
+				}
+				allFieldsB.append(COMPONENT_ITEM_SEPARATOR);									
+			}
+			
+		}
+		//deleting last ", " from list
+		if(allFieldsB.toString().endsWith(COMPONENT_ITEM_SEPARATOR)){
+			allFieldsB.delete(allFieldsB.length()-COMPONENT_ITEM_SEPARATOR.length(), allFieldsB.length());
+		}
+		return  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(allFieldsB.toString());
+	}
+
+
+	/**
+	 * Get additional parameters
+	 * @return additionalParameters
+	 */
+	public Map<String, String> getAdditionalParameters() {
+		if(additionalParameters == null){
+			additionalParameters = new LinkedHashMap<String, String>();
+		}		
+		return additionalParameters;
+	}
+
+
+	/**
+	 * Set additional parameters
+	 * @param additionalParameters
+	 */
+	public void setAdditionalParameters(Map<String, String> additionalParameters) {
+		this.additionalParameters = additionalParameters;
+	}
+	
+
+	/**
+	 * Add one additional parameter
+	 * @param type
+	 * @param value
+	 */
+	public void addAdditionalParameter(String type, String value) {
+		getAdditionalParameters().put(type, CreatorEditorSettings.getInstance().replaceForbiddenChars(value));
+	}
+	
+	/**
+	 * Get additional parameter
+	 * @param type
+	 * @return value, or null if not exist
+	 */
+	public String getAdditionalParameter(String type) {
+		return getAdditionalParameters().get(type);
+	}	
+	
+	/**
+	 * Does this component have some additional parameters
+	 * @return true if this component has some additional parameter, false otherwise
+	 */
+	public boolean hasAdditionalParameters(){
+		return additionalParameters != null && getAdditionalParameters().size() > 0 ? true : false;
+	}
+
+	/**
+	 * Removes all additional parameters
+	 * Note: attributes is not going to be removed. Use {@link AbstractComponent#removeAllAttributes()}
+	 */
+	public void removeAdditionalParameters() {
+		additionalParameters = new LinkedHashMap<String, String>();
+	}
+
+	/**
+	 * Set this contact belong to contact set
+	 * @param reference
+	 */
+	public void setReferenceToAnotherComponent(AbstractComponent reference) {
+		this.referenceToAnotherComponent = reference;
+	}
+
+
+	/**
+	 * Get contact set which this contact belongs to
+	 * @return
+	 */
+	public AbstractComponent getReferenceToAnotherComponent() {
+		return referenceToAnotherComponent;
+	}
+	
+	/**
+	 * 
+	 * @return true if component has a reference to another component
+	 */
+	public boolean hasReferenceToAnotherComponent(){
+		return referenceToAnotherComponent != null;
+	}
+
+
+	/**
+	 * Set component id
+	 * @param id
+	 */
+	public void setId(int id) {
+		this.id = id;
+	}
+
+
+	/**
+	 * Removes all existing attributes.
+	 * Note: Additional parameters is not going to be removed. Use {@link AbstractComponent#removeAdditionalParameters()}
+	 */
+	public void removeAllAttributes() {
+		attributes = new LinkedHashMap<String, Vector<AbstractValue>>();		
+	}
+
+
+	/**
+	 * Get fixed values for itemType
+	 * @param itemType
+	 * @return possible values for item or <code>null</code> if item has no fixed values
+	 */
+	public abstract String[] getValuesForItemType(String itemType);
+
+
+	/**
+	 * Check if type is supporting <code>incvalueforeachcopy</code> parameter.
+	 * Default implementation return allways <code>false</code>, overwrite in component if 
+	 * real implementation is needed, in other words, if in component there is some
+	 * type that supports <code>incvalueforeachcopy</code> parameter. 
+	 * @param type
+	 * @return <code>true</code> if <code>incvalueforeachcopy</code> is supported <code>false</code> othewise.
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		return false;
+		
+	}
+
+
+	/**
+	 * Items max occurrence count in one script. Default implementation is
+	 * unbounded and {@link AbstractComponent#MAX_OCCURS_UNBOUNDED} is returned. 
+	 * Component can overwrite this implementation if has items that have limited number
+	 * of items occurrences in one script.
+	 * @param itemName
+	 * @return item max occurrence if defined or {@link AbstractComponent#MAX_OCCURS_UNBOUNDED}.
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return MAX_OCCURS_UNBOUNDED;
+	}
+
+
+	/**
+	 * Get variables for that component.
+	 * @return variables of that component type.
+	 */
+	public abstract AbstractVariables getVariables();
+
+
+	/**
+	 * Check if this type and value has some limitations to other values.
+	 * 
+	 * @see AbstractComponent#isTypeDisabledByTypeAndValue(String, String, String)
+	 * 
+	 * @param type
+	 * @param value
+	 * @return <code>false</code> as default. Extending components may overwrite this if needed.
+	 */
+	public boolean hasTypeLimitationsForOtherValues(String type, String value) {		
+		return false;
+	}
+	
+	/**
+	 * Check that is a type disabled by some other type and value.
+	 * 
+	 * @see AbstractComponent#hasTypeLimitationsForOtherValues(String, String)
+	 * 
+	 * @param selectedType type that may disable some other type
+	 * @param selectedValue value of type that may disable some other type
+	 * @param typeToDisable type to be disabled by selected type and value
+	 * @return <code>false</code> as default. Extending components may overwrite this if needed.
+	 */
+	public boolean isTypeDisabledByTypeAndValue(String selectedType, String selectedValue, String typeToDisable) {
+		return false;
+	}	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,487 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+
+/**
+ * Abstract class for all Values, e.g. one contact can have n. values for field phone number.
+ */
+
+public abstract class AbstractValue {
+	
+	/**
+	 * Empty value for int
+	 */
+	public static final int NULL_VALUE = 0;
+	/**
+	 * Empty string
+	 */
+	public static final String EMPTY_STRING = "";
+	/**
+	 * UI text for random value 
+	 */
+	public static final String RANDOM_TEXT = "<RND>";
+	
+	/**
+	 * UI text for edit mode
+	 */
+	public static final String RANDOM_TEXT_NOT_RANDOM = "Edit mode";
+
+	/**
+	 * UI text for incvalueforeachcopy XML value
+	 * @see AbstractComponent#INCVALUEFOREACHCOPY_PARAMETER_ID
+	 */
+	public static final String RANDOM_TEXT_INC_FOR_EACH_COPY = "Increase for each copy";// incvalueforeachcopy"
+	/**
+	 * Short UI text for incvalueforeachcopy XML value
+	 */
+	public static final String RANDOM_TEXT_INC_FOR_EACH_COPY_SHORT = "(Inc=true)";// incvalueforeachcopy"
+	/**
+	 * UI text for random max length
+	 */
+	public static final String RANDOM_TEXT_MAX_LENGTH = "Random - Max length";
+	/**
+	 * UI text for random default length
+	 */
+	public static final String RANDOM_TEXT_DEFAULT_LENGTH = "Random - Default length";
+	/**
+	 * UI text for random custom length
+	 */
+	public static final String RANDOM_TEXT_USER_DEFINED_LENGTH = "Random - Custom length";
+	/**
+	 * Default value for user defined length for custom random length
+	 */
+	public static final int USER_DEFINED_DEFAULT_LENGTH = 100;
+
+	/**
+	 * Long UI text for random max length
+	 */
+	public static final String RANDOM_TEXT_MAX_LENGTH_LONG = "Random value, max length";
+	/**
+	 * Long UI text for random custom length
+	 */
+	public static final String RANDOM_TEXT_DEFAULT_LENGTH_LONG = "Random value, default length";
+	/**
+	 * Long  UI text for random custom length
+	 */
+	public static final String RANDOM_TEXT_USER_DEFINED_LENGTH_LONG = "Random value, custom length";
+
+	
+	/**
+	 * Value
+	 */
+	private String value;
+	/**
+	 * Type
+	 */
+	private String type;
+	/**
+	 * Is this value random
+	 */
+	private boolean isRandom;
+	/**
+	 * Amount of this value
+	 */
+	private int amount;
+	/**
+	 * ID of this value
+	 */
+	private int id;
+	/**
+	 * Max amount of this value
+	 */
+	private int maxAmount;
+	/**
+	 * Random type of this value
+	 */
+	private ModeTypes randomType;
+	/**
+	 * Custom random value length of this value
+	 */
+	private int randomValueLength;
+	/**
+	 * Is this value a contact set reference
+	 */
+	private boolean isContactSetReference = false;
+	
+	/**
+	 * If component has additional parameters, like type
+	 */
+	private Map<String, String>additionalParameters = null;	
+	
+	/**
+	 * Enumeration for different mode types
+	 */
+	public enum ModeTypes{
+		RandomTypeNotRandom,
+		RandomTypeDefaultLength,
+		RandomTypeMaxLength,
+		RandomTypeUserDefinedLength,
+		ModeTypeIncValueForEachCopy
+	}
+	
+	@SuppressWarnings("unused")
+	private AbstractValue(){
+		//No empty constructor always have to have type for value
+	}
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to RandomTypes.RandomTypeNormalLenght
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	protected AbstractValue(String type){
+		setType(type);
+		setValue(EMPTY_STRING);
+		setRandom(true);
+		setModeType(ModeTypes.RandomTypeDefaultLength);
+		setAmount(NULL_VALUE);
+		setRandomValueLenght(NULL_VALUE);
+		setId(NULL_VALUE);
+		setMaxAmount(NULL_VALUE);
+	}
+	
+	/**
+	 * Get String values for random value selection, used e.g. as CCombo values
+	 * 
+	 * @return random values
+	 */
+	public static String[] getModeValues(){
+		String [] values = new String[]{
+				RANDOM_TEXT_NOT_RANDOM, 
+				RANDOM_TEXT_DEFAULT_LENGTH, 
+				RANDOM_TEXT_MAX_LENGTH,
+				RANDOM_TEXT_USER_DEFINED_LENGTH};
+		return values;
+	}
+	/**
+	 * Get String values for random value selection, used e.g. as CCombo values
+	 * 
+	 * @return random values
+	 */
+	public static String[] getModeValuesForFixedValues(){
+		String [] values = new String[]{
+				RANDOM_TEXT_NOT_RANDOM, 
+				RANDOM_TEXT_DEFAULT_LENGTH};
+		return values;
+	}	
+	
+	/**
+	 * Get String values for random value selection, used e.g. as CCombo values
+	 * 
+	 * @return random values
+	 */
+	public static String[] getModeValuesForSupportingIncValueForeEachCopy(){
+		String [] values = new String[]{
+				RANDOM_TEXT_NOT_RANDOM, 
+				RANDOM_TEXT_DEFAULT_LENGTH, 
+				RANDOM_TEXT_MAX_LENGTH,
+				RANDOM_TEXT_USER_DEFINED_LENGTH,		
+				RANDOM_TEXT_INC_FOR_EACH_COPY
+				};
+		return values;
+	}		
+
+	/**
+	 * get value
+	 * @return value
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * Set the value, will remove forbidden characters for XML content by using
+	 * CreatorXML.removeForbiddenChars(String)
+	 * @param value
+	 */
+	public void setValue(String value) {
+		this.value = CreatorEditorSettings.getInstance().replaceForbiddenChars(value);
+	}
+
+	/**
+	 * Is this value random or not
+	 * @return true if it is a random value
+	 */
+	public boolean isRandom() {
+		return isRandom;
+	}
+
+	/**
+	 * Setting this value as random or not random. 
+	 * @param isRandom if false also sets this.randomType = RandomTypes.RandomTypeNotRandom
+	 */
+	public void setRandom(boolean isRandom) {
+		this.isRandom = isRandom;
+		if(!isRandom){
+			this.randomType = ModeTypes.RandomTypeNotRandom;
+		}
+	}
+
+	/**
+	 * Get amout of this value
+	 * @return amount
+	 */
+	public int getAmount() {
+		return amount;
+	}
+
+	/**
+	 * Set amount of this value
+	 * @param amount
+	 */
+	public void setAmount(int amount) {
+		this.amount = amount;
+	}
+
+	/**
+	 * Get random type of this value
+	 * @return randomtype
+	 */
+	public ModeTypes getModeType() {
+		return randomType;
+	}
+
+	/**
+	 * Set random type. 
+	 * @param modeType if RandomTypes.RandomTypeNotRandom given
+	 * also value set to not random, otherwise also set to random.
+	 */
+	public void setModeType(ModeTypes modeType) {
+		this.randomType = modeType;
+		if(modeType == ModeTypes.RandomTypeNotRandom || modeType == ModeTypes.ModeTypeIncValueForEachCopy){
+			this.isRandom = false;
+		}
+		else{
+			this.isRandom = true;
+		}
+	}
+	
+	/**
+	 * Get random value text by this value random type
+	 * @return text to show in UI
+	 */
+	public String getModeValueText(){
+		String txt ;
+		switch (getModeType()) {
+		case RandomTypeNotRandom:
+			txt = RANDOM_TEXT_NOT_RANDOM;
+			break;
+		case RandomTypeDefaultLength:
+			txt = RANDOM_TEXT_DEFAULT_LENGTH;
+			break;
+		case RandomTypeMaxLength:
+			txt = RANDOM_TEXT_MAX_LENGTH;
+			break;
+		case RandomTypeUserDefinedLength:
+			txt = RANDOM_TEXT_USER_DEFINED_LENGTH;
+			break;
+		case ModeTypeIncValueForEachCopy:
+			txt = RANDOM_TEXT_INC_FOR_EACH_COPY;
+			break;				
+		default:
+			txt = EMPTY_STRING;
+			break;
+		}
+		return txt;
+	}
+
+	/**
+	 * Get random type by random type text
+	 * @param mode
+	 * @return random type
+	 */
+	public static ModeTypes getModeTypeByText(String mode) {
+		
+		if(mode == null || mode.equals(RANDOM_TEXT_NOT_RANDOM)){
+			return ModeTypes.RandomTypeNotRandom;
+		}
+		else if(mode.equals(RANDOM_TEXT_DEFAULT_LENGTH) || mode.equals(RANDOM_TEXT_DEFAULT_LENGTH_LONG) ){
+			return ModeTypes.RandomTypeDefaultLength;
+		}
+		else if(mode.equals(RANDOM_TEXT_MAX_LENGTH) || mode.equals(RANDOM_TEXT_MAX_LENGTH_LONG) ){
+				return ModeTypes.RandomTypeMaxLength;
+		}
+		else if(mode.equals(RANDOM_TEXT_USER_DEFINED_LENGTH) || mode.equals(RANDOM_TEXT_USER_DEFINED_LENGTH_LONG)){
+			return ModeTypes.RandomTypeUserDefinedLength;
+		}		
+		else if(mode.equals(RANDOM_TEXT_INC_FOR_EACH_COPY)){
+			return ModeTypes.ModeTypeIncValueForEachCopy;
+		}				
+		else{
+			return ModeTypes.RandomTypeNotRandom;
+		}
+		
+	}
+
+	/**
+	 * Get user defined value for random length
+	 * @return random value length
+	 */
+	public int getRandomValueLenght() {
+		return randomValueLength;
+	}
+
+	/**
+	 * Setting user defined length to random value
+	 * @param randomValueLenght if set to > 0 random type is also set to RandomTypes.RandomTypeUserSetLength
+	 * if set to <= random type is also set to RandomTypes.RandomTypeDefaultLenght
+	 */
+	public void setRandomValueLenght(int randomValueLenght) {
+		this.randomValueLength = randomValueLenght;
+		if(randomValueLenght > 0){
+			setModeType(ModeTypes.RandomTypeUserDefinedLength);
+		}else{
+			//value len cannot be 0, so setting default len instead
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+	}
+
+	
+	/**
+	 * Get type
+	 * @return type of this value
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Set type
+	 * @param type
+	 */
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * Get ID
+	 * @return id of this value
+	 */
+	public int getId() {
+		return id;
+	}
+
+	/**
+	 * Set ID
+	 * @param id of this value
+	 */
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	/**
+	 * Get max amount
+	 * @return maxAmount of this value
+	 */
+	public int getMaxAmount() {
+		return maxAmount;
+	}
+
+	/**
+	 * Set Max amount
+	 * @param maxAmount of this value
+	 */
+	public void setMaxAmount(int maxAmount) {
+		this.maxAmount = maxAmount;
+	}
+
+	/**
+	 * Set this value to contact set reference
+	 * @param isContactSetReference <code>true</code> if this value is contact set reference
+	 * <code>false</code> otherwise.
+	 */
+	public void setContactSetReference(boolean isContactSetReference) {
+		this.isContactSetReference  = isContactSetReference;
+		
+	}
+
+	/**
+	 * Is this value a contact set referece
+	 * @return <code>true</code> if its a contact set reference, <code>false</code> otherwise.
+	 */
+	public boolean isContactSetReference() {
+		return isContactSetReference;
+	}
+
+	/**
+	 * Get additional parameters
+	 * @return additionalParameters
+	 */
+	public Map<String, String> getAdditionalParameters() {
+		if(additionalParameters == null){
+			additionalParameters = new LinkedHashMap<String, String>();
+		}		
+		return additionalParameters;
+	}
+
+
+	/**
+	 * Set additional parameters
+	 * @param additionalParameters
+	 */
+	public void setAdditionalParameters(Map<String, String> additionalParameters) {
+		this.additionalParameters = additionalParameters;
+	}
+	
+
+	/**
+	 * Add one additional parameter
+	 * @param type
+	 * @param value
+	 */
+	public void addAdditionalParameter(String type, String value) {
+		getAdditionalParameters().put(type, CreatorEditorSettings.getInstance().replaceForbiddenChars(value));
+	}
+	
+	/**
+	 * Get additional parameter
+	 * @param type
+	 * @return value, or null if not exist
+	 */
+	public String getAdditionalParameter(String type) {
+		return getAdditionalParameters().get(type);
+	}	
+	
+	/**
+	 * Does this component have some additional parameters
+	 * @return true if this component has some additional parameter, false otherwise
+	 */
+	public boolean hasAdditionalParameters(){
+		return additionalParameters != null && getAdditionalParameters().size() > 0 ? true : false;
+	}
+
+	/**
+	 * Removes all additional parameters
+	 * Note: attributes is not going to be removed. Use {@link AbstractComponent#removeAllAttributes()}
+	 */
+	public void removeAdditionalParameters() {
+		additionalParameters = new LinkedHashMap<String, String>();
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/AbstractVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Abstract super class for variables of one type.
+ */
+public abstract class AbstractVariables {
+	
+	/**
+	 * ID for max random length 
+	 */
+	public static final String RANDOM_LEN_MAX_XML_VALUE = "max";
+
+	/**
+	 * ID for default random length
+	 */
+	public static final String RANDOM_LEN_DEFAULT_XML_VALUE = "default";
+
+	/**
+	 * "yes" and "no" values
+	 */
+	public static final String YES_NO_TYPES_AS_COMMA_SEPARATED_STRING [] = {"yes", "no"};
+	
+	/**
+	 * UI help text for date time format
+	 */
+	public static final String DATE_TIME_FORMAT = "YYYY-MM-DDTHH:MM:SS";
+	
+	/**
+	 * UI help text for date format
+	 */
+	public static final String DATE_FORMAT = "YYYY-MM-DD";
+	
+	/**
+	 * UI Help text for date and date time usage 
+	 */
+	public static final String DATE_TIME_AND_DATE_FORMAT_HELP_TEXT = "For date time fields use format: '" 
+		+DATE_TIME_FORMAT +"' and for date fields use format: '" +DATE_FORMAT +"'.";
+	
+	/**
+	 * UI Help text for date usage
+	 */
+	public static final String DATE_FORMAT_HELP_TEXT = "For date fields use format: '" 
+		+DATE_FORMAT +"'.";
+
+	/**
+	 * UI help text for coordinate format
+	 */
+	public static final String COORDINATE_FORMAT = "-nn.nnnn – nn.nnnn";
+	
+	/**
+	 * UI help text for coordinate format usage
+	 */
+	public static final String COORDINATE_FORMAT_HELP_TEXT = "For latitude, longitude and altitude use format: '" +COORDINATE_FORMAT +"'."
+		+" Positive latitude means north and negative south, zero point is Equator. " +
+				"Positive longitude means east and negative west, zero point is Prime Meridian. " +
+				"For altitude zero point is sea level.";
+		
+	
+	/**
+	 * Storage for component items to be shown in UI.
+	 * First String is key to XML element name and second String is shown in UI.
+	 */
+	protected Map<String, String> items = null;
+	
+	/**
+	 * Storage for additional items, not to be shown in UI. But even when these items are not shown in UI
+	 * they are allowed to add to script. Most likely those are XML structure elements when XML is hidden
+	 * from user to. Or XML typing information what's hidden from user. 
+	 */
+	protected Map<String, String> additionalItems = null;
+	
+	/**
+	 * Storage for fixed values of certain item type to be shown in UI.
+	 * First String is key to XML element name and second String table is values able to set to element.
+	 * Values are set as they appear in XML and UI.
+	 */
+	protected Map<String, String[]> itemsValues = null;
+	
+	/**
+	 * Storage for max occurs of certain item type in one script.
+	 */
+	protected Map<String, Integer> maxOccur;
+	
+	/**
+	 * Storage for Tip Texts of certain item type.
+	 */
+	protected Map<String, String> tipTexts;		
+	
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return a component class implementing {@link AbstractVariables}
+	 */
+	protected abstract AbstractVariables getInstanceImpl();
+
+
+	/**
+	 * Get XML element name by value
+	 * @param value
+	 * @return key if found, null otherwise
+	 */
+	public String getIdByValue(String value) {
+		
+		if(value == null){
+			return null;
+		}
+		
+		Collection<String> keys = getItemIDs();
+		for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
+			String key = (String) iterator.next();
+			String _value = getInstanceImpl().items.get(key);
+			if (_value.equals(value)) {
+				return key;
+			}
+		}
+
+		//If there is additional items added, checkin also it there is value
+		if(getInstanceImpl().additionalItems != null){
+			//If value is null, it might be sub value e.g. email in <attendees><attendee><email>...
+			Collection<String> subkeys = getInstanceImpl().additionalItems.keySet();
+			for (Iterator<String> iterator = subkeys.iterator(); iterator.hasNext();) {
+				String key = (String) iterator.next();
+				String _value = getInstanceImpl().additionalItems.get(key);
+				if (_value.equals(value)) {
+					return key;
+				}
+			}		
+		}
+		//Or if id was not found at all, its not a supported value/id
+		return null;
+
+	}	
+
+	/**
+	 * Get item ID:s (match to element name in XML <contact><element name></element
+	 * name></contact>)
+	 * 
+	 * @return item ID:s
+	 */
+	public Collection<String> getItemIDs() {
+		
+		return getInstanceImpl().items.keySet();
+		
+	}
+
+	/**
+	 * Get Item values (showable names)
+	 * @return item names
+	 */
+	public Collection<String> getItemValues() {
+		
+		return getInstanceImpl().items.values();
+	}
+
+	/**
+	 * Get item ID:s (match to element name in XML <contact><element name></element
+	 * name></contact>)
+	 * 
+	 * @return item ID:s
+	 */
+	public String[] getItemIDsAsString() {
+		return (String[]) getItemIDs().toArray(new String[0]);
+	}
+
+	/**
+	 * Get Item values (showable names)
+	 * @return item names
+	 */
+	public String[] getItemValuesAsString() {
+		Collection<String> col = getItemValues();
+		String[] arr = (String[]) col.toArray(new String[0]);
+		return arr;
+	}
+
+	/**
+	 * Get value by XML element name
+	 * @param id
+	 * @return value
+	 */
+	public String getValueById(String id) {
+		if(id == null){
+			return null;
+		}
+		String id_ = id.toLowerCase();
+		String value = getInstanceImpl().items.get(id_);
+		//If value is null, it might be sub value e.g. email in <attendees><attendee><email>...
+		if (value == null && getInstanceImpl().additionalItems != null){
+			value = getInstanceImpl().additionalItems.get(id_);
+		}
+		return value;
+	}	
+	
+	/**
+	 * Get fixed values for type. E.g. Message can have values "read" and "new" for item "status".
+	 * @param id - ID of the item (element type in XML).
+	 * @return possible values or <code>null</code> if item type has no 
+	 * fixed values or item type was not found.
+	 */
+	public String[] getValuesForItemType(String itemType){
+		if(getInstanceImpl().itemsValues == null || getValueById(itemType) == null){
+			return null;
+		}
+		else{
+			String [] values = getInstanceImpl().itemsValues.get(itemType);
+			if(values == null || values.length < 1){
+				return null;
+			}else{
+				return values;
+			}
+		}
+	}
+
+	/**
+	 * Items max occurrence count in one script. Default implementation is
+	 * unbounded and {@link AbstractComponent#MAX_OCCURS_UNBOUNDED} is returned. 
+	 * Component can overwrite this implementation if has items that have limited number
+	 * of items occurrences in one script.
+	 * @param itemName
+	 * @return item max occurrence if defined or {@link AbstractComponent#MAX_OCCURS_UNBOUNDED}.
+	 */
+	public int itemMaxOccur(String itemName) {
+		
+		if(maxOccur == null){		
+			return AbstractComponent.MAX_OCCURS_UNBOUNDED;
+		}else{
+			Integer maxOcc = maxOccur.get(itemName);			
+			if(maxOcc != null){
+				int occ = maxOcc.intValue();
+				if(occ > 0){
+					return occ;
+				}
+			}
+		}
+		return AbstractComponent.MAX_OCCURS_UNBOUNDED;
+	}
+
+
+	/**
+	 * Get Tip Text to item type.
+	 * @param itemType
+	 * @return TipText or <code>null</code> if not set.
+	 */
+	public String getTipText(String itemType) {
+
+		if(tipTexts == null || itemType == null){
+			return null;			
+		}else{
+			return tipTexts.get(itemType);
+		}
+		
+	}
+
+
+	/**
+	 * Check if mode is enabled for key. Default implementation return <code>true</code>,
+	 * component variables can overwrite this if special handling is needed.
+	 * @param key
+	 * @return <code>true</code> if mode is enabled.
+	 */
+	public boolean isModeEnabledForKey(String key) {
+		return true;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/ComponentServices.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,193 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import com.nokia.s60tools.creator.components.bookmark.Bookmark;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkFolder;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkFolderValue;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkValue;
+import com.nokia.s60tools.creator.components.calendar.Calendar;
+import com.nokia.s60tools.creator.components.calendar.CalendarValue;
+import com.nokia.s60tools.creator.components.connectionmethod.ConnectionMethod;
+import com.nokia.s60tools.creator.components.connectionmethod.ConnectionMethodValue;
+import com.nokia.s60tools.creator.components.contact.Contact;
+import com.nokia.s60tools.creator.components.contact.ContactGroup;
+import com.nokia.s60tools.creator.components.contact.ContactGroupValue;
+import com.nokia.s60tools.creator.components.contact.ContactSet;
+import com.nokia.s60tools.creator.components.contact.ContactSetValue;
+import com.nokia.s60tools.creator.components.contact.ContactValue;
+import com.nokia.s60tools.creator.components.filetype.FileType;
+import com.nokia.s60tools.creator.components.filetype.FileTypeValue;
+import com.nokia.s60tools.creator.components.impsserver.IMPSServer;
+import com.nokia.s60tools.creator.components.impsserver.IMPSServerValue;
+import com.nokia.s60tools.creator.components.landmark.Landmark;
+import com.nokia.s60tools.creator.components.landmark.LandmarkValue;
+import com.nokia.s60tools.creator.components.log.Log;
+import com.nokia.s60tools.creator.components.log.LogValue;
+import com.nokia.s60tools.creator.components.messaging.MailBox;
+import com.nokia.s60tools.creator.components.messaging.MailBoxValue;
+import com.nokia.s60tools.creator.components.messaging.Message;
+import com.nokia.s60tools.creator.components.messaging.MessageValue;
+import com.nokia.s60tools.creator.components.note.Note;
+import com.nokia.s60tools.creator.components.note.NoteValue;
+import com.nokia.s60tools.creator.components.savedpage.SavedPage;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageFolder;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageFolderValue;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Helper class to get a real implementing class of {@link AbstractComponent} 
+ * and {@link AbstractValue} -classes.
+ */
+public class ComponentServices {
+	
+	/**
+	 * Get a component by String in XML file (<xs:complexType>)
+	 * @param componentType
+	 * @return a Component, null if not found or elementName was null,
+	 * a UnknownCompoment if component was unknown 
+	 */
+	public static AbstractComponent getComponentByXMLElementName(String componentType){
+		
+		if(componentType == null){
+			return null;
+		}
+		
+		if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_XML_ELEMENT)){
+			return new Contact(AbstractComponent.NULL_ID);
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_NOTE_XML_ELEMENT)){
+			return new Note(AbstractComponent.NULL_ID);
+		}	
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_BOOKMARK_XML_ELEMENT)){
+			return new Bookmark(AbstractComponent.NULL_ID);
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_BOOKMARK_FOLDER_XML_ELEMENT)){
+			return new BookmarkFolder(AbstractComponent.NULL_ID);
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_SAVED_PAGE_XML_ELEMENT)){
+			return new SavedPage(AbstractComponent.NULL_ID);
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER_XML_ELEMENT)){
+			return new SavedPageFolder(AbstractComponent.NULL_ID);
+		}	
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_LOG_XML_ELEMENT)){
+			return new Log(AbstractComponent.NULL_ID);
+		}	
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_IMPS_SERVER_XML_ELEMENT)){
+			return new IMPSServer(AbstractComponent.NULL_ID);
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONNECTION_METHOD_XML_ELEMENT)){
+			return new ConnectionMethod(AbstractComponent.NULL_ID);
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CALENDAR_XML_ELEMENT)){
+			return new Calendar(AbstractComponent.NULL_ID);
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_MAIL_BOX_XML_ELEMENT)){
+			return new MailBox(AbstractComponent.NULL_ID);
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_MESSAGE_XML_ELEMENT)){
+			return new Message(AbstractComponent.NULL_ID);
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_SET_XML_ELEMENT)){
+			return new ContactSet(AbstractComponent.NULL_ID);
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_GROUP_XML_ELEMENT)){
+			return new ContactGroup(AbstractComponent.NULL_ID);
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_LANDMARK_XML_ELEMENT)){
+			return new Landmark(AbstractComponent.NULL_ID);
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_FILE_XML_ELEMENT)){
+			return new FileType(AbstractComponent.NULL_ID);
+		}			
+		else{ 
+			return new UnknownCompoment(AbstractComponent.NULL_ID);
+		}
+		
+	}
+	
+	/**
+	 * Get a component by String in XML file (<xs:complexType>)
+	 * @param componentType
+	 * @return a Component, null if not found or elementName was null,
+	 * a UnknownValue if component was unknown
+	 */
+	public static AbstractValue getValueByXMLElementName(String componentType){
+		
+		
+		if(componentType == null){
+			return null;
+		}
+		
+		if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_XML_ELEMENT)){
+			return new ContactValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_NOTE_XML_ELEMENT)){
+			return new NoteValue();
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_BOOKMARK_XML_ELEMENT)){
+			return new BookmarkValue();
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_BOOKMARK_FOLDER_XML_ELEMENT)){
+			return new BookmarkFolderValue();
+		}	
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_SAVED_PAGE_XML_ELEMENT)){
+			return new SavedPageValue();
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER_XML_ELEMENT)){
+			return new SavedPageFolderValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_LOG_XML_ELEMENT)){
+			return new LogValue();
+		}		
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_IMPS_SERVER_XML_ELEMENT)){
+			return new IMPSServerValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONNECTION_METHOD_XML_ELEMENT)){
+			return new ConnectionMethodValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CALENDAR_XML_ELEMENT)){
+			return new CalendarValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_MAIL_BOX_XML_ELEMENT)){
+			return new MailBoxValue();
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_MESSAGE_XML_ELEMENT)){
+			return new MessageValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_SET_XML_ELEMENT)){
+			return new ContactSetValue();
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_GROUP_XML_ELEMENT)){
+			return new ContactGroupValue();
+		}			
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_LANDMARK_XML_ELEMENT)){
+			return new LandmarkValue();
+		}
+		else if(componentType.trim().equalsIgnoreCase(CreatorEditorSettings.TYPE_FILE_XML_ELEMENT)){
+			return new FileTypeValue();
+		}			
+		else{ 
+			return new UnknownValue();
+		}
+		
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/Components.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,290 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.xml.CreatorXML;
+
+/**
+ * Class for holding components in UI
+ */
+public class Components implements IComponentServices {
+	
+	private LinkedHashMap<String, Vector<AbstractComponent>> components;
+	private String fileName;
+	private String filePath;
+
+	
+
+	/**
+	 * @return all components
+	 */
+	public Map<String, Vector<AbstractComponent>> getComponents() {
+		if(components == null){
+			components = new LinkedHashMap<String,  Vector<AbstractComponent>>();
+		}			
+		return components;
+	}
+	
+	/**
+	 * Get Components of selected type
+	 * @param compoentType, component type as it is in {@link AbstractComponent} subclasses. Use
+	 * <code>AbstractComponent.getType()</code> to get component id.
+	 * @return a component, null if not exist
+	 */
+	public Vector<AbstractComponent> getComponents(String type) {
+		
+		return getComponents().get(type);
+	}
+	
+
+	/**
+	 * Add one component to components
+	 * @param component
+	 */
+	public void addComponent(AbstractComponent component) {
+		Vector<AbstractComponent> v = getComponents(component.getType());
+		if(v == null){
+			v = new Vector<AbstractComponent>();
+		}
+		if(v.contains(component)){
+			v.remove(component);
+			v.add(component);	
+		}else{
+			v.add(component);
+		}
+				
+		getComponents().put(component.getType(), v);
+	}
+
+	/**
+	 * Get keys to components added
+	 * @return Keys (Types)
+	 */
+	public Set<String> getComponentTypes() {		
+		return getComponents().keySet();
+	}
+
+	/**
+	 * Get Component by type and component String
+	 * @param componentType
+	 * @param componentToString
+	 * @return a Component or null if not found
+	 */
+	public AbstractComponent getComponentByTypeAndComponentString(
+			String componentType, String componentToString) {
+		
+		AbstractComponent wantedComponent = null;
+		
+		Vector<AbstractComponent> comps = getComponents(componentType);
+		//Looping through all components and seek wanted component 
+		for (Iterator<AbstractComponent> iterator = comps.iterator(); iterator.hasNext();) {
+			AbstractComponent comp = (AbstractComponent) iterator
+					.next();
+			if(componentToString.equals(comp.toString())){
+				wantedComponent = comp;
+				break;
+			}
+		}
+		
+		return wantedComponent;
+	}
+	
+	/**
+	 * Get Component by type and component String
+	 * @param componentToString
+	 * @return a Component or null if not found
+	 */
+	public AbstractComponent getComponentByComponentString(String componentToString) {
+
+		AbstractComponent wantedComponent = null;
+
+		Set<String> keys = getComponentTypes();
+		for (Iterator<String> typesIt = keys.iterator(); typesIt.hasNext();) {
+			String type = (String) typesIt.next();
+			Vector<AbstractComponent> comps = getComponents(type);
+			//Looping through all components and seek wanted component 
+			for (Iterator<AbstractComponent> iterator = comps.iterator(); iterator.hasNext();) {
+				AbstractComponent comp = (AbstractComponent) iterator
+						.next();
+				if(componentToString.equals(comp.toString())){
+					wantedComponent = comp;
+					break;
+				}
+			}
+		}
+		
+		return wantedComponent;
+	}	
+	
+
+	/**
+	 * Removes component from list
+	 * @param component
+	 */
+	public void remove(AbstractComponent component) {
+		Vector<AbstractComponent> v = getComponents(component.getType());
+		if(v == null){
+			return;
+		}
+		v.remove(component);
+		
+	}
+
+	/**
+	 * Get components as XML String
+	 * @return components
+	 */
+	public String toXMLString() {
+		CreatorXML xml = new CreatorXML(this);
+		return xml.toString();
+	}
+
+	/**
+	 * Update existing component
+	 * @param oldComp old existing component
+	 * @param editedComp new edited component
+	 */
+	public void updateComponent(AbstractComponent oldComp,
+			AbstractComponent editedComp) 
+			{
+		
+		Vector<AbstractComponent> v = getComponents(oldComp.getType());
+		if(v == null){
+			v = new Vector<AbstractComponent>();
+		}
+
+		if(v.contains(oldComp)){
+			v.remove(oldComp);
+			v.add(editedComp);	
+		}else{
+			v.add(editedComp);
+		}
+		
+				
+		getComponents().put(editedComp.getType(), v);		
+		
+	}
+
+	/**
+	 * Has this set of components one or more Contact Sets.
+	 * @return true if at least one contact set is found
+	 */
+	public boolean hasContactSets() {
+		return getComponents(CreatorEditorSettings.TYPE_CONTACT_SET) != null 
+			&& getComponents(CreatorEditorSettings.TYPE_CONTACT_SET).size() > 0 ? true : false;
+	}
+
+	/**
+	 * Removes all references to component
+	 * @param component
+	 */
+	public void removeReferencesToComponent(AbstractComponent component) {
+		
+		//All components
+		Collection<Vector<AbstractComponent>> values = getComponents().values();
+		
+		//Looping through all components
+		for (Iterator<Vector<AbstractComponent>> iterator = values.iterator(); iterator.hasNext();) {
+			//found all component types
+			Vector<AbstractComponent> componentsByType = (Vector<AbstractComponent>) iterator
+					.next();
+			//looping through all component types and found all components by that type
+			for (Iterator<AbstractComponent> iterator2 = componentsByType.iterator(); iterator2
+					.hasNext();) {
+				//Found a component
+				AbstractComponent comp = (AbstractComponent) iterator2
+						.next();
+				//IF that component has a reference to component which references wanted to remove, removing
+				if(comp.hasReferenceToAnotherComponent()){
+					if(comp.getReferenceToAnotherComponent().equals(component)){
+						comp.setReferenceToAnotherComponent(null);
+					}
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.IComponentServices#isReferencedByAnotherComponent(com.nokia.s60tools.creator.components.AbstractComponent)
+	 */
+	public boolean isReferencedByAnotherComponent(AbstractComponent component) {
+		
+		//All components
+		Collection<Vector<AbstractComponent>> values = getComponents().values();
+		
+		//Looping through all components
+		for (Iterator<Vector<AbstractComponent>> iterator = values.iterator(); iterator.hasNext();) {
+			//found all component types
+			Vector<AbstractComponent> componentsByType = (Vector<AbstractComponent>) iterator
+					.next();
+			//looping through all component types and found all components by that type
+			for (Iterator<AbstractComponent> iterator2 = componentsByType.iterator(); iterator2
+					.hasNext();) {
+				//Found a component
+				AbstractComponent comp = (AbstractComponent) iterator2
+						.next();
+				//IF that component has a reference to component which references wanted to remove, removing
+				if(comp.hasReferenceToAnotherComponent()){
+					if(comp.getReferenceToAnotherComponent().equals(component)){
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Set the name of the script file
+	 * @param fileName
+	 */	
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+	/**
+	 * Get the name of the script file.
+	 * @return fileName
+	 */
+	public String getFileName(){
+		return fileName;
+	}
+
+	/**
+	 * Set the full path of the script file
+	 * @param filePath
+	 */		
+	public void setFilePath(String filePath) {
+		this.filePath = filePath;
+	}
+	/**
+	 * Get the full path of the script file.
+	 * @return fileName
+	 */
+	public String getFilePath(){
+		return filePath;
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/IComponentServices.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.creator.components;
+
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * Interface to implement some component related functions
+ */
+public interface IComponentServices {
+
+	/**
+	 * If that component is referenced by any other component
+	 * @param component
+	 * @return true if any other component references to this component
+	 */
+	public abstract boolean isReferencedByAnotherComponent(
+			AbstractComponent component);
+
+	/**
+	 * @return all components
+	 */
+	public Map<String, Vector<AbstractComponent>> getComponents();
+
+	/**
+	 * Get Component by type and component String
+	 * @param componentToString
+	 * @return a Component or null if not found
+	 */
+	public AbstractComponent getComponentByComponentString(
+			String componentToString);
+
+	/**
+	 * Get Components of selected type
+	 * @param compoentType, component type as it is in {@link AbstractComponent} subclasses. Use
+	 * <code>AbstractComponent.getType()</code> to get component id.
+	 * @return a component, null if not exist
+	 */
+	public Vector<AbstractComponent> getComponents(String type);
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/UnknownCompoment.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Component type representing unknown component level element in XML Script.
+ * E.g. In XML, there was component, added by user manually (without Creator Script Editor)
+ * that is not supported with Creator Script Editor. 
+ * 
+ * This component type exist, because of error messages can be then full filled with detailed information. 
+ */
+public class UnknownCompoment extends AbstractComponent {
+
+	/**
+	 * Construction
+	 * @param id of component
+	 */
+	protected UnknownCompoment(int id) {
+		super(id);
+	}
+
+	/**
+	 * Not implemented
+	 */
+	public String getIdByValue(String value) {
+		return value;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_UNKNOWN;
+	}
+
+	/**
+	 * Not implemented
+	 */
+	public String getValueById(String id) {
+		return id;
+	}
+
+	/**
+	 * Not implemented
+	 */
+	public String getXMLElementName() {
+		return null;
+	}
+
+	/**
+	 * Not implemented
+	 */
+	public boolean isValid() {
+		return false;
+	}
+
+
+	/**
+	 * Not implemented
+	 */
+	public void updateEntryTypeSpecificDataFields(
+			AbstractComponent entryWithUpdatedData) {
+	}
+
+	/* Returns allways null.
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/UnknownValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components;
+
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Component value representing unknown component value in {@link UnknownCompoment} at XML Script.
+ * E.g. In XML, there was component, added by user manually (without Creator Script Editor)
+ * that is not supported with Creator Script Editor. 
+ * 
+ * This component type value exist, because of error messages can be then full filled with detailed information. 
+ */
+public class UnknownValue extends AbstractValue {
+	
+	/**
+	 * Default construction
+	 */
+	public UnknownValue(){
+		super(CreatorEditorSettings.TYPE_UNKNOWN);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/Bookmark.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing bookmark
+ */
+public class Bookmark extends AbstractComponent {
+
+
+	public Bookmark(int id) {
+		super(id);
+	}	
+	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_BOOKMARK;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return BookmarkVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return BookmarkVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_BOOKMARK_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return BookmarkVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return BookmarkVariables.getInstance();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing Bookmark folder
+ */
+public class BookmarkFolder extends AbstractComponent {
+
+
+	public BookmarkFolder(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_BOOKMARK_FOLDER;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return BookmarkFolderVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return BookmarkFolderVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_BOOKMARK_FOLDER_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return BookmarkFolderVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return BookmarkFolderVariables.getInstance();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolderValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of bookmark folder
+ */
+public class BookmarkFolderValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public BookmarkFolderValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public BookmarkFolderValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public BookmarkFolderValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public BookmarkFolderValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public BookmarkFolderValue() {
+		super(CreatorEditorSettings.TYPE_BOOKMARK_FOLDER);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkFolderVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for bookmar folder
+ */
+public class BookmarkFolderVariables extends AbstractVariables {
+	
+	
+	private static BookmarkFolderVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static BookmarkFolderVariables getInstance() {
+		
+		if(instance == null){
+			instance = new BookmarkFolderVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private BookmarkFolderVariables(){
+		init();
+	}
+
+
+	/**
+	 * UI text "Name"
+	 */
+	public static final String NAME = "Name";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(1);
+		  items.put("name",NAME);
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of bookmark
+ */
+public class BookmarkValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public BookmarkValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public BookmarkValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public BookmarkValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public BookmarkValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public BookmarkValue() {
+		super(CreatorEditorSettings.TYPE_BOOKMARK);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/bookmark/BookmarkVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.bookmark;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+public class BookmarkVariables extends AbstractVariables {
+	
+	
+	private static BookmarkVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static BookmarkVariables getInstance() {
+		
+		if(instance == null){
+			instance = new BookmarkVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private BookmarkVariables(){
+		init();
+	}
+
+	//
+	// Items (rows) for component 
+	//
+	public static final String NAME = "Name";
+	public static final String URL = "URL";
+	public static final String USERNAME = "Username";
+	public static final String PASSWORD = "Password";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(4);
+		  items.put("name",NAME);
+		  items.put("url",URL);
+		  items.put("username",USERNAME);
+		  items.put("password",PASSWORD);
+		 
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractVariables#getInstanceImpl()
+	 */
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/Calendar.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,220 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.calendar;
+
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.contact.ContactValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing Calendar
+ */
+public class Calendar extends AbstractComponent {
+
+	public Calendar(int id) {
+		super(id);
+	}	
+
+	public Calendar(int id, String eventType) {
+		this(id);
+		setEventType(eventType);
+	}	
+	
+	
+	/**
+	 * Get type for this Calendar event
+	 * @return
+	 */
+	public String getEventType() {
+		return getAdditionalParameter(TYPE_PARAMETER_ID);
+	}
+
+
+
+	/**
+	 * Set event type for this calendar event
+	 * @param eventType
+	 */
+	public void setEventType(String eventType) {
+		addAdditionalParameter(TYPE_PARAMETER_ID, eventType);
+	}
+
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_CALENDAR;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		// Calendar must have type
+		return getEventType() != null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return CalendarVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return CalendarVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_CALENDAR_XML_ELEMENT;
+	}
+	
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	public String toString() {
+	
+		Set<String> componentKeys = getKeys();
+		//Collection<String> values = comp.getAttributes().values();
+		
+		StringBuffer allFieldsB = new StringBuffer();
+		allFieldsB.append(getValueById( getEventType()));			
+		allFieldsB.append( COMPONENT_TYPE_SEPARATOR);
+		
+		//Amount (how many of this component will be added)
+		if(getAmount() > 0){
+			allFieldsB.append(" Amount=");
+			allFieldsB.append(getAmount());
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+		}
+		
+		//Store all attendees found to here
+		Vector <CalendarValue> attendees = new Vector<CalendarValue>();
+		
+		String itemlabel = new String();
+		Vector<AbstractValue> itemValue;
+		//Looping through one component, founding all fields from that component
+		for (Iterator<String> compValuesIt = componentKeys.iterator(); compValuesIt.hasNext();) {
+			itemlabel = (String) compValuesIt.next();
+			itemValue = getAttribute(itemlabel);
+			//get all values from values vector
+			for (Iterator<AbstractValue> iterator = itemValue.iterator(); iterator.hasNext();) {
+				AbstractValue absVal = iterator.next();
+				CalendarValue calVal = (CalendarValue)absVal;
+
+				//if value is not attendee, its a regular value
+				if(!calVal.isAttendee()){
+					addOneItemToBuffer(allFieldsB, itemlabel, calVal);									
+				}
+				//for attendee values, collecting them and gathering in the end all together
+				else{
+					attendees.add(calVal);
+				}				
+				
+			}
+			
+		}
+		
+		//If ther is attendees, adding them
+		if(attendees.size() > 0){
+			allFieldsB.append(CalendarVariables.ATTENDEES);
+			allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);			
+			for (Iterator<CalendarValue> iterator = attendees.iterator(); iterator.hasNext();) {
+				CalendarValue val = (CalendarValue) iterator.next();
+				allFieldsB.append(val.getValue());
+				allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+			}
+		}		
+		
+		
+		//deleting last ", " from list
+		if(allFieldsB.toString().endsWith(COMPONENT_ITEM_SEPARATOR)){
+			allFieldsB.delete(allFieldsB.length()-COMPONENT_ITEM_SEPARATOR.length(), allFieldsB.length());
+		}
+		return  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(allFieldsB.toString());
+	}
+
+
+
+	private void addOneItemToBuffer(StringBuffer allFieldsB, String itemlabel,
+			CalendarValue calVal) {
+		allFieldsB.append(itemlabel);
+		allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+		//If value is random value, showing in UI only short description (<RND>)
+		if(calVal.isRandom()){
+			allFieldsB.append(ContactValue.RANDOM_TEXT);
+		}else{
+			allFieldsB.append(calVal.getValue());
+		}
+		allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return CalendarVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return CalendarVariables.getInstance().itemMaxOccur(itemName);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return CalendarVariables.getInstance();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/CalendarValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.calendar;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of calendar
+ */
+public class CalendarValue extends AbstractValue {
+	
+	private boolean isAttendee = false;
+	private String attendeeEmail = null;
+	private String attendeeCommonName = null;
+
+	/**
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public CalendarValue(String type, String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(type, value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+
+	/**
+	 * Set amount and also maxamount as amount
+	 * For now in calendar there is no any other possible amount fields in calendar than maxamount in contact-set reference
+	 * So using always amount also as maxamount. If there is new requirement for amount in calendar, reimplement. 
+	 *	
+	 * @param amount -for amount and maxamount
+	 */
+	public void setAmount(int amount) {
+		super.setAmount(amount);
+		super.setMaxAmount(amount);
+	}
+
+	/**
+	 * 
+	 * @param value
+	 * @param amount
+	 */
+	public CalendarValue(String type, String value, int amount) {
+		this();
+		setValue(type, value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public CalendarValue(String type, String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(type, value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public CalendarValue(String type, String value) {
+		this();
+		setValue(type, value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public CalendarValue() {
+		super(CreatorEditorSettings.TYPE_CALENDAR);
+	}
+
+	/**
+	 * Is this value an attendee value
+	 * @return <code>true</code> if this is attendee <code>false</code> otherwise
+	 */
+	public boolean isAttendee() {
+		return isAttendee;
+	}
+
+	/**
+	 * Set this value to be an attendee value
+	 * @param isAttendee <code>true</code> if this is attendee, <code>false</code> otherwise
+	 */
+	public void setAttendee(boolean isAttendee) {
+		this.isAttendee = isAttendee;
+	}
+
+	/**
+	 * Get attendee email
+	 * @return attendee email
+	 */
+	public String getAttendeeEmail() {
+		return attendeeEmail;
+	}
+
+	/**
+	 * Get attendee common nane
+	 * @return attendeee common name
+	 */
+	public String getAttendeeCommonName() {
+		return attendeeCommonName;
+	}
+
+
+	/**
+	 * Set value by type. If type is "Attendee" using setAttendeeValue(value)
+	 * otherwise using setValue(String)
+	 * @param value
+	 * @param type as in ZML 
+	 */
+	public void setValue(String type, String value) {
+		
+		if (type != null) {
+			setType(type);
+			if (type.equalsIgnoreCase(CalendarVariables.ATTENDEEEMAIL_XML_ELEMENT)
+					|| type.equalsIgnoreCase(CalendarVariables.ATTENDEEEMAIL)) {
+				this.attendeeEmail = value;
+				setAttendee(true);
+			} else if (type.equalsIgnoreCase(CalendarVariables.ATTENDEECOMMONNAME_XML_ELEMENT)
+					|| type.equalsIgnoreCase(CalendarVariables.ATTENDEECOMMONNAME)) {
+				this.attendeeCommonName = value;
+				setAttendee(true);
+			}else if (type.equalsIgnoreCase(CalendarVariables.ATTENDEE)
+					|| type.equalsIgnoreCase(CalendarVariables.ATTENDEE_XML_ELEMENT)) {
+				setAttendeeValue(value);
+			}else {
+				setValue(value);
+			}
+
+		} else {
+			setValue(value);
+		}
+		
+	}	
+	
+	/**
+	 * Set attendee value, calling this will also set this object as attendee by using setAttendee(true) 
+	 * @param attendeeEmail - <code>null</code> not allowed.
+	 * @param attendeeCommonName or <code>null</code> if not set
+	 */
+	public void setAttendeeValue(String attendeeEmail, String attendeeCommonName) {
+		setAttendee(true);		
+		
+		this.attendeeEmail = attendeeEmail;
+		this.attendeeCommonName = attendeeCommonName;
+
+	}
+	
+	/**
+	 * Set attendee value, calling this will also set this object as attendee by using setAttendee(true) 
+	 * @param attendee with email and optional common name separated with '|'
+	 */
+	public void setAttendeeValue(String attendee) {
+		
+		if(attendee != null){
+
+			setAttendee(true);			
+
+			int separatorIndex = attendee.indexOf("|") ; 
+			if(separatorIndex != -1){
+				this.attendeeEmail = attendee.substring(0,separatorIndex).trim();
+				this.attendeeCommonName = attendee.substring(separatorIndex +1).trim();;
+				
+			}else{
+				this.attendeeEmail = attendee;				
+			}
+		}
+	}	
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#getValue()
+	 */
+	public String getValue() {
+
+		//In case of Attendee, there is two parameters in one value
+		if(isAttendee()){
+			if(getAttendeeCommonName() == null){
+				return getAttendeeEmail();
+			}else{
+				return getAttendeeEmail() + AbstractComponent.COMPONENT_TYPE_SEPARATOR
+					+getAttendeeCommonName();
+			}
+			
+		}
+		//In case of contact set reference, value is not set, but id is
+		else if(isContactSetReference()){
+			return ""+getId();
+		}
+		else{
+			return super.getValue();
+		}
+	}	
+	
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/calendar/CalendarVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,259 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.creator.components.calendar;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Variables for calendar
+ */
+public class CalendarVariables extends AbstractVariables {
+
+	public static final String STATUS_XML_ELEMENT = "status";
+
+	public static final String RECURRENTFREQUENCY_XML_ELEMENT = "recurrentfrequency";
+
+	public static final String ORGANIZEREMAIL_XML_ELEMENT = "organizeremail";
+
+	private static CalendarVariables instance;
+
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static CalendarVariables getInstance() {
+
+		if (instance == null) {
+			instance = new CalendarVariables();
+		}
+
+		return instance;
+	}
+
+	private CalendarVariables() {
+		init();
+		initFixedValues();	
+		initMaxOccurValues();
+	}
+	
+
+	
+	//
+	// Variables
+	//
+	public static final String SUMMARY = "Summary";
+	public static final String LOCATION = "Location";
+	public static final String DESCRIPTION = "Description";
+	public static final String STARTTIME = "Start time";
+	public static final String ENDTIME = "End time";
+	
+	public static final String CREATION_PERIOD_START_DATE = "Creation period start date";
+	public static final String CREATION_PERIOD_END_DATE = "Creation period end date";
+	
+
+	public static final String ALARMTIME = "Alarm time";
+	public static final String DATE = "Date";	
+
+	public static final String RECURRENTFREQUENCY = "Recurrent frequency";
+	public static final String RECURRENTINTERVAL = "Recurrent interval";
+	public static final String RECURRENTFROM = "Recurrent from";
+	public static final String RECURRENTTO = "Recurrent to";
+
+	public static final String SYNCHRONIZATION = "Synchronization";
+
+	public static final String ORGANIZERNAME = "Organizer name";
+	public static final String ORGANIZEREMAIL = "Organizer email";
+
+	public static final String ATTENDEES = "Attendees";
+	public static final String ATTENDEE = "Attendee";
+	public static final String ATTENDEE_XML_ELEMENT = "attendee";
+	public static final String ATTENDEECOMMONNAME = "Commonname";
+	public static final String ATTENDEEEMAIL = "Email";
+
+	public static final String ATTENDEECOMMONNAME_XML_ELEMENT = "commonname";
+	public static final String ATTENDEEEMAIL_XML_ELEMENT = "email";	
+	
+	public static final String SYNCHRONIZATION_XML_ELEMENT = "Synchronization";
+
+	public static final String STATUS = "Status";
+
+	public static final String PRIORITY = "Priority";	
+	
+	public static final String ATTENDEE_CONTACT_SET_REFERENCE  = "Attendee Contact Set ID";
+
+	public static final String RECURRENTFREQUENCY_POSSIBLE_VALUES_AS_COMMA_SEPARATED [] = {"not-repeated", "daily", "weekly", "monthly", "yearly"} ;	
+	public static final String RECURRENTFREQUENCY_POSSIBLE_VALUES_HELP_TEXT = "To do every second week occurrence calendar event, set '"
+		+RECURRENTFREQUENCY+"' to \"weekly\" and set '" +RECURRENTINTERVAL +"' to 2";
+	public static final String STATUS_POSSIBLE_VALUES_AS_COMMA_SEPARATED [] = {"tentative", "confirmed", "cancelled", "todoneedsaction", "todocompleted", "todoinprocess"};
+	public static final String PRIORITY_POSSIBLE_VALUES_HELP_TEXT = "high, normal, low, or integer values between 0 and 255. Integer values: high = 1, normal = 2, low = 3";
+
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(13);
+		items.put("summary", SUMMARY);
+		items.put("description", DESCRIPTION);
+		items.put("location", LOCATION);
+		items.put("starttime", STARTTIME);
+		items.put("endtime", ENDTIME);
+		
+		items.put("creationperiodstartdate", CREATION_PERIOD_START_DATE);
+		items.put("creationperiodenddate", CREATION_PERIOD_END_DATE);
+
+		items.put("alarmtime", ALARMTIME);
+
+		items.put(RECURRENTFREQUENCY_XML_ELEMENT, RECURRENTFREQUENCY);
+		items.put("recurrentinterval", RECURRENTINTERVAL);		
+		items.put("recurrentfrom", RECURRENTFROM);
+		items.put("recurrentto", RECURRENTTO);
+
+		items.put("synchronization", SYNCHRONIZATION);
+
+		items.put("organizername", ORGANIZERNAME);		
+		items.put(ORGANIZEREMAIL_XML_ELEMENT, ORGANIZEREMAIL);
+
+		items.put(ATTENDEE_XML_ELEMENT, ATTENDEE);
+		
+		items.put(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT, ATTENDEE_CONTACT_SET_REFERENCE);
+		
+
+		//Sub items (xml elements) is collected to own table, so they are not shown in UI 
+
+		additionalItems = new LinkedHashMap<String, String>(13);
+		additionalItems.put("attendees", ATTENDEES);
+		additionalItems.put(ATTENDEECOMMONNAME_XML_ELEMENT, ATTENDEECOMMONNAME);
+		additionalItems.put(ATTENDEEEMAIL_XML_ELEMENT, ATTENDEEEMAIL);	
+		
+		additionalItems.put("starttime", DATE);
+		additionalItems.put(STATUS_XML_ELEMENT, STATUS);
+		additionalItems.put("priority", PRIORITY);
+		
+		additionalItems.put(CreatorEditorSettings.TYPE_APPOINTMENT_XML_ELEMENT, CreatorEditorSettings.TYPE_APPOINTMENT);
+		additionalItems.put(CreatorEditorSettings.TYPE_EVENT_XML_ELEMENT, CreatorEditorSettings.TYPE_EVENT);
+		additionalItems.put(CreatorEditorSettings.TYPE_REMINDER_XML_ELEMENT, CreatorEditorSettings.TYPE_REMINDER);
+		additionalItems.put(CreatorEditorSettings.TYPE_TODO_XML_ELEMENT, CreatorEditorSettings.TYPE_TODO);
+		additionalItems.put(CreatorEditorSettings.TYPE_ANNIVERSARY_XML_ELEMENT, CreatorEditorSettings.TYPE_ANNIVERSARY);
+				
+		
+
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+		itemsValues.put(RECURRENTFREQUENCY_XML_ELEMENT, RECURRENTFREQUENCY_POSSIBLE_VALUES_AS_COMMA_SEPARATED);		
+		itemsValues.put(STATUS_XML_ELEMENT, STATUS_POSSIBLE_VALUES_AS_COMMA_SEPARATED);
+	}	
+	
+	
+	/**
+	 * Inits Max Occur valus for items
+	 */
+	private void initMaxOccurValues(){
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+		
+		Integer integerOne = new Integer (1);
+		
+		maxOccur.put(SUMMARY, integerOne );
+		maxOccur.put(DESCRIPTION, integerOne );
+		maxOccur.put(LOCATION, integerOne );
+		maxOccur.put(STARTTIME, integerOne );
+		maxOccur.put(ENDTIME, integerOne );		
+		maxOccur.put(CREATION_PERIOD_START_DATE, integerOne );
+		maxOccur.put(CREATION_PERIOD_END_DATE, integerOne );
+		maxOccur.put(ALARMTIME, integerOne );
+		maxOccur.put(RECURRENTFREQUENCY, integerOne );
+		maxOccur.put(RECURRENTINTERVAL, integerOne );		
+		maxOccur.put(RECURRENTFROM, integerOne );
+		maxOccur.put(RECURRENTTO, integerOne );
+		maxOccur.put(SYNCHRONIZATION, integerOne );
+		maxOccur.put(ORGANIZERNAME, integerOne );		
+		maxOccur.put(ORGANIZEREMAIL, integerOne );
+		
+		maxOccur.put(STATUS, integerOne);
+		maxOccur.put(PRIORITY, integerOne);		
+
+		maxOccur.put(ATTENDEES, integerOne);		
+
+	}		
+	
+	/**
+	 * Get Item values (showable names)
+	 * @return item names
+	 */
+	public String[] getItemValuesAsString(String type) {
+
+		String[] arr = null;
+
+		//TO-DO
+		if(type.equals(CreatorEditorSettings.TYPE_TODO_XML_ELEMENT)){
+			arr=new String[]{
+					SUMMARY, DESCRIPTION, STARTTIME ,ENDTIME, CREATION_PERIOD_START_DATE, CREATION_PERIOD_END_DATE, ALARMTIME, SYNCHRONIZATION, PRIORITY, STATUS
+					};
+			return arr;
+		}
+		//Reminder
+		else if(type.equals(CreatorEditorSettings.TYPE_REMINDER_XML_ELEMENT)){
+			arr=new String[]{
+					SUMMARY, DESCRIPTION, ALARMTIME, SYNCHRONIZATION, CREATION_PERIOD_START_DATE, CREATION_PERIOD_END_DATE
+					};
+			return arr;			
+		}		
+		//Anniversary
+		else if(type.equals(CreatorEditorSettings.TYPE_ANNIVERSARY_XML_ELEMENT)){
+			arr=new String[]{
+					SUMMARY, DESCRIPTION, DATE, ALARMTIME, SYNCHRONIZATION, CREATION_PERIOD_START_DATE, CREATION_PERIOD_END_DATE
+					};
+			return arr;	
+		}	
+		//Event (Day note)
+		else if(type.equals(CreatorEditorSettings.TYPE_EVENT_XML_ELEMENT)){
+			arr=new String[]{
+					SUMMARY, DESCRIPTION, STARTTIME, ENDTIME, CREATION_PERIOD_START_DATE, CREATION_PERIOD_END_DATE, ALARMTIME, SYNCHRONIZATION
+					};
+			return arr;			
+		}
+		//Appointment
+		else if(type.equals(CreatorEditorSettings.TYPE_APPOINTMENT)){
+			//return all others, but not priority and status
+			arr=new String[]{
+					SUMMARY, DESCRIPTION, LOCATION, STARTTIME, ENDTIME, CREATION_PERIOD_START_DATE, CREATION_PERIOD_END_DATE, ALARMTIME,
+					RECURRENTFROM, RECURRENTTO, RECURRENTFREQUENCY, RECURRENTINTERVAL,
+					SYNCHRONIZATION, ORGANIZERNAME, ORGANIZEREMAIL, ATTENDEE, 
+					CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE
+					};
+			return arr;			
+			
+		}
+		//Just in case else returning all
+		else{
+			return getItemValuesAsString();
+		}		
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractVariables#getInstanceImpl()
+	 */
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethod.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.connectionmethod;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing Connection method 
+ */
+public class ConnectionMethod extends AbstractComponent {
+
+
+	public ConnectionMethod(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_CONNECTION_METHOD;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return ConnectionMethodVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return ConnectionMethodVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_CONNECTION_METHOD_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return ConnectionMethodVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return ConnectionMethodVariables.getInstance().itemMaxOccur(itemName);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return ConnectionMethodVariables.getInstance();
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethodValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.connectionmethod;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of connection method
+ */
+public class ConnectionMethodValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public ConnectionMethodValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public ConnectionMethodValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public ConnectionMethodValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public ConnectionMethodValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public ConnectionMethodValue() {
+		super(CreatorEditorSettings.TYPE_CONNECTION_METHOD);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/connectionmethod/ConnectionMethodVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.connectionmethod;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for connection method
+ */
+public class ConnectionMethodVariables extends AbstractVariables {
+	
+	//
+	// Variables for XML element names
+	//
+	public static final String USEPROXY_XML_ELEMENT = "useproxy";
+	public static final String PROMPTPASSWORD_XML_ELEMENT = "promptpassword";
+	public static final String SECUREAUTHENTICATION_XML_ELEMENT = "secureauthentication";
+	public static final String DISABLE_TEXT_AUTH_XML_ELEMENT = "disabletextauth";
+	public static final String WAPWSOPTION_XML_ELEMENT = "wapwspoption";
+	public static final String DATACALLLINESPEED_XML_ELEMENT = "datacalllinespeed";
+	public static final String DATACALLTYPEISDN_XML_ELEMENT = "datacalltypeisdn";
+	public static final String PROTOCOLLTYPE_XML_ELEMENT = "protocoltype";
+	public static final String BEARERTYPE_XML_ELEMENT = "bearertype";
+	
+	/**
+	 * Only instance of this class
+	 */
+	private static ConnectionMethodVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static ConnectionMethodVariables getInstance() {
+		
+		if(instance == null){
+			instance = new ConnectionMethodVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private ConnectionMethodVariables(){
+		init();
+		initFixedValues();		
+		initMaxOccurValues();
+	}
+	
+	//
+	// Variables to show in UI
+	//
+	public static final String	CONNECTIONNAME	= "Connection name";
+	public static final String	BEARERTYPE	= "Bearer type";
+	public static final String	STARTPAGE	= "Start page";
+	public static final String	WAPWSPOPTION	= "WAP WSP option";
+	public static final String	PROTOCOLTYPE	= "Protocol type";
+	public static final String	SECUREAUTHENTICATION	= "Secure authentication";
+	public static final String	LOGINNAME	= "Login name";
+	public static final String	LOGINPASS	= "Login password";
+	public static final String	PROMPTPASSWORD	= "Prompt password";
+	public static final String	GATEWAYADDRESS	= "Gateway address";
+	public static final String	SUBNETMASK	= "Subnetmask";
+	public static final String	DEVICEIPADDR	= "Device IP address";
+	public static final String	IP4NAMESERVER1	= "IP v4 primary nameserver";
+	public static final String	IP4NAMESERVER2	= "IP v4 secondary nameserver";
+	public static final String	DATACALLTELNUMBER	= "Datacall phone number";
+	public static final String	DATACALLTYPEISDN	= "Datacall ISDN type";
+	public static final String	DATACALLLINESPEED	= "Datacall line speed";
+	public static final String	USEPROXY	= "Use proxy";
+	public static final String	PROXYSERVERADDRESS	= "Proxy server address";
+	public static final String	PROXYPORTNUMBER	= "Proxy port number";
+	public static final String	IP6NAMESERVER1	= "IP v6 primary nameserver";
+	public static final String	IP6NAMESERVER2	= "IP v6 secondary nameserver";
+	public static final String	DISABLETEXTAUTH	= "Disable plaintext authentication";
+	public static final String	WLANNAME	= "SSID of WLAN connection";
+	public static final String	WLANIPADDR	= "IP address of Device";
+	public static final String	WLANSECMODE	= "WLAN Security mode";
+	public static final String	WLANNETMODE	= "WLAN Network mode";
+	
+	//
+	// Fixed variables for certain item in UI
+	//
+	public static final String ALL_BEARERTYPE_TYPES_AS_COMMA_SEPARATED_STRING [] = {"WLAN", "GPRS", "Datacall", "HSGSM", "Embedded", "VPN", "LAN"};
+	public static final String ALL_PROTOCOLTYPE_TYPES_AS_COMMA_SEPARATED_STRING [] = {"IPV4", "IPV6"};
+	public static final String ALL_DATACALLTYPEISDN_TYPES_AS_COMMA_SEPARATED_STRING [] = {"Analogue", "ISDNv110", "ISDNv120"};
+	public static final String ALL_DATACALLLINESPEED_TYPES_AS_COMMA_SEPARATED_STRING [] = {"AUTOMATIC", "9600", "14400", "19200", "28800", "38400", "43200", "56000"};
+	public static final String ALL_WAPWSPOPTION_TYPES_AS_COMMA_SEPARATED_STRING [] = {"Connectionless", "Connectionoriented"};
+	
+	
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(27);
+		items.put("connectionname", CONNECTIONNAME	);
+		items.put(BEARERTYPE_XML_ELEMENT, BEARERTYPE	);
+		items.put("startpage", STARTPAGE	);
+		items.put(WAPWSOPTION_XML_ELEMENT, WAPWSPOPTION	);
+		items.put(PROTOCOLLTYPE_XML_ELEMENT, PROTOCOLTYPE	);
+		items.put("loginname", LOGINNAME	);
+		items.put(SECUREAUTHENTICATION_XML_ELEMENT, SECUREAUTHENTICATION	);
+		items.put("loginpass", LOGINPASS	);
+		items.put(PROMPTPASSWORD_XML_ELEMENT, PROMPTPASSWORD	);
+		items.put("gatewayaddress", GATEWAYADDRESS	);
+		items.put("subnetmask", SUBNETMASK	);
+		items.put("deviceipaddr", DEVICEIPADDR	);
+		items.put("ip4nameserver1", IP4NAMESERVER1	);
+		items.put("ip4nameserver2", IP4NAMESERVER2	);
+		items.put("datacalltelnumber", DATACALLTELNUMBER	);
+		items.put(DATACALLTYPEISDN_XML_ELEMENT, DATACALLTYPEISDN	);
+		items.put(DATACALLLINESPEED_XML_ELEMENT, DATACALLLINESPEED	);
+		items.put(USEPROXY_XML_ELEMENT, USEPROXY	);
+		items.put("proxyserveraddress", PROXYSERVERADDRESS	);
+		items.put("proxyportnumber", PROXYPORTNUMBER	);
+		items.put("ip6nameserver1", IP6NAMESERVER1	);
+		items.put("ip6nameserver2", IP6NAMESERVER2	);
+		items.put(DISABLE_TEXT_AUTH_XML_ELEMENT, DISABLETEXTAUTH	);
+		items.put("wlanname", WLANNAME	);
+		items.put("wlanipaddr", WLANIPADDR	);
+		items.put("wlansecmode", WLANSECMODE	);
+		items.put("wlannetmode", WLANNETMODE	);
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+		itemsValues.put(BEARERTYPE_XML_ELEMENT, ALL_BEARERTYPE_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(PROTOCOLLTYPE_XML_ELEMENT, ALL_PROTOCOLTYPE_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(DATACALLTYPEISDN_XML_ELEMENT, ALL_DATACALLTYPEISDN_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(DATACALLLINESPEED_XML_ELEMENT, ALL_DATACALLLINESPEED_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(WAPWSOPTION_XML_ELEMENT, ALL_WAPWSPOPTION_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(DISABLE_TEXT_AUTH_XML_ELEMENT, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(SECUREAUTHENTICATION_XML_ELEMENT, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(PROMPTPASSWORD_XML_ELEMENT, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(USEPROXY_XML_ELEMENT, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		
+	}	
+	
+	/**
+	 * Inits Max Occur values for items, all items can occur only once.
+	 */
+	private void initMaxOccurValues(){
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+		
+		Integer integerOne = new Integer (1);
+		
+		maxOccur.put( CONNECTIONNAME	, integerOne );
+		maxOccur.put( BEARERTYPE	, integerOne );
+		maxOccur.put( STARTPAGE	, integerOne );
+		maxOccur.put( WAPWSPOPTION	, integerOne );
+		maxOccur.put( PROTOCOLTYPE	, integerOne );
+		maxOccur.put( LOGINNAME	, integerOne );
+		maxOccur.put( SECUREAUTHENTICATION	, integerOne );
+		maxOccur.put( LOGINPASS	, integerOne );
+		maxOccur.put( PROMPTPASSWORD	, integerOne );
+		maxOccur.put( GATEWAYADDRESS	, integerOne );
+		maxOccur.put( SUBNETMASK	, integerOne );
+		maxOccur.put( DEVICEIPADDR	, integerOne );
+		maxOccur.put( IP4NAMESERVER1	, integerOne );
+		maxOccur.put( IP4NAMESERVER2	, integerOne );
+		maxOccur.put( DATACALLTELNUMBER	, integerOne );
+		maxOccur.put( DATACALLTYPEISDN	, integerOne );
+		maxOccur.put( DATACALLLINESPEED	, integerOne );
+		maxOccur.put( USEPROXY	, integerOne );
+		maxOccur.put( PROXYSERVERADDRESS	, integerOne );
+		maxOccur.put( PROXYPORTNUMBER	, integerOne );
+		maxOccur.put( IP6NAMESERVER1	, integerOne );
+		maxOccur.put( IP6NAMESERVER2	, integerOne );
+		maxOccur.put( DISABLETEXTAUTH	, integerOne );
+		maxOccur.put( WLANNAME	, integerOne );
+		maxOccur.put( WLANIPADDR	, integerOne );
+		maxOccur.put( WLANSECMODE	, integerOne );
+		maxOccur.put( WLANNETMODE	, integerOne );		
+		
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/Contact.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,108 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing contact
+ */
+public class Contact extends AbstractComponent {
+
+
+	public Contact(int id) {
+		super(id);
+	}	
+	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_CONTACT;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return ContactVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return ContactVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_CONTACT_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return ContactVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isTypeSupportingIncValueForEachCopy(java.lang.String)
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		return ContactVariables.getInstance().isTypeSupportingIncValueForEachCopy(type);
+		
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return ContactVariables.getInstance();
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroup.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing contact group
+ */
+public class ContactGroup extends AbstractComponent {
+
+
+	public int getId() {
+		int id_ = NULL_ID;
+		String numberValue = getAdditionalParameter(AbstractComponent.ID_PARAMETER_ID);
+		if( numberValue != null ){
+			try {
+				id_ = Integer.parseInt(numberValue);
+			} catch (Exception e) {
+				id_ = NULL_ID;
+			}
+		}
+		return id_;
+	}
+
+
+
+	public ContactGroup(int id) {
+		super(id);
+	}	
+	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_CONTACT_GROUP;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return ContactGroupVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return ContactGroupVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_CONTACT_GROUP_XML_ELEMENT;
+	}
+
+
+
+
+	/**
+	 * Get name parameter
+	 * @return
+	 */
+	public String getName() {
+		return getAdditionalParameter(AbstractComponent.NAME_PARAMETER_ID); 
+	}
+	
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	public String toString() {
+	
+		Set<String> componentKeys = getKeys();
+		//Collection<String> values = comp.getAttributes().values();
+		
+		StringBuffer allFieldsB = new StringBuffer();
+		allFieldsB.append(getType());			
+		allFieldsB.append( COMPONENT_TYPE_SEPARATOR);
+		
+		//reference to another component
+		if(hasReferenceToAnotherComponent()){
+			allFieldsB.append( getReferenceToAnotherComponent().getType() );
+			allFieldsB.append( WHITE_SPACE );
+			allFieldsB.append( ID_PARAMETER_ID );			
+			allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR );
+			allFieldsB.append( getReferenceToAnotherComponent().getId() );
+			allFieldsB.append( COMPONENT_TYPE_SEPARATOR);			
+		}
+		
+		//Amount (how many of this component will be added)
+		if(getAmount() > 0){
+			allFieldsB.append(" maxmount=");
+			allFieldsB.append(getAmount());
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+		}
+		
+
+		if(getName() != null && getName().trim().length() > 0){
+			allFieldsB.append(ContactGroupVariables.NAME);
+			allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+			allFieldsB.append(getName() );
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);			
+		}		
+		
+		
+		String itemlabel = new String();
+		Vector<AbstractValue> itemValue;
+		//Looping through one component, founding all fields from that component
+		for (Iterator<String> compValuesIt = componentKeys.iterator(); compValuesIt.hasNext();) {
+			itemlabel = (String) compValuesIt.next();
+			itemValue = getAttribute(itemlabel);
+			//get all values from values vector
+			for (Iterator<AbstractValue> iterator = itemValue.iterator(); iterator.hasNext();) {
+				ContactGroupValue val = (ContactGroupValue) iterator.next();
+	
+				allFieldsB.append(itemlabel);
+				allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);//=
+				//If value is random value, showing in UI only short description (<RND>)
+				allFieldsB.append(val.getValue());
+				allFieldsB.append(COMPONENT_ITEM_SEPARATOR);//, 						
+			}
+			
+		}
+		//deleting last ", " from list
+		if(allFieldsB.toString().endsWith(COMPONENT_ITEM_SEPARATOR)){
+			allFieldsB.delete(allFieldsB.length()-COMPONENT_ITEM_SEPARATOR.length(), allFieldsB.length());
+		}
+		return  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(allFieldsB.toString());
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return ContactGroupVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return ContactGroupVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroupValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ *  One row of data of contact group.
+ * 
+ *  Id and value are same in contact groups values. 
+ *  Thats because of parsing expect that value is random if there is no value, and 
+ *  group has only attributes, no value in XML element.
+ */
+public class ContactGroupValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public ContactGroupValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public ContactGroupValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+	
+	/** 
+	 * Returning {@link #getId()} as String, because id and value are same in contact groups. 
+	 * Thats because of parsing expect that value is random if there is no value, and 
+	 * group has only attributes, no value in xml element.
+	 * 
+	 * @return {@link #getId()}
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#getValue()
+	 */
+
+	public String getValue() {
+		return ""+getId();
+	}
+
+	/**
+	 * Is this value random or not
+	 * @return true if it is a random value
+	 */
+	public boolean isRandom() {
+		return false;
+	}	
+	
+
+	/* Contact Group value cannot be random. So always returning RandomTypes.RandomTypeNotRandom
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#getRandomType()
+	 */
+	public ModeTypes getModeType() {
+		return ModeTypes.RandomTypeNotRandom;
+	}	
+
+	/**
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public ContactGroupValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public ContactGroupValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public ContactGroupValue() {
+		super(CreatorEditorSettings.TYPE_CONTACT_GROUP);
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#setMaxAmount(int)
+	 */
+	public void setMaxAmount(int maxAmount) {
+		super.setMaxAmount(maxAmount);
+		super.setAmount(maxAmount);
+	}
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#setAmount(int)
+	 */
+	public void setAmount(int amount) {
+		this.setMaxAmount(amount);
+	}
+
+	
+	/* Overwriting because of value and id are same in contact groups
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#setValue(java.lang.String)
+	 */
+	public void setValue(String value) {
+		super.setValue(value);
+		
+		int intValue=0;
+		try {
+			intValue = Integer.parseInt(value);
+		} catch (Exception e) {
+			intValue = 0;
+		}
+		super.setId(intValue);
+	}	
+	/* Overwriting because of value and id are same in contact groups
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#setId(int)
+	 */
+	public void setId(int id) {
+		super.setId(id);
+		super.setValue("" +id);
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactGroupVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Variables for contact group
+ */
+public class ContactGroupVariables extends AbstractVariables {
+	
+
+	private static ContactGroupVariables instance;
+	
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static ContactGroupVariables getInstance() {
+		
+		if(instance == null){
+			instance = new ContactGroupVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private ContactGroupVariables(){
+		init();
+	}
+	
+
+	/**
+	 * UI text "Name"
+	 */
+	public static final String NAME = "Name";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(1);
+		items.put(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE);
+		
+		additionalItems = new LinkedHashMap<String, String>(13);
+
+		additionalItems.put(AbstractComponent.NAME_PARAMETER_ID, NAME);
+		
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+		
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSet.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing contact set
+ */
+public class ContactSet extends AbstractComponent {
+
+
+
+	public ContactSet(int id) {
+		super(id);
+	}	
+	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_CONTACT_SET;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return ContactSetVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return ContactSetVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_CONTACT_SET_XML_ELEMENT;
+	}
+	
+
+
+	/**
+	 * Get Number of existing parameters
+	 * @return 0 if not any
+	 */
+	public int getNumberOfExistingContacts() {
+		int numberOfExistingParams = NULL_ID;
+		String numberValue = getAdditionalParameter(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID);
+		if( numberValue != null ){
+			try {
+				numberOfExistingParams = Integer.parseInt(numberValue);
+			} catch (Exception e) {
+				numberOfExistingParams = NULL_ID;
+			}
+		}
+		return numberOfExistingParams;
+	}
+	
+	
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	public String toString() {
+	
+		StringBuffer allFieldsB = new StringBuffer();
+		allFieldsB.append(getType());			
+		allFieldsB.append( COMPONENT_TYPE_SEPARATOR);
+
+		allFieldsB.append(getValueById(ID_PARAMETER_ID));
+		allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+		allFieldsB.append(getId());
+
+		//Number of existing contacts
+		if(getNumberOfExistingContacts() != 0){
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+			allFieldsB.append(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS);
+			allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+			allFieldsB.append(getNumberOfExistingContacts() );
+		}		
+		
+
+		return  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(allFieldsB.toString());
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return ContactSetVariables.getInstance().getValuesForItemType(idByValue);
+
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return ContactSetVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSetValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of contact set
+ */
+public class ContactSetValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public ContactSetValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public ContactSetValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new NoteValue.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public ContactSetValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new NoteValue with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public ContactSetValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to{@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public ContactSetValue() {
+		super(CreatorEditorSettings.TYPE_CONTACT_SET);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactSetVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Variables for contact set
+ */
+public class ContactSetVariables extends AbstractVariables {
+	
+	
+	public static final String ADD_CONTACT_SET_TXT = "Add new " +CreatorEditorSettings.TYPE_CONTACT_SET;
+
+	private static ContactSetVariables instance;
+
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static ContactSetVariables getInstance() {
+		
+		if(instance == null){
+			instance = new ContactSetVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private ContactSetVariables(){
+		init();
+	}
+	
+	/**
+	 * UI text "ID"
+	 */
+	public static final String ID = "ID";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(1);
+		items.put(AbstractComponent.ID_PARAMETER_ID,ID);
+		
+		additionalItems = new LinkedHashMap<String, String>(13);
+		additionalItems.put(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID, AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_DIALOG_TEXT);
+
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractVariables#isModeEnabledForKey(java.lang.String)
+	 */
+	public boolean isModeEnabledForKey(String key) {
+		return false;
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.contact;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of contact
+ */
+public class ContactValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public ContactValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public ContactValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+
+	/**
+	 * Creates new ContactValue.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public ContactValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new ContactValue with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public ContactValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new ContactValue.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public ContactValue() {
+		super(CreatorEditorSettings.TYPE_CONTACT);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/contact/ContactVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,589 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.creator.components.contact;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.filetype.FileTypeVariables;
+
+/**
+ * Variables for contact
+ */
+public class ContactVariables extends AbstractVariables
+
+{
+
+	/**
+	 * Constant for founding id element supports <code>incvalueforeachcopy</code>.
+	 * S60 Side of Creator is implemented so if "number" or "phone" exist on element name
+	 * it supports <code>incvalueforeachcopy</code>.
+	 */
+	private static final String NUMBER = "number";
+
+	/**
+	 * Constant for founding id element supports <code>incvalueforeachcopy</code>.
+	 * S60 Side of Creator is implemented so if "number" or "phone" exist on element name
+	 * it supports <code>incvalueforeachcopy</code>.
+	 */
+	private static final String PHONE = "phone";
+
+	public static final String THUMBNAILID_XML_ELEMENT = "thumbnailid";
+
+	private static ContactVariables instance;
+
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static ContactVariables getInstance() {
+
+		if (instance == null) {
+			instance = new ContactVariables();
+		}
+
+		return instance;
+	}
+
+	private ContactVariables() {
+		init();
+		initFixedValues();
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+	
+
+	/**
+	 * Label text for "first name" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_FIRST_NAME = "First name";
+
+	/**
+	 * Memory entry item label "Middle name" 
+	 */
+	public static final String QTN_PHOB_LBL_MIDDLE_NAME = "Middle name";
+
+	/**
+	 * Label text for "last name" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_LAST_NAME = "Last name";
+
+	/**
+	 * Label text for "first name reading" memory entry item, used in japanese
+	 * Phonebook only (not visible in other languages)
+	 */
+	public static final String QTN_PHOB_LBL_FIRST_READING = "First name reading";
+
+	/**
+	 * Label text for "last name reading" memory entry item, used in japanese
+	 * Phonebook only (not visible in other languages)
+	 */
+	public static final String QTN_PHOB_LBL_LAST_READING = "Last name reading";
+
+	/**
+	 * Label text for prefix memory entry item. l:
+	 */
+	public static final String QTN_PHOB_LBL_PREFIX = "Prefix";
+
+	/**
+	 * Label text for suffix memory entry item. l:
+	 */
+	public static final String QTN_PHOB_LBL_SUFFIX = "Suffix";
+
+	/**
+	 * Label text for "Company Name" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_COMPANY_NAME = "Company Name";
+
+	/**
+	 * Memory entry item label "Department" 
+	 */
+	public static final String QTN_PHOB_LBL_DEPT_NAME = "Department";
+
+	/**
+	 * Label text for "Job Title" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_JOB_TITLE = "Job Title";
+
+	/**
+	 * Label text for "Nick Name" memory entry item. l:
+	 */
+	public static final String QTN_SIMP_LBL_NICK = "Nick name";
+
+	/**
+	 * Memory entry item label "Assistant name"
+	 */
+	public static final String QTN_PHOB_LBL_ASSISTANT_NAME = "Assistant name";
+
+	/**
+	 * Memory entry item label "Spouse" 
+	 */
+	public static final String QTN_PHOB_LBL_SPOUSE = "Spouse";
+
+	/**
+	 * Memory entry item label "Children" 
+	 */
+	public static final String QTN_PHOB_LBL_CHILDREN = "Children";
+
+	/**
+	 * Label text for "Phone Number (Standard)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_STANDARD = "Phone Number";
+
+	/**
+	 * Label text for "Phone Number (Home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_HOME = "Phone Number (Home)";
+
+	/**
+	 * Label text for "Phone Number (Work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_WORK = "Phone Number (Work)";
+
+	/**
+	 * Label text for "Phone Number (Mobile)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_MOBILE = "Phone Number (Mobile)";
+
+	/**
+	 * Label text for "Mobile (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_MOBILE_HOME = "Mobile (home)";
+
+	/**
+	 * Label text for "Mobile (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_MOBILE_WORK = "Mobile (work)";
+
+	/**
+	 * Label text for "video no." memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VIDEO = "Video no.";
+
+	/**
+	 * Label text for "video no. (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VIDEO_HOME = "Video no. (home)";
+
+	/**
+	 * Label text for "video no. (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VIDEO_WORK = "Video no. (work)";
+
+	/**
+	 * Memory entry item label "Car phone"
+	 */
+	public static final String QTN_PHOB_LBL_CAR_TEL = "Car phone";
+
+	/**
+	 * Memory entry item label "Assistant phone"
+	 */
+	public static final String QTN_PHOB_LBL_NUMBER_ASSISTANT = "Assistant phone";
+
+	/**
+	 * Label text for "VOIP call" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VOIP = "Tel. Internet";
+
+	/**
+	 * Label text for "VOIP call (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VOIP_HOME = "Tel. Internet (home)";
+
+	/**
+	 * Label text for "VOIP call (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_VOIP_WORK = "Tel. Internet (work)";
+
+	/**
+	 * Label text for "push to talk" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POC = "PTT";
+
+	/**
+	 * Label text for "share view" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_SWIS = "Share view";
+
+	/**
+	 * Label text for "SIP" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_SIP = "SIP";
+
+	/**
+	 * Label text for "Fax Number" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_FAX = "Fax";
+
+	/**
+	 * Label text for "Fax (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_FAX_HOME = "Fax (home)";
+
+	/**
+	 * Label text for "Fax (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_FAX_WORK = "Fax (work)";
+
+	/**
+	 * Label text for "Pager Number" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_PAGER = "Pager Number";
+
+	/**
+	 * Label text for "Email Address" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EMAIL = "Email";
+
+	/**
+	 * Label text for "Email (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EMAIL_HOME = "Email (home)";
+
+	/**
+	 * Label text for "Email (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EMAIL_WORK = "Email (work)";
+
+	/**
+	 * Label text for "URL" memory entry item 
+	 */
+	public static final String QTN_PHOB_LBL_URL = "URL";
+
+	/**
+	 * Label text for "URL (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_URL_HOME = "URL (home)";
+
+	/**
+	 * Label text for "URL (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_URL_WORK = "URL (work)";
+
+	/**
+	 * Label text for "Postal Address" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_ADDRESS = "Postal Address";
+
+	/**
+	 * Label text for "P.O.Box" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POBOX = "P.O.Box";
+
+	/**
+	 * Label text for "Extencion" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EXTENCION = "Extension";
+
+	/**
+	 * Label text for "Street" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STREET = "Street";
+
+	/**
+	 * Label text for "Postal code" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POSTAL_CODE = "Postal code";
+
+	/**
+	 * Label text for "City" memory entry item 
+	 */
+	public static final String QTN_PHOB_LBL_CITY = "City";
+
+	/**
+	 * Label text for "State" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STATE = "State";
+
+	/**
+	 * Label text for "Country" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_COUNTRY = "Country";
+
+	/**
+	 * Label text for "Address (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_ADDRESS_HOME = "Address (home)";
+
+	/**
+	 * Label text for "P.O.Box (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POBOX_HOME = "P.O.Box (home)";
+
+	/**
+	 * Label text for "Extencion (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EXTENCION_HOME = "Extension (home)";
+
+	/**
+	 * Label text for "Street (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STREET_HOME = "Street (home)";
+
+	/**
+	 * Label text for "Postal code (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POSTAL_CODE_HOME = "Postal code (home)";
+
+	/**
+	 * Label text for "City (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_CITY_HOME = "City (home)";
+
+	/**
+	 * Label text for "State (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STATE_HOME = "State (home)";
+
+	/**
+	 * Label text for "Country (home)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_COUNTRY_HOME = "Country (home)";
+
+	/**
+	 * Label text for "Address (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_ADDRESS_WORK = "Address (work)";
+
+	/**
+	 * Label text for "P.O.Box (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POBOX_WORK = "P.O.Box (work)";
+
+	/**
+	 * Label text for "Extencion (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_EXTENCION_WORK = "Extension (work)";
+
+	/**
+	 * Label text for "Street (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STREET_WORK = "Street (work)";
+
+	/**
+	 * Label text for "Postal code (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_POSTAL_CODE_WORK = "Postal code (work)";
+
+	/**
+	 * Label text for "City (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_CITY_WORK = "City (work)";
+
+	/**
+	 * Label text for "State (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_STATE_WORK = "State (work)";
+
+	/**
+	 * Label text for "Country (work)" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_COUNTRY_WORK = "Country (work)";
+
+	/**
+	 * Label text for "DTMF String" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_DTMF = "DTMF";
+
+	/**
+	 * Label text for "Date" memory entry item 
+	 */
+	public static final String QTN_PHOB_LBL_DATE = "Birthday";
+
+	/**
+	 * Memory entry item label "Anniversary" 
+	 */
+	public static final String QTN_PHOB_LBL_ANNIVERSARY = "Anniversary";
+
+	/**
+	 * Label text for "Note" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_NOTE = "Note";
+
+	/**
+	 * Memory entry item label "Synchronization"
+	 */
+	public static final String QTN_PHOB_LBL_SYNCHRONIZATION = "Synchronization";
+
+	/**
+	 * Label text for "thumbnail" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_THUMBNAILPATH = "Thumbnail path";
+	
+	/**
+	 * Label for Thumbnail ID, not existing value in S60 Device, only occurs in script mode.
+	 */
+	public static final String QTN_PHOB_LBL_THUMBNAILID = "Thumbnail ID";
+	
+
+	/**
+	 * Label text for "Image" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_IMAGE = "Image";
+
+	/**
+	 * Label text for "Text for call" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_TEXT = "Text for call";
+
+	/**
+	 * Label text for "Personal Ringing Tone Indication" memory entry item
+	 */
+	public static final String QTN_PHOB_LBL_TONE = "Ring tone path";
+	
+	//
+	//few items found also in VPbkEngFieldTypes.rss, but those cause Emulator to crash, so not taken into use
+	//
+	
+	/**
+	 * Label text for Location privacy indicator, found in VPbkEngFieldTypes.rss
+	 */
+	public static final String R_VPBK_FIELD_TYPE_LOCPRIVACY = "Location privacy indicator";
+	
+	/**
+	 * Label text for Wv(IM) address, found in VPbkEngFieldTypes.rss
+	 */	
+	public static final String R_VPBK_FIELD_TYPE_WVADDRESS = "Wv(IM) address";	
+
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(71);
+		
+		//First 10 items exist in same order that they appear in Device when creating new contact
+		
+		items.put("firstname", QTN_PHOB_LBL_FIRST_NAME);
+		items.put("lastname", QTN_PHOB_LBL_LAST_NAME);
+		items.put("mobilephonegen", QTN_PHOB_LBL_NUMBER_MOBILE);
+		items.put("landphonegen", QTN_PHOB_LBL_NUMBER_STANDARD);
+		items.put("emailgen", QTN_PHOB_LBL_EMAIL);
+		items.put("videonumbergen", QTN_PHOB_LBL_VIDEO);
+		items.put("voipgen", QTN_PHOB_LBL_VOIP);
+		items.put("poc", QTN_PHOB_LBL_POC);
+		items.put("company", QTN_PHOB_LBL_COMPANY_NAME);
+		items.put("jobtitle", QTN_PHOB_LBL_JOB_TITLE);
+
+		items.put("note", QTN_PHOB_LBL_NOTE);
+		items.put("middlename", QTN_PHOB_LBL_MIDDLE_NAME);
+		items.put("secondname", QTN_SIMP_LBL_NICK);
+		
+
+		items.put("prefix", QTN_PHOB_LBL_PREFIX);
+		items.put("suffix", QTN_PHOB_LBL_SUFFIX);
+
+		items.put("addrlabelgen", QTN_PHOB_LBL_ADDRESS);
+		items.put("addrpogen", QTN_PHOB_LBL_POBOX);
+		items.put("addrextgen", QTN_PHOB_LBL_EXTENCION);
+		items.put("addrstreetgen", QTN_PHOB_LBL_STREET);
+		items.put("addrlocalgen", QTN_PHOB_LBL_CITY);
+		items.put("addrregiongen", QTN_PHOB_LBL_STATE);
+		items.put("addrpostcodegen", QTN_PHOB_LBL_POSTAL_CODE);
+		items.put("addrcountrygen", QTN_PHOB_LBL_COUNTRY);
+
+		items.put("addrlabelhome", QTN_PHOB_LBL_ADDRESS_HOME);
+		items.put("addrpohome", QTN_PHOB_LBL_POBOX_HOME);
+		items.put("addrexthome", QTN_PHOB_LBL_EXTENCION_HOME);
+		items.put("addrstreethome", QTN_PHOB_LBL_STREET_HOME);
+		items.put("addrlocalhome", QTN_PHOB_LBL_CITY_HOME);
+		items.put("addrregionhome", QTN_PHOB_LBL_STATE_HOME);
+		items.put("addrpostcodehome", QTN_PHOB_LBL_POSTAL_CODE_HOME);
+		items.put("addrcountryhome", QTN_PHOB_LBL_COUNTRY_HOME);
+
+		items.put("addrlabelwork", QTN_PHOB_LBL_ADDRESS_WORK);
+		items.put("addrpowork", QTN_PHOB_LBL_POBOX_WORK);
+		items.put("addrextwork", QTN_PHOB_LBL_EXTENCION_WORK);
+		items.put("addrstreetwork", QTN_PHOB_LBL_STREET_WORK);
+		items.put("addrlocalwork", QTN_PHOB_LBL_CITY_WORK);
+		items.put("addrregionwork", QTN_PHOB_LBL_STATE_WORK);
+		items.put("addrpostcodework", QTN_PHOB_LBL_POSTAL_CODE_WORK);
+		items.put("addrcountrywork", QTN_PHOB_LBL_COUNTRY_WORK);
+
+		items.put("swis", QTN_PHOB_LBL_SWIS);
+		items.put("sip", QTN_PHOB_LBL_SIP);
+		items.put("dtmfstring", QTN_PHOB_LBL_DTMF);
+		items.put("department", QTN_PHOB_LBL_DEPT_NAME);
+		items.put("asstname", QTN_PHOB_LBL_ASSISTANT_NAME);
+		items.put("spouse", QTN_PHOB_LBL_SPOUSE);
+		items.put("children", QTN_PHOB_LBL_CHILDREN);
+		items.put("anniversary", QTN_PHOB_LBL_ANNIVERSARY);
+		items.put("synchronization", QTN_PHOB_LBL_SYNCHRONIZATION);
+		items.put("thumbnailpath", QTN_PHOB_LBL_THUMBNAILPATH);
+		items.put(THUMBNAILID_XML_ELEMENT, QTN_PHOB_LBL_THUMBNAILID);
+		items.put("callerobjtext",QTN_PHOB_LBL_TEXT);
+		items.put("ringtonepath",QTN_PHOB_LBL_TONE);
+		items.put("callerobjimg",QTN_PHOB_LBL_IMAGE);
+		items.put("birthday",QTN_PHOB_LBL_DATE);
+
+		items.put("landphonehome", QTN_PHOB_LBL_NUMBER_HOME);
+		items.put("landphonework", QTN_PHOB_LBL_NUMBER_WORK);
+
+		items.put("mobilephonehome", QTN_PHOB_LBL_NUMBER_MOBILE_HOME);
+		items.put("mobilephonework", QTN_PHOB_LBL_NUMBER_MOBILE_WORK);
+
+		items.put("faxnumbergen", QTN_PHOB_LBL_FAX);
+		items.put("faxnumberhome", QTN_PHOB_LBL_FAX_HOME);
+		items.put("faxnumberwork", QTN_PHOB_LBL_FAX_WORK);
+		items.put("pagernumber", QTN_PHOB_LBL_PAGER);
+
+		items.put("videonumberhome", QTN_PHOB_LBL_VIDEO_HOME);
+		items.put("videonumberwork", QTN_PHOB_LBL_VIDEO_WORK);
+
+		items.put("voiphome", QTN_PHOB_LBL_VOIP_HOME);
+		items.put("voipwork", QTN_PHOB_LBL_VOIP_WORK);
+
+		items.put("asstphone", QTN_PHOB_LBL_NUMBER_ASSISTANT);
+		items.put("carphone", QTN_PHOB_LBL_CAR_TEL);
+
+		items.put("urlgen", QTN_PHOB_LBL_URL);
+		items.put("urlhome", QTN_PHOB_LBL_URL_HOME);
+		items.put("urlwork", QTN_PHOB_LBL_URL_WORK);
+
+		items.put("emailhome", QTN_PHOB_LBL_EMAIL_HOME);
+		items.put("emailwork", QTN_PHOB_LBL_EMAIL_WORK);
+
+		
+		//Following items not found in devices and causes emulator crash, can be taken into use if wanted
+		//items found in VPbkEngFieldTypes.rss
+		items.put("locprivacy",R_VPBK_FIELD_TYPE_LOCPRIVACY);//r_vpbk_field_type_locprivacy (Location privacy indicator)
+		items.put("wvaddress", R_VPBK_FIELD_TYPE_WVADDRESS);//R_VPBK_FIELD_TYPE_WVADDRESS (Wv(IM) address)
+	
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+		itemsValues.put(THUMBNAILID_XML_ELEMENT, FileTypeVariables.ALL_PICTURE_FILE_TYPES_AS_COMMA_SEPARATED_STRING);		
+	}
+
+	/**
+	 * Check if <code>incvalueforeachcopy</code> is supported for type.
+	 * @param type as in UI, not as in XML.
+	 * @return <code>true</code> if <code>incvalueforeachcopy</code> is supported.
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		//phone number
+		String id = getIdByValue(type);
+		if(id == null){
+			return false;
+		}
+		
+		return id.contains(PHONE)  || id.contains(NUMBER);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileType.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,134 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.filetype;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing File
+ */
+public class FileType extends AbstractComponent {
+
+
+	public FileType(int id) {
+		super(id);
+	}	
+	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_FILE;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return FileTypeVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return FileTypeVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_FILE_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return FileTypeVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return FileTypeVariables.getInstance().itemMaxOccur(itemName);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return FileTypeVariables.getInstance();
+	}		
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#hasTypeLimitationsForOtherValues(java.lang.String, java.lang.String)
+	 */
+	public boolean hasTypeLimitationsForOtherValues(String type, String value) {
+		if(type.equals(FileTypeVariables.ENCRYPTION_TYPE) ){
+			return true;
+		}
+		else{
+			return false;
+		}
+	}	
+	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isTypeDisabledByTypeAndValue(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public boolean isTypeDisabledByTypeAndValue(String selectedType, String selectedValue, String typeToDisable) {
+		if(selectedType == null || selectedValue == null || typeToDisable == null){
+			return false;
+		}
+		else if(selectedType.equals(FileTypeVariables.ENCRYPTION_TYPE) && selectedValue.equals(FileTypeVariables.DRM_FL) && typeToDisable.startsWith(FileTypeVariables.DRM_CD)){
+			return true;
+		}
+		else{
+			return false;
+		}
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileTypeValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.filetype;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of file
+ */
+public class FileTypeValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public FileTypeValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public FileTypeValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public FileTypeValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public FileTypeValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public FileTypeValue() {
+		super(CreatorEditorSettings.TYPE_FILE);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/filetype/FileTypeVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,349 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.filetype;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for file
+ */
+public class FileTypeVariables extends AbstractVariables {
+	
+
+	/**
+	 * UI text for "Encryption Type"
+	 */
+	public static final String ENCRYPTION_TYPE = "Encryption Type";
+	
+	/**
+	 * XML element "right"
+	 */
+	public static final String RIGHT_XML = "right";
+	//
+	//Constants for UI, privates because of prefixes (Play, Print...)
+	//
+	private static final String ENDTIME = "Endtime";
+	private static final String STARTTIME = "Starttime";
+	private static final String ACCUMULATED = "Accumulated";
+	private static final String INTERVAL = "Interval";
+	private static final String COUNT = "Count";
+	
+
+	//
+	//constants for XML element names
+	//
+	public static final String COUNT_XML = "count";
+	public static final String INTERVAL_XML = "interval";
+	public static final String ENDTIME_XML = "endtime";
+	public static final String STARTTIME_XML = "starttime";
+	public static final String ACCUMULATED_XML = "accumulated";
+	public static final String ENCRYPTION_TYPE_XML = "encryption";
+	public static final String TYPE_XML = "type";
+
+
+	//
+	//Constants for print
+	//
+	public static final String PRINT_TYPE = "print";
+	public static final String PRINTINTERVAL = PRINT_TYPE + INTERVAL_XML;
+	public static final String PRINTENDTIME =  PRINT_TYPE + ENDTIME_XML;
+	public static final String PRINTSTARTTIME =  PRINT_TYPE + STARTTIME_XML;
+	public static final String PRINTCOUNT =  PRINT_TYPE + COUNT_XML;
+	public static final String PRINTACCUMULATED =  PRINT_TYPE + ACCUMULATED_XML;
+	
+	public static final String [][] PRINT_KEYS = {{
+		PRINTCOUNT, PRINTINTERVAL, PRINTSTARTTIME, PRINTENDTIME, PRINTACCUMULATED
+	},{
+		COUNT_XML, INTERVAL_XML, STARTTIME_XML, ENDTIME_XML, ACCUMULATED_XML
+	}};
+	
+	//
+	//Constants for execute
+	//	
+	public static final String EXECUTE_TYPE = "execute";
+	public static final String EXECUTEINTERVAL = EXECUTE_TYPE + INTERVAL_XML;
+	public static final String EXECUTEENDTIME = EXECUTE_TYPE + ENDTIME_XML;
+	public static final String EXECUTESTARTTIME = EXECUTE_TYPE + STARTTIME_XML;
+	public static final String EXECUTECOUNT = EXECUTE_TYPE + COUNT_XML; 
+	public static final String EXECUTEACCUMULATED = EXECUTE_TYPE + ACCUMULATED_XML;
+	public static final String [][] EXECUTE_KEYS = {{
+		EXECUTECOUNT, EXECUTEINTERVAL, EXECUTESTARTTIME, EXECUTEENDTIME, EXECUTEACCUMULATED 
+	},{
+		COUNT_XML, INTERVAL_XML, STARTTIME_XML, ENDTIME_XML, ACCUMULATED_XML		
+	}};
+	
+	//
+	//Constants for display
+	//	
+	public static final String DISPLAY_TYPE = "display";
+	public static final String DISPLAYINTERVAL = DISPLAY_TYPE + INTERVAL_XML;
+	public static final String DISPLAYENDTIME = DISPLAY_TYPE + ENDTIME_XML;
+	public static final String DISPLAYSTARTTIME = DISPLAY_TYPE + STARTTIME_XML;
+	public static final String DISPLAYCOUNT = DISPLAY_TYPE + COUNT_XML;
+	public static final String DISPLAYACCUMULATED = DISPLAY_TYPE + ACCUMULATED_XML;
+	public static final String [][] DISPLAY_KEYS = {{
+		DISPLAYCOUNT, DISPLAYINTERVAL, DISPLAYSTARTTIME, DISPLAYENDTIME, DISPLAYACCUMULATED
+	},{
+		COUNT_XML, INTERVAL_XML, STARTTIME_XML, ENDTIME_XML, ACCUMULATED_XML	
+	}};
+	
+	//
+	//Constants for play
+	//	
+	public static final String PLAY_TYPE = "play";
+	public static final String PLAYINTERVAL = PLAY_TYPE + INTERVAL_XML;
+	public static final String PLAYENDTIME = PLAY_TYPE + ENDTIME_XML;
+	public static final String PLAYSTARTTIME = PLAY_TYPE + STARTTIME_XML;
+	public static final String PLAYCOUNT = PLAY_TYPE + COUNT_XML;
+	public static final String PLAYACCUMULATED = PLAY_TYPE + ACCUMULATED_XML;
+	public static final String [][] PLAY_KEYS = {{
+		PLAYCOUNT, PLAYINTERVAL, PLAYSTARTTIME, PLAYENDTIME,  PLAYACCUMULATED 
+	},{
+		COUNT_XML, INTERVAL_XML, STARTTIME_XML, ENDTIME_XML, ACCUMULATED_XML
+	}};	
+
+	
+	/**
+	 * Prefix for "DRM-CD"
+	 */
+	public static final String DRM_CD = "DRM-CD";
+	/**
+	 * Prefix for "DRM-FL"
+	 */
+	public static final String DRM_FL = "DRM-FL";
+	
+	//
+	// Prefixes for DRM-CD variables
+	//
+	private static final String DRM_CD_PRINT = DRM_CD + " Print ";
+	private static final String DRM_CD_EXECUTE = DRM_CD + " Execute ";
+	private static final String DRM_CD_DISPLAY = DRM_CD + " Display ";
+	private static final String DRM_CD_PLAY = DRM_CD + " Play ";
+	
+	public static final String DURATIONS_HELP_TEXT = "For '" +ACCUMULATED + "' and '" +INTERVAL +"' -fields use format: "
+		+"P[n]Y[n]M[n]DT[n]H[n]M[n]S. Where P is start point for duration, Y stands for year, M for month, D for day, " 
+		+"T is time part start point, H stands for hour, M for minute and S for second. "
+		+" E.g. P1Y2M3DT4H5M6S.";
+	
+	
+	private static FileTypeVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static FileTypeVariables getInstance() {
+		
+		if(instance == null){
+			instance = new FileTypeVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private FileTypeVariables(){
+		init();
+		initFixedValues();
+		initMaxOccurValues();
+	}
+	
+	public static final String TYPE = "Type";
+	public static final String DIR = "Directory";
+	public static final String [] ALL_FILE_TYPES_AS_COMMA_SEPARATED_STRING = {"3GPP-70kB", "AAC-100kB", "AMR-20kB", "XLS-15kB", "GIF-2kB", "JPEG-200kB", "JPEG-25kB", "JPEG-500kB", "MIDI-10kB", "MP3-250kB", "PNG-15kB", "PPT-40kB", "RM-95kB", "RNG-1kB", "TXT-10kB", "TXT-70kB", "WAV-20kB", "DOC-20kB", "SWF-15kB", "JAD-1kB", "JAR-10kB", "TIF-25kB", "MXMF-40kB", "BMP-25kB", "JP2-65kB", "SVG-15kB", "HTML-20kB", "VCF-1kB", "VCS-1kB", "MP4-200kB", "SISX-10kB", "RAM-1kB", "WMV-200kB", "WMA-50kB"};
+	public static final String [] ALL_PICTURE_FILE_TYPES_AS_COMMA_SEPARATED_STRING = {"GIF-2kB", "JPEG-200kB", "JPEG-25kB", "JPEG-500kB", "PNG-15kB", "TIF-25kB", "BMP-25kB", "JP2-65kB", "SVG-15kB"};
+		
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(4);
+		items.put(TYPE_XML, TYPE);
+		items.put("directory", DIR);
+
+		items.put(ENCRYPTION_TYPE_XML, ENCRYPTION_TYPE);
+
+		items.put(PLAYCOUNT, DRM_CD_PLAY + COUNT);
+		items.put(PLAYSTARTTIME, DRM_CD_PLAY + STARTTIME);
+		items.put(PLAYENDTIME, DRM_CD_PLAY + ENDTIME);
+		items.put(PLAYINTERVAL, DRM_CD_PLAY + INTERVAL);
+		items.put(PLAYACCUMULATED, DRM_CD_PLAY + ACCUMULATED);
+
+		items.put(DISPLAYCOUNT, DRM_CD_DISPLAY + COUNT);
+		items.put(DISPLAYSTARTTIME, DRM_CD_DISPLAY + STARTTIME);
+		items.put(DISPLAYENDTIME, DRM_CD_DISPLAY + ENDTIME);
+		items.put(DISPLAYINTERVAL, DRM_CD_DISPLAY + INTERVAL);
+		items.put(DISPLAYACCUMULATED, DRM_CD_DISPLAY + ACCUMULATED);
+
+		items.put(EXECUTECOUNT, DRM_CD_EXECUTE + COUNT);
+		items.put(EXECUTESTARTTIME, DRM_CD_EXECUTE + STARTTIME);
+		items.put(EXECUTEENDTIME, DRM_CD_EXECUTE + ENDTIME);
+		items.put(EXECUTEINTERVAL, DRM_CD_EXECUTE + INTERVAL);
+		items.put(EXECUTEACCUMULATED, DRM_CD_EXECUTE + ACCUMULATED);
+
+		items.put(PRINTCOUNT, DRM_CD_PRINT + COUNT);
+		items.put(PRINTSTARTTIME, DRM_CD_PRINT + STARTTIME);
+		items.put(PRINTENDTIME, DRM_CD_PRINT + ENDTIME);
+		items.put(PRINTINTERVAL, DRM_CD_PRINT + INTERVAL);
+		items.put(PRINTACCUMULATED, DRM_CD_PRINT + ACCUMULATED);
+		
+		
+		additionalItems = new LinkedHashMap<String, String>(4);
+		additionalItems.put(COUNT_XML, COUNT_XML);
+		additionalItems.put(INTERVAL_XML, INTERVAL_XML);
+		additionalItems.put(ENDTIME_XML, ENDTIME_XML);
+		additionalItems.put(STARTTIME_XML, STARTTIME_XML);
+		additionalItems.put(ACCUMULATED_XML, ACCUMULATED_XML);
+		additionalItems.put(RIGHT_XML, RIGHT_XML);
+
+	}
+	
+	/**
+	 * Inits Max Occur valus for items
+	 */
+	private void initMaxOccurValues(){
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+		
+		Integer integerOne = new Integer (1);
+		maxOccur.put(TYPE, integerOne );//Should it be able to add more than one file? If So, also S60 side must be changed.
+		maxOccur.put(DIR, integerOne );
+		maxOccur.put(ENCRYPTION_TYPE, integerOne );
+		
+		maxOccur.put( DRM_CD_PLAY + COUNT, integerOne );
+		maxOccur.put( DRM_CD_PLAY + STARTTIME, integerOne );
+		maxOccur.put( DRM_CD_PLAY + ENDTIME, integerOne );
+		maxOccur.put( DRM_CD_PLAY + INTERVAL, integerOne );
+		maxOccur.put( DRM_CD_PLAY + ACCUMULATED, integerOne );
+
+		maxOccur.put( DRM_CD_DISPLAY + COUNT, integerOne );
+		maxOccur.put( DRM_CD_DISPLAY + STARTTIME, integerOne );
+		maxOccur.put( DRM_CD_DISPLAY + ENDTIME, integerOne );
+		maxOccur.put( DRM_CD_DISPLAY + INTERVAL, integerOne );
+		maxOccur.put( DRM_CD_DISPLAY + ACCUMULATED, integerOne );
+
+		maxOccur.put( DRM_CD_EXECUTE + COUNT, integerOne );
+		maxOccur.put( DRM_CD_EXECUTE + STARTTIME, integerOne );
+		maxOccur.put( DRM_CD_EXECUTE + ENDTIME, integerOne );
+		maxOccur.put( DRM_CD_EXECUTE + INTERVAL, integerOne );
+		maxOccur.put( DRM_CD_EXECUTE + ACCUMULATED, integerOne );
+
+		maxOccur.put( DRM_CD_PRINT + COUNT, integerOne );
+		maxOccur.put( DRM_CD_PRINT + STARTTIME, integerOne );
+		maxOccur.put( DRM_CD_PRINT + ENDTIME, integerOne );
+		maxOccur.put( DRM_CD_PRINT + INTERVAL, integerOne );
+		maxOccur.put( DRM_CD_PRINT + ACCUMULATED, integerOne );		
+	}
+	
+	/**
+	 * Check if this key is a encryption value
+	 * @param key (not a XML key but UI key)
+	 * @return
+	 */
+	public static boolean isEncryptionValue(String key){
+		return key.startsWith(DRM_CD);
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+
+		//For enabling creation of empty type (then directory will be created) we first add a empty slot for list
+		String [] items = new String[ALL_FILE_TYPES_AS_COMMA_SEPARATED_STRING.length + 1];
+		items [0] = AbstractValue.EMPTY_STRING;
+		for (int i = 1; i < items.length; i++) {
+			items[i] = ALL_FILE_TYPES_AS_COMMA_SEPARATED_STRING[i - 1];
+		}
+		
+		itemsValues.put(TYPE_XML, items);
+		
+		
+		itemsValues.put(ENCRYPTION_TYPE_XML, new String[] {DRM_FL, DRM_CD});
+
+	}	
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+	/**
+	 * Get ID used in editor to <right><[element]> 
+	 * @param rightType
+	 * @param elementName
+	 * @return Interal ID for  <right><[element]>
+	 */
+	public static String getEncryptionId(String rightType, String elementName) {
+		
+		if(rightType.equalsIgnoreCase(DISPLAY_TYPE)){
+			return getEncryptionElemnInternalId(DISPLAY_TYPE, elementName);
+		}
+		else if(rightType.equalsIgnoreCase(PLAY_TYPE)){
+			return getEncryptionElemnInternalId(PLAY_TYPE, elementName);
+		}
+		else if(rightType.equalsIgnoreCase(EXECUTE_TYPE)){
+			return getEncryptionElemnInternalId(EXECUTE_TYPE, elementName);
+		}
+		else if(rightType.equalsIgnoreCase(PRINT_TYPE)){
+			return getEncryptionElemnInternalId(PRINT_TYPE, elementName);
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Get id for encryption element used only in object model, not in XML
+	 * @param type
+	 * @param elemn
+	 * @return id
+	 */
+	private static String getEncryptionElemnInternalId(String type, String elemn){
+		
+		
+		if(elemn.equalsIgnoreCase(COUNT_XML)){
+			return type + COUNT_XML;
+		}
+		else if(elemn.equalsIgnoreCase(INTERVAL_XML)){
+			return type + INTERVAL_XML;
+		}
+		else if(elemn.equalsIgnoreCase(ENDTIME_XML)){
+			return type + ENDTIME_XML;
+		}
+		else if(elemn.equalsIgnoreCase(STARTTIME_XML)){
+			return type + STARTTIME_XML;
+		}		
+		else if(elemn.equalsIgnoreCase(ACCUMULATED_XML)){
+			return type + ACCUMULATED_XML;
+		}			
+		else{
+			return null;
+		}
+	
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractVariables#isModeEnabledForKey(java.lang.String)
+	 */
+	public boolean isModeEnabledForKey(String key) {
+		if(key != null && key.equals(ENCRYPTION_TYPE)){
+			return false;
+		}
+		else{
+			return true;
+		}
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.impsserver;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing IMPS Server
+ */
+public class IMPSServer extends AbstractComponent {
+
+
+	public IMPSServer(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_IMPS_SERVER;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return IMPSServerVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return IMPSServerVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_IMPS_SERVER_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return IMPSServerVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return IMPSServerVariables.getInstance();
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServerValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.impsserver;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of IMPS Server
+ */
+public class IMPSServerValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public IMPSServerValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public IMPSServerValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public IMPSServerValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public IMPSServerValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public IMPSServerValue() {
+		super(CreatorEditorSettings.TYPE_IMPS_SERVER);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/impsserver/IMPSServerVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.impsserver;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for IMPS server
+ */
+public class IMPSServerVariables extends AbstractVariables {
+	
+	
+	private static IMPSServerVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static IMPSServerVariables getInstance() {
+		
+		if(instance == null){
+			instance = new IMPSServerVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private IMPSServerVariables(){
+		init();
+	}
+
+	//
+	// Variables to show items in UI
+	//
+	public static final String NAME = "Name";
+	public static final String URL = "URL";
+	public static final String USERNAME = "Username";
+	public static final String PASSWORD = "Password";
+	public static final String CONNECTION_METHOD_NAME = "Connection method name";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(5);
+		  items.put("name",NAME);
+		  items.put("url",URL);
+		  items.put("username",USERNAME);
+		  items.put("password",PASSWORD);
+		  items.put("connectionmethodname",CONNECTION_METHOD_NAME);
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/Landmark.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.landmark;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing landmark
+ */
+public class Landmark extends AbstractComponent {
+
+
+	public Landmark(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_LANDMARK;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return LandmarkVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return LandmarkVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_LANDMARK_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return LandmarkVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return LandmarkVariables.getInstance().itemMaxOccur(itemName);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return LandmarkVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/LandmarkValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.landmark;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of landmark
+ */
+public class LandmarkValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public LandmarkValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public LandmarkValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public LandmarkValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public LandmarkValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public LandmarkValue() {
+		super(CreatorEditorSettings.TYPE_LOG);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/landmark/LandmarkVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.landmark;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for landmark
+ */
+public class LandmarkVariables extends AbstractVariables {
+	
+	//
+	// Variables to show items in UI
+	//
+	public static final String POSTAL_ZIP = "Postal code/ZIP";
+	public static final String CITY = "City";
+	public static final String STATE_PROVINCE = "State/Province";
+	public static final String COUNTRY_REGION = "Country/Region";
+	public static final String PHONE_NUMBER = "Phone number";
+	public static final String URL = "URL";
+	public static final String LATITUDE = "Latitude";
+	public static final String LONGITUDE = "Longitude";
+	public static final String POSITION_ACCURACY = "Position accuracy";
+	public static final String STREET = "Street";
+	public static final String DESCRIPTION = "Description";
+	public static final String CATEGORY = "Category";
+	public static final String NAME = "Name";
+	public static final String ALTITUDE = "Altitude";
+	public static final String ALTITUDE_ACCURACY = "Altitude accuracy";
+	
+	private static LandmarkVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static LandmarkVariables getInstance() {
+		
+		if(instance == null){
+			instance = new LandmarkVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private LandmarkVariables(){
+		init();
+		initMaxOccurValues();
+		initTipTexts();
+	}
+	
+
+	
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(4);
+		  items.put("name",NAME);
+		  items.put("category",CATEGORY);
+		  items.put("description",DESCRIPTION);
+		  items.put("street",STREET);
+		  items.put("postalcode",POSTAL_ZIP);
+		  items.put("city",CITY);
+		  items.put("state",STATE_PROVINCE);
+		  items.put("country",COUNTRY_REGION);
+		  items.put("phonenbr",PHONE_NUMBER);
+		  items.put("url",URL);
+		  items.put("latitude",LATITUDE);
+		  items.put("longitude",LONGITUDE);
+		  items.put("positionaccuracy",POSITION_ACCURACY);
+		  items.put("altitude",ALTITUDE);
+		  items.put("altitudeaccuracy",ALTITUDE_ACCURACY);
+		 
+	}
+	
+	/**
+	 * Inits Max Occur valus for items.
+	 * Only {@link LandmarkVariables#CATEGORY} can occur more than once in on script.
+	 */
+	private void initMaxOccurValues() {
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+
+		Integer integerOne = new Integer(1);
+
+		// On landmarks, only CATEGORY can occur more than once in on script
+
+		maxOccur.put(NAME, integerOne);		
+		maxOccur.put(DESCRIPTION, integerOne);
+		maxOccur.put(STREET, integerOne);
+		maxOccur.put(POSTAL_ZIP, integerOne);
+		maxOccur.put(CITY, integerOne);
+		maxOccur.put(STATE_PROVINCE, integerOne);
+		maxOccur.put(COUNTRY_REGION, integerOne);
+		maxOccur.put(PHONE_NUMBER, integerOne);
+		maxOccur.put(URL, integerOne);
+		maxOccur.put(LATITUDE, integerOne);
+		maxOccur.put(LONGITUDE, integerOne);
+		maxOccur.put(POSITION_ACCURACY, integerOne);
+		maxOccur.put(ALTITUDE, integerOne);
+		maxOccur.put(ALTITUDE_ACCURACY, integerOne);
+	}	
+
+	private void initTipTexts(){
+		tipTexts = new HashMap<String, String>();		
+		
+		String altitudeTipText = "Altitude in meters";
+		
+		String accuracyTipText = "Accuracy in meters";
+		tipTexts.put(POSITION_ACCURACY, accuracyTipText);
+		tipTexts.put(ALTITUDE, altitudeTipText);
+		tipTexts.put(ALTITUDE_ACCURACY, accuracyTipText);		
+	}
+	
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/Log.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.log;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing log
+ */
+public class Log extends AbstractComponent {
+
+
+	public Log(int id) {
+		super(id);
+	}	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_LOG;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return LogVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return LogVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_LOG_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return LogVariables.getInstance().getValuesForItemType(idByValue);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isTypeSupportingIncValueForEachCopy(java.lang.String)
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		return LogVariables.getInstance().isTypeSupportingIncValueForEachCopy(type);
+		
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return LogVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/LogValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.log;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of log
+ */
+public class LogValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public LogValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public LogValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public LogValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public LogValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public LogValue() {
+		super(CreatorEditorSettings.TYPE_LOG);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/log/LogVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.log;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for log
+ */
+public class LogVariables extends AbstractVariables {
+	
+
+	private static final String DIRECTION_XML = "direction";
+	private static LogVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static LogVariables getInstance() {
+		
+		if(instance == null){
+			instance = new LogVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private LogVariables(){
+		init();
+		initFixedValues();
+	}
+	
+	//
+	// Variables to show items in UI
+	//
+	public static final String DIRECTION = "Direction";
+	public static final String DURATION = "Duration";
+	public static final String PHONENUMBER = "Phone number";
+	public static final String DATETIME = "Datetime";
+	
+	/**
+	 * Direction fixed values
+	 */
+	public static final String [] ALL_DIRECTION_TYPES_AS_COMMA_SEPARATED_STRING = {"missed", "in", "out"};
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(4);
+		  items.put(DIRECTION_XML,DIRECTION);
+		  items.put("duration",DURATION);
+		  items.put("phonenumber",PHONENUMBER);
+		  items.put("datetime",DATETIME);
+		 
+	}
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+
+		itemsValues.put(DIRECTION_XML, ALL_DIRECTION_TYPES_AS_COMMA_SEPARATED_STRING);
+				
+
+	}		
+	
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+	
+	/**
+	 * Check if <code>incvalueforeachcopy</code> is supported for type.
+	 * @param type as in UI, not as in XML.
+	 * @return <code>true</code> if <code>incvalueforeachcopy</code> is supported.
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		if(type == null){
+			return false;
+		}
+		
+		return type.equals(PHONENUMBER);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBox.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing mailbox
+ */
+public class MailBox extends AbstractComponent {
+
+
+	public MailBox(int id, String type) {
+		this(id);
+		setMailBoxType(type);
+	}	
+	
+	public MailBox(int id) {
+		super(id);
+	}	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_MAIL_BOX;
+	}
+	
+	/**
+	 * Get type for this MailBox
+	 * @return
+	 */
+	public String getMailBoxType() {
+		return getAdditionalParameter(TYPE_PARAMETER_ID);
+	}
+
+
+
+	/**
+	 * Set event type for this MailBox
+	 * @param type
+	 */
+	public void setMailBoxType(String type) {
+		addAdditionalParameter(TYPE_PARAMETER_ID, type);
+	}		
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return MailBoxVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return MailBoxVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_MAIL_BOX_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return MailBoxVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return MailBoxVariables.getInstance().itemMaxOccur(itemName);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return MailBoxVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBoxValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of mailbox
+ */
+public class MailBoxValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public MailBoxValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public MailBoxValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public MailBoxValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public MailBoxValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public MailBoxValue() {
+		super(CreatorEditorSettings.TYPE_MAIL_BOX);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MailBoxVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,318 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for mailbox
+ */
+public class MailBoxVariables extends AbstractVariables {
+	
+	//
+	// Variables to show items in UI
+	//
+	private static final String TO_CC_INCLUDE_LIMIT = "TO/CC include limit";
+	private static final String SMTP_AUTHENTICATION = "SMTP authentication";
+	private static final String REPLYTO_ADDRESS = "Replyto address";
+	private static final String RECEIPT_ADDRESS = "Receipt address";
+	private static final String EMAIL_ALIAS = "Email alias";
+	private static final String OUTGOING_SERVER_NAME = "Outgoing server name";
+	private static final String OUTGOING_PASSWORD = "Outgoing password";
+	private static final String OUTGOING_LOGIN_NAME = "Outgoing login name";
+	private static final String OUTGOING_PORT = "Outgoing port";
+	private static final String SYNC_RATE = "Sync rate";
+	private static final String MAX_EMAIL_SIZE = "Max email size";
+	private static final String IMAP_IDLE_TIMEOUT = "Imap idle timeout";
+	private static final String PATH_SEPARATOR = "Path separator";
+	private static final String INCOMING_FOLDER_PATH = "Incoming folder path";
+	private static final String ATTACHMENT_FETCH_SIZE = "Attachment fetch size";
+	private static final String BODY_TEXT_SIZE_LIMIT = "Body text size limit";
+	private static final String ATTACHMENT_SIZE_LIMIT = "Attachment size limit";
+	private static final String INCOMING_SERVER_NAME = "Incoming server name";
+	private static final String INCOMING_PASSWORD = "Incoming password";
+	private static final String INCOMING_LOGINNAME = "Incoming loginname";
+	private static final String INCOMING_PORT = "Incoming port";
+	
+	//
+	// XML element names
+	//	
+	private static final String SEND_OPTION_XML = "sendoption";
+	private static final String COPY_TO_SELF_XML = "copytoself";
+	private static final String FOLDER_SYNC_TYPE_XML = "foldersynctype";
+	private static final String SUBSCRIBE_TYPE_XML = "subscribetype";
+	private static final String GET_EMAIL_OPTIONS_XML = "getemailoptions";
+	
+	//
+	// Fixed variables for certain item in UI
+	//
+	public static final String [] POSSIBLE_VALUES_FOR_GET_EMAIL_OPTIONS = {"getheaders", "getbodytext", "getbodytextandattachments", "getattachments", "getbodyalternativetext"};
+	public static final String [] POSSIBLE_VALUES_FOR_SUBSCRIBE_TYPE = {"updateneither", "updatelocal", "updateremote", "updateboth"};
+	public static final String [] POSSIBLE_VALUES_FOR_FOLDER_SYNC_TYPE = {"usecombination", "uselocal", "useremote"};
+	public static final String [] POSSIBLE_VALUES_FOR_COPY_TO_SELF = {"no", "to", "cc", "bcc"};
+	public static final String [] POSSIBLE_VALUES_FOR_SEND_OPTION = {"immediately", "onnextconnection", "onrequest"};
+
+	
+	//
+	// XML element names, not needed outside of this class
+	//
+	
+	private static final String REQUEST_RECEIPTS_XML = "requestreceipts";
+	private static final String OUTGOING_SSL_WRAPPER_XML = "outgoingsslwrapper";
+	private static final String OUTGOING_SECURE_SOCKETS_XML = "outgoingsecuresockets";
+	private static final String ADD_VCARD_XML = "addvcard";
+	private static final String DISCONNECTED_USER_MODE_XML = "disconnectedusermode";
+	private static final String ENABLE_EXPUNGE_MODE_XML = "enableexpungemode";
+	private static final String MARK_SEEN_IN_SYNC_XML = "markseeninsync";
+	private static final String IMAP_IDLE_COMMAND_XML = "imapidlecommand";
+	private static final String DELETE_MAILS_AT_DISCONNECT_XML = "deletemailsatdisconnect";
+	private static final String AUTOSEND_ON_CONNECT_XML = "autosendonconnect";
+	private static final String ACKNOWLEDGE_RECEIPTS_XML = "acknowledgereceipts";
+	private static final String USE_APOP_SECURE_LOGIN_XML = "useapopsecurelogin";
+	private static final String INCOMING_SSL_WRAPPER_XML = "incomingsslwrapper";
+	private static final String INCOMINGSECURESOCKETS_XML = "incomingsecuresockets";
+	
+	
+	//
+	// Variables to show items in UI
+	//
+	public static final String SEND_OPTION = "Send option";
+	public static final String FOLDER_SYNC_TYPE = "Folder sync type";
+	public static final String SUBSCRIBE_TYPE = "Subscribe type";
+	public static final String MAILBOX_SYNC_LIMIT = "Mailbox sync limit";
+	public static final String INBOX_SYNC_LIMIT = "Inbox sync limit";
+	public static final String GET_EMAIL_OPTIONS = "Get email options";
+	public static final String OUTGOING_CONNECTIONMETHOD_NAME = "Outgoing connectionmethod name";
+	public static final String INCOMING_CONNECTIONMETHOD_NAME = "Incoming connectionmethod name";
+	public static final String REQUEST_RECEIPTS = "Request receipts";
+	public static final String OUTGOING_SSL_WRAPPER = "Outgoing SSL wrapper";
+	public static final String OUTGOING_SECURE_SOCKETS = "Outgoing secure sockets";
+	public static final String ADD_VCARD = "Add vcard";
+	public static final String DISCONNECTED_USER_MODE = "Disconnected user mode";
+	public static final String ENABLE_EXPUNGE_MODE = "Enable EXPUNGE mode";
+	public static final String MARK_SEEN_IN_SYNC = "Mark seen in sync";
+	public static final String IMAP_IDLE_COMMAND = "Imap idle command";
+	public static final String DELETE_MAILS_AT_DISCONNECT = "Delete mails at disconnect";
+	public static final String AUTOSEND_ON_CONNECT = "Autosend on connect";
+	public static final String ACKNOWLEDGE_RECEIPTS = "Acknowledge receipts";
+	public static final String INCOMING_SSL_WRAPPER = "Incoming SSL wrapper";
+	public static final String INCOMING_SECURE_SOCKETS = "Incoming secure sockets";
+	public static final String OWN_EMAIL = "Own email";
+	public static final String COPY_TO_SELF = "Copy to self";
+	public static final String USE_APOP_SECURE_LOGIN = "Use APOP secure login";
+	public static final String NAME = "Name";
+	public static final String CONNECTION_METHOD_NAME = "Connection method name";
+	
+	
+		
+	
+	/**
+	 * Only instance of this class
+	 */
+	private static MailBoxVariables instance;
+	
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static MailBoxVariables getInstance() {
+		
+		if(instance == null){
+			instance = new MailBoxVariables();
+		}
+		
+		return instance;
+	}	
+	
+	/**
+	 * Private contruction
+	 */
+	private MailBoxVariables(){
+		init();
+		initFixedValues();
+		initMaxOccurValues();
+	}
+	
+	//
+	//TYPES of mail box
+	//
+	private static final String TYPE = "Type";
+	private static final String TYPE_POP3 = "POP3";
+	private static final String TYPE_IMAP = "IMAP4";
+	private static final String TYPE_SYNCML = "SyncML";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(14);
+		
+		items.put("name",NAME);
+		items.put("ownemail",OWN_EMAIL);
+		items.put(COPY_TO_SELF_XML,COPY_TO_SELF);
+		items.put(USE_APOP_SECURE_LOGIN_XML,USE_APOP_SECURE_LOGIN);			
+		
+		items.put("incomingport", INCOMING_PORT);
+		items.put(INCOMING_SSL_WRAPPER_XML, INCOMING_SSL_WRAPPER);
+		items.put(INCOMINGSECURESOCKETS_XML, INCOMING_SECURE_SOCKETS);
+		items.put("incomingloginname", INCOMING_LOGINNAME);
+		items.put("incomingpassword", INCOMING_PASSWORD);
+		items.put("incomingservername", INCOMING_SERVER_NAME);
+		items.put("incomingconnectionmethod", INCOMING_CONNECTIONMETHOD_NAME);
+		items.put(ACKNOWLEDGE_RECEIPTS_XML, ACKNOWLEDGE_RECEIPTS);
+		items.put("attachmentsizelimit", ATTACHMENT_SIZE_LIMIT);
+		items.put(AUTOSEND_ON_CONNECT_XML, AUTOSEND_ON_CONNECT);
+		items.put("bodytextsizelimit", BODY_TEXT_SIZE_LIMIT);
+		items.put(DELETE_MAILS_AT_DISCONNECT_XML, DELETE_MAILS_AT_DISCONNECT);
+		items.put("attachmentfetchsize", ATTACHMENT_FETCH_SIZE);
+		items.put("incomingfolderpath", INCOMING_FOLDER_PATH);
+		items.put("pathseparator", PATH_SEPARATOR);
+		items.put(GET_EMAIL_OPTIONS_XML, GET_EMAIL_OPTIONS);
+		items.put(IMAP_IDLE_COMMAND_XML, IMAP_IDLE_COMMAND);
+		items.put("imapidletimeout", IMAP_IDLE_TIMEOUT);
+		items.put("maxemailsize", MAX_EMAIL_SIZE);
+		items.put(SUBSCRIBE_TYPE_XML, SUBSCRIBE_TYPE);
+		items.put("syncrate", SYNC_RATE);
+		items.put(FOLDER_SYNC_TYPE_XML, FOLDER_SYNC_TYPE);
+		items.put(MARK_SEEN_IN_SYNC_XML, MARK_SEEN_IN_SYNC);
+		items.put(ENABLE_EXPUNGE_MODE_XML, ENABLE_EXPUNGE_MODE);
+		items.put("inboxsynclimit", INBOX_SYNC_LIMIT);
+		items.put("mailboxsynclimit", MAILBOX_SYNC_LIMIT);
+		items.put(DISCONNECTED_USER_MODE_XML, DISCONNECTED_USER_MODE);
+		items.put("outgoingport", OUTGOING_PORT);
+		items.put(OUTGOING_SSL_WRAPPER_XML, OUTGOING_SSL_WRAPPER);
+		items.put(OUTGOING_SECURE_SOCKETS_XML, OUTGOING_SECURE_SOCKETS);
+		items.put("outgoingloginname", OUTGOING_LOGIN_NAME);
+		items.put("outgoingpassword", OUTGOING_PASSWORD);
+		items.put("outgoingservername", OUTGOING_SERVER_NAME);
+		items.put("outgoingconnectionmethod", OUTGOING_CONNECTIONMETHOD_NAME);
+		items.put(ADD_VCARD_XML, ADD_VCARD);
+		items.put("emailalias", EMAIL_ALIAS);
+		items.put("receiptaddress", RECEIPT_ADDRESS);
+		items.put("replytoaddress", REPLYTO_ADDRESS);
+		items.put(REQUEST_RECEIPTS_XML, REQUEST_RECEIPTS);
+		items.put("smtpauth", SMTP_AUTHENTICATION);
+		items.put(SEND_OPTION_XML, SEND_OPTION);
+		items.put("toccincludelimit", TO_CC_INCLUDE_LIMIT);		
+		
+				
+		additionalItems = new LinkedHashMap<String, String>(13);
+		additionalItems.put(AbstractComponent.TYPE_PARAMETER_ID,TYPE);
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+		itemsValues.put(INCOMINGSECURESOCKETS_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(INCOMING_SSL_WRAPPER_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(USE_APOP_SECURE_LOGIN_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(ACKNOWLEDGE_RECEIPTS_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(AUTOSEND_ON_CONNECT_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(DELETE_MAILS_AT_DISCONNECT_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(IMAP_IDLE_COMMAND_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(MARK_SEEN_IN_SYNC_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(ENABLE_EXPUNGE_MODE_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(DISCONNECTED_USER_MODE_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(ADD_VCARD_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(OUTGOING_SECURE_SOCKETS_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(OUTGOING_SSL_WRAPPER_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);
+		itemsValues.put(REQUEST_RECEIPTS_XML, YES_NO_TYPES_AS_COMMA_SEPARATED_STRING);	
+		
+		itemsValues.put(GET_EMAIL_OPTIONS_XML, POSSIBLE_VALUES_FOR_GET_EMAIL_OPTIONS);	
+		itemsValues.put(SUBSCRIBE_TYPE_XML,  POSSIBLE_VALUES_FOR_SUBSCRIBE_TYPE);	
+		itemsValues.put(FOLDER_SYNC_TYPE_XML,  POSSIBLE_VALUES_FOR_FOLDER_SYNC_TYPE);	
+		itemsValues.put(COPY_TO_SELF_XML, POSSIBLE_VALUES_FOR_COPY_TO_SELF);	
+		itemsValues.put(SEND_OPTION_XML, POSSIBLE_VALUES_FOR_SEND_OPTION);	
+	
+	}	
+	
+	/**
+	 * Inits Max Occur valus for items
+	 */
+	private void initMaxOccurValues(){
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+		
+		Integer integerOne = new Integer (1);
+		
+		maxOccur.put(NAME, integerOne );
+		maxOccur.put(OWN_EMAIL, integerOne );
+		maxOccur.put(COPY_TO_SELF, integerOne );
+		maxOccur.put(USE_APOP_SECURE_LOGIN, integerOne );					
+		maxOccur.put(INCOMING_PORT, integerOne );
+		maxOccur.put(INCOMING_SSL_WRAPPER, integerOne );
+		maxOccur.put(INCOMING_SECURE_SOCKETS, integerOne );
+		maxOccur.put(INCOMING_LOGINNAME, integerOne );
+		maxOccur.put(INCOMING_PASSWORD, integerOne );
+		maxOccur.put(INCOMING_SERVER_NAME, integerOne );
+		maxOccur.put(INCOMING_CONNECTIONMETHOD_NAME, integerOne );
+		maxOccur.put(ACKNOWLEDGE_RECEIPTS, integerOne );
+		maxOccur.put(ATTACHMENT_SIZE_LIMIT, integerOne );
+		maxOccur.put(AUTOSEND_ON_CONNECT, integerOne );
+		maxOccur.put(BODY_TEXT_SIZE_LIMIT, integerOne );
+		maxOccur.put(DELETE_MAILS_AT_DISCONNECT, integerOne );
+		maxOccur.put(ATTACHMENT_FETCH_SIZE, integerOne );
+		maxOccur.put(INCOMING_FOLDER_PATH, integerOne );
+		maxOccur.put(PATH_SEPARATOR, integerOne );
+		maxOccur.put(GET_EMAIL_OPTIONS, integerOne );
+		maxOccur.put(IMAP_IDLE_COMMAND, integerOne );
+		maxOccur.put(IMAP_IDLE_TIMEOUT, integerOne );
+		maxOccur.put(MAX_EMAIL_SIZE, integerOne );
+		maxOccur.put(SUBSCRIBE_TYPE, integerOne );
+		maxOccur.put(SYNC_RATE, integerOne );
+		maxOccur.put(FOLDER_SYNC_TYPE, integerOne );
+		maxOccur.put(MARK_SEEN_IN_SYNC, integerOne );
+		maxOccur.put(ENABLE_EXPUNGE_MODE, integerOne );
+		maxOccur.put(INBOX_SYNC_LIMIT, integerOne );
+		maxOccur.put(MAILBOX_SYNC_LIMIT, integerOne );
+		maxOccur.put(DISCONNECTED_USER_MODE, integerOne );
+		maxOccur.put(OUTGOING_PORT, integerOne );
+		maxOccur.put(OUTGOING_SSL_WRAPPER, integerOne );
+		maxOccur.put(OUTGOING_SECURE_SOCKETS, integerOne );
+		maxOccur.put(OUTGOING_LOGIN_NAME, integerOne );
+		maxOccur.put(OUTGOING_PASSWORD, integerOne );
+		maxOccur.put(OUTGOING_SERVER_NAME, integerOne );
+		maxOccur.put(OUTGOING_CONNECTIONMETHOD_NAME, integerOne );
+		maxOccur.put(ADD_VCARD, integerOne );
+		maxOccur.put(EMAIL_ALIAS, integerOne );
+		maxOccur.put(RECEIPT_ADDRESS, integerOne );
+		maxOccur.put(REPLYTO_ADDRESS, integerOne );
+		maxOccur.put(REQUEST_RECEIPTS, integerOne );
+		maxOccur.put(SMTP_AUTHENTICATION, integerOne );
+		maxOccur.put(SEND_OPTION, integerOne );
+		maxOccur.put(TO_CC_INCLUDE_LIMIT, integerOne );	
+	}	
+	
+	/*
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractVariables#getInstanceImpl()
+	 */
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+	/**
+	 * Get values for "Type"
+	 * @return fixed values for Type
+	 */
+	public static String[] getTypeVariables() {
+		
+		return new String[]{TYPE_IMAP, TYPE_POP3, TYPE_SYNCML };
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/Message.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.contact.ContactValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing message
+ */
+public class Message extends AbstractComponent {
+
+
+	public Message(int id, String messageType) {
+		this(id);
+		setMessageType(messageType);
+	}	
+	public Message(int id) {
+		super(id);
+	}		
+	
+	/**
+	 * Get type for this Message
+	 * @return
+	 */
+	public String getMessageType() {
+		return getAdditionalParameter(TYPE_PARAMETER_ID);
+	}
+
+
+
+	/**
+	 * Set event type for this Message
+	 * @param eventType
+	 */
+	public void setMessageType(String eventType) {
+		addAdditionalParameter(TYPE_PARAMETER_ID, eventType);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_MESSAGE;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		// Message must have type
+		return getMessageType() != null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return MessageVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return MessageVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_MESSAGE_XML_ELEMENT;
+	}
+	
+	/**
+	 * Component type must be separated from other data with COMPONENT_TYPE_SEPARATOR, and before
+	 * COMPONENT_TYPE_SEPARATOR there must not be any other information than component type.
+	 * @return component String. Format:
+	 * <code><Component type> COMPONENT_TYPE_SEPARATOR <Item label>=<Item value>, <Item label>=<Item value>... </code> 
+	 */	
+	public String toString() {
+	
+		Set<String> componentKeys = getKeys();
+		//Collection<String> values = comp.getAttributes().values();
+		
+		StringBuffer allFieldsB = new StringBuffer();
+		allFieldsB.append( getValueById( getMessageType() ));			
+		allFieldsB.append( COMPONENT_TYPE_SEPARATOR);
+		
+		//Amount (how many of this component will be added)
+		if(getAmount() > 0){
+			allFieldsB.append(" Amount=");
+			allFieldsB.append(getAmount());
+			allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+		}
+		
+		String itemlabel = new String();
+		Vector<AbstractValue> itemValue;
+		//Looping through one component, founding all fields from that component
+		for (Iterator<String> compValuesIt = componentKeys.iterator(); compValuesIt.hasNext();) {
+			itemlabel = (String) compValuesIt.next();
+			itemValue = getAttribute(itemlabel);
+			//get all values from values vector
+			for (Iterator<AbstractValue> iterator = itemValue.iterator(); iterator.hasNext();) {
+				AbstractValue absVal = iterator.next();
+				MessageValue calVal = (MessageValue)absVal;
+
+				addOneItemToBuffer(allFieldsB, itemlabel, calVal);									
+			}
+			
+		}
+		
+		//deleting last ", " from list
+		if(allFieldsB.toString().endsWith(COMPONENT_ITEM_SEPARATOR)){
+			allFieldsB.delete(allFieldsB.length()-COMPONENT_ITEM_SEPARATOR.length(), allFieldsB.length());
+		}
+		return  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(allFieldsB.toString());
+	}
+	
+	private void addOneItemToBuffer(StringBuffer allFieldsB, String itemlabel,
+			MessageValue calVal) {
+		allFieldsB.append(itemlabel);
+		allFieldsB.append(COMPONENT_LABEL_VALUE_SEPARATOR);
+		//If value is random value, showing in UI only short description (<RND>)
+		if(calVal.isRandom()){
+			allFieldsB.append(ContactValue.RANDOM_TEXT);
+		}else{
+			allFieldsB.append(calVal.getValue());
+		}
+		allFieldsB.append(COMPONENT_ITEM_SEPARATOR);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return MessageVariables.getInstance().getValuesForItemType(idByValue);
+		
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isTypeSupportingIncValueForEachCopy(java.lang.String)
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		return MessageVariables.getInstance().isTypeSupportingIncValueForEachCopy(type);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#itemMaxOccur(java.lang.String)
+	 */
+	public int itemMaxOccur(String itemName) {		
+		return MessageVariables.getInstance().itemMaxOccur(itemName);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return MessageVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MessageValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,125 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of message
+ */
+public class MessageValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public MessageValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public MessageValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+	/**
+	 * Set amount and also maxamount as amount
+	 * For now in messages there is no any other possible amount fields in calendar than maxamount in contact-set reference
+	 * So using always amount also as maxamount. If there is new requirement for amount in messages, reimplement. 
+	 *	
+	 * @param amount -for amount and maxamount
+	 */
+	public void setAmount(int amount) {
+		super.setAmount(amount);
+		super.setMaxAmount(amount);
+	}
+
+
+	/**
+	 * Creates new Value.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public MessageValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public MessageValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new Value.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public MessageValue() {
+		super(CreatorEditorSettings.TYPE_MESSAGE);
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractValue#getValue()
+	 */
+	public String getValue() {
+
+		//In case of Attendee, there is two parameters in one value
+		if(isContactSetReference()){
+			return ""+getId();
+		}
+		else{
+			return super.getValue();
+		}
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/messaging/MessageVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.messaging;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.filetype.FileTypeVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * Variables for message
+ */
+public class MessageVariables extends AbstractVariables {
+
+
+	//
+	// UI texts for xml elements
+	//
+	public static final String STATUS = "Status";
+	public static final String TO = "To";
+	public static final String FROM = "From";
+	public static final String FOLDER = "Folder";
+	public static final String SUBJECT = "Subject";
+	public static final String TEXT = "Text";
+	public static final String ATTACHMENTPATH = "Attachment path";
+	public static final String ATTACHMENTID = "Attachment file ID";
+	public static final String SMART_MSG_TYPE = "Type";
+	
+	/**
+	 * Possible fixed values for "Folder" 
+	 */
+	public static final String [] FOLDER_POSSIBLE_VALUES = {"Sent", "Inbox", "Draft", "Outbox"};
+	/**
+	 * Possible fixed values for "Status"
+	 */
+	public static final String [] STATUS_POSSIBLE_VALUES = {"Read", "New"};
+	/**
+	 * Possible fixed values for Smart message "Type"
+	 */
+	public static final String [] SMART_MSG_TYPE_POSSIBLE_VALUES = {
+		"internetsettings", "emailnotification", "businesscard", "wapsettings", "vcalendar", 
+		"vcard", "ringtone", "operatorlogo", "wapprovisioning", "clilogo"};
+
+	
+	
+	//
+	// XML element names
+	//
+	private static final String ATTACHEMENT_ID_XML_ELEMENT = "attachmentid";
+	private static final String FOLDER_XML_ELEMENT = "folder";
+	private static final String SMARTMESSAGETYPE_XML_ELEMENT = "smartmessagetype";
+	private static final String BT_XML_ELEMENT = "bt";
+	private static final String IR_XML_ELEMENT = "ir";
+	private static final String SMART_XML_ELEMENT = "smart";
+	private static final String SMS_XML_ELEMENT = "sms";
+	private static final String MMS_XML_ELEMENT = "mms";
+	private static final String AMS_XML_ELEMENT = "ams";
+	private static final String EMAIL_XML_ELEMENT = "email";
+	private static final String FROM_XML_ELEMENT = "from";
+	private static final String TO_XML_ELEMENT = "to";
+	private static final String STATUS_XML_ELEMENT = "status";
+	
+	private static MessageVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static MessageVariables getInstance() {
+		
+		if(instance == null){
+			instance = new MessageVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private MessageVariables(){
+		init();
+		initFixedValues();
+		initMaxOccurValues();
+	}
+	
+
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(3);
+		items.put(TO_XML_ELEMENT, TO);
+		items.put(FROM_XML_ELEMENT, FROM);
+		items.put(FOLDER_XML_ELEMENT, FOLDER);
+		items.put("subject", SUBJECT);
+		items.put("text", TEXT);
+		items.put(STATUS_XML_ELEMENT, STATUS);		
+		items.put("attachmentpath", ATTACHMENTPATH);
+		items.put(ATTACHEMENT_ID_XML_ELEMENT, ATTACHMENTID);
+		//For contact set references, (from and to) must create own handling, because of items keys are unique, cant have same key with two values
+		items.put(/*FROM_XML_ELEMENT*/CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM);
+		items.put(/*TO_XML_ELEMENT */CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO);
+
+		additionalItems = new LinkedHashMap<String, String>(13);
+
+		
+		additionalItems.put(SMS_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_SMS);
+		additionalItems.put(MMS_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_MMS);
+		additionalItems.put(AMS_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_AMS);
+		additionalItems.put(EMAIL_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_EMAIL);
+		additionalItems.put(SMART_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_SMART);
+		additionalItems.put(IR_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_IR);		 
+		additionalItems.put(BT_XML_ELEMENT, CreatorEditorSettings.TYPE_MESSAGE_BT);
+		
+		
+		additionalItems.put(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE);
+		//For contact set references, (from and to) must create own handling, because of items keys are unique, cant have same key with two values
+		//Contact set reference from and to xml elements will found here
+		additionalItems.put(FROM_XML_ELEMENT, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM);		
+		additionalItems.put(TO_XML_ELEMENT, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO);
+		
+		additionalItems.put(SMARTMESSAGETYPE_XML_ELEMENT, SMART_MSG_TYPE);		
+		
+	}
+	
+	private void initFixedValues(){
+		itemsValues = new LinkedHashMap<String, String[]>(4);
+		itemsValues.put(STATUS_XML_ELEMENT, STATUS_POSSIBLE_VALUES);
+		itemsValues.put(SMARTMESSAGETYPE_XML_ELEMENT, SMART_MSG_TYPE_POSSIBLE_VALUES);
+		itemsValues.put(FOLDER_XML_ELEMENT, FOLDER_POSSIBLE_VALUES);
+		itemsValues.put(ATTACHEMENT_ID_XML_ELEMENT, FileTypeVariables.ALL_FILE_TYPES_AS_COMMA_SEPARATED_STRING);				
+	}
+	
+	/**
+	 * Inits Max Occur valus for items
+	 */
+	private void initMaxOccurValues(){
+		maxOccur = new LinkedHashMap<String, Integer>(4);
+		
+		Integer integerOne = new Integer (1);
+		
+		maxOccur.put(FOLDER, integerOne );
+		maxOccur.put(SUBJECT, integerOne );
+		maxOccur.put(TEXT, integerOne );
+		maxOccur.put(SMART_MSG_TYPE, integerOne );
+		maxOccur.put(STATUS, integerOne );		
+	}	
+	
+	/**
+	 * Get XML element name by value
+	 * @param value
+	 * @return key if found, null otherwise
+	 */
+	public String getIdByValue(String value) {
+		
+		if(value != null && value.equals(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM)){
+			return FROM_XML_ELEMENT;
+		}
+		else if(value != null && value.equals(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO)){
+			return TO_XML_ELEMENT;
+		}		
+		else{
+			return super.getIdByValue(value);
+		}
+
+	}
+	
+	
+	/**
+	 * Get value by two xml element name. Use with from/to and contact-set-reference to get proper contact set reference element UI name.
+	 * @param superElement
+	 * @param element
+	 * @return String
+	 */
+	public static String getValueByIds(String superElement, String element){
+		if(superElement != null && element != null){
+			if(superElement.equalsIgnoreCase(FROM) && element.equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT)){
+				return CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM;
+			}
+			else if(superElement.equalsIgnoreCase(TO) && element.equalsIgnoreCase(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT)){
+				return CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO;
+			}
+			else{ 
+				return null;			
+			}
+		}
+		else{
+			return null;
+		}
+	}
+	
+	/**
+	 * Get Item values (showable names)
+	 * 
+	 * @return item names
+	 */
+	public String[] getItemValuesAsString(String type) {
+
+		String _type = getValueById(type);
+		
+		String[] arr = null;
+
+		//
+		// Some of types has limited number of values, not all
+		//
+		
+		if (_type.equals(CreatorEditorSettings.TYPE_MESSAGE_SMS)) {
+			arr = new String[] {
+			// No subject, no attachement in SMS
+					TO, FROM, FOLDER, TEXT,STATUS, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO, 
+					CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM };
+			return arr;
+		} else if (_type.equals(CreatorEditorSettings.TYPE_MESSAGE_SMART)) {
+			arr = new String[] { TO, FROM, FOLDER ,STATUS, 
+					CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO, 
+					CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM,
+					SMART_MSG_TYPE};
+			return arr;
+		} else if (_type.equals(CreatorEditorSettings.TYPE_MESSAGE_IR)
+				|| _type.equals(CreatorEditorSettings.TYPE_MESSAGE_BT)) {
+			arr = new String[] { TO, FROM, FOLDER, STATUS,SUBJECT, CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO, 
+					CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM };
+			return arr;
+		}
+		// Types:
+		// CreatorEditorSettings.TYPE_MESSAGE_MMS,
+		// CreatorEditorSettings.TYPE_MESSAGE_AMS,
+		// CreatorEditorSettings.TYPE_MESSAGE_EMAIL
+		// will have all elements
+		else {
+			return getItemValuesAsString();
+		}
+	}	
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+	/**
+	 * Get ID by subelement name and superelement name
+	 * @param itemId - sub element name
+	 * @param superElementType - super element name
+	 * @return
+	 */
+	public String getIDByValueAndType(String itemId, String superElementType) {
+		
+		if(itemId != null && superElementType != null && itemId.equals(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT)){
+		
+			if(superElementType.equals(FROM_XML_ELEMENT )){
+				return CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_FROM;
+			}
+			else if(superElementType.equals(TO_XML_ELEMENT )){
+				return CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_TO;
+			}
+			else{
+				return getIdByValue(itemId);
+			}
+		}
+		
+		else{
+			return getIdByValue(itemId);
+		}
+		
+	}
+
+	/**
+	 * Check if <code>incvalueforeachcopy</code> is supported for type.
+	 * @param type as in UI, not as in XML.
+	 * @return <code>true</code> if <code>incvalueforeachcopy</code> is supported.
+	 */
+	public boolean isTypeSupportingIncValueForEachCopy(String type) {
+		
+		//phone number
+		
+		if(type == null){
+			return false;
+		}
+		
+		return type.equals(TO) || type.equals(FROM);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/Note.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.note;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing Note
+ */
+public class Note extends AbstractComponent {
+
+
+	public Note(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_NOTE;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return NoteVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return NoteVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_NOTE_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return NoteVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return NoteVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/NoteValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.note;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of note
+ */
+public class NoteValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public NoteValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public NoteValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new NoteValue.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public NoteValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new NoteValue with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public NoteValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new NoteValue.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public NoteValue() {
+		super(CreatorEditorSettings.TYPE_NOTE);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/note/NoteVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.note;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for note
+ */
+public class NoteVariables extends AbstractVariables {
+	
+
+	private static NoteVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static NoteVariables getInstance() {
+		
+		if(instance == null){
+			instance = new NoteVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private NoteVariables(){
+		init();
+	}
+	
+
+	/**
+	 * UI text "Text".
+	 */
+	public static final String TEXT = "Text";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(1);
+		items.put("text",TEXT);
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing saved page
+ */
+public class SavedPage extends AbstractComponent {
+
+
+	public SavedPage(int id) {
+		super(id);
+	}	
+	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_SAVED_PAGE;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return SavedPageVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return SavedPageVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_SAVED_PAGE_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return SavedPageVariables.getInstance().getValuesForItemType(idByValue);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return SavedPageVariables.getInstance();
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+
+/**
+ * Class representing saved page folder
+ */
+public class SavedPageFolder extends AbstractComponent {
+
+
+	public SavedPageFolder(int id) {
+		super(id);
+	}	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.config.AbstractComponent#getType()
+	 */
+	public String getType() {
+		return CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getIdByValue(java.lang.String)
+	 */
+	public String getIdByValue(String value) {		
+		return SavedPageFolderVariables.getInstance().getIdByValue(value);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValueById(java.lang.String)
+	 */
+	public String getValueById(String id) {		
+		return SavedPageFolderVariables.getInstance().getValueById(id);
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getXMLElementName()
+	 */
+	public String getXMLElementName() {
+		return CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER_XML_ELEMENT;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getValuesForItemType(java.lang.String)
+	 */
+	public String[] getValuesForItemType(String itemType) {
+		//If there is not this type of item at all
+		String idByValue = getIdByValue(itemType);
+		if(idByValue == null){
+			return null;
+		}
+		return SavedPageFolderVariables.getInstance().getValuesForItemType(idByValue);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.components.AbstractComponent#getVariables()
+	 */
+	public AbstractVariables getVariables(){
+		return SavedPageFolderVariables.getInstance();
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolderValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of saved page folder
+ */
+public class SavedPageFolderValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public SavedPageFolderValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public SavedPageFolderValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new NoteValue.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public SavedPageFolderValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new NoteValue with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public SavedPageFolderValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new NoteValue.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public SavedPageFolderValue() {
+		super(CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageFolderVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for saved page folder
+ */
+public class SavedPageFolderVariables extends AbstractVariables {
+	
+	
+	private static SavedPageFolderVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static SavedPageFolderVariables getInstance() {
+		
+		if(instance == null){
+			instance = new SavedPageFolderVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private SavedPageFolderVariables(){
+		init();
+	}
+
+
+	/**
+	 * UI text "Name"
+	 */
+	public static final String NAME = "Name";
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(1);
+		items.put("name",NAME);
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageValue.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+
+/**
+ * One row of data of saved page
+ */
+public class SavedPageValue extends AbstractValue {
+
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param randomType
+	 * @param amount
+	 */
+	public SavedPageValue(String value, ModeTypes randomType, int amount) {
+		this();
+		setValue(value);
+		setModeType(randomType);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new Value.
+	 * @param value
+	 * @param amount
+	 */
+	public SavedPageValue(String value, int amount) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(amount);
+	}
+
+
+	/**
+	 * Creates new NoteValue.
+	 * 
+	 * @param value
+	 * @param isRandom if false, random type is set to {@link ModeTypes#RandomTypeNotRandom}
+	 * if true random type is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 * @param amount
+	 */
+	public SavedPageValue(String value, boolean isRandom, int amount) {
+		this();
+		if(!isRandom){
+			setModeType(ModeTypes.RandomTypeNotRandom);			
+		}
+		else{
+			setModeType(ModeTypes.RandomTypeDefaultLength);
+		}
+		setValue(value);
+		setAmount(amount);
+	}
+	
+	/**
+	 * Creates new NoteValue with no random and no amount.
+	 * random value is set to {@link ModeTypes#RandomTypeNotRandom} and
+	 * amount is set to 0.
+	 * @param value
+	 */
+	public SavedPageValue(String value) {
+		this();
+		setValue(value);
+		setModeType(ModeTypes.RandomTypeNotRandom);
+		setAmount(0);
+	}	
+	
+	/**
+	 * Creates new NoteValue.
+	 * Attributes is set by default;
+	 *  - random value is set to {@link ModeTypes#RandomTypeDefaultLength}
+	 *  - random is set to true
+	 *  - value is set to EMPTY_STRING 
+	 *  - amount is set to 0.
+	 */
+	public SavedPageValue() {
+		super(CreatorEditorSettings.TYPE_SAVED_PAGE);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/components/savedpage/SavedPageVariables.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.components.savedpage;
+
+import java.util.LinkedHashMap;
+
+import com.nokia.s60tools.creator.components.AbstractVariables;
+
+/**
+ * Variables for saved page
+ */
+public class SavedPageVariables extends AbstractVariables {
+	
+	
+	private static SavedPageVariables instance;
+	
+	/**
+	 * Get Singleton instance of variables
+	 * @return 
+	 */
+	public static SavedPageVariables getInstance() {
+		
+		if(instance == null){
+			instance = new SavedPageVariables();
+		}
+		
+		return instance;
+	}	
+	
+	private SavedPageVariables(){
+		init();
+	}
+
+
+	/**
+	 * UI text "Name"
+	 */
+	public static final String NAME = "Name";
+	/**
+	 * UI text "Path"
+	 */
+	public static final String PATH = "Path";
+
+	
+	private void init() {
+
+		items = new LinkedHashMap<String, String>(2);
+		items.put("name",NAME);
+		items.put("path",PATH);
+		 
+	}
+
+	protected AbstractVariables getInstanceImpl() {
+		return instance;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/core/CreatorEditorSettings.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,433 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.core;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Set;
+
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.calendar.CalendarVariables;
+
+/**
+ * CreatorScriptEditorSettings. Values for drop down menu on CreatorScript Editor.
+ * 
+ * Use CreatorScriptEditorPropertiesSetter to set Values on startup
+ */
+public class CreatorEditorSettings {
+	
+	/**
+	 * One instance of settings
+	 */
+	private static CreatorEditorSettings instance;
+	
+	/**
+	 * Holds forbidden characters and entity numbers 
+	 */
+	private Hashtable<String, String> entityNumbersAndChars;
+	
+	/**
+	 * Holds forbidden characters and entity numbers 
+	 */
+	private Hashtable<String, String> entityNamesAndChars;
+
+
+
+	/**
+	 * Type for general "Unkown" component type
+	 */
+	public static final String TYPE_UNKNOWN = "Unknown component";
+			
+	//
+	// Variables for contacts
+	//
+	public static final String TYPE_CONTACT = "Contact";
+	public static final String TYPE_CONTACT_XML_ELEMENT = "contact";		
+	public static final String TYPE_CONTACT_SET = "Contact-set";
+	public static final String TYPE_CONTACT_SET_XML_ELEMENT = "contact-set";
+	public static final String TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT = "contact-set-reference";
+	public static final String TYPE_CONTACT_SET_REFERENCE_FROM = "From (Contact Set ID)";
+	public static final String TYPE_CONTACT_SET_REFERENCE_TO = "To (Contact Set ID)";
+	public static final String TYPE_CONTACT_SET_REFERENCE = "Contact Set ID";
+	public static final String TYPE_CONTACT_GROUP = "Contact Group";
+	public static final String TYPE_CONTACT_GROUP_XML_ELEMENT = "contactgroup";
+	
+	//
+	// Variables for note
+	//
+	public static final String TYPE_NOTE = "Note";
+	public static final String TYPE_NOTE_XML_ELEMENT = "note";	
+	
+	//
+	// Variables for bookmark
+	//
+	public static final String TYPE_BOOKMARK = "Bookmark";
+	public static final String TYPE_BOOKMARK_XML_ELEMENT = "bookmark";
+	public static final String TYPE_BOOKMARK_FOLDER = "Bookmark folder";
+	public static final String TYPE_BOOKMARK_FOLDER_XML_ELEMENT = "bookmarkfolder";
+
+	//
+	// Variables for saved page
+	//
+	public static final String TYPE_SAVED_PAGE = "Saved page";
+	public static final String TYPE_SAVED_PAGE_XML_ELEMENT = "savedpage";
+	public static final String TYPE_SAVED_PAGE_FOLDER = "Saved page folder";
+	public static final String TYPE_SAVED_PAGE_FOLDER_XML_ELEMENT = "savedpagefolder";
+
+	//
+	// Variables for log
+	//	
+	public static final String TYPE_LOG = "Log";
+	public static final String TYPE_LOG_XML_ELEMENT = "log";
+
+	//
+	// Variables for IMPS Server
+	//
+	public static final String TYPE_IMPS_SERVER = "IMPS Server";
+	public static final String TYPE_IMPS_SERVER_XML_ELEMENT = "impsserver";
+
+	//
+	// Variables for Connection method
+	//	
+	public static final String TYPE_CONNECTION_METHOD_XML_ELEMENT = "connectionmethod";
+	public static final String TYPE_CONNECTION_METHOD = "Connection method";
+
+	//
+	// Variables for calendar
+	//	
+	public static final String TYPE_CALENDAR_XML_ELEMENT = "calendar";
+	public static final String TYPE_CALENDAR = "Calendar";
+	public static final String TYPE_TODO = "To-do";
+	public static final String TYPE_TODO_XML_ELEMENT = "todo";	
+	public static final String TYPE_APPOINTMENT = "Appointment";
+	public static final String TYPE_APPOINTMENT_XML_ELEMENT = "appointment";
+	public static final String TYPE_EVENT = "Event";
+	public static final String TYPE_EVENT_XML_ELEMENT = "event";
+	public static final String TYPE_REMINDER = "Reminder";
+	public static final String TYPE_REMINDER_XML_ELEMENT = "reminder";
+	public static final String TYPE_ANNIVERSARY = "Anniversary";	
+	public static final String TYPE_ANNIVERSARY_XML_ELEMENT = "anniversary";	
+
+	//
+	// Variables for mailbox
+	//
+	public static final String TYPE_MAIL_BOX_XML_ELEMENT = "mailbox";
+	public static final String TYPE_MAIL_BOX = "Mail box";
+
+	//
+	// Variables for messages
+	//
+	public static final String TYPE_MESSAGE_XML_ELEMENT = "message";
+	public static final String TYPE_MESSAGE_SMS = "SMS";
+	public static final String TYPE_MESSAGE_MMS = "MMS";
+	public static final String TYPE_MESSAGE_AMS = "AMS";	
+	public static final String TYPE_MESSAGE_EMAIL = "Email";
+	public static final String TYPE_MESSAGE_SMART = "Smart message";
+	public static final String TYPE_MESSAGE_IR = "IR message";
+	public static final String TYPE_MESSAGE_BT = "BT message";
+	public static final String TYPE_MESSAGE = "Message";
+
+	//
+	// Variables for landmarks
+	//
+	public static final String TYPE_LANDMARK_XML_ELEMENT = "landmark";	
+	public static final String TYPE_LANDMARK = "Landmark";
+
+	//
+	// Variables for file
+	//	
+	public static final String TYPE_FILE = "File";
+	public static final String TYPE_FILE_XML_ELEMENT = "file";
+
+
+	
+	
+
+	/**
+	 * List of components able to add to script. This components is shown as list in combo in UI.
+	 * Contact set does not belong to list, because it's handled as separate component.
+	 */
+	private String [] components = {
+			TYPE_CONTACT,
+			TYPE_CONTACT_GROUP,
+			TYPE_CONNECTION_METHOD,
+			TYPE_TODO,
+			TYPE_APPOINTMENT,
+			TYPE_EVENT,
+			TYPE_REMINDER,
+			TYPE_ANNIVERSARY,
+			TYPE_MAIL_BOX,
+			TYPE_MESSAGE_SMS,
+			TYPE_MESSAGE_MMS,
+			TYPE_MESSAGE_AMS,
+			TYPE_MESSAGE_EMAIL,
+			TYPE_MESSAGE_SMART,
+			TYPE_MESSAGE_IR,
+			TYPE_MESSAGE_BT,
+			TYPE_NOTE,
+			TYPE_BOOKMARK,
+			TYPE_BOOKMARK_FOLDER,
+			TYPE_SAVED_PAGE,
+			TYPE_SAVED_PAGE_FOLDER,
+			TYPE_LOG,
+			TYPE_IMPS_SERVER,
+			TYPE_LANDMARK,
+			TYPE_FILE
+			};	
+	
+	
+	/**
+	 * Private construction
+	 */
+	private CreatorEditorSettings(){
+		
+		init();
+		
+	}
+	
+	/**
+	 * Initialize entities for forbidden characters
+	 */
+	private void init(){
+		entityNumbersAndChars = new Hashtable<String, String>();
+		entityNumbersAndChars.put("&#38;", "&" );
+		entityNumbersAndChars.put("&#60;", "<" );
+		entityNumbersAndChars.put("&#62;", ">" );
+		entityNumbersAndChars.put("&#39;", "\'");
+		entityNumbersAndChars.put("&#34;", "\"");
+		
+		entityNamesAndChars = new Hashtable<String, String>();
+		entityNamesAndChars.put("&amp;", "&" );
+		entityNamesAndChars.put("&lt;", "<" );
+		entityNamesAndChars.put("&gt;", ">" );
+		entityNamesAndChars.put("&apos;", "\'");
+		entityNamesAndChars.put("&quot;", "\"");
+		
+	}
+
+	
+	
+	/**
+	 * Only instance of Settings
+	 * @return CreatorScriptEditorSettings instance
+	 */
+	public static CreatorEditorSettings getInstance(){
+		if(instance == null){
+			instance = new CreatorEditorSettings();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Get Components
+	 * @return components possible to create to script
+	 */
+	public String[] getComponents() {
+		return components;
+	}
+
+	/**
+	 * Set Components
+	 * @param components possible to create to script
+	 */
+	public void setComponents(String[] components) {
+		this.components = components;
+	}
+
+
+	/**
+	 * Is selected component supported or not.
+	 * @param componentName
+	 * @return true if it's a supported component name false otherwise
+	 */
+	public boolean isSupportedComponent(String componentName){
+		
+		boolean isSupported = false;
+		for (int i = 0; i < components.length; i++) {
+			if(components[i].equals(componentName)){
+				isSupported = true;
+				break;
+			}
+		}
+		
+		return isSupported ;
+	}
+
+
+	/**
+	 * Check if a String contains forbidden characters to XML element and attribute content
+	 * @param in
+	 * @return true if contain, false otherwise
+	 */
+	public boolean containForbiddenChars(String in){
+		
+		Collection<String> forbiddenChars = entityNumbersAndChars.values();
+		for (Iterator<String> iterator = forbiddenChars.iterator(); iterator.hasNext();) {
+			String forbiddenChar = (String) iterator.next();
+			if(in.contains(forbiddenChar)){
+				return true;
+			}
+		}
+		return false;		
+	
+	}
+	
+	/**
+	 * Check if a String contains entities matching forbidden chars (e.g. &amp; or &#38;)
+	 * @param in
+	 * @return
+	 */
+	public boolean containEntities(String in){
+		
+		Set<String> numKeys = entityNumbersAndChars.keySet();
+		for (Iterator<String> iterator = numKeys.iterator(); iterator.hasNext();) {
+			String key = (String) iterator.next();
+			if(in.contains(key)){
+				return true;
+			}
+		}
+		
+		Set<String> nameKeys = entityNamesAndChars.keySet();
+		for (Iterator<String> iterator = nameKeys.iterator(); iterator.hasNext();) {
+			String key = (String) iterator.next();
+			if(in.contains(key)){
+				return true;
+			}
+		}				
+		return false;	
+	
+	}	
+
+	/**
+	 * Replaces entities:
+	 * &#38; and &amp; with &
+	 * &#60; and &lt; with <
+	 * &#62; and &gt; with >
+	 * &#39; and &apos; with '
+	 * &#34; and &quot; with "
+	 * @param in String with entities
+	 * @return out String with entities as characters
+	 */
+	public String replaceEntitiesWithChars(String in){
+		
+		if(in == null){
+			return in;
+		}
+		
+		String out = new String(in);
+		Set<String> numKeys = entityNumbersAndChars.keySet();
+		for (Iterator<String> iterator = numKeys.iterator(); iterator.hasNext();) {
+			String key = (String) iterator.next();
+			out = out.replace(key, entityNumbersAndChars.get(key));
+		}
+		
+		Set<String> nameKeys = entityNamesAndChars.keySet();
+		for (Iterator<String> iterator = nameKeys.iterator(); iterator.hasNext();) {
+			String key = (String) iterator.next();
+			out = out.replace(key, entityNamesAndChars.get(key));
+		}
+		
+		return out;
+		
+	}
+
+	/**
+	 * Checks that there are no forbidden characters and replaces with valid
+	 * ones if needed. Chars that will be replaced: &, <, >, ", '
+	 * 
+	 * @param in
+	 *            String to be checked.
+	 * @return Returns checked and corrected string.
+	 */
+	public String replaceForbiddenChars(String in) {
+		
+		if(in == null){
+			return in;
+		}
+
+		StringBuffer b = new StringBuffer();
+		char[] arr = in.toCharArray();
+		for (int i = 0; i < arr.length; i++) {
+
+			if (arr[i] == '<') {
+				b.append("&lt;");
+			} else if (arr[i] == '>') {
+				b.append("&gt;");
+			} else if (arr[i] == '&') {
+				b.append("&amp;");
+			} else if (arr[i] == '\"') {
+				b.append("&quot;");
+			} else if (arr[i] == '\'') {
+				b.append("&apos;");
+			} else {
+				b.append(arr[i]);
+			}
+
+		}
+		return b.toString();
+
+	}
+
+	/**
+	 * 
+	 * @param key
+	 *            (type in UI format or in XML element name)
+	 * @return true if key is one of contact set reference types
+	 *         (TYPE_CONTACT_SET_REFERENCE, TYPE_CONTACT_SET_REFERENCE_FROM or
+	 *         TYPE_CONTACT_SET_REFERENCE_TO) false otherwise.
+	 */
+	public static boolean isContactSetReference(String key) {
+		if (key != null && ( key.equals(TYPE_CONTACT_SET_REFERENCE)
+			|| key.equals(TYPE_CONTACT_SET_REFERENCE_FROM)
+			|| key.equals(TYPE_CONTACT_SET_REFERENCE_TO)
+			|| key.equals(TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT)
+			|| key.equals(CalendarVariables.ATTENDEE_CONTACT_SET_REFERENCE)
+			)){
+			return true;
+		}			
+		else{
+			return false;
+		}
+	}
+
+	/**
+	 * Check if value is randomText
+	 * @param randomTxt
+	 * @return <code>true</code> if its random text, <code>false</code> otherwise.
+	 */
+	public static boolean isRandomText(String randomTxt) {
+		
+		if(randomTxt == null){
+			return false;
+		}
+		else{
+			return randomTxt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)						
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH_LONG)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT)
+				|| randomTxt.equals("&lt;RND&gt;");
+		}
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/AbstractDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3015 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.CreatorHelpContextIDs;
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.calendar.Calendar;
+import com.nokia.s60tools.creator.components.contact.Contact;
+import com.nokia.s60tools.creator.components.contact.ContactGroup;
+import com.nokia.s60tools.creator.components.contact.ContactSet;
+import com.nokia.s60tools.creator.components.contact.ContactSetVariables;
+import com.nokia.s60tools.creator.components.messaging.MailBox;
+import com.nokia.s60tools.creator.components.messaging.MailBoxVariables;
+import com.nokia.s60tools.creator.components.messaging.Message;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.CreatorScriptEditor;
+import com.nokia.s60tools.creator.editors.IAddComponentListener;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+
+/**
+ *
+ */
+public abstract class AbstractDialog extends Dialog {
+
+
+	//
+	// Variables for UI texts (column topics)
+	//
+	protected static final String AMOUNT_TXT = "Amount";
+	protected static final String MODE_TXT = "Mode";
+	protected static final String ITEM_VALUE_TXT = "Item value";
+	protected static final String ITEM_TYPE_TXT = "Item type";
+	protected static final String CLEAR_TXT = "Clear";
+
+	//
+	// Variables for UI component lengths
+	//
+	protected static final int TEXT_FIELD_LENGTH = 200;
+	protected static final int AMOUNT_FIELD_LENGTH = 50;
+	private static final int COLUMN_WIDTH_FOR_ONE_CHAR = 10;
+	
+	//
+	// Help texts for UI
+	//
+	public static final String POSSIBLE_VALUES_FOR_TXT_PART_1 = "Possible values for '";
+	public static final String POSSIBLE_VALUES_FOR_TXT_PART_2 = "' are: ";
+	public static final String POSSIBLE_VALUES_FOR_TXT_PART_3 = ".";
+	
+	
+	public static final String MAX_AMOUNT_TEXT = "Max amount";	
+	public static final String AMOUNT_FIELD_INFO_TEXT = "If amount field is empty, amount 1 is used.";
+	
+
+	//
+	// UI texts
+	//
+	private static final String RANDOM_LEN_MAX = "Max";
+	private static final String RANDOM_LEN_DEFAULT = "Default";
+	private static final String SET_RANDOM_TXT = "Set random";
+	private static final String ADD_ROW_TXT = "Add row";
+	
+	
+	/**
+	 * Unexpected error message
+	 */
+	private static final String UNEXPECTED_ERROR_WHEN_CREATING_TABLE_AREA_ERROR_WAS = 
+		"Unexpected error when creating table area, error was: ";
+
+
+	/**
+	 * How many lines is shown in dialog by default
+	 */
+	private static final int INITIAL_ITEMS_NUMBER_IN_TABLE = 20;
+	/**
+	 * How many items can be in combo (max)
+	 */
+	private static final int MAX_ITEMS_IN_COMBO = 30;	
+
+	
+	/**
+	 * UI help text for refering to connection method 
+	 */
+	public static final String CONNECTION_METHOD_NAME_HELP_TEXT = POSSIBLE_VALUES_FOR_TXT_PART_1 
+		+MailBoxVariables.CONNECTION_METHOD_NAME
+		+POSSIBLE_VALUES_FOR_TXT_PART_2 
+		+"'Default' or any existing " +MailBoxVariables.CONNECTION_METHOD_NAME 
+		+POSSIBLE_VALUES_FOR_TXT_PART_3;	
+
+	/**
+	 * UI help text for refering to incoming and outgoing connection method 
+	 */
+	public static final String CONNECTION_METHOD_NAME_IN_AND_OUT_HELP_TEXT = POSSIBLE_VALUES_FOR_TXT_PART_1 
+		+MailBoxVariables.INCOMING_CONNECTIONMETHOD_NAME
+		+ " and "
+		+MailBoxVariables.OUTGOING_CONNECTIONMETHOD_NAME
+		+POSSIBLE_VALUES_FOR_TXT_PART_2 
+		+"'Default' or any existing " +MailBoxVariables.CONNECTION_METHOD_NAME 
+		+POSSIBLE_VALUES_FOR_TXT_PART_3;
+	
+	
+	//
+	// private fields
+	//
+	
+	private AbstractComponent component = null;
+	private boolean isInEditMode;
+	private Color white;
+	private Color grey;
+	protected Table itemsTable;
+	protected Text amoutTxtToComponent;
+	
+	private boolean isAmountFieldsEnabled = true;
+	private boolean isRandomFieldsEnabled = true;
+	private IComponentProvider provider = null;
+	private CCombo linkToOtherComponentCombo = null;
+	private boolean isTableEnabled = true;
+	private String tableColumnHeaderAmount;
+	private Text extraNbrToComponent = null;
+	private Text extraTxtToComponent = null;
+	private String labelForExtraNumberField;
+	private String labelForExtraTextField;
+	private boolean wasErrorsWithDatas = false;
+	private Button addContactSetButton = null;
+	private Button addRowButton;
+
+
+	/**
+	 * errors
+	 */
+	private Vector<String> errors = null;
+
+	/**
+	 * @param parentShell
+	 */
+	private AbstractDialog(IShellProvider parentShell) {
+		super(parentShell);
+		throw new RuntimeException("Not accepted");
+	}
+
+	/**
+	 * @param parentShell
+	 */
+	private AbstractDialog(Shell parentShell) {
+		super (parentShell);
+		throw new RuntimeException("Not accepted");
+	}
+	
+
+	/**
+	 * @param parentShell
+	 * @param component
+	 */
+	public AbstractDialog(Shell parentShell, IComponentProvider provider){
+		super(parentShell);		
+		this.provider = provider;
+		init();
+	}
+
+	/**
+	 * @param parentShell
+	 * @param component
+	 */
+	public AbstractDialog(IShellProvider parentShell, IComponentProvider provider){
+		super(parentShell);
+		this.provider = provider;
+		init();
+	}
+
+
+	/**
+	 * Init
+	 */
+	private void init(){
+		RGB rgbWhite = new RGB(255, 255, 255);
+		white = new Color(null, rgbWhite);
+		
+		//Get grey color from parent
+		grey = super.getParentShell().getBackground();
+		
+		setInEditMode(provider.isInEditMode());
+		if(isInEditMode){
+			this.component = provider.getEditable();
+		}
+		
+		tableColumnHeaderAmount = AMOUNT_TXT;
+	}
+	
+	/**
+	 * Set context sensitive help id
+	 * @param control
+	 * @param id
+	 */
+	protected void setContextSensitiveHelpID(Control control, String id){
+		
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,id);		 
+		 
+	}
+	/**
+	 * Set context sensitive help id to item by component type
+	 * @param control
+	 */
+	protected void setContextSensitiveHelpIDByComponentType(Control control){
+		
+		 if(getComponent() instanceof ContactSet){			 
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET);			 
+		 }else if(getComponent() instanceof Contact || getComponent() instanceof ContactGroup){
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,CreatorHelpContextIDs.CREATOR_HELP_CONTACTS);			 
+		 }else if(getComponent() instanceof Message){			 
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,CreatorHelpContextIDs.CREATOR_HELP_MESSAGES);
+		 }else if(getComponent() instanceof Calendar){			 
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,CreatorHelpContextIDs.CREATOR_HELP_CALENDAR);
+		 }else{
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(control,CreatorHelpContextIDs.CREATOR_HELP_GENERIC_COMPONENT);
+		 }
+		 
+	}	
+
+	/**
+	 * SuperClass for all Dialogs holds instance to component created or edited. 
+	 * Implementing classes will know what type of {@link AbstractComponent} needs to be handle. 
+	 * @return component
+	 */
+	public AbstractComponent getComponent() {
+		return component;
+	}
+
+
+
+	/**
+	 * Set component
+	 * @param component
+	 */
+	protected void setComponent(AbstractComponent component) {
+		this.component = component;
+	}
+	
+	/**
+	 * Every dialog must be able to create a new Component by it's own type.
+	 * @return AbstractComponent
+	 */
+	protected abstract AbstractComponent createNewComponent();
+
+	/**
+	 * Every dialog must be able to create a new Value by it's own type.
+	 * @return AbstractValue
+	 */
+	protected abstract AbstractValue createNewValue(String type, String value, String random, String amount);
+
+	/**
+	 * Is Dialog in Edit mode (or add new mode)
+	 * @return true if dialog is in edit mode, false otherwise
+	 */
+	protected boolean isInEditMode() {
+		return isInEditMode;
+	}
+
+
+	/**
+	 * Set Dialog to edit mode
+	 * @param isInEditMode true if Dialog is in edit mode
+	 */
+	protected void setInEditMode(boolean isInEditMode) {
+		this.isInEditMode = isInEditMode;
+	}
+	
+	
+	/**
+	 * Selects given value as default to Combo
+	 * @param values
+	 * @param combo
+	 * @param value
+	 */
+	protected void setComboSelection(String[] values, CCombo combo, String value) {
+		if (values!= null && combo != null && value != null && !value.equals(AbstractValue.EMPTY_STRING)) {
+			for (int i = 0; i < values.length; i++) {
+				if (value.equalsIgnoreCase(values[i])) {
+					combo.select(i);
+					break;
+				}
+			}
+		}
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+
+	/**
+	 * @return Listener for making sure that text field contains only numbers
+	 * Also back space and delete buttons is allowed
+	 */
+	protected VerifyListener getNumberVerifyListener() {		
+		return new VerifyListener() {
+			public void verifyText(VerifyEvent e) {
+				char c = e.character;
+				int i = c; // 0=48, 9=57, del = 127, backspace = 8
+				//If event is "" it's a clear command and must be accepted, otherwise only numbers, del and backspace is accepted commands
+				if ((e.text != null && e.text.equals(AbstractValue.EMPTY_STRING) )|| (i >= 48 && i <= 57) || i == 8 || i == 127) {
+					e.doit = true;// If text is not number, don't do it (set
+									// text just typed)
+				} else {
+					e.doit = false;
+				}
+			}
+		};
+	}
+
+	/**
+	 * Check if valueText should be enabled or not and setting text to it
+	 * 
+	 * @param valueTxt
+	 * @param randomTxt
+	 */
+	protected void setValueTextAndEnabling(final Text valueTxt,
+			String txtToValue, String randomTxt) {
+
+		//just in case taking of valueText size limit, if there was user defined on, other text will be also limited
+		valueTxt.setTextLimit(Text.LIMIT);
+
+		// If random is selected, text field is disabled and showing that random
+		// mode is on
+		if (randomTxt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+				|| randomTxt
+						.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG)) 
+		{			
+			removeNumberVerifyListener(valueTxt);//If there is number verify listener, that must be removed
+			valueTxt.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG);
+			valueTxt.setEnabled(false);			
+		} 
+		else if (randomTxt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)) 
+		{
+			removeNumberVerifyListener(valueTxt);//If there is number verify listener, that must be removed
+			valueTxt.setText(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG);
+			valueTxt.setEnabled(false);
+		}
+		else if (randomTxt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH)
+				|| randomTxt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH_LONG)) 
+		{
+			valueTxt.setEnabled(true);
+			try {				
+				Integer.parseInt(txtToValue);
+				valueTxt.setText(txtToValue);
+			} catch (NumberFormatException e) {
+				// When there was a text, an error will occur, skipping that one
+				valueTxt.setText("" +AbstractValue.USER_DEFINED_DEFAULT_LENGTH);
+				valueTxt.setFocus(); 
+				valueTxt.selectAll();
+			}
+			//even if given data was valid or not, we add verify listener
+			finally{
+				//We need number verify listener when user defined len is selected
+				valueTxt.addVerifyListener(getNumberVerifyListener());
+				//When field is for custom random length field, text limit will be 9
+				valueTxt.setTextLimit(9);					
+			}
+		}		
+
+		// If just started edit mode, must put initial value to txt field
+		else if (txtToValue != null && txtToValue.trim().length() > 0) {
+			removeNumberVerifyListener(valueTxt);//If there is number verify listener, that must be removed			
+			valueTxt.setEnabled(true);
+			valueTxt.setText(CreatorEditorSettings.getInstance()
+					.replaceEntitiesWithChars(txtToValue));
+		}
+		// else value must be enabled, and if there was a random mode txt,
+		// cleaning in
+		else {
+			removeNumberVerifyListener(valueTxt);//If there is number verify listener, that must be removed			
+			valueTxt.setEnabled(true);
+			if (valueTxt.getText() != null
+					&& (valueTxt.getText().equals(
+							AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+							|| valueTxt.getText().equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG) 
+							|| valueTxt.getText().equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH))
+							|| valueTxt.getText().equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)
+							) 
+			{
+				valueTxt.setText(AbstractValue.EMPTY_STRING);
+			}
+		}
+		
+		
+	}
+	
+	/**
+	 * Check if valueText should be enabled or not and setting text to it
+	 * 
+	 * @param valueCombo
+	 * @param randomTxt
+	 */
+	protected void setValueTextAndEnabling(final CCombo valueCombo,
+			String txtToValue, String randomTxt, String typeComboSelection) {
+		
+				
+		// If random is selected, text field is disabled and showing that random
+		// mode is on. With fixed values, random lenght cannot be definede, so it allways is 
+		//random with default lenght
+		boolean isRandomValue = CreatorEditorSettings.isRandomText(randomTxt);
+		
+		if (isRandomValue ) 
+		{			
+			valueCombo.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG);
+			valueCombo.setEnabled(false);			
+		} 
+
+		
+		// If just started edit mode, must put initial value to txt field
+		else if (txtToValue != null && txtToValue.trim().length() > 0) {
+			
+			//When type is contact set reference, selection must be done with contactsetref as String, not by its value, which is just its id, e.g. "1"
+			boolean isContactSetReference = CreatorEditorSettings.isContactSetReference(typeComboSelection);
+			String selection;
+			if(isContactSetReference){
+				selection = getContactSetStringById(txtToValue);
+			}else{
+				 selection = txtToValue;
+			}
+			valueCombo.setEnabled(true);
+			valueCombo.setText(AbstractValue.EMPTY_STRING);					
+			String items[] = valueCombo.getItems();
+			if(isContactSetReference && selection == null){
+				valueCombo.setText(AbstractValue.EMPTY_STRING);
+				String errMsg = typeComboSelection 
+						+" can not be set, because contact-set: '" +txtToValue +"' was not found.";
+				CreatorEditorConsole.getInstance().println(errMsg , CreatorEditorConsole.MSG_ERROR);
+				addError(errMsg);
+				
+			}else{
+				for (int i = 0; i < items.length; i++) {
+					if(selection.equalsIgnoreCase(items[i])){
+						valueCombo.setText(selection);
+						break;
+					}
+				}
+			}
+			
+		}
+		// else value must be enabled, and if there was a random mode txt,
+		// cleaning in
+		else {
+			valueCombo.setEnabled(true);
+			if (valueCombo.getText() != null
+					&& (valueCombo.getText().equals(
+							AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+							|| valueCombo.getText().equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG) 
+							|| valueCombo.getText().equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH))
+							|| valueCombo.getText().equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)
+							|| valueCombo.getText().equals(AbstractValue.RANDOM_TEXT)
+							) 
+			{
+				valueCombo.setText(AbstractValue.EMPTY_STRING);
+			}
+		}
+
+		
+	}	
+
+	/**
+	 * Remove verify listener(s) from widget
+	 * @param widget
+	 */
+	private void removeNumberVerifyListener(final Widget widget) {
+		if( widget.isListening(SWT.Verify)){
+			Listener [] listeners = widget.getListeners(SWT.Verify);
+			for (int i = 0; i < listeners.length; i++) {
+				widget.removeListener(SWT.Verify, listeners[i]);
+			}
+		}
+	}
+
+	
+	/**
+	 * @return white color
+	 */
+	protected Color getWhite() {
+		return white;
+	}
+	
+	/**
+	 * @return grey color
+	 */
+	protected Color getGrey() {
+		return grey;
+	}	
+
+	/**
+	 * Create table columns with header names:
+	 * Item Type, Item Value, Random, Amount
+	 */
+	protected void createTableColums() {
+		//
+		//Create columns, set column widths
+		//
+		TableColumn columnType = new TableColumn(itemsTable, SWT.NONE);
+		columnType.setWidth (200);
+		columnType.setText(ITEM_TYPE_TXT);
+		TableColumn columnValue = new TableColumn(itemsTable, SWT.NONE);
+		columnValue.setWidth (300);
+		columnValue.setText(ITEM_VALUE_TXT);
+		TableColumn columnMode = new TableColumn(itemsTable, SWT.CENTER);
+		columnMode.setWidth (180);
+		columnMode.setText(MODE_TXT);
+		TableColumn columnAmount = new TableColumn(itemsTable, SWT.NONE);
+		columnAmount.setWidth (tableColumnHeaderAmount.length() * COLUMN_WIDTH_FOR_ONE_CHAR);
+		columnAmount.setText(tableColumnHeaderAmount);
+
+		//REMOVE btn
+		TableColumn columnRemove = new TableColumn(itemsTable, SWT.NONE);
+		columnRemove.setWidth (40);
+	}
+
+	/**
+	 * Create a empty row to table
+	 */
+	protected void addRow(boolean openItemType, boolean setFocusToRow) throws Exception{
+		addRow(AbstractValue.EMPTY_STRING, AbstractValue.EMPTY_STRING, 
+				AbstractValue.EMPTY_STRING, AbstractValue.EMPTY_STRING, openItemType, setFocusToRow);
+	}
+
+	/**
+	 * Create a row to table, and setting values to rows (if needed)
+	 * @param key
+	 * @param value
+	 */
+	protected void addRow(String key, AbstractValue value, boolean setFocusToRow) throws Exception{
+		
+		String valueStr = value.getValue();
+
+		if(value.getModeType() == ModeTypes.RandomTypeUserDefinedLength){
+			valueStr = "" +value.getRandomValueLenght();
+		}
+		addRow(key, valueStr, value.getModeValueText(), ""+ value.getAmount(), true, setFocusToRow );
+	}
+
+	/**
+	 * Get item types allready existing in dialog
+	 * @return
+	 */
+	private String [] getAddedItems(){
+		
+		
+		Vector<String> addedItems = new Vector<String>();
+		if(itemsTable != null){
+			
+			TableItem [] items = itemsTable.getItems();
+			
+			for (int i = 0; i < items.length; i++) {
+				
+				TableItem item = items[i];
+				
+				if(item != null){
+			
+					String key = item.getText(0);					
+					addedItems.add(key);
+					
+				}
+			}
+		}
+		return (String[])addedItems.toArray(new String[0]);
+	}
+	
+	/**
+	 * Get Item types (showable names) as String. 
+	 * @return item names
+	 * @param addedItems items allready added to Script
+	 */	
+	private String [] getItemTypesAsString(String [] addedItems){
+	
+		String[] itemsString = getItemTypesAsString();
+		
+		if(addedItems == null || addedItems.length == 0){
+			return itemsString;
+		}
+		
+		Vector<String> items = new Vector<String>(itemsString.length);
+		for (int i = 0; i < itemsString.length; i++) {
+			items.add(itemsString[i]);
+		}						
+		
+		//Checking what items are currently added and what is supporting only one item in one script		
+		
+		for (int i = 0; i < addedItems.length; i++) {
+			int itemMaxOccur = getComponent().itemMaxOccur(addedItems[i]);
+			
+			if(itemMaxOccur == 1){
+				items.remove(addedItems[i]);
+			}
+		}
+		
+		return (String[]) items.toArray(new String[0]);
+	}
+	
+	
+	/**
+	 * Check item amount enablation by item name
+	 * @param itemName
+	 * @param amout Text
+	 * @return <code>true</code> if enabled, <code>false</code> otherwise.
+	 */
+	private void setAmountTextEnabletion(String itemName, Text amountText){
+		
+		int itemMaxOccur = getComponent().itemMaxOccur(itemName);
+		boolean enable = (itemMaxOccur == 1) ? false : true;
+		amountText.setEnabled(enable);
+		
+		if(!enable){
+			amountText.setBackground(getGrey());				
+		}else{
+			amountText.setBackground(getWhite());
+		}		
+		
+	}
+	
+	/**
+	 * Get Item types (showable names) as String. 
+	 * @return item names
+	 */	
+	protected abstract String [] getItemTypesAsString();
+	
+	/**
+	 * Get Item values (showable names)
+	 * @param itemType - one of types given by {@link #getItemTypesAsString()}
+	 * @return item names if itemType has fixed values or contac-set references 
+	 * or <code>null</code> if itemType has no fixed values.
+	 */	
+	private String [] getItemValueAsString(String itemType){
+		
+		String[] valuesForItemType;
+		
+		//If item is contact set reference, returning 
+		if(CreatorEditorSettings.isContactSetReference(itemType)){
+			valuesForItemType = getContactSetsAsString();
+			if(valuesForItemType == null){
+				valuesForItemType=new String[]{AbstractValue.EMPTY_STRING};
+			}
+		}
+		else{
+			valuesForItemType = getComponent().getValuesForItemType(itemType);
+		}
+		return valuesForItemType;
+	}
+	
+	
+	
+	/**
+	 * Create a row to table, and setting values to rows (if needed)
+	 * @param key
+	 * @param value
+	 * @param randomValueText
+	 * @param amount
+	 */
+	private void addRow(String key, String value, String randomValueText, 
+			String amount, boolean openItemType, boolean setFocusToRow) throws Exception{
+
+		String[] allreadyAddedItems = getAddedItems();
+		String[] itemTypesAsString = getItemTypesAsString(allreadyAddedItems);
+		
+		//If there is allready all items supported added to table, adding row wont affect (Might occurr when "Add Row" is pushed
+		if(itemTypesAsString == null || itemTypesAsString.length < 1 
+				&& key.equals(AbstractValue.EMPTY_STRING) && value.equals(AbstractValue.EMPTY_STRING)){
+			return;
+		}
+		
+		final TableItem item = new TableItem (itemsTable, SWT.NONE);
+		final int itemIndex = itemsTable.indexOf(item);
+			
+	
+		//
+		//CCombo for selecting item type
+		//
+		
+		TableEditor typeComboEditor = new TableEditor(itemsTable);
+		// Item names
+		final CCombo typeCombo = new CCombo(itemsTable, SWT.READ_ONLY);
+		//Allready added items will be update after all lines are added.
+		typeCombo.setItems(itemTypesAsString);
+		int visibleItemsCount = itemTypesAsString.length;
+		if(visibleItemsCount > 30){
+			visibleItemsCount=30;
+		}
+		typeCombo.setVisibleItemCount(visibleItemsCount);
+		final String typeComboSelection = getTypeComboSelection(key, itemIndex, openItemType);
+		typeCombo.setText(typeComboSelection);//// Select the previously selected item from the cell: combo.select(combo.indexOf(item.getText(column)));
+		typeCombo.setBackground(getWhite());
+		item.setText(0, typeCombo.getText());
+		
+		typeComboEditor.grabHorizontal = true;
+		typeComboEditor.setEditor(typeCombo, item, 0);
+	
+		
+		//
+		//Text for typing item value
+		//
+		TableEditor valueEditor = new TableEditor(itemsTable);
+		
+		//checking if text or combo is needed
+		String [] fixedValuesForType = getItemValueAsString(typeComboSelection);
+		boolean isValuesInCombo = fixedValuesForType != null && fixedValuesForType.length > 0;
+		Text valueTxt = null;
+		CCombo valueCombo = null;
+
+		if(isValuesInCombo){
+			// Adding action to clear Button
+			valueCombo = addValueComboToTable(fixedValuesForType, value,
+					item, randomValueText, typeComboSelection);
+			valueEditor.grabHorizontal = true;
+			valueEditor.setEditor(valueCombo, item, 1);
+			
+			
+		}else{
+			valueTxt = createValueText(value, randomValueText,
+					setFocusToRow, item, typeComboSelection);
+			valueEditor.grabHorizontal = true;
+			valueEditor.setEditor(valueTxt, item, 1);
+			
+		}
+		
+	
+		//
+		// CCombo for Random value selection.
+		//
+		// selecting random, max len, normal len, or no selection.
+		// If random is selected, disabling item value combo
+		//
+		
+		TableEditor modeEditor = new TableEditor(itemsTable);
+		final CCombo modeCombo = new CCombo(itemsTable, SWT.READ_ONLY );
+		String[] modeValues = getModeValues(isValuesInCombo, typeComboSelection);
+		modeCombo.setItems(modeValues);
+		
+		modeCombo.setText(getModeComboSelection(randomValueText, modeValues));
+		
+		item.setText(2, modeCombo.getText());
+		modeCombo.setBackground(getWhite());				
+	
+		modeEditor.grabHorizontal = true;		
+		modeEditor.setEditor(modeCombo, item, 2);
+		
+		modeCombo.setEnabled(isRandomFieldsEnabled);
+		if(!isRandomFieldsEnabled){
+			modeCombo.setBackground(getGrey());
+		}else{
+			modeCombo.setBackground(getWhite());
+		}
+	
+		//
+		//Text field for Amount text 
+		//
+		
+		TableEditor amountEditor = new TableEditor(itemsTable);
+		final Text amountTxt = new Text(itemsTable, SWT.NONE);
+		amountTxt.setTextLimit(5);	
+		//don't show if amount is not set (is 0)
+		if(!amount.equals("0")){
+			amountTxt.setText(amount);
+		}
+		item.setText(3, amountTxt.getText());
+		
+		// Verify that amount is typed with numbers
+		amountTxt.addVerifyListener(getNumberVerifyListener());
+		
+		//Update item when modify	
+		amountTxt.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				item.setText(3, amountTxt.getText());
+			}
+		});
+		
+		//In some cases amount fields is not enabled. 
+		//Future improvement idea, possibility to enable/disable amountTxt by selected type.
+		if(CreatorEditorSettings.isContactSetReference(key) || CreatorEditorSettings.isContactSetReference(typeComboSelection)){
+			amountTxt.setEnabled(true);//always enabled with contact set reference
+			modeCombo.setEnabled(false);
+			modeCombo.setBackground(getGrey());
+		}
+		else if(!isAmountFieldsEnabled){
+			setModeComboEnablation(typeComboSelection, modeCombo);
+			amountTxt.setEnabled(isAmountFieldsEnabled);			
+		}
+		else{
+			setModeComboEnablation(typeComboSelection, modeCombo);
+			setAmountTextEnabletion(typeComboSelection, amountTxt);	
+		}
+
+		
+		amountEditor.grabHorizontal = true;
+		amountEditor.setEditor(amountTxt, item, 3);
+		
+		//
+		// Remove btn
+		//
+		TableEditor clrBtnEditor = new TableEditor(itemsTable);
+		final Button clearBtn = new Button(itemsTable, SWT.PUSH);
+		clearBtn.setLayoutData(new GridData( GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		clearBtn.setFont(getButtonFont());
+		clearBtn.setText(CLEAR_TXT);
+		clearBtn.pack ();//This must be called, otherwise button is not visible
+		clrBtnEditor.minimumWidth = clearBtn.getSize ().x + 5;//Using +5 to fit button precisely to column 
+		clrBtnEditor.horizontalAlignment = SWT.CENTER;
+
+
+		//Setting all listeners to item value, depending on item type, listeners will be for
+		//Text or CCombo type of value.
+		setItemValueListeners(item, clrBtnEditor, valueEditor, typeCombo, fixedValuesForType,
+				isValuesInCombo, valueTxt, valueCombo, modeCombo, amountTxt,
+				clearBtn);		
+		
+		clrBtnEditor.setEditor(clearBtn, item, 4);
+		
+		// Update item when modify
+		typeCombo.addSelectionListener(new TypeComboSelectionListener(item,
+				clrBtnEditor, valueEditor, typeCombo, valueTxt, valueCombo,
+				modeCombo, amountTxt, clearBtn));	
+	
+		itemsTable.addListener(SWT.SetData, new TypeComboItemsSetterListener(typeCombo));
+		
+		setContextSensitiveHelpIDByComponentType(typeCombo);
+		setContextSensitiveHelpID(modeCombo, CreatorHelpContextIDs.CREATOR_HELP_RANDOM_VALUES);
+		setContextSensitiveHelpIDByComponentType(amountTxt);
+		setContextSensitiveHelpIDByComponentType(clearBtn);
+	}
+
+	private void setModeComboEnablation(final String typeComboSelection,
+			final CCombo modeCombo) {
+		boolean isModeEnabled = getComponent().getVariables().isModeEnabledForKey(typeComboSelection);
+		modeCombo.setEnabled(isModeEnabled);
+		if(!isModeEnabled){
+			modeCombo.setBackground(getGrey());				
+		}else{
+			modeCombo.setBackground(getWhite());
+		}
+	}
+
+	/**
+	 * Get selection for mode combo
+	 * @param modeText
+	 * @param modeValues
+	 * @return
+	 */
+	private String getModeComboSelection(String modeText, String [] modeValues) {
+		
+		if(modeText != null && !modeText.equals(AbstractValue.EMPTY_STRING)){
+			for (int i = 0; i < modeValues.length; i++) {
+				if(modeText.equalsIgnoreCase(modeValues[i])){
+					return modeText;
+				}
+			}
+		}
+		
+		return modeValues[0];
+	}
+
+	/**
+	 * Get values for mode combo
+	 * @param isValuesInCombo
+	 * @param typeComboSelection
+	 * @return values for mode combo
+	 */
+	private String[] getModeValues(boolean isValuesInCombo, String typeComboSelection) {
+
+		boolean incValueSupported = isTypeSupportingIncValueForeEachCopy(typeComboSelection);
+		
+		String[] modeValues;
+		
+		if(!incValueSupported && isValuesInCombo){
+			modeValues = AbstractValue.getModeValuesForFixedValues();
+		}
+		else if(!incValueSupported){
+			modeValues = AbstractValue.getModeValues();
+		}
+		//else incValueSupported == true
+		else{
+			modeValues = AbstractValue.getModeValuesForSupportingIncValueForeEachCopy();
+		}
+
+		return modeValues;
+	}
+	
+	/**
+	 * Check if component is supporting <code>incvalueforeachcopy</code> parameter.
+	 * @param type
+	 * @return <code>true</code> if supporting.
+	 */
+	private boolean isTypeSupportingIncValueForeEachCopy (String type){
+
+		return getComponent().isTypeSupportingIncValueForEachCopy(type);
+		
+	}	
+
+	/**
+	 * Set listeners related to value item (Text or CCombo)
+	 * @param item
+	 * @param clrButtonEditor
+	 * @param valueEditor
+	 * @param typeCombo
+	 * @param fixedValuesForType
+	 * @param isValuesInCombo
+	 * @param valueTxt
+	 * @param valueCombo
+	 * @param modeCombo
+	 * @param amountTxt
+	 * @param clearBtn
+	 */
+	private void setItemValueListeners(final TableItem item,
+			TableEditor clrButtonEditor, TableEditor valueEditor, final CCombo typeCombo,
+			String[] fixedValuesForType, boolean isValuesInCombo,
+			Text valueTxt, CCombo valueCombo, final CCombo modeCombo,
+			final Text amountTxt, final Button clearBtn) {
+		
+		//
+		//First remove existing listeners, so there will be no extra listeners with non existing objects
+		//
+		
+		Listener[] listeners = modeCombo.getListeners(SWT.Selection);
+		for (int i = 0; i < listeners.length; i++) {
+			modeCombo.removeListener(SWT.Selection, listeners[i]);
+		}	
+		listeners = clearBtn.getListeners(SWT.Selection);
+		for (int i = 0; i < listeners.length; i++) {
+			clearBtn.removeListener(SWT.Selection, listeners[i]);			
+		}
+		listeners = item.getListeners(SWT.Modify);
+		for (int i = 0; i < listeners.length; i++) {
+			item.removeListener(SWT.Modify, listeners[i]);			
+		}		
+		if(valueCombo != null){
+			listeners = valueCombo.getListeners(SWT.SetData);
+			for (int i = 0; i < listeners.length; i++) {
+				valueCombo.removeListener(SWT.SetData, listeners[i]);			
+			}	
+		}
+		
+		
+		if(isValuesInCombo){
+			
+			valueCombo.setVisibleItemCount(fixedValuesForType.length);			
+			
+			//Update item text when text is modified (and random Combo when value text is modified by fulfill random button)
+			valueCombo.addModifyListener( new ValueModifyListener(item, valueCombo, typeCombo));
+			//Add listener to check this value enablation by selection of another value
+			item.addListener(SWT.Modify,  new CheckItemValueEnablationsListener(typeCombo, valueCombo, modeCombo, amountTxt));
+			
+			 		
+			//Update value text item text when combo selection is changed
+			modeCombo.addSelectionListener(new ModeComboSelectionListener(modeCombo, valueCombo, item));
+			item.addListener(SWT.Modify, new SetAsRandomValueItemListener(item, valueCombo, modeCombo));	
+			
+			// Adding action to clear Button
+			clearBtn.addSelectionListener(getClearButtonSelectionListener(item, typeCombo, valueCombo, modeCombo,
+					amountTxt));		
+			
+    		//Adding listener to update items when new contact set is created, if there is contactSet creation button, and 
+			//if we have contact set reference as type.
+			if(addContactSetButton != null && CreatorEditorSettings.isContactSetReference(typeCombo.getText())){
+				addContactSetButton.addListener(SWT.SetData, new AddNewContactSetButtonListener(valueCombo));
+			}
+			
+
+		}else{
+			//Update item text when text is modified (and random Combo when value text is modified by fulfill random button)
+			valueTxt.addModifyListener( new ValueModifyListener(item, valueTxt, typeCombo));					
+			//Add listener to check this value enablation by selection of another value
+			item.addListener(SWT.Modify,  new CheckItemValueEnablationsListener(typeCombo, valueTxt, modeCombo, amountTxt));
+			
+			//Update value text item text when combo selection is changed
+			modeCombo.addSelectionListener(new ModeComboSelectionListener(modeCombo, valueTxt, item));			
+			//When fulfill all values with random -button modifies values, setting also combo and text field values
+			item.addListener(SWT.Modify, new SetAsRandomValueItemListener(item, valueTxt, modeCombo));	
+			
+			// Adding action to clear Button
+			clearBtn.addSelectionListener(getClearButtonSelectionListener(item, typeCombo, valueTxt, modeCombo,
+					amountTxt));			
+	
+		}
+
+	}
+
+
+
+	/**
+	 * Creates a value text
+	 * @param value
+	 * @param randomValueText
+	 * @param setFocusToRow
+	 * @param item
+	 * @param typeComboSelection
+	 * @return
+	 */
+	private Text createValueText(String value, String randomValueText,
+			boolean setFocusToRow, final TableItem item, String typeComboSelection) {
+		final Text valueTxt = new Text(itemsTable, SWT.NONE);
+		valueTxt.setFont(getUnicodeFont());
+		setValueTextAndEnabling(valueTxt, value, randomValueText);	
+		if(setFocusToRow){
+			valueTxt.setFocus(); 
+		}
+		item.setText(1, valueTxt.getText());
+    	if(CreatorEditorSettings.isContactSetReference(valueTxt.getText())){
+    		setContextSensitiveHelpID(valueTxt, CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET);
+    	}else{
+    		setContextSensitiveHelpIDByComponentType(valueTxt);
+    	}
+    	
+    	setTipTextToValue(valueTxt, typeComboSelection);
+    	
+		return valueTxt;
+	}
+	
+	/**
+	 * Sets tip text to value if needed
+	 * @param valueTxt
+	 * @param typeComboSelection
+	 */
+	private void setTipTextToValue(Text valueTxt, String typeComboSelection) {
+		AbstractVariables var = getComponent().getVariables();
+		String tipText = var.getTipText(typeComboSelection);
+		if(tipText != null){
+			valueTxt.setToolTipText(tipText);
+		}
+	}
+
+	/**
+	 * Listener for mode selection combo
+	 */
+	private class ModeComboSelectionListener implements SelectionListener{
+	
+		private  CCombo modeCombo = null;
+		private  Text text = null;
+		private  TableItem item = null;
+		private  CCombo combo = null;
+
+		public ModeComboSelectionListener(final CCombo modeCombo, final Text text, final TableItem item){
+			this.modeCombo = modeCombo;
+			this.text = text;
+			this.item = item;
+			
+		}
+		public ModeComboSelectionListener(final CCombo modeCombo, final CCombo combo, final TableItem item){
+			this.modeCombo = modeCombo;
+			this.combo = combo;
+			this.item = item;
+			
+		}		
+		
+        public void widgetSelected(SelectionEvent event) {
+        	
+        	String rndTxt = modeCombo.getText();
+        	
+        	if(text!=null){
+	        	if(CreatorEditorSettings.isContactSetReference(rndTxt)){ 
+	        		setContextSensitiveHelpID(text, CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET);
+	        	}else{
+	        		setContextSensitiveHelpIDByComponentType(text);
+	        	}
+	        	item.setText(2, rndTxt);
+	        	setValueTextAndEnabling(text, null, rndTxt);
+        	}
+        	else{
+	        	if(CreatorEditorSettings.isContactSetReference(rndTxt)){ 
+	        		setContextSensitiveHelpID(combo, CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET);
+	        	}else{
+	        		setContextSensitiveHelpIDByComponentType(combo);
+	        	}
+	        	combo.setEnabled(false);
+	        	item.setText(2, rndTxt);
+	        	setValueTextAndEnabling(combo, null, rndTxt, null);
+        	}
+        }
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			//Not needed
+		}
+      }	
+
+
+	/**
+	 * Class for listening value text changes
+	 */
+	private class ValueModifyListener implements ModifyListener
+
+	{
+		private TableItem item = null;
+		private Text valueText = null;
+		private CCombo valueCombo = null;
+		private final CCombo typeCombo;
+		
+		public ValueModifyListener(TableItem item , Text valueText, final CCombo typeCombo){
+			this.item = item;
+			this.valueText = valueText;
+			this.typeCombo = typeCombo;			
+		}		
+		public ValueModifyListener(TableItem item , CCombo valueCombo, final CCombo typeCombo){
+			this.item = item;
+			this.valueCombo = valueCombo;
+			this.typeCombo = typeCombo;			
+		}			
+		public void modifyText(ModifyEvent e) {						
+			
+			if(valueText != null){				
+				item.setText(1, valueText.getText());				
+			}
+			else{
+	            item.setText(1, valueCombo.getText());	       
+				//Check that if something must do to some values by the selection
+				checkIfNeedToCallCheckItemValueEnablationListenersAndCallIfNeeded(
+						valueCombo, valueText, typeCombo);
+				
+	            
+			}
+		}
+
+     }	
+	
+	/**
+	 * Just for enabling to cast Events when using set as random functionality
+	 */
+	private class SetRandomEvent extends Event{
+		
+	}
+	
+	/**
+	 * Just for enabling to cast Event when checking 
+	 * if we should disable/enable some valus by some selection made
+	 */
+	private class CheckItemValueEnablationsEvent extends Event{
+
+		private String type;
+		private String value;
+
+
+		/**
+		 * @return the type
+		 */
+		public String getType() {
+			return type;
+		}
+
+		/**
+		 * @return the value
+		 */
+		public String getValue() {
+			return value;
+		}
+
+		public void setType(String type) {
+			this.type = type;			
+		}
+
+		public void setValue(String value) {
+			this.value = value;
+		}
+		
+	}	
+	
+	
+	/**
+	 * Listener class for setting values as random, used by button.
+	 */
+	private class SetAsRandomValueItemListener implements Listener{
+
+		TableItem item = null;
+		Text valueTxt = null;
+		CCombo randomCombo = null;
+		private CCombo valueCombo = null;
+
+		public SetAsRandomValueItemListener(TableItem item, Text valueTxt, CCombo randomCombo){
+			this.item = item;
+			this.valueTxt = valueTxt;
+			this.randomCombo = randomCombo;
+			
+		}		
+		public SetAsRandomValueItemListener(TableItem item,CCombo valueCombo, CCombo randomCombo){
+			this.item = item;
+			this.valueCombo = valueCombo;
+			this.randomCombo = randomCombo;
+			
+		}
+		
+		public void handleEvent(Event e) {
+
+			//Checking that if we have wanted event
+			if(!(e instanceof SetRandomEvent)){
+				return;
+			}
+			
+			String txt = item.getText(1);
+						
+			//If value is in text, but not in combo
+			if (valueTxt!=null) {
+				
+				if (e.doit) {
+					removeNumberVerifyListener(valueTxt);
+				}
+				if (txt != null) {
+					setValueTextAndEnablingAndRandomComboSelection(txt,
+							valueTxt, randomCombo);
+				}
+			}
+			//else value is in combo
+			else{				
+				setValueTextAndEnablingAndRandomComboSelection(txt, valueCombo, randomCombo);
+			}			
+		}		
+	}	
+	
+	/**
+	 * Listener class for enabling/disabling items by some other value set in dialog.
+	 * E.g. With File, crypted with CRM-FL, then all CRM-CD parameters will be disabled.
+	 */
+	private class CheckItemValueEnablationsListener implements Listener{
+
+		CCombo typeCombo;
+		Text valueTxt = null;
+		Text amountTxt = null;
+		CCombo modeCombo = null;
+		private CCombo valueCombo = null;
+
+		public CheckItemValueEnablationsListener(CCombo typeCombo, Text valueTxt, CCombo modeCombo, Text amountTxt){
+			this.typeCombo = typeCombo;
+			this.valueTxt = valueTxt;
+			this.modeCombo = modeCombo;
+			this.amountTxt = amountTxt;
+			
+		}		
+		public CheckItemValueEnablationsListener(CCombo typeCombo,CCombo valueCombo, CCombo modeCombo, Text amountTxt){
+			this.typeCombo = typeCombo;
+			this.valueCombo = valueCombo;
+			this.modeCombo = modeCombo;
+			this.amountTxt = amountTxt;
+		}
+		
+		public void handleEvent(Event e) {
+						
+			if(! ( e instanceof CheckItemValueEnablationsEvent )){
+				return;
+			}
+			
+			CheckItemValueEnablationsEvent event = (CheckItemValueEnablationsEvent)e;
+			String type = event.getType();
+			String value = event.getValue();
+			String typeToBeDisabled = typeCombo.getText();
+
+			enableOrDisableRowItems(type, value, typeToBeDisabled, valueTxt, valueCombo, modeCombo, amountTxt);
+						
+		}
+
+		
+	}	
+
+	/**
+	 * Enables or disable items of row 
+	 * @param type
+	 * @param value
+	 * @param typeToBeDisabled
+	 * @param valueTxt
+	 * @param valueCombo
+	 * @param modeCombo
+	 */
+	private void enableOrDisableRowItems(String type, String value,
+			String typeToBeDisabled,
+			Text valueTxt,
+			CCombo valueCombo,
+			CCombo modeCombo, Text amountTxt) {
+				
+		boolean enableAllValues = !getComponent().isTypeDisabledByTypeAndValue(type, value, typeToBeDisabled);
+		boolean enableValue = enableAllValues;
+		
+		String currentValueTxt;
+		if (valueTxt!=null) {
+			currentValueTxt = valueTxt.getText();
+		}else{
+			currentValueTxt = valueCombo.getText();
+		}
+		
+		//Check if current value is random value now
+		boolean isRandomValue = CreatorEditorSettings.isRandomText(currentValueTxt);		
+		//If value is random, and we try to enable values, dont do that
+		if (isRandomValue && enableAllValues) 
+		{
+			enableValue = false;
+		}
+
+		//If value is in text, but not in combo
+		if (valueTxt!=null) {
+			valueTxt.setEnabled(enableValue);
+		}
+		//else value is in combo
+		else{
+			valueCombo.setEditable(enableValue);
+		}
+		
+		//dont enable mode combo if its not enabled to this type
+		boolean isModeEnabled = getComponent().getVariables().isModeEnabledForKey(typeToBeDisabled);		
+		if(isModeEnabled){
+			modeCombo.setEnabled(enableAllValues);
+		}
+		
+		//amount field can be enabled or disabled if its in use
+		if(isAmountFieldsEnabled()){
+			amountTxt.setEnabled(enableAllValues);
+		}
+	}	
+	
+	/**
+	 * Listener to set items to Type Combo when selection is made
+	 */
+	private class TypeComboItemsSetterListener implements Listener{
+		
+		private final CCombo typeCombo;
+
+		public TypeComboItemsSetterListener(CCombo typeCombo){
+			this.typeCombo = typeCombo;
+			
+		}
+
+		public void handleEvent(Event event) {
+			
+			if(event.doit && event.data != null && event.data instanceof String[]){				
+				String [] items = (String[]) event.data;			
+				String selectionText = typeCombo.getText();
+				typeCombo.setItems(items);
+				int count = items.length;
+				if(count > MAX_ITEMS_IN_COMBO){
+					count = MAX_ITEMS_IN_COMBO;
+				}
+				typeCombo.setVisibleItemCount(count);
+				typeCombo.setText(selectionText);
+			}
+		}
+		
+	}
+	
+	/**
+	 * Get listener for type combo.
+	 * There is logic for changing value field from text to combo and vice versa. 
+	 * @param item
+	 * @param typeCombo
+	 * @param valueTxt
+	 * @param randomCombo
+	 * @param amountTxt
+	 * @return
+	 */
+	private class TypeComboSelectionListener implements SelectionListener{
+
+		private TableItem item;
+		private CCombo typeCombo;
+		private Text valueTxt;
+		private Text amountTxt;
+		private CCombo valueCombo;
+		private CCombo modeCombo;
+		private TableEditor valueEditor;
+		private TableEditor clrBtnEditor;
+		private final Button clearBtn;
+
+		public TypeComboSelectionListener ( TableItem item,
+				TableEditor clrButtonEditor, TableEditor valueEditor,  CCombo typeCombo,
+				Text valueTxt, CCombo valueCombo,  CCombo modeCombo,
+				 Text amountTxt,  Button clearBtn){
+			this.clrBtnEditor = clrButtonEditor;
+			this.valueEditor = valueEditor;
+			this.item = item;
+			this.typeCombo = typeCombo;
+			this.valueTxt = valueTxt;
+			this.valueCombo = valueCombo;
+			this.amountTxt = amountTxt;
+			this.modeCombo = modeCombo;
+			this.clearBtn = clearBtn;
+			
+		}		
+
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetSelected(SelectionEvent event) {
+			
+	        String typeComboSelection = typeCombo.getText();
+			item.setText(0, typeComboSelection);
+
+			String [] fixedValuesForType = getItemValueAsString(typeComboSelection);
+			//Will values be in combo afterwards 
+			boolean isValuesInCombo = fixedValuesForType != null && fixedValuesForType.length > 0;
+			//Was value field type changed by user selection? Will be true if before value was text, and now it will be combo and so on...
+			boolean isValueFieldTypeChanged = 
+				isValuesInCombo && valueCombo == null || !isValuesInCombo && valueTxt == null 
+				? true : false;
+			
+			
+	  		if(CreatorEditorSettings.isContactSetReference(typeComboSelection))
+	  		{
+				amountTxt.setEnabled(true);//always enabled with contact set reference
+				modeCombo.setEnabled(false);
+				modeCombo.setText(AbstractValue.RANDOM_TEXT_NOT_RANDOM);//Setting to edit mode when contact-set is selected
+				modeCombo.setBackground(getGrey());
+
+			}else if(!isAmountFieldsEnabled){
+				amountTxt.setText(AbstractValue.EMPTY_STRING);				
+				amountTxt.setEnabled(isAmountFieldsEnabled);
+				setModeComboEnablation(typeComboSelection, modeCombo);				
+			}else{
+				amountTxt.setText(AbstractValue.EMPTY_STRING);				
+				setAmountTextEnabletion(typeComboSelection, amountTxt);
+				setModeComboEnablation(typeComboSelection, modeCombo);								
+			}
+
+			
+			// Just changing contents when value remains in combo
+			if (isValuesInCombo && !isValueFieldTypeChanged) {
+				valueCombo.setItems(fixedValuesForType);
+				valueCombo.setVisibleItemCount(fixedValuesForType.length);
+
+				//When values was in combo and type was changed to contact set, we must set listeners again to listen contact-set changes.
+				setItemValueListeners(item, clrBtnEditor, valueEditor, typeCombo, fixedValuesForType,
+						isValuesInCombo, null, valueCombo, modeCombo, amountTxt,
+						clearBtn);					
+			}
+			//value remains in text
+			else if (!isValuesInCombo && !isValueFieldTypeChanged) {
+				valueTxt.setText(AbstractValue.EMPTY_STRING);
+				valueTxt.setEnabled(true);
+			}
+			//else isValueFieldTypeChanged == true
+			else{
+				//Removing old control when new will be created
+				Control editable = valueEditor.getEditor();
+				editable.dispose();
+
+				//value changed from text to combo
+				if (isValuesInCombo ) {
+					valueCombo = addValueComboToTable(fixedValuesForType, AbstractValue.EMPTY_STRING, 
+							item, AbstractValue.EMPTY_STRING, typeComboSelection);
+					valueEditor.setEditor(valueCombo, item, 1);
+					
+					setItemValueListeners(item, clrBtnEditor, valueEditor, typeCombo, fixedValuesForType,
+							isValuesInCombo, null, valueCombo, modeCombo, amountTxt,
+							clearBtn);		
+					valueTxt = null;
+					
+					
+				} else// if (!isValuesInCombo && isValueFieldTypeChanged) 
+					{
+					valueTxt = createValueText(AbstractValue.EMPTY_STRING, AbstractValue.EMPTY_STRING, true, item, typeComboSelection);
+					valueTxt.setEnabled(true);
+					valueEditor.setEditor(valueTxt, item, 1);
+
+					setItemValueListeners(item, clrBtnEditor, valueEditor, typeCombo, null,
+							isValuesInCombo, valueTxt, null, modeCombo, amountTxt,
+							clearBtn);					
+					valueCombo = null;//For removing listners 
+					
+				}
+			}
+
+			//setting modeCombo values after all other changes are made
+			String modeComboValues [] = getModeValues(isValuesInCombo, typeComboSelection);
+			modeCombo.setItems(modeComboValues);
+			modeCombo.setText(getModeComboSelection(AbstractValue.EMPTY_STRING, modeComboValues));
+			item.setText(2, modeCombo.getText());			
+			
+			//Notify table listeners to update item combos
+			notifyTypeComboDataListeners(); 						
+			
+		}
+
+
+		//Not needed.
+		public void widgetDefaultSelected(SelectionEvent e) {			
+		}
+	}	
+	
+	/**
+	 * Notify table listeners to update type combo data
+	 */
+	private void notifyTypeComboDataListeners() {
+		
+		String addedItems[] = getAddedItems();//get items added allready to dialog
+		String toBeSetItems[] = getItemTypesAsString(addedItems);//get items to be set to all item types
+		
+		Event itemsComboUpdateEvent = new Event();
+		itemsComboUpdateEvent.doit = true;
+		itemsComboUpdateEvent.data = toBeSetItems;
+		
+		//Enabling / disabling add row button if there is no rows able to add
+		if(toBeSetItems.length == 0 && addRowButton != null){
+			addRowButton.setEnabled(false);
+		}else if(addRowButton != null){
+			addRowButton.setEnabled(true);
+		}//else no action 
+		
+		//Notify all type-combos that new data must be set to combos
+		itemsTable.notifyListeners(SWT.SetData, itemsComboUpdateEvent);
+	}
+
+	/**
+	 * Get listener for Clear button
+	 * @param item
+	 * @param typeCombo
+	 * @param valueTxt
+	 * @param randomCombo
+	 * @param amountTxt
+	 * @return
+	 */
+	private SelectionAdapter getClearButtonSelectionListener(
+			final TableItem item, final CCombo typeCombo, final Text valueTxt,
+			final CCombo randomCombo, final Text amountTxt) {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				
+
+				// Clearing data, also item texts must be cleared
+				typeCombo.setText(AbstractValue.EMPTY_STRING);
+				item.setText(0, AbstractValue.EMPTY_STRING);
+				valueTxt.setText(AbstractValue.EMPTY_STRING);
+				item.setText(1, AbstractValue.EMPTY_STRING);
+				randomCombo.setText(AbstractValue.EMPTY_STRING);
+				item.setText(2, AbstractValue.EMPTY_STRING);
+				amountTxt.setText(AbstractValue.EMPTY_STRING);
+				item.setText(3, AbstractValue.EMPTY_STRING);
+
+				typeCombo.setEnabled(true);
+				valueTxt.setEnabled(true);
+				randomCombo.setEnabled(true);
+				amountTxt.setEnabled(true);
+				
+				randomCombo.setBackground(getWhite());
+				
+				//Notify table listeners to update item combos
+				notifyTypeComboDataListeners();	
+			}
+		};
+	}
+	
+	/**
+	 * Get listener for Clear button
+	 * @param item
+	 * @param typeCombo
+	 * @param valueCombo
+	 * @param randomCombo
+	 * @param amountTxt
+	 * @return
+	 */
+	private SelectionAdapter getClearButtonSelectionListener(
+			final TableItem item, final CCombo typeCombo, final CCombo valueCombo,
+			final CCombo randomCombo, final Text amountTxt) {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				
+				// Clearing data, also item texts must be cleared
+				typeCombo.setText(AbstractValue.EMPTY_STRING);
+				item.setText(0, AbstractValue.EMPTY_STRING);
+				valueCombo.setText(AbstractValue.EMPTY_STRING);
+				item.setText(1, AbstractValue.EMPTY_STRING);
+				randomCombo.setText(AbstractValue.EMPTY_STRING);
+				item.setText(2, AbstractValue.EMPTY_STRING);
+				amountTxt.setText(AbstractValue.EMPTY_STRING);
+				item.setText(3, AbstractValue.EMPTY_STRING);
+
+				typeCombo.setEnabled(true);
+				valueCombo.setEnabled(true);
+				randomCombo.setEnabled(true);
+				amountTxt.setEnabled(true);
+				
+				randomCombo.setBackground(getWhite());
+			
+				//Notify table listeners to update item combos
+				notifyTypeComboDataListeners();					
+			}
+		};
+	}	
+	
+	
+	/**
+	 * When "Set Random" button is pushed, and user wants to set all values as random
+	 * editing value field and random combo selection
+	 * @param txt
+	 * @param valueTxt
+	 * @param modeCombo
+	 */
+	private void setValueTextAndEnablingAndRandomComboSelection(String txt,
+			Text valueTxt, CCombo modeCombo) {
+		
+		valueTxt.setTextLimit(Text.LIMIT);
+
+		if(txt == null){
+			valueTxt.setEnabled(true);
+			valueTxt.setText(AbstractValue.EMPTY_STRING);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_NOT_RANDOM);
+		}
+		// If random is selected, text field is disabled and showing that random
+		// mode is on
+		
+		//random mode with default len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG)) {
+
+			valueTxt.setEnabled(false);
+			valueTxt.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH);
+		} 
+		//Random mode with max len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)) {
+			valueTxt.setEnabled(false);
+			valueTxt.setText(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_MAX_LENGTH);
+		}
+		//random mode with user defined len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH_LONG)) {
+			valueTxt.setEnabled(true);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH);
+		}
+		//mode is RANDOM_TEXT_INC_FOR_EACH_COPY This should not be able to occur, because RANDOM_TEXT_INC_FOR_EACH_COPY
+		//value are always phone numbers and will be on text field, just in case implemented.
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_INC_FOR_EACH_COPY)) {
+			valueTxt.setEnabled(true);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_INC_FOR_EACH_COPY);
+		}
+
+		//default, not random
+		else{
+			valueTxt.setEnabled(true);
+			valueTxt.setText(txt);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_NOT_RANDOM);
+		}		
+	}	
+	
+	/**
+	 * Checks values from type and value (from valueTxt if not null or from valuecombo if txt was null)
+	 * and then checks if other items must check they enablations,
+	 * and enables/disables if required
+	 * 
+	 * @param txt
+	 * @param valueCombo
+	 * @param typeCombo
+	 */
+	private void checkIfNeedToCallCheckItemValueEnablationListenersAndCallIfNeeded(
+			CCombo valueCombo, Text valueText, CCombo typeCombo) {
+		
+		String value;
+		if(valueCombo != null){
+			value = valueCombo.getText();
+		}else{
+			value = valueText.getText();
+		}		
+		String type = typeCombo.getText();
+
+		callCheckItemValueEnablationListeners(type, value);
+	}
+	
+	/**
+	 * Check all items from itemsTable, and enables/disables those if required by some else values
+	 */
+	private void checkIfNeedToCallItemValueEnablationListners(){
+		TableItem[] items = itemsTable.getItems();
+		//Looping through all items in table
+		for (int i = 0; i < items.length; i++) {
+
+			TableItem item = items[i];
+			if (item != null) {
+				String type = item.getText(0);
+				String value = item.getText(1);
+				
+				callCheckItemValueEnablationListeners(type, value);
+			}
+		}		
+	}
+
+	/**
+	 * Calls listeners to check they values if required by given type and value.
+	 * 
+	 * @see AbstractComponent#hasTypeLimitationsForOtherValues(String, String)
+	 * 
+	 * @param value
+	 * @param type
+	 */
+	private void callCheckItemValueEnablationListeners(String type, String value) {
+		
+		//check from component, if that type and value combination needs to call listeners		
+		boolean wakeUpListners = getComponent().hasTypeLimitationsForOtherValues(type, value);
+		
+		//If we need to wake up listners, doing so
+		if(wakeUpListners){
+		
+			TableItem[] items = itemsTable.getItems();
+			//Looping through all items in table
+			for (int i = 0; i < items.length; i++) {
+	
+				TableItem item = items[i];
+				if (item != null) {
+					//Creating special event, so other listeners can check that if they are not intressed of this event
+					CheckItemValueEnablationsEvent e = new CheckItemValueEnablationsEvent();
+					e.setType(type);
+					e.setValue(value);
+					e.doit = true;
+					item.notifyListeners(SWT.Modify, e);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * When "Set Random" button is pushed, and user wants to set all values as random
+	 * editing value field and random combo selection
+	 * @param txt
+	 * @param valueCombo
+	 * @param modeCombo
+	 */
+	private void setValueTextAndEnablingAndRandomComboSelection(String txt,
+			CCombo valueCombo, CCombo modeCombo) {
+		
+		valueCombo.setTextLimit(Text.LIMIT);
+
+		if(txt == null){
+			valueCombo.setEnabled(true);
+			valueCombo.setText(AbstractValue.EMPTY_STRING);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_NOT_RANDOM);
+		}
+		// If random is selected, text field is disabled and showing that random
+		// mode is on
+		
+		//random mode with default len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG)) {
+
+			valueCombo.setEnabled(false);
+			valueCombo.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH);
+		} 
+		//Random mode with max len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG)) {
+			valueCombo.setEnabled(false);
+			valueCombo.setText(AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_MAX_LENGTH);
+		}
+		//random mode with user defined len
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH)
+				|| txt.equals(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH_LONG)) {
+			valueCombo.setEnabled(true);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH);
+		}
+		//mode is RANDOM_TEXT_INC_FOR_EACH_COPY This should not be able to occur, because RANDOM_TEXT_INC_FOR_EACH_COPY
+		//value are always phone numbers and will be on text field, just in case implemented.
+		else if (txt.equals(AbstractValue.RANDOM_TEXT_INC_FOR_EACH_COPY)) {
+			valueCombo.setEnabled(true);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_INC_FOR_EACH_COPY);
+		}
+		//default, not random
+		else{
+			valueCombo.setEnabled(true);
+			valueCombo.setText(txt);
+			modeCombo.setText(AbstractValue.RANDOM_TEXT_NOT_RANDOM);
+		}		
+	}		
+
+
+	/**
+	 * Adds one value combo to table 
+	 * @param values
+	 * @param selectedValue
+	 * @param item
+	 * @param randomValueText
+	 * @param typeComboSelection
+	 * @return
+	 */
+	private CCombo addValueComboToTable(String[] values, String selectedValue,
+			final TableItem item, String randomValueText, String typeComboSelection) {
+		TableEditor editor;
+		//
+		//value combo
+		//
+    	boolean isContactSetReference = CreatorEditorSettings.isContactSetReference(typeComboSelection);    		
+		
+		editor = new TableEditor(itemsTable);
+		final CCombo valueCombo = new CCombo(itemsTable, SWT.NONE);
+		valueCombo.setItems(values);
+		valueCombo.setEditable(false);
+		valueCombo.setBackground(getWhite());
+		if(selectedValue != null){
+			setValueTextAndEnabling(valueCombo, selectedValue, randomValueText, typeComboSelection);		
+		}
+
+		item.setText(1, valueCombo.getText());
+			
+		valueCombo.addSelectionListener(new SelectionAdapter() {
+	        public void widgetSelected(SelectionEvent event) {
+	        	item.setText(1, valueCombo.getText());
+	        }
+	      });		
+	
+		editor.grabHorizontal = true;
+		editor.setEditor(valueCombo, item, 1);
+		
+		if(isContactSetReference){
+    		setContextSensitiveHelpID(valueCombo, CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET);
+    	}else{
+    		setContextSensitiveHelpIDByComponentType(valueCombo);
+    	}		
+		
+		return valueCombo;
+	}	
+
+	/**
+	 * Get selection value for type Combo by item content (key) and itemIndex
+	 * @param key for returning back if it was not empty
+	 * @param itemIndex a row index just adding
+	 * @param openItemType 
+	 * @return a showable Item name or empty string, key if it was not empty or next value for items,
+	 *  or empty string if index was over last item index 
+	 */
+	private String getTypeComboSelection(String key, int itemIndex, boolean openItemType) {
+		if(key == null ){
+			return AbstractValue.EMPTY_STRING;
+		}
+		else if(key.equals(AbstractValue.EMPTY_STRING) 
+				&& getItemTypesAsString().length > itemIndex)
+		{
+			String setThisItemAsDefaultSelection = "";
+			if(openItemType){
+				setThisItemAsDefaultSelection = getItemTypesAsString()[itemIndex];
+			}
+			return setThisItemAsDefaultSelection;
+		}else{
+			return key;
+		}
+	}
+
+	/**
+	 * @return unicode Font
+	 */
+	protected Font getUnicodeFont() {
+		Font defaultFont = itemsTable.getFont();
+		FontData defaulFD [] = defaultFont.getFontData();		
+		FontData fd = new FontData("Arial Unicode MS", defaulFD[0].getHeight(),  defaulFD[0].getStyle());
+		return new Font(Display.getCurrent(), fd);
+	}
+
+	/**
+	 * Gets 1 size smaller font for the button
+	 * @return same Font with smaller size
+	 */
+	protected Font getButtonFont() {
+		Font defaultFont = itemsTable.getFont();
+		FontData defaulFD [] = defaultFont.getFontData();
+		FontData fd = new FontData(defaulFD[0].getName(), defaulFD[0].getHeight()-1, defaulFD[0].getStyle());
+		Font font = new Font(Display.getCurrent(), fd);		
+		return font;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+	 */
+	protected void createButtonsForButtonBar(Composite parent) {
+	    // Creating just OK button
+	    createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+	            true);
+	    createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,
+	            true);     
+	    
+	}
+
+	
+	/* 
+	 * Collecting Component data from table fields 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	protected void okPressed() {
+			
+		//When in edit mode, just removing all attributes and replace them with current editor values
+		if(isInEditMode()){
+			getComponent().removeAllAttributes();
+		}else{
+			//otherwise creating new component
+			setComponent(createNewComponent());
+		}
+		
+		if(itemsTable != null){
+			
+			TableItem [] items = itemsTable.getItems();
+			
+			for (int i = 0; i < items.length; i++) {
+				
+				TableItem item = items[i];
+				
+				if(item != null){
+			
+					String type = item.getText(0);
+					String value = item.getText(1);
+					
+					if(type != null && type.trim().length()>0
+							&& value != null && value.trim().length()>0){
+						value = value.trim();//Editor will produce script with no extra spaces.
+						
+						AbstractValue aValue = createNewValue(type, value, item.getText(2), item.getText(3));
+						
+						//If field is Contact set reference
+						if(CreatorEditorSettings.isContactSetReference(type)){
+							
+							AbstractComponent compToReference = getProvider().getComponents()
+							.getComponentByComponentString(	value );
+							
+							aValue.setContactSetReference(true);
+							aValue.setRandom(false);//contact set reference cannot be random
+							int id = 0;
+							try {
+								id=compToReference.getId();
+							} catch (Exception e) {
+								id = 0;
+								showWarningDialog("Contact Set not exist", "Contact Set with id: '" +value +"' doesn't exist, please use existing Contact Set IDs.");
+							}
+							aValue.setId(id);
+							
+							int maxamount = 0;
+							try {
+								maxamount=Integer.parseInt(item.getText(3));
+							} catch (Exception e) {
+								maxamount = 0;
+							}
+							aValue.setMaxAmount(maxamount);							
+						}						
+						 
+						//Setting random type as user defined and set length by user definition
+						else if(aValue.getModeValueText().equalsIgnoreCase(AbstractValue.RANDOM_TEXT_USER_DEFINED_LENGTH)){
+							aValue.setModeType(ModeTypes.RandomTypeUserDefinedLength);
+							int randomLen;
+							try {
+								randomLen = Integer.parseInt(value);
+							} catch (NumberFormatException e) {
+								e.printStackTrace();
+								randomLen = AbstractValue.USER_DEFINED_DEFAULT_LENGTH;
+								showWarningDialog("Invalid random value", "Invalid user defined random lenght value: '" 
+										+value +"'. Value was set to: '" +AbstractValue.USER_DEFINED_DEFAULT_LENGTH +"'.");
+								
+							}
+							aValue.setRandomValueLenght(randomLen);
+						}
+						
+						Vector<AbstractValue> v = getComponent().getAttribute(type);
+						if(v == null){
+							v = new Vector<AbstractValue>();
+						}
+						v.add(aValue);
+						
+						getComponent().setAttribute(type, v);
+					}
+				}			
+			}
+			
+		}
+			//Amount txt for component level		
+			if(amoutTxtToComponent != null){
+				String amount = amoutTxtToComponent.getText();
+				if(amount != null && amount.trim().length() > 0){
+					try {
+						int am = Integer.parseInt(amount);
+						getComponent().setAmount(am);		
+					} catch (Exception e) {					
+						//just in case take Exception for parseInt, should not be occur, because of text field data validation
+						e.printStackTrace();
+						getComponent().setAmount(0);
+					}
+				}		
+			}
+			
+			
+			//If extra field number is used
+			if(extraNbrToComponent != null){
+				getComponent().addAdditionalParameter(getComponent().getIdByValue(labelForExtraNumberField), extraNbrToComponent.getText());
+			}
+			//If extra field txt is used			
+			if(extraTxtToComponent != null){
+				getComponent().addAdditionalParameter(getComponent().getIdByValue(labelForExtraTextField), extraTxtToComponent.getText());				
+			}
+			
+			//Set link to another component if any
+			setLinkToOtherComponentByComboSelection();
+			
+			super.okPressed();
+	
+		}
+	
+	/**
+	 * Show an confirmation dialog
+	 * @param title
+	 * @param message
+	 * @return true if OK pressed, false otherwise
+	 */
+	protected boolean showConfirmationDialog(String title, String message) {
+		Shell sh;
+		if (getShell() != null) {			
+			try {
+				sh = getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+			
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		return MessageDialog.openConfirm(sh, title, message);
+	}	
+	
+
+	/**
+	 * Show an information dialog
+	 * @param title
+	 * @param message
+	 */
+	protected void showInformationDialog(String title, String message) {
+		Shell sh;
+		if (getShell() != null) {			
+			try {
+				sh = getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+			
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		MessageDialog.openInformation(sh, title, message);
+	}
+	/**
+	 * Show an warning dialog
+	 * @param title
+	 * @param message
+	 */
+	protected void showWarningDialog(String title, String message) {
+		Shell sh;
+		if (getShell() != null) {			
+			try {
+				sh = getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+			
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		MessageDialog.openWarning(sh, title, message);
+	}	
+	/**
+	 * Show an error dialog
+	 * @param title
+	 * @param message
+	 */
+	protected void showErrorDialog(String title, String message) {
+		Shell sh;
+		if (getShell() != null) {			
+			try {
+				sh = getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+			
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		MessageDialog.openError(sh, title, message);
+	}	
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		try{
+			Composite composite = createDialogAreaComposite(parent);
+			GridLayout gridLayout = new GridLayout();
+			composite.setLayout(gridLayout);
+	
+			//Create Amount area
+			createAmountArea(composite);		
+			
+			//Create table area
+			createTableArea(composite);		
+			
+			if(/*showAmountInfoText &&*/ isAmountFieldsEnabled){
+				addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+			}		
+			
+			if(wasErrors()){
+				showErrorDialog("Errors occured when dialog opened", getErrors());
+			}
+			
+			return composite;
+		}catch(Exception e){
+			e.printStackTrace();
+			showUnableToOpenDialogErrorMsg(e);
+		}
+		return null;
+	}
+
+	/**
+	 * Creates a composite for dialog area
+	 * @param parent
+	 * @return a Composite
+	 */
+	protected Composite createDialogAreaComposite(Composite parent) {
+		Composite composite = (Composite) super.createDialogArea(parent);
+		return composite;
+	}
+
+	/**
+	 * Creating all items to dialog area, a real implementation for createDialogArea(Composite parent)
+	 */
+	protected void createTableArea(Composite composite) {
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		
+	
+		Composite tableComposite = new Composite(composite, SWT.SIMPLE);
+		tableComposite.setLayout(gdl);
+		tableComposite.setLayoutData(gd);
+		
+		itemsTable = new Table (tableComposite, SWT.BORDER | SWT.MULTI);
+		GridData tableGd = new GridData(GridData.FILL_BOTH);
+		tableGd.heightHint = 300;	
+		itemsTable.setLayoutData(tableGd);
+		itemsTable.setLinesVisible (true);
+		itemsTable.setHeaderVisible(true);	
+		itemsTable.setEnabled(isTableEnabled);
+	
+		//Create columns to table
+		createTableColums();
+		
+		AbstractComponent component = (AbstractComponent) getComponent();
+		Set<String> keys = component.getKeys();
+		Vector<String> keysV = new Vector<String>(keys);
+		
+		
+		//Create rows to table +2 is for new items
+		int actualComponentItemCount = component.getAttributeCount();// +2;
+		int allCompoenentItemCount = getItemTypesAsString().length;
+		//Always create at least 12 rows
+		if(!isInEditMode() && actualComponentItemCount < INITIAL_ITEMS_NUMBER_IN_TABLE  ){
+			if(allCompoenentItemCount > INITIAL_ITEMS_NUMBER_IN_TABLE){
+				actualComponentItemCount = INITIAL_ITEMS_NUMBER_IN_TABLE;
+			}
+			else{
+				actualComponentItemCount = allCompoenentItemCount;
+			}
+		}
+		
+		
+		//Looping through table and add existing data or empty rows
+		for (int i=0; i<actualComponentItemCount; i++) {
+			//TableEditor editor = new TableEditor (itemsTable);						
+			
+			//Creating empty rows if there is no data allready added at least 12 rows
+			if (i >= component.getAttributeCount()){
+				try {
+					addRow(!isInEditMode(), false);
+				} catch (Exception e) {
+					handleTableRowCreationError(e);
+				}
+			}
+			//rows of the table where is data added
+			else{
+				String key = (String) keysV.get(i);
+				Vector<AbstractValue> values = component.getAttribute(key);
+				for (Iterator<AbstractValue> iterator = values.iterator(); iterator.hasNext();) {
+					AbstractValue value = (AbstractValue) iterator
+							.next();
+					try {
+						addRow(key, value, false);
+					} catch (Exception e) {
+						handleTableRowCreationError(e);
+					}	
+					
+				}
+				//Adding one row to Table
+						
+			}//else
+		}
+		
+		//Notify listeners to update values when all rows are set
+		checkIfNeedToCallItemValueEnablationListners();
+		
+		//Notify table listeners to update item combos
+		notifyTypeComboDataListeners();	
+		
+		//Create add row button
+		createAddRowButton(tableComposite);
+		
+		if(wasErrorsWithDatas){
+			showErrorDialog("Errors on script", "There was some errors when opening component, see Console for details.");
+		}
+	}
+
+	/**
+	 * Set wasErrorsWithDatas as true and prints console error message
+	 * @param e
+	 */
+	private void handleTableRowCreationError(Exception e) {
+		wasErrorsWithDatas  = true;
+		e.printStackTrace();
+		CreatorEditorConsole.getInstance().println(UNEXPECTED_ERROR_WHEN_CREATING_TABLE_AREA_ERROR_WAS +e, CreatorEditorConsole.MSG_ERROR);
+	}
+
+	/**
+	 * Creates an Add row button to selected composite
+	 * @param parent
+	 */
+	private void createAddRowButton(Composite parent) {
+		addRowButton = new Button(parent, SWT.PUSH);	
+		addRowButton.setText(ADD_ROW_TXT);
+		//Add add row functionality
+		addRowButton.addSelectionListener(new SelectionAdapter(){
+			
+			public void widgetSelected(SelectionEvent event) {
+				try {
+					addRow(true, true);
+					//Notify table listeners to update item combos
+					notifyTypeComboDataListeners();						
+					
+					//notify also listners if needed
+					checkIfNeedToCallItemValueEnablationListners();					
+				} catch (Exception e) {
+					handleTableRowCreationError(e);					
+				}
+			}
+			
+		});
+		setContextSensitiveHelpID(addRowButton, CreatorHelpContextIDs.CREATOR_HELP_MODIFY_COMPONENT);
+	}
+
+	/**
+	 * Creates a button to launch "Create new Contact-set" -dialog.
+	 * @param composite
+	 * @param addIndent - If add some empty space before creating button |"    " <BUTTON>|
+	 */
+	protected void createAddNewContactSetButton(Composite composite, boolean addIndent){
+		
+		
+		if(addIndent){
+			//Adding empty labe for decoration purposes
+			Label emptyText = new Label(composite, SWT.SIMPLE);
+			emptyText.setBackground(getGrey());
+			emptyText.setText("       ");			
+		}
+	
+		addContactSetButton = new Button(composite, SWT.PUSH);
+		addContactSetButton.setText(ContactSetVariables.ADD_CONTACT_SET_TXT);		
+	
+		//add button listener
+		addContactSetButton.addSelectionListener(provider.getAddNewContactSetComponentListener(getShell(), provider));
+		addContactSetButton.setData(linkToOtherComponentCombo);
+		
+		//When a new component was added, must update data in list, doing it through listener, 
+		//which is provided to dialog through event.widget.data 
+		addContactSetButton.setData(new AddNewContactSetButtonListener (null));
+		
+	}
+
+	/**
+	 * Update link list when new component was added
+	 */
+	private class AddNewContactSetButtonListener implements IAddComponentListener{
+		
+		private CCombo combo = null;
+
+
+		AddNewContactSetButtonListener(CCombo combo){
+			this.combo = combo;
+			
+		}
+		
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.creator.editors.IAddComponentListener#componentAdded(com.nokia.s60tools.creator.components.AbstractComponent)
+		 */
+		public void componentAdded(AbstractComponent comp) {
+			
+			if(comp != null && comp.isValid() && linkToOtherComponentCombo != null){
+				String[] contactSetsAsString = getContactSetsAsString();
+				//If list is empty, cant just add one just created, so setting all values
+				String selection = linkToOtherComponentCombo.getText();
+				linkToOtherComponentCombo.setItems(contactSetsAsString);
+				if(selection != null){
+					linkToOtherComponentCombo.setText(selection);
+				}
+				linkToOtherComponentCombo.setEnabled(true);		
+				
+			}
+			
+			
+			//Woke upp also other listeners who's intressed of this event! (those who has combo!=null)
+			Event event = new Event();
+			event.doit = true;
+			addContactSetButton.notifyListeners(SWT.SetData, event);
+			
+		}
+
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+		 */
+		public void handleEvent(Event event) {
+			if(combo != null && event.doit){
+				String text = combo.getText();
+				String[] contactSetsAsString = getContactSetsAsString();
+				combo.setItems(contactSetsAsString);
+				int length = contactSetsAsString.length;
+				if(length > MAX_ITEMS_IN_COMBO){
+					length = MAX_ITEMS_IN_COMBO;
+				}
+				combo.setVisibleItemCount(length);
+				combo.setText(text);
+			}			
+		}
+	}
+
+	/**
+	 * Create Amount area with label and text field to add label
+	 * @param parent
+	 */
+	protected void createAmountArea(Composite parent) {
+		Composite amountComp = new Composite(parent,SWT.SIMPLE);
+		amountComp.setLayout(new GridLayout(5, false));
+		GridData gridData = new GridData(GridData.FILL_BOTH);
+		gridData.heightHint = 45;
+		amountComp.setLayoutData(gridData);
+				
+		createAmountAreaImpl(amountComp);
+		createFulFillWithRandomDatas(amountComp);	
+	}
+	
+	/**
+	 * Create Amount area with label and text field to add label
+	 * @param parent
+	 * @param addCreateNewContactSetButton <code>true</code> if Botton for creating contact-set(s)
+	 * will be created, <code>false</code> otherwise.
+	 */	
+	protected void createAmountArea(Composite parent, boolean addCreateNewContactSetButton) {
+		
+		if(!addCreateNewContactSetButton){
+			createAmountArea(parent);
+		}
+		else{
+			Composite amountComp = new Composite(parent,SWT.SIMPLE);
+			amountComp.setLayout(new GridLayout(7, false));
+			GridData gridData = new GridData(GridData.FILL_BOTH);
+			gridData.heightHint = 45;
+			amountComp.setLayoutData(gridData);
+					
+			createAmountAreaImpl(amountComp);
+			//Create button to create new contact sets
+			createAddNewContactSetButton(amountComp, true);			
+			
+			createFulFillWithRandomDatas(amountComp);				
+		}
+	}	
+
+	/**
+	 * Create Amount area with label and text field to add label.
+	 * Takes real composite as parameter, not parent
+	 * @param composite
+	 */	
+	private void createAmountAreaImpl(Composite amountComp) {
+		Label amoutLb = new Label(amountComp,SWT.NONE);
+		amoutLb.setText(AMOUNT_TXT);
+		
+		amoutTxtToComponent = new Text(amountComp, SWT.LEFT | SWT.BORDER);
+		amoutTxtToComponent.setLayoutData(new GridData(AMOUNT_FIELD_LENGTH,
+				SWT.DEFAULT));
+		amoutTxtToComponent.setTextLimit(10);
+		if(getComponent().getAmount() > 0){
+			amoutTxtToComponent.setText( "" +getComponent().getAmount());
+		}
+		//Verify listener must be set after setting text
+		amoutTxtToComponent.addVerifyListener(getNumberVerifyListener());		
+		
+		setContextSensitiveHelpID(amoutTxtToComponent, CreatorHelpContextIDs.CREATOR_HELP_GENERIC_COMPONENT);
+		
+	}
+
+	/**
+	 * Creates 
+	 * @param amountComp
+	 */
+	private void createFulFillWithRandomDatas(Composite amountComp) {
+		//
+		//Fulfill items with random -functionality buttons
+		//
+		
+		Label fulFillLb1 = new Label(amountComp,SWT.NONE);
+		fulFillLb1.setText("          Set all values as random with length:");
+		
+		Composite radioComp = new Composite(amountComp, SWT.SIMPLE);
+		RowLayout rowLayout = new RowLayout();
+		rowLayout.type = SWT.VERTICAL;
+		radioComp.setLayout(rowLayout);
+		final Button selectLenDefaultBtn = new Button(radioComp, SWT.RADIO);
+		selectLenDefaultBtn.setText(RANDOM_LEN_DEFAULT);
+		selectLenDefaultBtn.setSelection(true);
+		final Button selectLenMaxBtn = new Button(radioComp, SWT.RADIO);
+		selectLenMaxBtn.setText(RANDOM_LEN_MAX);
+		Button setAsRandom = new Button(amountComp, SWT.PUSH);
+		setAsRandom.setText(SET_RANDOM_TXT);
+		setAsRandom.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				String len = AbstractVariables.RANDOM_LEN_DEFAULT_XML_VALUE;
+				boolean selection = selectLenMaxBtn.getSelection();
+				if(selection){
+					len = AbstractVariables.RANDOM_LEN_MAX_XML_VALUE;
+				}
+				boolean setAllValuesAsRandom = showConfirmationDialog("Set all Values as random", "Are you sure that you want to set all values as random? All existing values will be replaced by random value with "  +len +" length.");
+				if(setAllValuesAsRandom){
+					setAllItemsAsRandom(selection);
+				}
+			}
+		});
+		
+		setContextSensitiveHelpID(selectLenDefaultBtn, CreatorHelpContextIDs.CREATOR_HELP_GENERIC_COMPONENT);
+		setContextSensitiveHelpID(selectLenMaxBtn, CreatorHelpContextIDs.CREATOR_HELP_GENERIC_COMPONENT);
+		setContextSensitiveHelpID(setAsRandom, CreatorHelpContextIDs.CREATOR_HELP_GENERIC_COMPONENT);
+
+	}
+	
+	/**
+	 * Creates a composite and creates extra numberfield and extra text field to it
+	 * @param parent
+	 * @param labelForNumberField
+	 * @param numberFieldValue
+	 * @param labelForTextField
+	 * @param textFieldValue
+	 */
+	protected void createNumberAndTextFields(Composite parent, String labelForNumberField, 
+			int numberFieldValue, String labelForTextField, String textFieldValue){
+		
+		Composite comp = new Composite(parent,SWT.SIMPLE);
+		comp.setLayout(new GridLayout(4, false));
+		comp.setLayoutData(new GridData(GridData.FILL_BOTH));		
+		
+		createExtraNumberField(labelForNumberField, numberFieldValue, comp);
+		
+		createExtraTextField(labelForTextField, textFieldValue, comp);
+	
+	}
+
+	/**
+	 * Creates an extra text field and label to composite
+	 * @param labelForTextField
+	 * @param textFieldValue text value for field, or <code>null</code> if don't want any
+	 * @param comp
+	 */
+	protected void createExtraTextField(String labelForTextField,
+			String textFieldValue, Composite comp) {
+		this.labelForExtraTextField = labelForTextField;		
+		Label txtLb = new Label(comp,SWT.NONE);
+		txtLb.setText(labelForTextField);
+		
+		extraTxtToComponent = new Text(comp, SWT.LEFT | SWT.BORDER);
+		extraTxtToComponent.setLayoutData(new GridData(TEXT_FIELD_LENGTH,
+				SWT.DEFAULT ) );
+		if(textFieldValue != null){
+			extraTxtToComponent.setText(textFieldValue.trim());
+		}
+		
+		setContextSensitiveHelpIDByComponentType(extraTxtToComponent);
+	}
+
+	/**
+	 * Creates an extra number field and label to composite
+	 * @param labelForNumberField
+	 * @param numberFieldValue number value to field, give 0 if don't want any
+	 * @param comp
+	 */
+	protected void createExtraNumberField(String labelForNumberField,
+			int numberFieldValue, Composite comp) {
+		this.labelForExtraNumberField = labelForNumberField;
+		Label nbrLb = new Label(comp,SWT.NONE);
+		nbrLb.setText(labelForExtraNumberField);
+		
+		extraNbrToComponent = new Text(comp, SWT.LEFT | SWT.BORDER);
+		extraNbrToComponent.setLayoutData(new GridData(AMOUNT_FIELD_LENGTH,
+				SWT.DEFAULT));
+		extraNbrToComponent.setTextLimit(10);
+		if(numberFieldValue > 0){
+			extraNbrToComponent.setText( "" +numberFieldValue);
+		}
+		//Verify listener must be set after setting text
+		extraNbrToComponent.addVerifyListener(getNumberVerifyListener());
+		setContextSensitiveHelpIDByComponentType(extraNbrToComponent);
+	}
+	
+	/**
+	 * Create Amount area with label and text field to add label
+	 * @param parent
+	 */	
+	protected void createAmountAreaAndLinkToOtherComponentCombo(Composite parent, String comboLabel,
+			String[] contentToComponentLinkCombo, String contactSetSelection, 
+			boolean addCreateNewContactSetButton, boolean createFullFillWithRandom) {
+		if(addCreateNewContactSetButton){
+			createAmountAreaAndLinkToOtherComponentComboWithCreateButton(
+					parent, comboLabel, contentToComponentLinkCombo, contactSetSelection, 
+					createFullFillWithRandom);
+		}else{
+			createAmountAreaAndLinkToOtherComponentCombo(
+					parent, comboLabel, contentToComponentLinkCombo, contactSetSelection,
+					createFullFillWithRandom);
+		}
+		if(getComponent()  instanceof Contact) {
+			setContextSensitiveHelpID(linkToOtherComponentCombo, CreatorHelpContextIDs.CREATOR_HELP_CONTACT_SET );			
+		}else{
+			setContextSensitiveHelpIDByComponentType(linkToOtherComponentCombo);
+		}	
+	}
+	/**
+	 * Create Amount area with label and text field to add label
+	 * @param parent
+	 */	
+	private void createAmountAreaAndLinkToOtherComponentCombo(Composite parent, String comboLabel,
+			String[] contentToComponentLinkCombo, String contactSetSelection, 
+			boolean createFullFillWithRandom) {
+		Composite amountComp = new Composite(parent,SWT.SIMPLE);
+		int numColumns = 7;
+
+		amountComp.setLayout(new GridLayout(numColumns, false));
+		amountComp.setLayoutData(new GridData(GridData.FILL_BOTH));		
+		
+		createAmountAreaImpl(amountComp);
+
+		createLinkToOtherComponentPart(amountComp, comboLabel, contentToComponentLinkCombo,
+				contactSetSelection, false);
+		
+		if(createFullFillWithRandom){
+			createFulFillWithRandomDatas(amountComp);
+		}
+		
+		
+	}
+	/**
+	 * Create Amount area with label and text field to add label
+	 * @param parent
+	 */	
+	private void createAmountAreaAndLinkToOtherComponentComboWithCreateButton(Composite parent, String comboLabel,
+			String[] contentToComponentLinkCombo, String contactSetSelection, 
+			boolean createFullFillWithRandom) {
+		Composite amountComp = new Composite(parent,SWT.SIMPLE);
+		int numColumns = 5;
+		amountComp.setLayout(new GridLayout(numColumns, false));
+		amountComp.setLayoutData(new GridData(GridData.FILL_BOTH));		
+		
+		createAmountAreaImpl(amountComp);
+		if(createFullFillWithRandom){
+			createFulFillWithRandomDatas(amountComp);
+		}
+
+		createLinkToOtherComponentPart(parent, comboLabel, contentToComponentLinkCombo,
+					contactSetSelection, true);			
+		
+	}	
+
+	protected void createLinkToOtherComponentPart(Composite parent, String comboLabel,
+			String[] contentToComponentLinkCombo, String contactSetSelection,
+			boolean addCreateNewContactSetButton) {
+
+		Composite linkComp = new Composite(parent,SWT.SIMPLE);
+		int numColumns = 2;
+		if(addCreateNewContactSetButton){
+			numColumns ++;
+		}
+
+		
+		linkComp.setLayout(new GridLayout(numColumns, false));
+		linkComp.setLayoutData(new GridData(GridData.FILL_BOTH));			
+		//
+		// Create link to other component
+		//			
+		
+		Label setLb = new Label(linkComp,SWT.NONE);
+		setLb.setText(comboLabel);
+		
+		linkToOtherComponentCombo  = new CCombo(linkComp, SWT.READ_ONLY | SWT.BORDER );
+		linkToOtherComponentCombo .setBackground(getWhite());
+					
+		//If there is some values, setting them to combo
+		if(contentToComponentLinkCombo != null && contentToComponentLinkCombo.length > 0){
+			setComponentsToOtherComponentLinkCombo(contentToComponentLinkCombo);
+		}//Otherwise combo will be disabled
+		else{
+			linkToOtherComponentCombo .setEnabled(false);
+		}
+
+		
+		//If we want to create button for add new contact-set
+		if(addCreateNewContactSetButton){
+			//Create button for creating new contact-sets
+			createAddNewContactSetButton(linkComp, false);
+		}
+		
+		
+		if(contactSetSelection != null){
+			setComboSelection(contentToComponentLinkCombo, linkToOtherComponentCombo, contactSetSelection);
+		}
+	}
+
+
+	/**
+	 * Update items to other component link -Combo
+	 * @param contentToComponentLinkCombo
+	 */
+	protected void setComponentsToOtherComponentLinkCombo(
+			String[] contentToComponentLinkCombo) {
+		if(linkToOtherComponentCombo != null){
+			linkToOtherComponentCombo.setItems(contentToComponentLinkCombo);
+		}
+	}	
+	
+	/**
+	 * Set all items in table as random.
+	 * @param setAsMaxLength
+	 */
+	private void setAllItemsAsRandom(boolean setAsMaxLength) {
+
+		TableItem[] items = itemsTable.getItems();
+
+		//Looping through all items in table
+		for (int i = 0; i < items.length; i++) {
+
+			TableItem item = items[i];
+
+			if (item != null) {
+				Event e = new SetRandomEvent();
+				e.doit = true;
+				item.notifyListeners(SWT.Modify, e);
+				
+				String key = item.getText(0);
+
+				//When item is contact set reference, it cannot be random, or if random fields is disabled, they cannot be set as random.
+				if(isRandomFieldsEnabled() && !CreatorEditorSettings.isContactSetReference(key) && getComponent().getVariables().isModeEnabledForKey(key)){										
+					//When there is a key, setting value as random
+					if (key != null && key.trim().length() > 0) {
+						//setting value as max or default
+						if(setAsMaxLength){
+							item.setText(1, AbstractValue.RANDOM_TEXT_MAX_LENGTH_LONG);
+							item.setText(2, AbstractValue.RANDOM_TEXT_MAX_LENGTH);
+							
+						}
+						else{
+							item.setText(1, AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH_LONG);
+							item.setText(2, AbstractValue.RANDOM_TEXT_DEFAULT_LENGTH);
+						}
+						//Notify listeners by self
+						item.notifyListeners(SWT.Modify, e);
+						
+					}
+				}
+			}
+		}
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	protected void configureShell(Shell shell) {
+	    super.configureShell(shell);
+	    if(isInEditMode()){
+	    	shell.setText("Edit " +getComponent().getType() +"(s)");        	
+	    }else{
+	    	shell.setText("Add " +getComponent().getType() +"(s)");
+	    }
+	}	
+	
+	/**
+	 * Adds an information label to view
+	 * @param txt
+	 */
+	protected void addInformation(Composite composite, String txt){
+		Composite infoComp = new Composite(composite,SWT.SIMPLE);
+		infoComp.setLayout(new GridLayout(1, false));
+		infoComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		GridData gd = new GridData(CreatorScriptEditor.EDITOR_DEFAULT_WIDTH, SWT.DEFAULT);
+		Label info = new Label(infoComp,SWT.WRAP );
+		info.setLayoutData(gd);
+		info.setText(txt);		
+	}
+
+	/**
+	 * Get is amount fields enabled or not
+	 * @return true if is enabled
+	 */
+	protected boolean isAmountFieldsEnabled() {
+		return isAmountFieldsEnabled;
+	}
+
+	/**
+	 * Set amount fields enable or disable in table 
+	 * @param isAmountFieldsEnabled
+	 */
+	protected void setAmountFieldsEnabled(boolean isAmountFieldsEnabled) {
+		this.isAmountFieldsEnabled = isAmountFieldsEnabled;
+	}
+	
+	/**
+	 * Sets table enabled or disabled, default is enabled
+	 * @param b
+	 */
+	protected void setTableEnabled(boolean isTableEnabled) {
+		this.isTableEnabled = isTableEnabled;
+	}
+	
+
+
+	/**
+	 * Get {@link IComponentProvider} interface
+	 * @return interface to provide component services
+	 */
+	protected IComponentProvider getProvider() {
+		return provider;
+	}
+
+	/**
+	 * Get selection text from other component selection Combo
+	 * @return selection text, or null if not created
+	 */
+	private String getLinkToOtherComponentComboSelection() {
+		
+		String txt = null;
+		if(linkToOtherComponentCombo != null){
+			txt = linkToOtherComponentCombo.getText();
+		}
+		return txt;
+	}
+
+	/**
+	 * Sets link to another component
+	 */
+	private void setLinkToOtherComponentByComboSelection() { 
+		
+		//text from combo
+		String contactSetLinkText = getLinkToOtherComponentComboSelection();
+		if(contactSetLinkText != null && contactSetLinkText.trim().length() >0){
+		
+			//future improvement idea, "linkToOtherComponentCombo" is not the best name for additional component level data combo
+			//also better way to handle data from that is to let real Dialog implementation to handle it.
+			
+			//If component is mailbox, linktoanother component is actually type
+			if(getComponent() instanceof MailBox){
+				MailBox box = (MailBox) getComponent();
+				box.setMailBoxType(contactSetLinkText.trim());
+			}
+			else{
+				//get a component which the reference points
+				AbstractComponent compToReference = getProvider().getComponents()
+					.getComponentByComponentString(	contactSetLinkText);
+				//set reference to this component
+				getComponent().setReferenceToAnotherComponent(compToReference);
+
+				
+			}
+		}
+		//There is possibility that contact set reference is removed, and thats why must remove existing reference
+		else{
+			getComponent().setReferenceToAnotherComponent(null);			
+		}
+
+	}
+
+	/**
+	 * Get Contact Sets as String
+	 * @return contact sets
+	 */
+	protected String[] getContactSetsAsString() {
+		
+		Vector<AbstractComponent> contSets = getProvider().getComponents().getComponents(CreatorEditorSettings.TYPE_CONTACT_SET);
+	
+		String[] arr = null;
+		if(contSets != null && contSets.size() > 0){
+			arr = new String[contSets.size()+1];
+			int i = 1;
+			arr[0]  = AbstractValue.EMPTY_STRING;//To be able to reset selection
+			for (Iterator<AbstractComponent> iterator = contSets.iterator(); iterator.hasNext();) {
+				AbstractComponent comp = (AbstractComponent) iterator
+						.next();
+				arr[i] = comp.toString();
+				i++;
+			}
+		}
+		return arr;
+	}
+	
+	/**
+	 * Get Contact Set as String or <code>null</code> if not found
+	 * @param contact set id
+	 * @return Get Contact Set as String or <code>null</code> if not found
+	 */
+	protected String getContactSetStringById(String id) {
+		try {
+			int idInt = Integer.parseInt(id);
+			return getContactSetStringById(idInt);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * Get Contact Set as String or <code>null</code> if not found
+	 * @param contact set id
+	 * @return Get Contact Set as String or <code>null</code> if not found
+	 */
+	protected String getContactSetStringById(int id) {
+		
+		Vector<AbstractComponent> contSets = getProvider().getComponents().getComponents(CreatorEditorSettings.TYPE_CONTACT_SET);
+	
+			for (Iterator<AbstractComponent> iterator = contSets.iterator(); iterator.hasNext();) {
+				AbstractComponent comp = (AbstractComponent) iterator
+						.next();
+				if(comp.getId() == id){
+					return comp.toString();
+				}
+			}
+		return null;
+	}	
+
+	/**
+	 * Set amount of table column headers if not default value
+	 * @param tableColumnHeaderAmount
+	 */
+	protected void setTableColumnHeaderAmount(String tableColumnHeaderAmount) {
+		this.tableColumnHeaderAmount = tableColumnHeaderAmount;
+	}
+
+	/**
+	 * Greate link to another component combo
+	 * @param parent
+	 * @param contentToComponentLinkCombo
+	 * @param contactSetSelection
+	 */
+	protected void createLinkToOtherComponentCombo(Composite parent, String[] contentToComponentLinkCombo,
+			String comboLabel,
+			String contactSetSelection) {
+
+		Composite comp = new Composite(parent,SWT.SIMPLE);
+		comp.setLayout(new GridLayout(2, false));
+		comp.setLayoutData(new GridData(GridData.FILL_BOTH));		
+				
+		Label setLb = new Label(comp,SWT.NONE);
+		setLb.setText(comboLabel);
+		
+		linkToOtherComponentCombo  = new CCombo(comp, SWT.READ_ONLY | SWT.BORDER );
+		linkToOtherComponentCombo .setBackground(getWhite());
+					
+		//If there is some values, setting them to combo
+		if(contentToComponentLinkCombo != null && contentToComponentLinkCombo.length > 0){
+			setComponentsToOtherComponentLinkCombo(contentToComponentLinkCombo);
+		}//Otherwise combo will be disabled
+		else{
+			linkToOtherComponentCombo .setEnabled(false);
+		}
+		
+		if(contactSetSelection != null){
+			setComboSelection(contentToComponentLinkCombo, linkToOtherComponentCombo, contactSetSelection);
+		}
+				
+	}
+
+	/**
+	 * Check if random fields are enabled for this dialog
+	 * @return <code>true</code> if random fields are enabled <code>false</code> othrewise.
+	 */
+	protected boolean isRandomFieldsEnabled() {
+		return isRandomFieldsEnabled;
+	}
+
+	/**
+	 * Set if random fields are enabled for this dialog
+	 * @param isRandomFieldsEnabled <code>true</code> if random fields are enabled <code>false</code> othrewise.
+	 */
+	protected void setRandomFieldsEnabled(boolean isRandomFieldsEnabled) {
+		this.isRandomFieldsEnabled = isRandomFieldsEnabled;
+	}	
+
+
+	/***
+	 * Get Text for contact-set reference check box
+	 * @return UI text for associate this component to contact-set
+	 */
+	protected String getContactSetRefernceText(){
+		return "Associate this " +getComponent().getType() +" to Contact-set: ";
+
+	}
+
+	/**
+	 * Show error message dialog when dialog was not able to open
+	 * @param e {@link Exception} which was thrown
+	 */
+	protected void showUnableToOpenDialogErrorMsg(Exception e) {
+		showErrorDialog("Error", "Errors occurded when editor dialog was opened, see console for details.");
+		CreatorEditorConsole.getInstance().println("Errors occurded when try to open editor dialog for compoent:'" 
+				+getComponent().getType() + "', reason: " +e, CreatorEditorConsole.MSG_ERROR);
+		
+	}
+	
+	/**
+	 * Add an error
+	 * @param errorMsg
+	 */
+	protected void addError(String errorMsg){
+		if(errors == null){
+			errors = new Vector<String>();
+		}
+		errors.add(errorMsg);
+		
+	}
+	
+	/**
+	 * Get all errors, one error will be its own line separeted with "\n"
+	 * @return errors occurred when dialog was opened
+	 */
+	protected String getErrors(){
+		if(errors == null){
+			return "";
+		}else{
+			StringBuffer b = new StringBuffer();
+			String newLine = "\n";
+			for (Iterator<String> iterator = errors.iterator(); iterator.hasNext();) {
+				String err= (String) iterator.next();
+				b.append(err);
+				b.append(newLine);
+			}
+			//remove last new line
+			b.delete(b.length()-newLine.length(), b.length());
+			return b.toString();
+		}
+	}
+	
+	/**
+	 * Was there any errors when creating dialog
+	 * @return <code>true</code> if there was some errors, e.g. unable to set value to combo
+	 */
+	protected boolean wasErrors(){
+		return errors != null;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/BookmarkDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.bookmark.Bookmark;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkValue;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class BookmarkDialog extends AbstractDialog {
+	
+
+	
+	public BookmarkDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new Bookmark(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected Bookmark createNewComponent(){
+		return new Bookmark(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected BookmarkValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new BookmarkValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return BookmarkVariables.getInstance().getItemValuesAsString();
+	}
+
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		setAmountFieldsEnabled(false);
+		
+		return super.createDialogArea(parent);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/BookmarkFolderDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkFolder;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkFolderValue;
+import com.nokia.s60tools.creator.components.bookmark.BookmarkFolderVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class BookmarkFolderDialog extends AbstractDialog {
+	
+
+
+	
+	public BookmarkFolderDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new BookmarkFolder(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected BookmarkFolder createNewComponent(){
+		return new BookmarkFolder(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected BookmarkFolderValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new BookmarkFolderValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return BookmarkFolderVariables.getInstance().getItemValuesAsString();
+	}
+
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		setAmountFieldsEnabled(false);
+		
+		return super.createDialogArea(parent);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/CalendarDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.calendar.Calendar;
+import com.nokia.s60tools.creator.components.calendar.CalendarValue;
+import com.nokia.s60tools.creator.components.calendar.CalendarVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class CalendarDialog extends AbstractDialog {
+	
+
+
+	
+	private String calendarType = null;
+
+
+//	public CalendarDialog(IShellProvider parentShell, IComponentProvider provider) {
+//
+//		super(parentShell, provider);
+//
+//
+//	}
+	
+	public CalendarDialog(Shell parentShell, String calendarType, IComponentProvider provider) {
+		super(parentShell, provider);
+		this.calendarType = calendarType;
+		init(calendarType);
+	}
+//	public CalendarDialog(IShellProvider parentShell, IComponentProvider provider, String calendarType) {
+//		this(parentShell, provider);
+//		this.calendarType = calendarType;
+//		init(calendarType);
+//	}	
+	
+	public CalendarDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		Calendar cal = (Calendar)provider.getEditable();
+		init(cal.getEventType());		
+	}
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(String calendarType){
+		this.calendarType = calendarType.toLowerCase();
+		if(getComponent() == null){
+			AbstractComponent comp = new Calendar(AbstractComponent.NULL_ID, calendarType);
+			setComponent(comp);
+		}		
+		setAmountFieldsEnabled(false);
+	}
+  
+    
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#createNewComponent()
+	 */
+	protected Calendar createNewComponent(){
+		return new Calendar(AbstractComponent.NULL_ID, calendarType);
+	}
+	
+	
+	protected CalendarValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		CalendarValue cal = new CalendarValue(type, value_, random_, amout_);
+		return cal;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return CalendarVariables.getInstance().getItemValuesAsString(calendarType);
+	}
+	
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+
+		Composite composite = createDialogAreaComposite(parent);
+		setTableColumnHeaderAmount(MAX_AMOUNT_TEXT);
+		
+		//If type is Appointment, there is Attendees, showing additional help information for that
+		boolean isAppointment = calendarType.equalsIgnoreCase(CreatorEditorSettings.TYPE_APPOINTMENT) 
+				|| calendarType.equalsIgnoreCase(CreatorEditorSettings.TYPE_APPOINTMENT_XML_ELEMENT);
+
+		//Create also add new contact set button, if this is appointment dialog 
+		createAmountArea(composite, isAppointment);			
+
+		createTableArea(composite);
+
+		if(isAppointment){
+
+			String attendeInfo = "For '" +CalendarVariables.ATTENDEE +"' use format: 'attendee email' or 'attendee email | attendee common name'";
+			addInformation(composite, attendeInfo);
+
+			String possibleValuesInfoText = 
+					CalendarVariables.RECURRENTFREQUENCY_POSSIBLE_VALUES_HELP_TEXT
+					+POSSIBLE_VALUES_FOR_TXT_PART_3;
+			addInformation(composite, possibleValuesInfoText);	
+
+		}
+		//If type is Appointment, there is Attendees, showing additional help information for that
+		else if(calendarType.equalsIgnoreCase(CreatorEditorSettings.TYPE_TODO) 
+				|| calendarType.equalsIgnoreCase(CreatorEditorSettings.TYPE_TODO_XML_ELEMENT)){
+
+
+			String possibleValuesInfoText = 
+				POSSIBLE_VALUES_FOR_TXT_PART_1 
+					+CalendarVariables.PRIORITY
+					+POSSIBLE_VALUES_FOR_TXT_PART_2 
+					+CalendarVariables.PRIORITY_POSSIBLE_VALUES_HELP_TEXT
+					+POSSIBLE_VALUES_FOR_TXT_PART_3;
+			addInformation(composite, possibleValuesInfoText);			
+		}		
+		addInformation(composite, AbstractVariables.DATE_TIME_AND_DATE_FORMAT_HELP_TEXT);
+				
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}		
+		return composite;
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	protected void configureShell(Shell shell) {
+	    super.configureShell(shell);
+//	    Calendar cal = (Calendar)getComponent();
+	    if(isInEditMode()){
+	    	shell.setText("Edit " +getComponent().getValueById(calendarType) +"(s)");        	
+	    }else{
+	    	shell.setText("Add " + getComponent().getValueById(calendarType) +"(s)");
+	    }
+	}		
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ConnectionMethodDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.connectionmethod.ConnectionMethod;
+import com.nokia.s60tools.creator.components.connectionmethod.ConnectionMethodValue;
+import com.nokia.s60tools.creator.components.connectionmethod.ConnectionMethodVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class ConnectionMethodDialog extends AbstractDialog {
+
+	
+	public ConnectionMethodDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new ConnectionMethod(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected ConnectionMethod createNewComponent(){
+		return new ConnectionMethod(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected ConnectionMethodValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new ConnectionMethodValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return ConnectionMethodVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		//Create Amount area
+		createAmountArea(composite);
+		//Create table area
+		createTableArea(composite);		
+		
+		if(isAmountFieldsEnabled() ){
+			addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+		}
+		
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}
+		
+		return composite;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,143 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.contact.Contact;
+import com.nokia.s60tools.creator.components.contact.ContactValue;
+import com.nokia.s60tools.creator.components.contact.ContactVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class ContactDialog extends AbstractDialog {
+	
+
+
+	
+	public ContactDialog(Shell parentShell, IComponentProvider provider) {
+		super(parentShell, provider);
+		init();
+	}
+
+	public ContactDialog(IShellProvider parentShell, IComponentProvider provider) {
+		super(parentShell, provider);
+		init();
+	}
+
+
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent con = new Contact(AbstractComponent.NULL_ID);
+			setComponent(con);
+		}		
+	}
+
+    protected AbstractComponent createNewComponent(){
+		return new Contact(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected ContactValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom && random_ != ModeTypes.ModeTypeIncValueForEachCopy){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new ContactValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return ContactVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		try {
+			//create Amount area
+			String [] contactSetsAsString = null;
+			String contactSetSelection = null;
+			if(getProvider() != null && getProvider().getComponents() != null){
+				contactSetsAsString = getContactSetsAsString();
+			}
+			if(getComponent().hasReferenceToAnotherComponent()){
+				contactSetSelection = getComponent().getReferenceToAnotherComponent().toString();
+			}
+
+			
+			// create contact set link area with amount
+			createAmountAreaAndLinkToOtherComponentCombo(
+					composite, getContactSetRefernceText(), contactSetsAsString, contactSetSelection, true, true);		
+			
+			createTableArea(composite);
+			addInformation(composite, AbstractVariables.DATE_FORMAT_HELP_TEXT);
+			
+			if(wasErrors()){
+				showErrorDialog("Errors occured when dialog opened", getErrors());
+			}			
+			
+			return composite;
+
+		} catch (Exception e) {
+			// Show error, should not be able to occur if ewerything is ok.
+			e.printStackTrace();
+			super.showUnableToOpenDialogErrorMsg(e);
+		}			
+		return null;		
+	}
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactGroupDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,134 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.contact.ContactGroup;
+import com.nokia.s60tools.creator.components.contact.ContactGroupValue;
+import com.nokia.s60tools.creator.components.contact.ContactGroupVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class ContactGroupDialog extends AbstractDialog {
+	
+
+	public ContactGroupDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new ContactGroup(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected ContactGroup createNewComponent(){
+		return new ContactGroup(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected ContactGroupValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new ContactGroupValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return ContactGroupVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+			
+		try {
+			Composite composite = createDialogAreaComposite(parent);
+			ContactGroup group = (ContactGroup)getComponent();
+			
+			
+			//In edit mode there might be allreary some content
+			String textValue =  CreatorEditorSettings.getInstance().replaceEntitiesWithChars(group.getName());
+			
+			Composite comp = new Composite(composite,SWT.SIMPLE);
+			comp.setLayout(new GridLayout(4, false));
+			comp.setLayoutData(new GridData(GridData.FILL_BOTH));				
+			createExtraTextField(ContactGroupVariables.NAME, textValue, comp);	
+			
+			//Create button to create new contact sets
+			createAddNewContactSetButton(comp, true);				
+
+			setTableColumnHeaderAmount(MAX_AMOUNT_TEXT);
+			setRandomFieldsEnabled(false);
+			createTableArea(composite); //Not creating at all, because there is no values for there
+			
+			if(wasErrors()){
+				showErrorDialog("Errors occured when dialog opened", getErrors());
+			}		
+		
+			return composite;
+		} catch (Exception e) {
+			e.printStackTrace();
+			showUnableToOpenDialogErrorMsg(e);
+		}
+		return null;
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/ContactSetDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,179 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.contact.ContactSet;
+import com.nokia.s60tools.creator.components.contact.ContactSetValue;
+import com.nokia.s60tools.creator.components.contact.ContactSetVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class ContactSetDialog extends AbstractDialog {
+	
+
+
+
+	
+	public ContactSetDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new ContactSet(getNextId());
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected ContactSet createNewComponent(){
+		//If we are in edit mode, when creating new component for replacing old, dont create new id
+		int idToComponent = isInEditMode() ? getComponent().getId() : getNextId();
+		return new ContactSet(idToComponent);
+	}
+	
+	
+	protected ContactSetValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new ContactSetValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return ContactSetVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		AbstractValue val = createNewValue(ContactSetVariables.ID, "" +getComponent().getId(), null, null);
+		Vector<AbstractValue> value = new Vector<AbstractValue>(1);
+		value.add(val);
+		getComponent().setAttribute(ContactSetVariables.ID, value);
+		
+		Composite composite = createDialogAreaComposite(parent);
+		
+		//No amount area with contact sets
+		
+		ContactSet set = (ContactSet)getComponent();
+		//In edit mode there might be already some content
+		int numberValue = set.getNumberOfExistingContacts();		
+		
+		//Number of existing fields area
+		Composite comp = new Composite(composite,SWT.SIMPLE);
+		comp.setLayout(new GridLayout(2, false));
+		comp.setLayoutData(new GridData(GridData.FILL_BOTH));				
+		createExtraNumberField(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_DIALOG_TEXT, numberValue, comp);		
+					
+		
+		//Amount fields is disabled
+		setAmountFieldsEnabled(false);
+		setTableEnabled(false);
+		
+		createTableArea(composite);
+
+		addInformation(composite, "Type Contact-Set is only technical type, used to link Contacts to Contact Groups, Messages, and Calendars.");
+		
+		addInformation(composite, "'" + AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_DIALOG_TEXT
+				+"' means that existing contacts found in device is used, and number of contacs will be added to Contact-set created.");
+
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}
+		
+		return composite;
+	}	
+	
+	
+	/**
+	 * Get next free id for contact set
+	 * @return id
+	 */
+	private int getNextId(){
+		Vector<AbstractComponent> sets =
+			getProvider().getComponents(CreatorEditorSettings.TYPE_CONTACT_SET);
+		//if there is no any, id is 1
+		if(sets == null || sets.size() == 0){
+			return 1;
+		}else{
+			//find all existing ids
+			Vector<Integer> ids = new Vector<Integer>(sets.size());
+			for (Iterator<AbstractComponent> iterator = sets.iterator(); iterator.hasNext();) {
+				ContactSet set = (ContactSet) iterator
+						.next();
+				ids.add(new Integer( set.getId()));
+			}
+			//if one is removed in the midle, next free id might be smaller than count
+			for (int i = 1; i < ids.size()+1; i++) {
+				if(!ids.contains(new Integer(i))){
+					return i;
+				}
+			}
+			//otherwise next free id is next number of numbers of sets
+			return ids.size() +1;
+
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/CreatorMessageBox.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+
+/**
+ * This class wraps the MessageBox in order to 
+ * enhance it with product name, and run it in
+ * AppDep plugin's active shell context.
+ * 
+ * @see  org.eclipse.swt.widgets.MessageBox
+ */
+public class CreatorMessageBox {
+
+	MessageBox msgBox;
+
+	/**
+	 * Constructor.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public CreatorMessageBox(String message, int style){		
+		Shell sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/**
+	 * Constructor.
+	 * @param sh Parent shell for the new instance.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public CreatorMessageBox(Shell sh, String message, int style){		
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object arg0) {
+		return msgBox.equals(arg0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#getMessage()
+	 */
+	public String getMessage() {
+		return msgBox.getMessage();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getParent()
+	 */
+	public Shell getParent() {
+		return msgBox.getParent();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getStyle()
+	 */
+	public int getStyle() {
+		return msgBox.getStyle();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getText()
+	 */
+	public String getText() {
+		return msgBox.getText();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return msgBox.hashCode();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#setMessage(java.lang.String)
+	 */
+	public void setMessage(String string) {
+		msgBox.setMessage(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#setText(java.lang.String)
+	 */
+	public void setText(String string) {
+		msgBox.setText(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return msgBox.toString();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#open()
+	 */
+	public int open() {
+		return msgBox.open();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/DialogLauncher.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,178 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.calendar.CalendarVariables;
+import com.nokia.s60tools.creator.components.messaging.MessageVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+
+/**
+ * Helper class to found correct real implementing Dialog class
+ * for {@link AbstractDialog} by selected component type
+ */
+public class DialogLauncher {
+	
+	/**
+	 * Get dialog by component type. Used when Add dialog is launched.
+	 * @param componentType
+	 * @param sh
+	 * @return aDialog
+	 */
+	public static AbstractDialog getDialog(String componentType, Shell sh, final IComponentProvider provider) 
+	{
+		
+		if(componentType.equals(CreatorEditorSettings.TYPE_CONTACT)){
+			return new ContactDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_CONTACT_SET)){
+			return new ContactSetDialog(sh, provider);
+		}		
+		else if(componentType.equals(CreatorEditorSettings.TYPE_CONTACT_GROUP)){
+			return new ContactGroupDialog(sh, provider);
+		}		
+		else if(componentType.equals(CreatorEditorSettings.TYPE_NOTE)){
+			return new NoteDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_BOOKMARK)){
+			return new BookmarkDialog(sh, provider);
+		}			
+		else if(componentType.equals(CreatorEditorSettings.TYPE_BOOKMARK_FOLDER)){
+			return new BookmarkFolderDialog(sh, provider);
+		}	
+		else if(componentType.equals(CreatorEditorSettings.TYPE_SAVED_PAGE)){
+			return new SavedPageDialog(sh, provider);
+		}			
+		else if(componentType.equals(CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER)){
+			return new SavedPageFolderDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_LOG)){
+			return new LogDialog(sh, provider);
+		}		
+		else if(componentType.equals(CreatorEditorSettings.TYPE_IMPS_SERVER)){
+			return new IMPSServerDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_CONNECTION_METHOD)){
+			return new ConnectionMethodDialog(sh, provider);
+		}
+		else if(
+				componentType.equals(CreatorEditorSettings.TYPE_TODO)
+				|| componentType.equals(CreatorEditorSettings.TYPE_APPOINTMENT)
+				|| componentType.equals(CreatorEditorSettings.TYPE_EVENT)
+				|| componentType.equals(CreatorEditorSettings.TYPE_REMINDER)
+				|| componentType.equals(CreatorEditorSettings.TYPE_ANNIVERSARY)				
+		){
+			return new CalendarDialog(sh, 
+					CalendarVariables.getInstance().getIdByValue(componentType), provider);
+		}
+		else if(
+				componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_SMS)
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_MMS)
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_AMS)
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_EMAIL)
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_SMART)
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_IR)				
+				|| componentType.equals(CreatorEditorSettings.TYPE_MESSAGE_BT)
+		){
+			return new MessageDialog(sh, 
+					MessageVariables.getInstance().getIdByValue(componentType), provider);
+		}		
+		else if(componentType.equals(CreatorEditorSettings.TYPE_MAIL_BOX)){
+			return new MailBoxDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_LANDMARK)){
+			return new LandmarkDialog(sh, provider);
+		}
+		else if(componentType.equals(CreatorEditorSettings.TYPE_FILE)){
+			return new FileTypeDialog(sh, provider);
+		}			
+		else{
+			CreatorEditorConsole.getInstance().println("Unknown dialog type: " + componentType, CreatorEditorConsole.MSG_ERROR);
+			
+			return null;
+		}
+		
+	}
+	/**
+	 * Get dialog by component. Used when Edit dialog is launched.
+	 * @param component
+	 * @param sh
+	 * @return aDialog
+	 */
+	public static AbstractDialog getDialog(final IComponentProvider provider, Shell sh) 
+	{		
+		
+		if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_CONTACT)){
+			return new ContactDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_CONTACT_SET)){
+			return new ContactSetDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_CONTACT_GROUP)){
+			return new ContactGroupDialog(sh, provider);
+		}				
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_NOTE)){
+			return new NoteDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_BOOKMARK)){
+			return new BookmarkDialog(sh, provider);
+		}			
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_BOOKMARK_FOLDER)){
+			return new BookmarkFolderDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_SAVED_PAGE)){
+			return new SavedPageDialog(sh, provider);
+		}			
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_SAVED_PAGE_FOLDER)){
+			return new SavedPageFolderDialog(sh, provider);
+		}			
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_LOG)){
+			return new LogDialog(sh, provider);
+		}			
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_IMPS_SERVER)){
+			return new IMPSServerDialog(sh, provider);
+		}	
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_CONNECTION_METHOD)){
+			return new ConnectionMethodDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_CALENDAR)){
+			return new CalendarDialog(sh, provider); 
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_MESSAGE)){
+			return new MessageDialog(sh, provider); 
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_MAIL_BOX)){
+			return new MailBoxDialog(sh, provider);
+		}	
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_LANDMARK)){
+			return new LandmarkDialog(sh, provider);
+		}
+		else if(provider.getEditable().getType().equals(CreatorEditorSettings.TYPE_FILE)){
+			return new FileTypeDialog(sh, provider);
+		}			
+		else{
+			CreatorEditorConsole.getInstance().println("Unknown dialog type: " + provider.getEditable().getType(), CreatorEditorConsole.MSG_ERROR);
+			return null;
+		}
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/FileTypeDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,197 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.filetype.FileType;
+import com.nokia.s60tools.creator.components.filetype.FileTypeValue;
+import com.nokia.s60tools.creator.components.filetype.FileTypeVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class FileTypeDialog extends AbstractDialog {
+	
+
+	
+	public FileTypeDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new FileType(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected FileType createNewComponent(){
+		return new FileType(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected FileTypeValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new FileTypeValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return FileTypeVariables.getInstance().getItemValuesAsString();
+	}
+	
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		//Create Amount area
+		createAmountArea(composite);
+		//Create table area
+		createTableArea(composite);		
+		
+		if(isAmountFieldsEnabled() ){
+			addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+		}		
+		
+		String possibleValuesInfoText = "If '" +FileTypeVariables.TYPE +"' is left empty, an empty '"+FileTypeVariables.DIR +"' will be created.";
+		addInformation(composite, possibleValuesInfoText);		
+		
+		//Add help text for date-time fields
+		addInformation(composite, AbstractVariables.DATE_TIME_AND_DATE_FORMAT_HELP_TEXT);
+		
+		//Format help text for accumulated and interval, format is: P1Y2M3DT4H5M6S (Iso8601).
+		//@see http://en.wikipedia.org/wiki/ISO_8601#Durations		
+		addInformation(composite, FileTypeVariables.DURATIONS_HELP_TEXT);		
+		
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}		
+		
+		return composite;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#okPressed()
+	 */
+	protected void okPressed() {
+		
+		
+		super.okPressed();
+		
+		//Checking if there are encryption parameters but not type set						
+		Vector<AbstractValue> enc = getComponent().getAttribute(FileTypeVariables.ENCRYPTION_TYPE);
+		
+		//Check If DRM_FL or DRM_CD is selected 
+		boolean isDRMCDorRandom = false;
+		if(enc != null){
+			for (Iterator<AbstractValue> iterator = enc.iterator(); iterator.hasNext();) {
+				AbstractValue val = (AbstractValue) iterator.next();
+				if(FileTypeVariables.DRM_CD.equalsIgnoreCase(val.getValue())){
+					isDRMCDorRandom = true;
+				}else if(CreatorEditorSettings.isRandomText(val.getValue())){
+					isDRMCDorRandom = true;
+				}	
+			}
+		}
+
+		//If encryption type has not been set or its set to DRM_FL, and there is at least one encryption item set, showing warning dialog
+		if(enc == null ||  enc.isEmpty() || !isDRMCDorRandom){
+			if(hasEncryptionItem()){
+				//Showing warning dialog 
+				showWarningDialog("Check " +FileTypeVariables.ENCRYPTION_TYPE, 
+						"There is at least one '" +FileTypeVariables.DRM_CD +"' encryption parameter set, but '" +FileTypeVariables.ENCRYPTION_TYPE
+						+"' is not set to '" +FileTypeVariables.DRM_CD +"'. All encryption parameters will lost on save if '" +FileTypeVariables.ENCRYPTION_TYPE
+						+"' is not set to '" +FileTypeVariables.DRM_CD +"'. You can open dialog with 'Edit' -button and set '" +FileTypeVariables.ENCRYPTION_TYPE
+						+"' to '" +FileTypeVariables.DRM_CD +"'.");			
+			}
+		}
+	}
+	
+	/**
+	 * Check if in this file has on item of encryption
+	 * @return <code>true</code> if has at least one
+	 */
+	private boolean hasEncryptionItem() {
+		return (hasEncryptionItem(FileTypeVariables.PRINT_KEYS)
+		|| hasEncryptionItem(FileTypeVariables.DISPLAY_KEYS)
+		|| hasEncryptionItem(FileTypeVariables.EXECUTE_KEYS)
+		|| hasEncryptionItem(FileTypeVariables.PLAY_KEYS));
+	}
+
+	/**
+	 * Check if one of given encryption items found in this file
+	 * @param keys
+	 * @return <code>true</code> if file has one of keys
+	 */
+	boolean hasEncryptionItem(String [][] keys){
+		for (int i = 0; i < keys[0].length; i++) {
+			String id = keys[0][i];
+			String value = getComponent().getValueById(id);
+			Vector<AbstractValue> enc = getComponent().getAttribute(value);			
+			if(enc != null && !enc.isEmpty()){
+				return true;
+			}				
+		}		
+		return false;
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/IMPSServerDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.impsserver.IMPSServer;
+import com.nokia.s60tools.creator.components.impsserver.IMPSServerValue;
+import com.nokia.s60tools.creator.components.impsserver.IMPSServerVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class IMPSServerDialog extends AbstractDialog {
+	
+
+
+	
+	public IMPSServerDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new IMPSServer(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected IMPSServer createNewComponent(){
+		return new IMPSServer(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected IMPSServerValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new IMPSServerValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return IMPSServerVariables.getInstance().getItemValuesAsString();
+	}
+
+	
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		setAmountFieldsEnabled(false);
+		Composite composite = createDialogAreaComposite(parent);
+		//Create Amount area
+		createAmountArea(composite);
+		//Create table area
+		createTableArea(composite);		
+		
+		addInformation(composite, CONNECTION_METHOD_NAME_HELP_TEXT);
+		
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}
+		return composite;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/LandmarkDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.landmark.Landmark;
+import com.nokia.s60tools.creator.components.landmark.LandmarkValue;
+import com.nokia.s60tools.creator.components.landmark.LandmarkVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class LandmarkDialog extends AbstractDialog {
+	
+
+	
+	public LandmarkDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new Landmark(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected Landmark createNewComponent(){
+		return new Landmark(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected LandmarkValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new LandmarkValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return LandmarkVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		//Create Amount area
+		createAmountArea(composite);
+		//Create table area
+		createTableArea(composite);		
+		
+		if(isAmountFieldsEnabled() ){
+			addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+		}
+		
+		addInformation(composite, AbstractVariables.COORDINATE_FORMAT_HELP_TEXT);
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}
+		return composite;
+	}	
+	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/LogDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.log.Log;
+import com.nokia.s60tools.creator.components.log.LogValue;
+import com.nokia.s60tools.creator.components.log.LogVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class LogDialog extends AbstractDialog {
+	
+
+	
+	public LogDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new Log(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected Log createNewComponent(){
+		return new Log(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected LogValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom && random_ != ModeTypes.ModeTypeIncValueForEachCopy){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new LogValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return LogVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		//Create Amount area
+		createAmountArea(composite);
+		//Create table area
+		createTableArea(composite);		
+		
+		if(isAmountFieldsEnabled() ){
+			addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+		}
+		
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}
+		return composite;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/MailBoxDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.messaging.MailBox;
+import com.nokia.s60tools.creator.components.messaging.MailBoxValue;
+import com.nokia.s60tools.creator.components.messaging.MailBoxVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class MailBoxDialog extends AbstractDialog {
+	
+
+
+
+	
+
+	public MailBoxDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			MailBox newBox = new MailBox(AbstractComponent.NULL_ID);
+			setComponent(newBox);
+		}		
+	}
+  
+    
+	
+	protected MailBox createNewComponent(){
+		return new MailBox(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected MailBoxValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new MailBoxValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return MailBoxVariables.getInstance().getItemValuesAsString();
+	}
+
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite composite = createDialogAreaComposite(parent);
+		
+		String [] typeValues = MailBoxVariables.getTypeVariables();
+		String selection = null;
+		if(isInEditMode()){
+			MailBox box = (MailBox)getComponent();
+			selection = box.getMailBoxType();
+		}else{
+			selection = typeValues[0];
+		}
+		
+		//Create Amount area with type box
+		createAmountAreaAndLinkToOtherComponentCombo(
+				composite, "Mail box type:", typeValues, selection, false, true);
+		//Create table area
+		createTableArea(composite);		
+		
+		if(isAmountFieldsEnabled() ){
+			addInformation(composite, AMOUNT_FIELD_INFO_TEXT);
+		}
+
+		
+		addInformation(composite, CONNECTION_METHOD_NAME_IN_AND_OUT_HELP_TEXT);
+
+
+		String possibleValuesInfoText = 
+			POSSIBLE_VALUES_FOR_TXT_PART_1 
+				+MailBoxVariables.INBOX_SYNC_LIMIT
+				+" and "
+				+MailBoxVariables.MAILBOX_SYNC_LIMIT
+				+POSSIBLE_VALUES_FOR_TXT_PART_2 
+				+"'All' or any integer between 1 and 999" 
+				+POSSIBLE_VALUES_FOR_TXT_PART_3;
+		addInformation(composite, possibleValuesInfoText);
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}	
+		return composite;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/MessageDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.messaging.Message;
+import com.nokia.s60tools.creator.components.messaging.MessageValue;
+import com.nokia.s60tools.creator.components.messaging.MessageVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class MessageDialog extends AbstractDialog {
+	
+
+	private String messagingType = null;
+
+
+	public MessageDialog(Shell parentShell, IComponentProvider provider) {
+
+		super(parentShell, provider);
+		Message msg = (Message)provider.getEditable();
+		init(msg.getMessageType());
+
+	}
+	
+	public MessageDialog(Shell parentShell, String messagingType, IComponentProvider provider) {
+		super(parentShell, provider);
+		this.messagingType = messagingType;
+		init(messagingType);
+	}
+
+	
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(String messagingType){
+		this.messagingType = messagingType.toLowerCase();
+		if(getComponent() == null){
+			AbstractComponent comp = new Message(AbstractComponent.NULL_ID, messagingType);
+			setComponent(comp);
+		}		
+		setAmountFieldsEnabled(false);
+	}
+  
+    
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#createNewComponent()
+	 */
+	protected Message createNewComponent(){
+		return new Message(AbstractComponent.NULL_ID, messagingType);
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#createNewValue(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	protected MessageValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom && random_ != ModeTypes.ModeTypeIncValueForEachCopy){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		MessageValue mes = new MessageValue(value_, random_, amout_);
+		mes.setType(type);
+		return mes;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return MessageVariables.getInstance().getItemValuesAsString(messagingType);
+	}
+	
+	/* Creating all items to dialog area
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite composite = createDialogAreaComposite(parent);		
+		setTableColumnHeaderAmount(MAX_AMOUNT_TEXT);
+
+		//Create also add new contact set button
+		createAmountArea(composite, true);			
+
+		createTableArea(composite);	
+				
+		if(wasErrors()){
+			showErrorDialog("Errors occured when dialog opened", getErrors());
+		}		
+		return composite;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	protected void configureShell(Shell shell) {
+	    super.configureShell(shell);
+	    if(isInEditMode()){
+	    	shell.setText("Edit " + getComponent().getValueById( messagingType )+"(s)");        	
+	    }else{
+	    	shell.setText("Add " + getComponent().getValueById( messagingType ) +"(s)");
+	    }
+	}		
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/NoteDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.note.Note;
+import com.nokia.s60tools.creator.components.note.NoteValue;
+import com.nokia.s60tools.creator.components.note.NoteVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class NoteDialog extends AbstractDialog {
+	
+
+	
+	public NoteDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new Note(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected Note createNewComponent(){
+		return new Note(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected NoteValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new NoteValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return NoteVariables.getInstance().getItemValuesAsString();
+	}
+
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		setAmountFieldsEnabled(false);
+		
+		return super.createDialogArea(parent);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/SavedPageDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.savedpage.SavedPage;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageValue;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class SavedPageDialog extends AbstractDialog {
+	
+
+
+	
+	public SavedPageDialog(Shell sh, IComponentProvider provider) {
+		super(sh, provider);
+		init();
+	}
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new SavedPage(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected SavedPage createNewComponent(){
+		return new SavedPage(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected SavedPageValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new SavedPageValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return SavedPageVariables.getInstance().getItemValuesAsString();
+	}
+	
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		setAmountFieldsEnabled(false);
+		
+		return super.createDialogArea(parent);
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/dialogs/SavedPageFolderDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.dialogs;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageFolder;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageFolderValue;
+import com.nokia.s60tools.creator.components.savedpage.SavedPageFolderVariables;
+import com.nokia.s60tools.creator.editors.IComponentProvider;
+
+
+/**
+ *
+ */
+public class SavedPageFolderDialog extends AbstractDialog {
+	
+
+
+	public SavedPageFolderDialog(Shell parentShell, IComponentProvider provider) {
+		super(parentShell, provider);
+		init();
+	}
+
+
+
+	/**
+	 * Initialize, creates Contact object
+	 */
+	private void init(){
+		if(getComponent() == null){
+			AbstractComponent comp = new SavedPageFolder(AbstractComponent.NULL_ID);
+			setComponent(comp);
+		}		
+	}
+  
+    
+	
+	protected SavedPageFolder createNewComponent(){
+		return new SavedPageFolder(AbstractComponent.NULL_ID);
+	}
+	
+	
+	protected SavedPageFolderValue createNewValue(String type, String value, String random, String amount) {
+
+		int amout_ = 0;
+		ModeTypes random_ = ModeTypes.RandomTypeNotRandom;
+		String value_ = value;
+		
+		//If amount is set
+		if(amount != null && amount.trim().length() > 0){
+			amout_ = Integer.parseInt(amount);
+		}
+		
+		//if random is selected
+		if(random != null && random.trim().length() > 0 && !random.equals(AbstractValue.EMPTY_STRING)){
+			random_ = AbstractValue.getModeTypeByText(random);
+			if(random_ != ModeTypes.RandomTypeNotRandom){
+				value_ = AbstractValue.RANDOM_TEXT;
+			}
+		}
+		return new SavedPageFolderValue(value_, random_, amout_);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.dialogs.AbstractDialog#getItemValueAsString()
+	 */
+	protected String[] getItemTypesAsString() {
+		return SavedPageFolderVariables.getInstance().getItemValuesAsString();
+	}
+	
+	
+	/* 
+	 * (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		setAmountFieldsEnabled(false);
+		
+		return super.createDialogArea(parent);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/CreatorScriptEditor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1160 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.creator.editors;
+
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PushbackInputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.ProgressMonitorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.CreatorHelpContextIDs;
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.Components;
+import com.nokia.s60tools.creator.components.contact.ContactSetVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.dialogs.AbstractDialog;
+import com.nokia.s60tools.creator.dialogs.DialogLauncher;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+import com.nokia.s60tools.creator.xml.CreatorScriptNotValidException;
+import com.nokia.s60tools.creator.xml.CreatorXML;
+import com.nokia.s60tools.creator.xml.CreatorXMLParser;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * Creator script editor - Editor area. Stores all components and handles adding, removing and editing a Script.
+ */
+public class CreatorScriptEditor extends MultiPageEditorPart implements IResourceChangeListener, IComponentProvider{
+
+	private static final String ADD_TXT = " Add ";
+
+	
+	public static final int COMPONENT_LIST_WIDTH = 500;
+
+	public static final int EDITOR_DEFAULT_WIDTH = 600;
+
+	/**
+	 * Fixed Width and height parameters to set UI components 
+	 * precisely 
+	 */
+	private static final int COMPONENT_LIST_ITEMS_HEIGHT_HINT = 8;
+
+	/** The text editor used in page 0. */
+	private TextEditor editor;
+	
+	/**
+	 * All components
+	 */
+	private Components components;
+	
+
+	
+	//Editor window widgets
+
+	private List componentsList;
+	
+	private Combo componentCombo;
+
+	private Button removeBtn;
+
+	private Button editBtn;
+
+	private boolean isDirty;
+
+	private Color white;
+
+	private boolean isEditLaunched = false;
+
+	private Button addComponentButton;
+
+	private Button addContactSetButton;
+	
+	private Button runInDeviceButton = null;	
+	
+	
+	
+	
+	
+	/**
+	 * Creates a multi-page editor example.
+	 */
+	public CreatorScriptEditor() {
+		super();
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+	}
+
+	private void setContextSensitiveHelpIDs(){
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(componentCombo, 
+		    		CreatorHelpContextIDs.CREATOR_HELP_ADD_COMPONENT);
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(addComponentButton, 
+		    		CreatorHelpContextIDs.CREATOR_HELP_ADD_COMPONENT);		
+		 
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(editBtn, 
+		    		CreatorHelpContextIDs.CREATOR_HELP_MODIFY_COMPONENT);		
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(removeBtn, 
+		    		CreatorHelpContextIDs.CREATOR_HELP_MODIFY_COMPONENT);		
+		 PlatformUI.getWorkbench().getHelpSystem().setHelp(componentsList, 
+		    		CreatorHelpContextIDs.CREATOR_HELP_MODIFY_COMPONENT);		
+
+		 if(runInDeviceButton != null){
+			 PlatformUI.getWorkbench().getHelpSystem().setHelp(runInDeviceButton, 
+			    		CreatorHelpContextIDs.RUN_IN_DEVICE_PAGE);					 
+		 }
+		 
+	}
+
+	/**
+	 * Create Creator Editor page.
+	 * 
+	 * Creating all Widgets and setting data from this.xml to them.
+	 * Creating listeners for selected Widgets. 
+	 * 
+	 */
+	private void createCreatorScriptEditorPage() {
+
+
+		final Composite composite = new Composite(getContainer(), SWT.SIMPLE);
+		final Shell shell = composite.getShell();
+
+		GridLayout gridLayout = new GridLayout();//2, false
+		composite.setLayout(gridLayout);
+
+		GridData gridData = new GridData();
+ 		gridData.horizontalAlignment = GridData.FILL;
+ 		gridData.grabExcessHorizontalSpace = true;
+		composite.setLayoutData(gridData);
+		
+		RGB rgbWhite = new RGB(255, 255, 255);
+		white = new Color(null, rgbWhite);
+		composite.setBackground(white);
+
+		//Create part of UI where is components to add, contact set adding button and run in device button
+		createButtonsPart(composite, shell);		
+		
+		
+		//COMPONENTS
+		Group componentsGroup = new Group(composite, SWT.SHADOW_NONE);
+		componentsGroup.setText("Components added:");
+		GridLayout componentsGrid = new GridLayout(2, false);
+		componentsGroup.setBackground(white);
+		GridData componentsGridData = new GridData(EDITOR_DEFAULT_WIDTH, SWT.DEFAULT/*GridData.HORIZONTAL_ALIGN_FILL*/);
+		componentsGridData.horizontalAlignment = GridData.FILL;
+		componentsGridData.grabExcessHorizontalSpace = true;	
+		componentsGridData.verticalAlignment = GridData.FILL;
+		componentsGridData.grabExcessVerticalSpace = true;
+
+		componentsGroup.setLayout(componentsGrid);
+		componentsGroup.setLayoutData(componentsGridData);
+		
+		
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL;
+		componentsList = new List(componentsGroup,listBoxStyleBits);
+		//If font not found or something else unexpected occur, don't fail whole program
+		try {
+			componentsList.setFont(getUnicodeFont());
+		} catch (Exception e) {
+			e.printStackTrace();
+			CreatorEditorConsole.getInstance().println("Could not set list font to Unicode, reason: " +e.getMessage(), CreatorEditorConsole.MSG_ERROR);
+		}
+		GridData listData = new GridData(COMPONENT_LIST_WIDTH, SWT.DEFAULT);
+		listData.horizontalAlignment = GridData.FILL;
+		listData.grabExcessHorizontalSpace = true;
+		listData.verticalAlignment = GridData.FILL;
+		listData.grabExcessVerticalSpace = true;
+
+		int listHeight = componentsList.getItemHeight() * COMPONENT_LIST_ITEMS_HEIGHT_HINT;
+		Rectangle trim = componentsList.computeTrim(0, 0, 0, listHeight);
+		listData.heightHint = trim.height;		
+		componentsList.setLayoutData(listData);
+		
+		componentsList.addSelectionListener(getEnableButtonsListener());	
+		
+		
+		//
+		//Setting components data to selection box
+		//
+		
+		
+		redrawComponentList();
+
+		Composite btnComp = new Composite(componentsGroup, SWT.SIMPLE);
+		btnComp.setLayout(new GridLayout(1, false));
+		GridData btnGrid = new GridData();
+		btnGrid.verticalAlignment = SWT.BEGINNING;
+		btnGrid.horizontalAlignment = SWT.BEGINNING;
+		btnComp.setLayoutData(btnGrid);//GridData.FILL_BOTH	
+		btnComp.setBackground(white);
+		
+		removeBtn = new Button(btnComp,SWT.PUSH);
+		removeBtn.setText("Remove");
+		removeBtn.setEnabled(false);
+		
+		editBtn = new Button(btnComp,SWT.PUSH);
+		editBtn.setText("   Edit   ");
+		editBtn.setEnabled(false);//By Default edit is not available, but when a component is selected, its enabled 
+		
+		//Open Edit Dialog when Edit button has been pushed
+		editBtn.addSelectionListener(getEditButtonListener(this, shell));			
+		
+		//Adding action to remove Button
+		removeBtn.addSelectionListener(getRemoveComponentListener());			
+		
+		
+		
+		int pageIndex = addPage(composite);
+		composite.pack();
+		setPageText(pageIndex, "Creator Script Editor");
+	}
+
+	private void createButtonsPart(final Composite composite, final Shell shell) {
+		//ADD COMPONENT GROUP				
+		Group addComponentGroup = new Group(composite, SWT.SHADOW_NONE);
+		addComponentGroup.setText("Add a component to script:");
+		GridLayout componentGrid = new GridLayout(7, false);
+		addComponentGroup.setBackground(white);
+		GridData componentGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		componentGridData.horizontalAlignment = GridData.FILL;
+		componentGridData.grabExcessHorizontalSpace = true;		
+		addComponentGroup.setLayout(componentGrid);
+		addComponentGroup.setLayoutData(componentGridData);
+
+		//SELECT COMPONENT LABEL
+		Label compoenentLabel = new Label(addComponentGroup, SWT.HORIZONTAL);
+		compoenentLabel.setText("Select component to add:");
+		compoenentLabel.setLayoutData(new GridData());
+		compoenentLabel.setBackground(white);
+
+		//Components to select
+		componentCombo = new Combo(addComponentGroup, SWT.READ_ONLY | SWT.DROP_DOWN);
+		componentCombo.setVisibleItemCount(CreatorEditorSettings.getInstance().getComponents().length);
+		componentCombo.setItems(CreatorEditorSettings.getInstance().getComponents());
+		componentCombo.setLayoutData(new GridData());
+		
+		
+		addComponentButton = new Button(addComponentGroup, SWT.PUSH);
+		addComponentButton.setText(ADD_TXT);		
+
+		//add button listener
+		addComponentButton.addSelectionListener(getAddComponentButtonListener(shell, this));		
+
+		
+		//Create own button for contact-set:s
+		Label nullText = new Label(addComponentGroup, SWT.HORIZONTAL);
+		nullText.setBackground(white);
+		nullText.setText("       ");//Just for making some space between buttons.
+		addContactSetButton = new Button(addComponentGroup, SWT.PUSH);
+		addContactSetButton.setText(ContactSetVariables.ADD_CONTACT_SET_TXT);		
+
+		//add button listener
+		addContactSetButton.addSelectionListener(getAddNewContactSetComponentListener(shell, this));
+
+		
+		//create button for run in device
+		Label nullText2 = new Label(addComponentGroup, SWT.HORIZONTAL);
+		nullText2.setBackground(white);
+		nullText2.setText("       ");//Just for making some space between buttons.
+		//Checking if HTI is supported at all, if not, not creating button at all.
+		if(isHTIAvailable()){
+			runInDeviceButton = new Button(addComponentGroup, SWT.PUSH);
+			runInDeviceButton.setText("Run in device via HTI");
+			runInDeviceButton.addSelectionListener(new RunInDeviceSelectionListener(components.getFileName(), components.getFilePath()));
+		}
+	}
+	
+	
+	/**
+	 * Checking if HTI connection package is available.
+	 * @return <code>true</code> if HTI is available, <code>false</code> otherwise.
+	 */
+	private boolean isHTIAvailable() {
+
+		try {
+			//If HTI is not available, Class HTIServiceFactory does not found and NoClassDefFoundError is thrown.
+			//There are different deliverables available and with all, HTI is not bundled with Carbide. 
+			HTIServiceFactory
+				.createFTPService(CreatorEditorConsole.getInstance());
+		} catch (NoClassDefFoundError e) {
+			CreatorEditorConsole.getInstance().println("HTI Connection is not available, Run in Device via HTI functionality is disabled.");
+			return false;
+		}			
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.editors.IComponentProvider#getAddNewContactSetComponentListener(org.eclipse.swt.widgets.Shell, com.nokia.s60tools.creator.editors.IComponentProvider)
+	 */
+	public SelectionListener getAddNewContactSetComponentListener(final Shell shell,
+			final IComponentProvider provider) {
+		
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				//tell listeners that a component was added to list	
+				IAddComponentListener listener = null;
+				if(event.widget != null){
+					Object o = event.widget.getData();
+					if(o instanceof IAddComponentListener){
+						//if listener was provided, passing it through to compont adding
+						listener = (IAddComponentListener)o;
+					}
+				}
+				
+				isEditLaunched = false;
+
+				// Get a dialog by selection type
+				final AbstractDialog aComponentAddDialog = DialogLauncher
+						.getDialog(CreatorEditorSettings.TYPE_CONTACT_SET, shell, provider);
+				// Open dialog
+				openAddNewComponentDialog(aComponentAddDialog, listener);				
+			}
+		};
+	}
+
+	/**
+	 * Get listener for Add button
+	 * @param shell
+	 * @return Listener
+	 */
+	private SelectionAdapter getAddComponentButtonListener(final Shell shell, final IComponentProvider provider) {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				
+				isEditLaunched = false;
+
+				// Get a dialog by selection type
+				final AbstractDialog aComponentAddDialog = DialogLauncher
+						.getDialog(componentCombo.getText(), shell, provider);
+				openAddNewComponentDialog(aComponentAddDialog, null);
+			}
+
+		};
+	}
+	/**
+	 * Open a dialog
+	 * @param aComponentAddDialog
+	 */
+	private void openAddNewComponentDialog(
+			final AbstractDialog aComponentAddDialog, IAddComponentListener listener) {
+		// Open dialog
+		aComponentAddDialog.open();
+		if (aComponentAddDialog.getReturnCode() == IDialogConstants.OK_ID) {
+			// After dialog closed, get component(s) created
+			AbstractComponent comp = aComponentAddDialog.getComponent();
+			addComponent(comp, listener); 
+
+		}// else, cancel is pushed
+	}
+
+	
+	/**
+	 * Get Listener for enabling buttons or not
+	 * @return Listener
+	 */
+	private SelectionAdapter getEnableButtonsListener() {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+	
+				boolean buttonsEnabled = componentsList.getSelectionIndex() != -1 ? true : false ;
+				removeBtn.setEnabled(buttonsEnabled);
+
+				//Edit only enabled when one row is selected
+				if(buttonsEnabled && componentsList.getSelection().length == 1){
+					editBtn.setEnabled(buttonsEnabled);
+				}else{
+					editBtn.setEnabled(false);
+				}
+
+			}
+		};
+	}
+
+
+	/**
+	 * Get Listener for Edit button
+	 * @param shell
+	 * @return Listener
+	 */
+	private SelectionAdapter getEditButtonListener(final IComponentProvider provider, final Shell shell) {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				
+				isEditLaunched = true;
+
+				//Get a dialog by selection type
+				int compIndex = componentsList.getSelectionIndex();
+				AbstractComponent comp = provider.getEditable();
+
+				final AbstractDialog aComponentEditDialog = DialogLauncher.getDialog(provider, shell) ;//new AddContactDialog(shell);
+				//Open dialog
+				aComponentEditDialog.open();
+				if (aComponentEditDialog.getReturnCode() == IDialogConstants.OK_ID) {
+					//After dialog closed, get component(s) created
+					//AbstractComponent editedComp= aComponentEditDialog.getComponent();
+					AbstractComponent editedComp= aComponentEditDialog.getComponent();
+					
+					//Add component to list and check if its valid
+					if(editedComp.isValid()){
+						getComponents().updateComponent(comp, editedComp);
+						componentsList.setItem(compIndex, editedComp.toString());
+						setDirty(true);
+					}
+					else{
+						//set error message
+						showErrorDialog("Component is not valid", "Component edited is not valid", "Please edit valid values to component.");
+					}
+				}//else, cancel is pushed
+			}
+		};
+	}
+
+
+	/**
+	 * Handle component(s) removal
+	 * 
+	 * @return Listener
+	 */
+	private SelectionAdapter getRemoveComponentListener() {
+		return new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				int[] indexes = componentsList.getSelectionIndices();
+				Vector<AbstractComponent> componentsToBeRemoved = new Vector<AbstractComponent>(indexes.length);
+				
+				//First just collecting components to be removed, because when Contact-set is removed a 
+				//components referenced to that will be changed, and seeking components left requires
+				//component list update to be found after that
+				for (int i = 0; i < indexes.length; i++) {
+					AbstractComponent comp = getComponentBySelection(indexes[i]);
+					componentsToBeRemoved.add(comp);
+				}				
+
+				//actually removing components and references to component to be removed
+				for (Iterator<AbstractComponent> iterator = componentsToBeRemoved.iterator(); iterator.hasNext();) {
+					AbstractComponent comp = (AbstractComponent) iterator.next();
+					//remove references to that component
+					getComponents().removeReferencesToComponent(comp);		
+					//remove component
+					getComponents().remove(comp);					
+				}
+				
+				componentsList.remove(indexes);
+				
+				//Update component list, because many components may changed				
+				redrawComponentList();				
+				setDirty(true);
+			}
+
+		};
+	}
+	
+	private void addComponentToList(AbstractComponent aComponent, List componentsList) {
+		componentsList.add(  aComponent.toString());
+	}
+	
+	private void redrawComponentList() {
+		componentsList.removeAll();
+		//Get all component types (Contacts, Connection methods, messages...)
+		Set<String> allComponentTypes = getComponents().getComponentTypes();
+		//Looping through all component types one by one
+		for (Iterator<String> allCompKeysIt = allComponentTypes.iterator(); allCompKeysIt.hasNext();) {			
+			String compType = (String) allCompKeysIt.next();
+			Vector<AbstractComponent> allComponentsByType = getComponents().getComponents(compType);
+	
+			//Looping through all components in one component type
+			for (Iterator<AbstractComponent> iterator = allComponentsByType.iterator(); iterator.hasNext();) {
+				AbstractComponent aComponent = (AbstractComponent) iterator.next();			
+				addComponentToList(aComponent, componentsList);
+			}			
+		}
+	}
+
+	
+	/**
+	 * Creates the pages of the multi-page editor.
+	 */
+	protected void createPages() {
+		
+		try {
+			createCreatorScriptEditorPage();
+			setContextSensitiveHelpIDs();			
+		} catch (Exception e) {
+			CreatorEditorConsole.getInstance().println("Unexpected error occurs: " + e, CreatorEditorConsole.MSG_ERROR);			
+			e.printStackTrace();			
+		}
+
+	}
+	/**
+	 * The <code>MultiPageEditorPart</code> implementation of this 
+	 * <code>IWorkbenchPart</code> method disposes all nested editors.
+	 * Subclasses may extend.
+	 */
+	public void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+		super.dispose();
+	}
+	/**
+	 * Saves the multi-page editor's document.
+	 */
+	public void doSave(IProgressMonitor monitor) {
+		//getEditor(0).doSave(monitor);
+				
+		InputStream stream = null;
+		try {
+			IEditorInput editorInput = getEditorInput();
+			//Type is IFileEditorInput allways when file is opened from project
+			//If file opened outside project, editor type is IPathEditorInput
+			if (editorInput instanceof IFileEditorInput) {
+				IFile file;
+				//Just making sure that stream is closed before renaming file
+				try {
+					stream = openUTF8ContentStream(getComponents().toXMLString());
+
+					IFileEditorInput iFile = (IFileEditorInput) editorInput;
+					file = iFile.getFile();
+
+					if (file.exists()) {
+						file.setContents(stream, true, true, monitor);
+						file.setCharset(FileUtils.ENCODING_TYPE_UTF_8, monitor);	
+					} else {
+						file.create(stream, true, monitor);
+						file.setCharset(FileUtils.ENCODING_TYPE_UTF_8, monitor);
+					}			
+				} finally {
+					stream.close();
+				}
+			}
+			//Else file is opened outside of Carbide project
+			else if (editorInput instanceof IPathEditorInput) {
+				IPathEditorInput javaInput = (IPathEditorInput) editorInput;
+				IPath path = javaInput.getPath();				
+				String fileLocation = path.toOSString();
+				FileUtils.writeToFile(fileLocation, getComponents().toXMLString(), FileUtils.ENCODING_TYPE_UTF_8);
+			}else{// if (editorInput instanceof FileStoreEditorInput) {
+				FileStoreEditorInput inp = ((FileStoreEditorInput) editorInput);	
+				URI uri = inp.getURI();				
+				java.io.File fi = new java.io.File(uri);
+				String fileLocation = fi.getAbsolutePath();
+				FileUtils.writeToFile(fileLocation, getComponents().toXMLString(), FileUtils.ENCODING_TYPE_UTF_8);				
+			}				
+			
+			setDirty(false);
+			
+		} catch (Exception e) {
+			showErrorDialog("Errors on save", "Save was not compleate.",
+					e.getMessage());
+			e.printStackTrace();
+		}
+		
+	}
+	/**
+	 * Saves the multi-page editor's document as another file.
+	 * Also updates the text for page 0's tab, and updates this multi-page editor's input
+	 * to correspond to the nested editor's.
+	 */
+	public void doSaveAs() {
+
+		
+		try {
+			IEditorInput editorInput = getEditorInput();
+			SaveAsDialog saveas = new SaveAsDialog(getContainer().getShell());
+			//Setting default saveasdialog file name and location
+			//If API name is changed IFileEditorInput is still the same
+			//and if orginal file is not saved yet (xml.isAPINameChanged())
+			//Setting default name to UI as new generated file name instead of old filename and path
+			if (editorInput instanceof IFileEditorInput ) {
+				IFileEditorInput iFile = (IFileEditorInput) editorInput;				
+				saveas.setOriginalFile(iFile.getFile());
+			} 
+			//Else file is opened outside of Carbide project
+			else if (editorInput instanceof IPathEditorInput) {
+				IPathEditorInput javaInput = (IPathEditorInput) editorInput;
+				IPath path = javaInput.getPath();				
+				saveas.setOriginalName(path.lastSegment());				
+			}else{// if (editorInput instanceof FileStoreEditorInput) {
+				FileStoreEditorInput inp = ((FileStoreEditorInput) editorInput);
+				saveas.setOriginalName(inp.getName());				
+			}			
+
+			saveas.open();
+			
+			if (SaveAsDialog.CANCEL == saveas.getReturnCode()) {
+				return;
+			}
+
+			if (saveas.getResult() == null
+					|| !saveas.getResult().toString().endsWith(".creatorxml")
+					|| !saveas.getResult().getFileExtension().equals("creatorxml")) {
+				showErrorDialog("Wrong file type",
+						"Save as was not complete. Please correct file type.",
+						"File type must be .creatorxml");
+				return;
+			}			
+			
+			String containerName = saveas.getResult().removeLastSegments(1)
+			.toOSString();
+			String fileName = saveas.getResult().lastSegment();
+		
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			IResource resource = root.findMember(new Path(containerName));
+		
+			//This is also check by SaveAsDialog, double check
+			if (resource == null || !resource.exists()
+					|| !(resource instanceof IContainer)) {
+				showErrorDialog(
+						"Container must exist",
+						"Save as was not complete, container must exist. Please select existing container.",
+						"Conteiner does not exist");
+				return;
+			}
+			IContainer container = (IContainer) resource;
+			final IFile file = container.getFile(new Path(fileName));
+			//Creating temp file because given API name must be found
+			InputStream stream = openUTF8ContentStream(getComponents().toXMLString());
+			ProgressMonitorPart monitor = new ProgressMonitorPart(
+					getContainer(), new GridLayout());
+			file.create(stream, true, monitor);
+			file.setCharset(FileUtils.ENCODING_TYPE_UTF_8, null);			
+			stream.close();
+
+			
+		} catch (Exception e) {
+			showErrorDialog("Errors on save as", "Save as was not compleate.",
+					e.getMessage());
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Open a stream from components in UTF-8 format
+	 * Client must close the opened stream.
+	 * @return components XML as stream
+	 * @throws UnsupportedEncodingException 
+	 */
+	private InputStream openUTF8ContentStream(String string) throws UnsupportedEncodingException {
+		return openContentStream(string, FileUtils.ENCODING_TYPE_UTF_8);
+	}
+	/**
+	 * Open a stream from components in specified character set format
+	 * Client must close the opened stream.
+	 * @return components XML as stream
+	 * @throws UnsupportedEncodingException 
+	 */
+	private InputStream openContentStream(String string, String charset) throws UnsupportedEncodingException {
+		if(charset == null){
+			charset = FileUtils.ENCODING_TYPE_UTF_8;
+		}
+		InputStream in = new ByteArrayInputStream(string.getBytes(charset));	
+		return in;
+	}		
+	
+	/* (non-Javadoc)
+	 * Method declared on IEditorPart
+	 */
+	public void gotoMarker(IMarker marker) {
+		setActivePage(0);
+		IDE.gotoMarker(getEditor(0), marker);
+	}
+	/**
+	 * Checks that the input is an instance of <code>IFileEditorInput, IPathEditorInput or FileStoreEditorInput</code>.
+	 * And sets Title and content of file.
+	 */
+	public void init(IEditorSite site, IEditorInput editorInput)
+		throws PartInitException {
+		if (!(editorInput instanceof IFileEditorInput)
+				&& !(editorInput instanceof IPathEditorInput)
+				&& !(editorInput instanceof FileStoreEditorInput) ){
+			throw new PartInitException(
+					"Invalid Input: Must be IFileEditorInput or IPathEditorInput, was: "
+							+ editorInput.getClass().getName());
+		}
+		setTitle(editorInput);
+		setTitleImage(CreatorActivator
+				.getImageForKey(CreatorActivator.CREATOR_SCRIPT_EDITOR_ICON));		
+
+		parseXMLAndSetComponents(editorInput);
+		super.init(site, editorInput);
+
+	}
+	
+	/**
+	 * When open a file, setting this.xml from file.
+	 * If file was old existing file, parsing file and set it to this.xml
+	 * if file was new just created file, creating new xml object and setting
+	 * it to this.xml
+	 * @param input
+	 */
+	private void parseXMLAndSetComponents(IEditorInput input) {
+
+		String fileName = "";
+		String filePath = "";
+		try {
+
+			String xmlString;
+			String charSet = null;
+			//Type is IFileEditorInput allways when file is opened from project
+			//If file opened outside project in Carbide 1.2 editor type is IPathEditorInput
+			//and in Carbide 1.3 its FileStoreEditorInput
+			if (input instanceof IFileEditorInput) {
+				IFileEditorInput iFile = (IFileEditorInput) input;
+				IFile file = iFile.getFile();
+				fileName = file.getName();
+				filePath = file.getLocation().toOSString();
+				InputStream in = file.getContents();
+				//Found out file charset, and opening file contents by that. So also non UTF-8 files is working
+				//Note! If e.g. file is edited in Windows, and charset is cp1252, then "official" (windows-1252) charset name must be in XML file
+				//e.g. <?xml version="1.0" encoding="windows-1252"?>, otherwise parsing XML file will fail.
+				charSet = file.getCharset();
+				xmlString = getFileContentsWithCharSet(in, charSet);
+				in.close();
+				in = null;
+
+			} else if(input instanceof IPathEditorInput){
+				IPath path = ((IPathEditorInput) input).getPath();
+				fileName = path.lastSegment();
+				filePath = path.toOSString();
+				java.io.File fi = path.toFile();				
+				FileInputStream in = new FileInputStream(fi);
+				xmlString = getFileContentsAsUTF8(in);
+				in.close();
+				in = null;
+			}else{
+				FileStoreEditorInput inp = ((FileStoreEditorInput) input);	
+				URI uri = inp.getURI();				
+				java.io.File fi = new java.io.File(uri);
+				fileName = fi.getName();
+				filePath = fi.getAbsolutePath();				
+				FileInputStream in = new FileInputStream(fi);
+				xmlString = getFileContentsAsUTF8(in);
+				in.close();
+				in = null;
+
+			}
+			
+			//if file is just created new API metadatafile with wizard
+			//creating new xml object and opening it
+			if (xmlString.startsWith(CreatorXML.NEW_API_CREATOR_FILE_UID)) {
+				components = new Components();
+				setDirty(true);
+			}
+			//Otherwise file is old existing metadata file, parsing it and setting 
+			//xml to this.xml
+			else {
+				components = parseXML(fileName, openContentStream(xmlString, charSet));
+				setDirty(false);
+				CreatorEditorConsole.getInstance().println(
+						"Creator Script XML file: '" + fileName
+								+ "' opened.");
+			}
+
+			components.setFileName(fileName);
+			components.setFilePath(filePath);
+
+		} catch (CreatorScriptNotValidException e) {
+			//If parsing was ok, but xml was not walid setting xml so user can correct errors
+			CreatorEditorConsole.getInstance().println(
+					"CreatorScriptNotValidException on init: " + e.toString());
+			showErrorDialog("Errors on Creator Script XML", "Creator XML file "
+					+ fileName + " could not be parsed.", e.getMessage());
+		} catch (Exception e) {
+			e.printStackTrace();
+			CreatorEditorConsole.getInstance().println(
+					"Exception on init: " + e.toString());
+			showErrorDialog("Error",
+					"Creator editor could not be opened. Errors on "
+							+ fileName, e.getMessage());
+		}
+
+	}
+	
+	/**
+	 * Get xml String from stream
+	 * @param is
+	 * @return
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private String getFileContentsAsUTF8(InputStream is) throws CoreException,
+			IOException {
+
+		int READ_BYTES = 3;
+		
+		StringBuffer buf = new StringBuffer();
+		PushbackInputStream pushIn = new PushbackInputStream(is, READ_BYTES);
+
+		byte[] bomBytes = new byte[READ_BYTES];//for reading 3 first bytes
+		pushIn.read(bomBytes,0, READ_BYTES);//read 3 bytes
+		
+		boolean isBomFile = false;
+
+		//BOM Files starts with 0xEF, 0xBB, 0xBF
+		if(bomBytes[0] == (byte)0xEF && bomBytes[1] == (byte)0xBB && bomBytes[2] == (byte)0xBF){
+			isBomFile = true;
+		}
+		
+		//If file was not started with BOM, must put first characters to buffer 
+		if (!isBomFile) {
+			pushIn.unread(bomBytes, 0, READ_BYTES);
+		}
+	
+		InputStreamReader isr = new InputStreamReader(pushIn, FileUtils.ENCODING_TYPE_UTF_8);
+		BufferedReader br = new BufferedReader(isr);
+		
+		String line;
+		while ((line = br.readLine()) != null) {			
+			buf.append(line);
+		}
+		String xmlString = buf.toString();
+		// Closing streams
+		pushIn.close();
+		br.close();
+		isr.close();
+		return xmlString;
+	}	
+	
+	/**
+	 * Get xml String from stream
+	 * @param is
+	 * @param character set
+	 * @return
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private String getFileContentsWithCharSet(InputStream is, String charset) throws CoreException,
+			IOException {
+		
+		if(charset == null){
+			charset = FileUtils.ENCODING_TYPE_UTF_8;
+		}
+		if(charset.equalsIgnoreCase(FileUtils.ENCODING_TYPE_UTF_8)){
+			return getFileContentsAsUTF8(is);
+		}
+		
+		StringBuffer buf = new StringBuffer();
+		InputStreamReader isr = new InputStreamReader(is, charset);
+		BufferedReader br = new BufferedReader(isr);
+		
+		String line;
+		while ((line = br.readLine()) != null) {			
+			buf.append(line);
+		}
+		String xmlString = buf.toString();
+		// Closing streams
+		is.close();
+		br.close();
+		isr.close();
+		return xmlString;
+
+	}		
+	
+	/**
+	 * Setting editor title as file name
+	 * @param editorInput
+	 */
+	private void setTitle(IEditorInput editorInput) {
+
+		if (editorInput instanceof IFileEditorInput) {
+			IFileEditorInput iFile = (IFileEditorInput) editorInput;
+			IFile file = iFile.getFile();
+			setPartName(file.getName());
+		} else if (editorInput instanceof IPathEditorInput) {
+			IPath path = ((IPathEditorInput) editorInput).getPath();
+			String filename = path.lastSegment();
+			setPartName(filename);
+		}else if (editorInput instanceof FileStoreEditorInput) {
+			FileStoreEditorInput inp = ((FileStoreEditorInput) editorInput);
+			String filename = inp.getName();
+			setPartName(filename);
+		}		
+	}	
+	
+	/* (non-Javadoc)
+	 * Method declared on IEditorPart.
+	 */
+	public boolean isSaveAsAllowed() {
+		return true;
+	}
+	/**
+	 * Calculates the contents of page 2 when the it is activated.
+	 */
+	protected void pageChange(int newPageIndex) {
+		super.pageChange(newPageIndex);
+	}
+	/**
+	 * Closes all project files on project close.
+	 */
+	public void resourceChanged(final IResourceChangeEvent event){
+		if(event.getType() == IResourceChangeEvent.PRE_CLOSE){
+			Display.getDefault().asyncExec(new Runnable(){
+				public void run(){
+					IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
+					for (int i = 0; i<pages.length; i++){
+						if(((FileEditorInput)editor.getEditorInput()).getFile().getProject().equals(event.getResource())){
+							IEditorPart editorPart = pages[i].findEditor(editor.getEditorInput());
+							pages[i].closeEditor(editorPart,true);
+						}
+					}
+				}            
+			});
+		}
+	}
+
+	
+	/**
+	 * Get Arial Unicode MS font
+	 * @return
+	 */
+	private Font getUnicodeFont() {
+		Font defaultFont = componentsList.getFont();
+		FontData defaulFD [] = defaultFont.getFontData();
+		//Font Arial Unicode MS is Supplied with Microsoft Office 2002 (XP) and Microsoft Office 2003.
+		//@see http://www.alanwood.net/unicode/fonts.html
+		FontData fd = new FontData("Arial Unicode MS", defaulFD[0].getHeight(),  defaulFD[0].getStyle());
+		return new Font(Display.getCurrent(), fd);
+	}
+	
+	/**
+	 * Parse xml String to XML object
+	 * @param fileName
+	 * @return
+	 * @throws MetadataNotValidException
+	 */
+	private Components parseXML(String fileName, InputStream inUTF8)
+			throws CreatorScriptNotValidException {
+		CreatorXMLParser parser = new CreatorXMLParser();
+		//This can be optimized by sending Reader as parameter instead of Stream,
+		//That will also require logic update when opening file and checking how file was opened 
+		//(was it a new file, project file or outside of the project file)
+		Components comps = parser.parse(inUTF8);
+		
+		if(parser.wasErrors()){
+			showErrorDialog("Errors on parsing", 
+					"There was some errors when parsing file: " +fileName, 
+					parser.getErrors());
+		}
+		
+		return comps;
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.editors.IComponentProvider#getComponents()
+	 */
+	public Components getComponents() {
+		return components;
+	}
+	
+	/**
+	 * Get selected component
+	 * @param selectionIndex
+	 * @return Component
+	 */
+	private AbstractComponent getComponentBySelection(int selectionIndex) {
+		String componentToString = componentsList.getItem(selectionIndex);
+
+//		AbstractComponent comp = (AbstractComponent)componentsList.getData("" +selectionIndex);
+		AbstractComponent comp = getComponents().getComponentByComponentString(componentToString);
+		return comp;
+	}
+	
+	/**
+	 * Show an error dialog
+	 * @param title
+	 * @param message
+	 * @param errors
+	 */
+	private void showErrorDialog(String title, String message, String errors) {
+		Status status = new Status(IStatus.ERROR,
+				"com.nokia.s60tools.metadataeditor", 0, errors, null);
+		Shell sh;
+		if (getContainer() != null) {
+			try {
+				sh = getContainer().getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		ErrorDialog.openError(sh, title, message, status);
+	}
+
+	/**
+	 * Show an information dialog
+	 * @param title
+	 * @param message
+	 */
+	@SuppressWarnings("unused")
+	private void showInformationDialog(String title, String message) {
+		Shell sh;
+		if (getContainer() != null) {			
+			try {
+				sh = getContainer().getShell();
+			} catch (SWTException e) {
+				sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			}
+			
+		} else {
+			sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		}
+
+		MessageDialog.openInformation(sh, title, message);
+	}	
+	
+	/**
+	 * If data is modified, editor is dirty and can be saved
+	 * NOTE: If editor data is changed and then changed back to original
+	 * data contents, status still remain as dirty
+	 */
+	public boolean isDirty() {
+		return this.isDirty;
+	}	
+	
+	/**
+	 * If editor contents is modified, save is allowed
+	 * @param isDirty
+	 */
+	private void setDirty(boolean isDirty) {
+		this.isDirty = isDirty;
+		if(runInDeviceButton!=null){
+			runInDeviceButton.setEnabled(!isDirty);
+		}
+		if (isDirty) {
+			firePropertyChange(PROP_DIRTY);
+		} else {
+			firePropertyChange(PROP_INPUT);
+		}
+	}
+
+
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.editors.IComponentProvider#getComponents(java.lang.String)
+	 */
+	public Vector<AbstractComponent> getComponents(String type) {		
+		return getComponents().getComponents(type);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.editors.IComponentProvider#getEditable()
+	 */
+	public AbstractComponent getEditable() {
+		//Get a dialog by selection type
+		int compIndex = componentsList.getSelectionIndex();
+		AbstractComponent comp = null;
+		if(compIndex != -1){
+			comp = getComponentBySelection(compIndex);
+		}
+		return comp;
+	}
+
+
+	public boolean isInEditMode() {
+		return isEditLaunched ;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.creator.editors.IComponentProvider#addComponent(com.nokia.s60tools.creator.components.AbstractComponent)
+	 */
+	public void addComponent(AbstractComponent comp, IAddComponentListener listener) {
+
+		//Adding a component to list, currently using outside of editor only when a contact set is created by dialog, not by editor
+
+		if (comp.isValid()) {
+			getComponents().addComponent(comp);
+			addComponentToList(comp, componentsList);
+			setDirty(true);
+			if(listener != null){
+				// tell listeners that a component was added to list
+				listener.componentAdded(comp);
+			}
+		} else {
+			// Error handling
+			showErrorDialog("Component is not valid",
+					"Component added is not valid",
+					"Not valid component");
+		}		
+		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/IAddComponentListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.editors;
+
+import org.eclipse.swt.widgets.Listener;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+
+public interface IAddComponentListener extends Listener{
+	
+	/**
+	 * Tell listeners that a Component was added
+	 * @param a Component, can be <code>null</code>
+	 */
+	public void componentAdded(AbstractComponent comp);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/IComponentProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.editors;
+
+import java.util.Vector;
+
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.IComponentServices;
+import com.nokia.s60tools.creator.components.contact.ContactSet;
+
+/**
+ * Interface to provide component related ({@link AbstractComponent}) services.
+ */
+public interface IComponentProvider {
+	
+	/**
+	 * Gets weather edit or add is launched
+	 * @return true if edit is launched, false otherwise.
+	 */
+	boolean isInEditMode();
+	
+	/**
+	 * Get editable component
+	 * @return a Component
+	 */
+	public AbstractComponent getEditable();
+	
+	/**
+	 * Get components by type
+	 * @param type
+	 * @return components with selected type
+	 */
+	public Vector<AbstractComponent> getComponents(String type);
+	
+	/**
+	 * Get listener which can be used to open dialog for creating {@link ContactSet} components. 
+	 * @param shell
+	 * @param provider
+	 * @return listener
+	 */
+	public SelectionListener getAddNewContactSetComponentListener(final Shell shell,
+			final IComponentProvider provider) ;
+	
+
+	/**
+	 * Get all components
+	 * @return components
+	 */
+	public IComponentServices getComponents();
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/editors/RunInDeviceSelectionListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.creator.editors;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+
+import com.nokia.s60tools.creator.job.CreatorJobManager;
+import com.nokia.s60tools.creator.job.RunInDeviceJob;
+import com.nokia.s60tools.creator.preferences.CreatorPreferences;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+
+public class RunInDeviceSelectionListener implements SelectionListener {
+	
+	private static final String SYMBIAN_FILE_SEPARATOR = "\\";
+	private final String filePath;
+	private final String fileName;
+
+	public RunInDeviceSelectionListener(String fileName, String filePath){
+		this.fileName = fileName;
+		this.filePath = filePath;		
+	}
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		String targetFileNameAndPath = getTargetFilePath();
+
+		String jobName = "Executing script: '" +fileName +"' in device.";
+
+		//Checking if job already running, not start if is
+		boolean jobAllreadyRunning = CreatorJobManager.getInstance().isJobAlreadyRunning(RunInDeviceJob.class.getName());
+		if(!jobAllreadyRunning){
+			RunInDeviceJob job = new RunInDeviceJob(jobName, filePath,  targetFileNameAndPath, fileName);
+			job.schedule();
+		}
+		//else printing message
+		else{
+			CreatorEditorConsole.getInstance().println("Excecution of script: '" +fileName +"' already running, running scripts simultaneously not allowed.", CreatorEditorConsole.MSG_WARNING);
+		}
+	}
+
+	/**
+	 * Get path for target file
+	 * @return path for target file
+	 */
+	private String getTargetFilePath() {
+		//Getting folder from references and check if folder ends with symbian file separator
+		//note File.separatorchar cannot be used!
+		String targetFolder = CreatorPreferences.getDeviceSaveFolded();
+		if(!targetFolder.endsWith(SYMBIAN_FILE_SEPARATOR)){
+			targetFolder = targetFolder + SYMBIAN_FILE_SEPARATOR;
+		}
+		return targetFolder +fileName;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/ConfirmFileReplaceDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,143 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.job;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.preferences.CreatorPreferences;
+import com.nokia.s60tools.creator.resources.Messages;
+
+/**
+ * Dialog for asking confirmation for file replace from user
+ */
+public class ConfirmFileReplaceDialog extends Dialog {
+	
+	
+	// File name
+	private String filePath;
+	// Selected button
+	private int selection = 0;
+	
+	// UI components
+	private Button confirmReplaceRadioCB = null;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 * @param filePath Name of the file to be replaced
+	 */
+	public ConfirmFileReplaceDialog(Shell parentShell, String filePath) {
+		super(parentShell);
+		this.filePath = filePath;
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(Messages.getString("ConfirmFileReplaceDialog.Confirm_Replace_DlgLabel")); //$NON-NLS-1$ 
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
+    	createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, true);
+    	createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, true); 
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		Label label = new Label(dialogAreaComposite,SWT.NONE);
+		label.setText(Messages.getString("ConfirmFileReplaceDialog.Confirm_Replace_DlgMsg_Prefix") //$NON-NLS-1$
+						+ "'" //$NON-NLS-1$
+						+ filePath
+						+ "'" //$NON-NLS-1$
+						+ ". " //$NON-NLS-1$
+						+ Messages.getString("ConfirmFileReplaceDialog.Confirm_Replace_DlgMsg_Postfix")); //$NON-NLS-1$); 
+		 
+		// "Don't ask again" check box
+		confirmReplaceRadioCB  = new Button(dialogAreaComposite, SWT.CHECK);
+		confirmReplaceRadioCB.setText(Messages.getString("ConfirmFileReplaceDialog.DontAskAgainFileReplace_Txt")); //$NON-NLS-1$
+		confirmReplaceRadioCB.setSelection(CreatorPreferences.getDontAskFileReplaceInDevice());
+		// Disable "No" button when check box is selected
+		confirmReplaceRadioCB.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent arg0) {
+				getButton(IDialogConstants.NO_ID).setEnabled(!confirmReplaceRadioCB.getSelection());
+			}
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				// Not implemented
+			}
+		});
+		
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		// Save pressed button id
+		selection = buttonId;
+		
+		if (buttonId != IDialogConstants.CANCEL_ID) {
+			// Save "Don't ask again" state
+				CreatorPreferences.setDontAskFileReplaceInDevice(confirmReplaceRadioCB
+						.getSelection());
+		}
+		
+		super.close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+	
+	/**
+	 * Returns id of selected button
+	 * @return Id of selected button
+	 */
+	public int getSelection() {
+		return selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/CreatorJobManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,143 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+package com.nokia.s60tools.creator.job;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.jobs.Job;
+
+
+/**
+ * Singleton class that is created on plugin
+ * startup, and is kept active as long as plugin is active.
+ * 
+ * The purpose of this class is to enable shutdown of all
+ * ongoing jobs on forced shutdown. All the jobs implementing
+ * <code>IManageableJob</code> should register itself to 
+ * this class and unregister when completed.
+ */
+public class CreatorJobManager {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private CreatorJobManager instance = null;
+
+	/**
+	 * List of registered jobs.
+	 */
+	private ArrayList<IManageableJob> registeredJobs = null;
+
+	/**
+	 * Listeners interested in job completions operations.
+	 */
+	private ListenerList listeners = null;
+	
+	/**
+	 * Public Singleton instance accessor.
+	 * @return Returns instance of this singleton class-
+	 */
+	public static CreatorJobManager getInstance(){
+		if( instance == null ){
+			instance = new CreatorJobManager();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private CreatorJobManager() {
+		registeredJobs = new ArrayList<IManageableJob>();
+		listeners = new ListenerList();
+	}
+	
+	/**
+	 * Register job
+	 * @param job Job
+	 */
+	public void registerJob(IManageableJob job){
+		registeredJobs.add(job);
+	}
+
+	/**
+	 * Unregister job
+	 * @param job Job
+	 */
+	public void unregisterJob(IManageableJob job){
+		registeredJobs.remove(job);
+		Object[] listenerArray = listeners.getListeners();
+		for (int i = 0; i < listenerArray.length; i++) {
+			IJobCompletionListener listenerObj 
+								= (IJobCompletionListener) listenerArray[i];
+			listenerObj.backgroundJobCompleted(job);
+		}
+	}
+	
+	/**
+	 * Shutdown registered jobs
+	 */
+	public void shutdown(){
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = iter.next();
+			job.forcedShutdown();			
+		}
+		registeredJobs.clear();
+		// Giving a moment for processes to really shutdown
+		try {
+			Thread.sleep(500);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Add listener 
+	 * @param obj Listener
+	 */
+	public void addListener(IJobCompletionListener obj){
+		listeners.add(obj);
+	}
+	
+	/**
+	 * Remove listener
+	 * @param obj Listener
+	 */
+	public void removeListener(IJobCompletionListener obj){
+		listeners.remove(obj);
+	}
+
+	/**
+	 * Check if job with given class name is allready running 
+	 * @param jobClassName get by using  {@link Class#getName()} for used {@link Job} -class.
+	 * @return <code>true</code> if job with given {@link Class} name is already running
+	 * <code>false</code> otherwise.
+	 */
+	public boolean isJobAlreadyRunning(String jobClassName) {
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = iter.next();
+			if(job.getClass().getName().equals(jobClassName)){
+				return true;
+			}
+		}		
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/IJobCompletionListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+package com.nokia.s60tools.creator.job;
+
+
+
+/**
+ * Listener interface for object requiring information
+ * about successful cache creation.
+ */
+public interface IJobCompletionListener {
+	
+	/**
+	 * Informs the listener about successful cache index creation.
+	 * @param cacheIndexObj Cache index that was just created.
+	 */
+	public void backgroundJobCompleted(IManageableJob jobObject);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/IManageableJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+package com.nokia.s60tools.creator.job;
+
+/**
+ * Jobs that implement this interface can be asked to 
+ * shutdown themselves during their execution. For example,
+ * when a plugin is disposed it is a good idea to request
+ * for all the managed jobs to also interrupt their
+ * execution.
+ */
+public interface IManageableJob {
+	public void forcedShutdown();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/RunInDeviceJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,382 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.creator.job;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+import com.nokia.s60tools.creator.preferences.CreatorPreferences;
+import com.nokia.s60tools.creator.resources.Messages;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+import com.nokia.s60tools.hticonnection.services.AppStatus;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IApplicationControlService;
+import com.nokia.s60tools.hticonnection.services.IConnectionTestService;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+import com.nokia.s60tools.hticonnection.services.IFTPRequestManager;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * Job for uploading files
+ */
+public class RunInDeviceJob extends Job implements IManageableJob, IFTPListener {
+	
+	private static final String CREATOR_EXE_NAME = ProductInfoRegistry.getCreatorSymbianExcecutableName();
+	private String srcFilePath;
+	private String destFilePath;
+	private static int timeout = 30*1000; // Default timeout 30 s.
+	private IProgressMonitor monitor;
+	private String destFileName;
+	private int confirmDialogSelection = -1;
+	private IFTPRequestManager FTPReguestManager;
+	
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param srcFilePath Source file path
+	 * @param destFilePath Destination file path
+	 */
+	public RunInDeviceJob(String name, String srcFilePath, String destFilePath, String destFileName ) {
+		super(name);
+		this.srcFilePath = srcFilePath;
+		this.destFilePath = destFilePath;
+		this.destFileName = destFileName;
+		setUser(true);
+		setTimeOut();
+	}
+	
+	/**
+	 * Setting the timeout for operation.
+	 */
+	private void setTimeOut() {
+		File srcFile = new File(srcFilePath);
+		Long bytes = new Long( srcFile.length());
+		//Setting time out to be 10 ms for byte, e.g script with few element is 300 bytes long, then timeout will be 30s
+		int countTimeOut = bytes.intValue() * 10;
+		//
+		int maxTimeOut = 2*60*1000;
+		//If we count longer than default time out, and it does not reach maximum time out, we set new timeout
+		if(countTimeOut > timeout && countTimeOut < maxTimeOut ){
+			timeout = countTimeOut;
+		}
+		//if we count longer than max timeout, using max timeout
+		else if(countTimeOut > maxTimeOut){
+			timeout = maxTimeOut;
+		}
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		
+		this.monitor = monitor;
+		try{
+		
+			CreatorJobManager.getInstance().registerJob(this);			
+			
+			//First check if HTI is running
+			IFTPService service = HTIServiceFactory
+					.createFTPService(CreatorEditorConsole.getInstance());			
+			IConnectionTestService connService = HTIServiceFactory
+				.createConnectionTestService(CreatorEditorConsole.getInstance());
+			checkCancel();			
+			//If HTI is not running, returning error
+			if(!connService.isReady()){
+				String msg = Messages.getString("RunInDeviceJob.HTINotRunning_ErrMsg");
+				CreatorEditorConsole.getInstance().println(
+						msg, CreatorEditorConsole.MSG_ERROR); //$NON-NLS-1$
+				
+				return new Status(
+						Status.ERROR,
+						CreatorActivator.PLUGIN_ID,
+						msg); //$NON-NLS-1$				
+			}
+			
+			checkCancel();
+			
+			//Then upload file
+			try {
+				monitor.beginTask(getName(), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+				
+				boolean replace = CreatorPreferences.getDontAskFileReplaceInDevice();
+				if(!replace){
+					monitor.subTask(Messages.getString("RunInDeviceJob.CheckFileExistence_TaskName")); //$NON-NLS-1$
+					replace = true;
+					//Before load, check if there is file allready
+					checkCancel();					
+					String deviceSaveFolded = CreatorPreferences.getDeviceSaveFolded();
+					String[] files = service.listFiles(deviceSaveFolded, 0);
+					if(files != null && files.length > 0){
+						for (int i = 0; i < files.length; i++) {
+							if(destFileName.equalsIgnoreCase(files[i])){
+								//File allready exist
+								replace = showReplaceFileDialog();
+								break;
+							}
+						}
+					}
+				}
+				
+				
+				//If replacing (or file does not exist) uploading file to device, 
+				//if user does not upload file, existing file will be executed in device.
+				if(replace){
+										
+					checkCancel();
+					monitor.subTask(Messages.getString("RunInDeviceJob.Upload_File_SubTaskName")); //$NON-NLS-1$
+					
+					StringBuffer buf = FileUtils.loadDataFromFile(srcFilePath);
+					if (buf != null) {
+						String fileString = buf.toString();
+		
+						checkCancel();	
+						service.uploadFile(fileString.getBytes(), destFilePath, this, timeout);
+						
+		
+					}					
+				}
+				
+			}
+			catch(JobCancelledByUserException e){
+				return Status.CANCEL_STATUS;
+			}			
+			catch (Exception e) {			
+				String msg = Messages.getString("RunInDeviceJob.Upload_Failed_ConsoleErrorMsg");
+				return returnErrorStatus(e, msg);
+			} 
+			
+			checkCancel();
+			
+			try {
+				
+				IApplicationControlService appService = HTIServiceFactory.createApplicationControlService(CreatorEditorConsole.getInstance());
+				String programName = CREATOR_EXE_NAME;
+				String parameters = destFilePath;							
+				
+				//Checking Creator application status in device
+				checkCancel();
+				monitor.subTask(Messages.getString("RunInDeviceJob.CheckIfRunning_SubTaskName")); //$NON-NLS-1$							
+				AppStatus status = appService.getApplicationStatusByName(programName, timeout);
+				
+				//If creator is running, stopping it
+				checkCancel();				
+				if(status.getStatus() == AppStatus.RUNNING){
+					
+					//Showing dialog to as if user wants to shutdown creator
+					//If user selects Cancel, JobCancelledByUserException is thrown
+					showShutdownDialog();
+					monitor.subTask(Messages.getString("RunInDeviceJob.StopCreator_SubTaskName")); //$NON-NLS-1$					
+					appService.stopApplicationByName(programName, timeout);
+				}
+				
+				//Showing user that he/she should follow progress in device/emulator
+				showInformation();																													
+				
+				//Start to run script
+				checkCancel();				
+				monitor.subTask(Messages.getString("RunInDeviceJob.Run_File_SubTaskName")); //$NON-NLS-1$							
+				appService.startProcess(programName, parameters, timeout);
+			}
+			catch(JobCancelledByUserException e){
+				return Status.CANCEL_STATUS;
+			}
+			catch (Exception e){
+				String msg = Messages.getString("RunInDeviceJob.Run_Failed_ConsoleErrorMsg");
+				return returnErrorStatus(e, msg);
+				
+			}		
+		
+		}
+		catch(JobCancelledByUserException e){
+			return Status.CANCEL_STATUS;
+		}
+		finally {
+			finished();
+		}
+		
+		return Status.OK_STATUS;
+	}
+
+	/**
+	 * Showing user a dialog to shutdown Creator in device or not,
+	 * @throws JobCancelledByUserException if user selects Cancel
+	 */
+	private void showShutdownDialog() throws JobCancelledByUserException {		
+		
+		if(!CreatorPreferences.getDontAskShutdownCreator()){
+		
+			Runnable runDlg = new Runnable(){
+	
+				public void run() {
+					//
+					ShutdownCreatorInDeviceDialog dlg = new ShutdownCreatorInDeviceDialog(CreatorActivator.getCurrentlyActiveWbWindowShell());
+		
+					dlg.open();
+					confirmDialogSelection = dlg.getSelection();
+				}
+			};
+			
+			Display.getDefault().syncExec(runDlg);
+			
+			if(confirmDialogSelection == IDialogConstants.CANCEL_ID){
+				throwJobCancelledException();
+			}
+		}
+	}
+
+	/**
+	 * Shows user an information dialog to follow execution in device.
+	 */
+	private void showInformation() {
+		
+		if(!CreatorPreferences.getDontAskShowInformation()){
+		Runnable showInfo = new Runnable(){
+					
+			public void run() {
+				WatchDeviceInformationDialog dlg = new WatchDeviceInformationDialog(
+						CreatorActivator.getCurrentlyActiveWbWindowShell(),
+						destFileName);
+				dlg.open();
+				
+			}
+		};
+		
+		Display.getDefault().asyncExec(showInfo);
+		}
+	}
+
+	/**
+	 * Check if job is canceled, and throws an exception if it's.
+	 * @throws JobCancelledByUserException
+	 */
+	private void checkCancel() throws JobCancelledByUserException {
+
+		if(monitor.isCanceled()){
+			if(FTPReguestManager != null){
+				FTPReguestManager.cancel();
+			}
+			throwJobCancelledException();
+		}
+		
+	}
+
+	/**
+	 * Throw cancel exception
+	 * @throws JobCancelledByUserException
+	 */
+	private void throwJobCancelledException() throws JobCancelledByUserException {
+		throw new JobCancelledByUserException(Messages.getString("RunInDeviceJob.JobCanceledByUser_Msg"));
+	}
+
+	/**
+	 * Check if user wants to replace existing file
+	 * @return <code>true</code> if replace, <code>false</code> otherwise.
+	 * @throws JobCancelledByUserException 
+	 */
+	private boolean showReplaceFileDialog() throws JobCancelledByUserException {
+
+		Runnable runDlg = new Runnable(){
+
+			public void run() {
+				//
+				Shell shell = CreatorActivator.getCurrentlyActiveWbWindowShell();
+				ConfirmFileReplaceDialog dlg = new ConfirmFileReplaceDialog(
+						shell, destFilePath);
+	
+				dlg.open();
+				confirmDialogSelection = dlg.getSelection();
+			}
+		};
+		
+		Display.getDefault().syncExec(runDlg);
+		
+		if(confirmDialogSelection == IDialogConstants.CANCEL_ID){
+			throwJobCancelledException();
+		}
+		boolean replace = confirmDialogSelection == IDialogConstants.YES_ID ? true : false;		
+		
+		return replace;
+	}
+
+	/**
+	 * Returns Error status
+	 * @param e
+	 * @param msg
+	 * @return {@link Status} with {@link Status#ERROR}
+	 */
+	private IStatus returnErrorStatus(Exception e, String msg) {
+		CreatorEditorConsole.getInstance().println(
+				msg, CreatorEditorConsole.MSG_ERROR); //$NON-NLS-1$
+		e.printStackTrace();			
+		return new Status(
+				Status.ERROR,
+				CreatorActivator.PLUGIN_ID,
+				msg, e); //$NON-NLS-1$
+	}
+
+	/**
+	 * Done and unregister job
+	 */
+	private void finished() {
+		monitor.done();
+		CreatorJobManager.getInstance().unregisterJob(this);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestEnded(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestEnded(IFTPRequestManager manager) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestInQueue(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestInQueue(IFTPRequestManager manager) {
+		// not needed
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestStarted(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestStarted(IFTPRequestManager manager) {
+		FTPReguestManager = manager;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/ShutdownCreatorInDeviceDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.job;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+import com.nokia.s60tools.creator.preferences.CreatorPreferences;
+import com.nokia.s60tools.creator.resources.Messages;
+
+/**
+ * Dialog for asking confirmation for file replace from user
+ */
+public class ShutdownCreatorInDeviceDialog extends Dialog {
+	
+	
+	// Selected button
+	private int selection = 0;
+	
+	// UI components
+	private Button dontShowAgainBtn = null;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 * @param destFileName Name of the script file
+	 */
+	public ShutdownCreatorInDeviceDialog(Shell parentShell) {
+		super(parentShell);
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(ProductInfoRegistry.getProductName());
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
+    	createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, true);    	
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		Label label = new Label(dialogAreaComposite,SWT.NONE);
+		String txt = Messages.getString("ShutdownCreatorInDeviceDialog.Msg");//$NON-NLS-1$
+
+		label.setText(txt); 
+		 
+		// "Don't ask again" check box
+		dontShowAgainBtn  = new Button(dialogAreaComposite, SWT.CHECK);
+		dontShowAgainBtn.setText(Messages.getString("ShutdownCreatorInDeviceDialog.DontAskAgain_Txt")); //$NON-NLS-1$
+		dontShowAgainBtn.setSelection(CreatorPreferences.getDontAskShutdownCreator());
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		// Save pressed button id
+		selection = buttonId;
+		
+		if (buttonId != IDialogConstants.CANCEL_ID) {
+			// Save "Don't ask again" state
+			CreatorPreferences.setDontAskShutdownCreator(dontShowAgainBtn
+							.getSelection());
+		}
+		super.close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+	
+	/**
+	 * Returns id of selected button
+	 * @return Id of selected button
+	 */
+	public int getSelection() {
+		return selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/job/WatchDeviceInformationDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.job;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+import com.nokia.s60tools.creator.preferences.CreatorPreferences;
+import com.nokia.s60tools.creator.resources.Messages;
+
+/**
+ * Dialog for asking confirmation for file replace from user
+ */
+public class WatchDeviceInformationDialog extends Dialog {
+	
+	
+	// File name
+	private String destFileName;
+	// Selected button
+	private int selection = 0;
+	
+	// UI components
+	private Button dontShowAgainBtn = null;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 * @param destFileName Name of the script file
+	 */
+	public WatchDeviceInformationDialog(Shell parentShell, String destFileName) {
+		super(parentShell);
+		this.destFileName = destFileName;
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(ProductInfoRegistry.getProductName());
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		Label label = new Label(dialogAreaComposite,SWT.NONE);
+		String txt = Messages.getString("WatchDeviceInformationDialog.Msg_Part1")//$NON-NLS-1$
+			+destFileName +Messages.getString("WatchDeviceInformationDialog.Msg_Part2") //$NON-NLS-1$
+			+"\n"+ Messages.getString("WatchDeviceInformationDialog.Msg_Part3") //$NON-NLS-1$ //$NON-NLS-2$
+			+" " +ProductInfoRegistry.getProductName() +"."; //$NON-NLS-1$ //$NON-NLS-2$
+
+		label.setText(txt); 
+		 
+		// "Don't ask again" check box
+		dontShowAgainBtn  = new Button(dialogAreaComposite, SWT.CHECK);
+		dontShowAgainBtn.setText(Messages.getString("WatchDeviceInformationDialog.DontAskAgain_Txt")); //$NON-NLS-1$
+		dontShowAgainBtn.setSelection(CreatorPreferences.getDontAskShowInformation());
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		// Save pressed button id
+		selection = buttonId;
+		
+		// Save "Don't ask again" state
+		CreatorPreferences.setDontAskShowInformation(dontShowAgainBtn
+						.getSelection());
+		super.close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+	
+	/**
+	 * Returns id of selected button
+	 * @return Id of selected button
+	 */
+	public int getSelection() {
+		return selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferenceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.preferences;
+
+/**
+ * Class for storing keys to preferences.
+ */
+public class CreatorPreferenceConstants {
+	
+	
+	/**
+	 * Default value for script save folder in device/emulator.
+	 */
+	public static final String DEFAULT_SAVE_FOLDER_IN_DEVICE = "c:\\data\\";//$NON-NLS-1$
+	
+	/**
+	 * <code>true</code> value
+	 */
+	public static final String TRUE = "true"; //$NON-NLS-1$
+	
+	/**
+	 * <code>false</code> value
+	 */
+	public static final String FALSE = "false"; //$NON-NLS-1$
+	
+	/**
+	 * preference DB key for prefix search order.
+	 */
+	public final static String DEFAULT_DEVICE_SAVE_FOLDER = "creatorDefaultDeviceSaveFolder"; //$NON-NLS-1$
+	
+	/**
+	 * preference DB key for "don't ask again" for replace file in device. 
+	 */
+	public final static String CREATOR_DONT_ASK_REPLACE = "creatorDontAskReplace";//$NON-NLS-1$
+
+	
+	/**
+	 * preference DB key for "don't ask again" for show information to follow execution in device. 
+	 */
+	public final static String DONT_ASK_SHOW_INFORMATION = "creatorDontAskShowInformation";//$NON-NLS-1$
+
+	/**
+	 * preference DB key for "don't ask again" for shutdown Creator in device. 
+	 */
+	public static final String CREATOR_DONT_ASK_SHUTDOWN = "creatorDontAskShutdown";
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferenceInitializer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+/**
+ * Class used to initialize default preference values.
+ */
+public class CreatorPreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		//Implement default values if needed.
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferencePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.creator.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.CreatorHelpContextIDs;
+import com.nokia.s60tools.creator.resources.Messages;
+
+
+/**
+ * Preference page for DE plugin preferences
+ *
+ */
+public class CreatorPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage{
+
+
+	
+
+
+	public static final int TEXT_WIDTH = 150;
+	
+	/**
+	 * Create the preference page
+	 */
+	public CreatorPreferencePage() {
+		super();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench arg0) {
+	}
+
+
+	private Text saveFolder;
+
+
+	/**
+	 * Button for dont ask again file replace in device
+	 */
+	private Button dontAskAgainFileReplaceBtn;
+
+
+	/**
+	 * Button for dont ask again show information 
+	 */
+	private Button dontAskAgainShowInformationBtn;
+	
+	/**
+	 * Button for dont ask again shutdown Creator in device/emulator
+	 */
+	private Button dontAskAgainShutdownBtn;	
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		Composite container = new Composite(parent, SWT.SIMPLE);
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		container.setLayout(gdl);
+		container.setLayoutData(gd);		
+		
+		
+		//Group for all components
+		Group group = new Group (container, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 1;
+		group.setLayout(gridLayout);
+		gridLayout.makeColumnsEqualWidth = false;
+		
+		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+		group.setText(Messages.getString("CreatorPreferencePage.PreferencesGroup_Txt"));//$NON-NLS-1$
+		group.setLayout (gridLayout);
+		
+		
+		//Create preference composite for Prefix search order
+		createPrefixSeachOrderComposite(group);			
+		
+		//Create group where is Dont Ask for file replace
+		createDontAskAgainFileReplaceComposite(group);
+		//Create group where is Dont ask for showing information dialog
+		createDontAskAgainShowInformationComposite(group);
+		
+		createDontAskAgainShutdownComposite(group);
+		
+		getPrefsStoreValues();
+
+		setHelps(parent);
+		
+		return container;
+	}
+
+	/**
+	 * Creates Don't ask for Search dialogs set as new root component questionary.
+	 * @param container
+	 */
+	private void createDontAskAgainFileReplaceComposite(
+			Composite container) {
+
+
+		//Group for all components
+		Composite askGroup = new Composite (container, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		askGroup.setLayout(gridLayout);
+//		gridLayout.makeColumnsEqualWidth = false;		
+//		askGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+//		askGroup.setText(Messages.getString("CreatorPreferencePage.DontAskAgainFileReplace_Group_Txt"));  //$NON-NLS-1$
+//		askGroup.setLayout (gridLayout);		
+//		
+		dontAskAgainFileReplaceBtn = new Button(askGroup, SWT.CHECK);
+		dontAskAgainFileReplaceBtn.setToolTipText(Messages.getString("CreatorPreferencePage.DontAskAgainFileReplace_ToolTip_Txt"));//$NON-NLS-1$
+		dontAskAgainFileReplaceBtn.setSelection(CreatorPreferences.getDontAskFileReplaceInDevice());
+
+		Label label = new Label(askGroup, SWT.HORIZONTAL);
+		label.setText(Messages.getString("CreatorPreferencePage.DontAskAgainFileReplace_Txt"));//$NON-NLS-1$ 
+			
+	}
+	
+	/**
+	 * Creates Don't ask for Search dialogs set as new root component questionary.
+	 * @param container
+	 */
+	private void createDontAskAgainShowInformationComposite(
+			Composite container) {
+
+
+		//Group for all components
+		Composite askGroup = new Composite (container, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		askGroup.setLayout(gridLayout);
+//		gridLayout.makeColumnsEqualWidth = false;		
+//		askGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+//		askGroup.setText(Messages.getString("CreatorPreferencePage.DontAskAgainShowInformation_Group_Txt"));  //$NON-NLS-1$
+//		askGroup.setLayout (gridLayout);		
+//		
+		dontAskAgainShowInformationBtn = new Button(askGroup, SWT.CHECK);
+		dontAskAgainShowInformationBtn.setToolTipText(Messages.getString("CreatorPreferencePage.DontAskAgainShowInformation_ToolTip_Txt"));//$NON-NLS-1$
+		dontAskAgainShowInformationBtn.setSelection(CreatorPreferences.getDontAskShowInformation());
+	
+		Label label = new Label(askGroup, SWT.HORIZONTAL);
+		label.setText(Messages.getString("CreatorPreferencePage.DontAskAgainShowInformation_Txt"));//$NON-NLS-1$ 
+			
+	}	
+
+	
+	/**
+	 * Creates Don't ask for Search dialogs set as new root component questionary.
+	 * @param container
+	 */
+	private void createDontAskAgainShutdownComposite(
+			Composite container) {
+
+
+		//Group for all components
+		Composite askGroup = new Composite (container, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		askGroup.setLayout(gridLayout);
+//		gridLayout.makeColumnsEqualWidth = false;		
+//		askGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+//		askGroup.setText(Messages.getString("CreatorPreferencePage.DontAskAgainShutdown_Group_Txt"));  //$NON-NLS-1$
+//		askGroup.setLayout (gridLayout);		
+		
+		dontAskAgainShutdownBtn = new Button(askGroup, SWT.CHECK);
+		dontAskAgainShutdownBtn.setToolTipText(Messages.getString("CreatorPreferencePage.DontAskAgainShutdown_ToolTip_Txt"));//$NON-NLS-1$
+		dontAskAgainShutdownBtn.setSelection(CreatorPreferences.getDontAskShutdownCreator());
+	
+		Label label = new Label(askGroup, SWT.HORIZONTAL);
+		label.setText(Messages.getString("CreatorPreferencePage.DontAskAgainShutdown_Txt"));//$NON-NLS-1$ 
+			
+	}		
+	
+	
+	/**
+	 * Create composite for prefix search order
+	 * @param parent
+	 * @param container
+	 */
+	private void createPrefixSeachOrderComposite(
+			Composite container) {
+				
+		
+		//Group for all components
+//		Group prefixGroup = new Group (container, SWT.NONE);
+//		GridLayout gridLayout = new GridLayout();
+//		gridLayout.numColumns = 2;
+//		prefixGroup.setLayout(gridLayout);
+//		gridLayout.makeColumnsEqualWidth = false;
+//		
+//		prefixGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+//		prefixGroup.setText(Messages.getString("CreatorPreferencePage.Upload_Group_Txt"));  //$NON-NLS-1$
+//		prefixGroup.setLayout (gridLayout);
+		
+		//composite for component list
+		Composite listComp = new Composite(container,SWT.SIMPLE);
+		GridLayout listCompLayout = new GridLayout();
+		listCompLayout.numColumns = 2;
+		listComp.setLayout(listCompLayout);
+
+		Label label = new Label(listComp,  SWT.HORIZONTAL);
+		label.setText(Messages.getString("CreatorPreferencePage.Upload_Group_Txt"));  //$NON-NLS-1$		
+		
+		saveFolder = new Text(listComp,SWT.LEFT | SWT.BORDER);
+		GridData listData = new GridData(TEXT_WIDTH, SWT.DEFAULT);	
+		saveFolder.setLayoutData(listData);		
+		
+		
+//		Composite btnComp = new Composite(container,SWT.SIMPLE);
+//		GridLayout btnCompLayout = new GridLayout();
+//		btnCompLayout.numColumns = 1;
+//		btnCompLayout.makeColumnsEqualWidth = true;
+//		btnComp.setLayout(btnCompLayout);	
+//		
+//
+//		GridData btnData = new GridData();
+//		btnData.horizontalAlignment = SWT.FILL;
+//		btnData.grabExcessVerticalSpace = true;
+		
+
+	}
+
+	/**
+	 * Set old values to components
+	 */
+	private void getPrefsStoreValues(){
+		//Set Prefix search order values
+		String value = CreatorPreferences.getDeviceSaveFolded();
+		saveFolder.setText(value);		
+		dontAskAgainFileReplaceBtn.setSelection(CreatorPreferences.getDontAskFileReplaceInDevice());
+		dontAskAgainShowInformationBtn.setSelection(CreatorPreferences.getDontAskShowInformation());
+		dontAskAgainShutdownBtn.setSelection(CreatorPreferences.getDontAskShutdownCreator());
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		// Resetting prefixes values.
+		saveFolder.setText(CreatorPreferenceConstants.DEFAULT_SAVE_FOLDER_IN_DEVICE);
+		// Resetting dontAskAgain value.
+		dontAskAgainFileReplaceBtn.setSelection(false);
+		dontAskAgainShowInformationBtn.setSelection(false);
+		dontAskAgainShutdownBtn.setSelection(false);
+		// Applies values to screen. Values are saved when Ok button is pressed.
+		super.performDefaults();
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		IPreferenceStore store = CreatorActivator.getPrefsStore();
+	
+		saveDefaultFolderPreferences(store);
+		saveDontAskAgainSearchConfirmation(store);
+		
+		return super.performOk();
+	}
+
+	/**
+	 * Save prefix seach order preferences
+	 * @param store
+	 */
+	private void saveDefaultFolderPreferences(IPreferenceStore store) {
+		String value = saveFolder.getText();
+		store.setValue(CreatorPreferenceConstants.DEFAULT_DEVICE_SAVE_FOLDER, value);
+	}
+	
+	/**
+	 * Save prefix seach order preferences
+	 * @param store
+	 */
+	private void saveDontAskAgainSearchConfirmation(IPreferenceStore store) {
+		
+		CreatorPreferences.setDontAskFileReplaceInDevice(dontAskAgainFileReplaceBtn.getSelection());
+		CreatorPreferences.setDontAskShowInformation(dontAskAgainShowInformationBtn.getSelection());
+		CreatorPreferences.setDontAskShutdownCreator(dontAskAgainShutdownBtn.getSelection());
+		
+	}
+	
+	/**
+	 * Sets this page's context sensitive helps
+	 *
+	 */
+	private void setHelps(Composite helpContainer) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(helpContainer,
+															CreatorHelpContextIDs.PREF_PAGE);
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/preferences/CreatorPreferences.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.creator.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+
+/**
+ * Helper class to use Dependency Explorer preferences. Use this class for accessing DE preferences 
+ * instead of accessing directly through  {@link org.eclipse.jface.util.IPropertyChangeListener.IPreferenceStore}.
+ */
+public class CreatorPreferences {
+	
+	/**
+	 * Get folder where to save files in target device
+	 * @return save folder 
+	 */
+	public static String getDeviceSaveFolded(){
+		String value = CreatorActivator.getPrefsStore().getString(CreatorPreferenceConstants.DEFAULT_DEVICE_SAVE_FOLDER);
+		if(value == null || value.trim().length()==0){
+			return CreatorPreferenceConstants.DEFAULT_SAVE_FOLDER_IN_DEVICE;
+		}
+		return value;
+	}
+	
+
+	/**
+	 * Get "Don't ask again" value for replace files in device
+	 * @return <code>true</code> if preference "don't ask again" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getDontAskFileReplaceInDevice(){
+		
+		String value = CreatorActivator.getPrefsStore().getString(CreatorPreferenceConstants.CREATOR_DONT_ASK_REPLACE);
+		if(value != null && value.equalsIgnoreCase(CreatorPreferenceConstants.TRUE)){
+			return true;
+		}else{
+			return false;
+		}
+		
+	}
+	
+	/**
+	 * Set "Don't ask again" value for replace files in device
+	 * @param isDontAskAgainChecked <code>true</code> if don't ask again is selected, <code>false</code> otherwise.
+	 */
+	public static void setDontAskFileReplaceInDevice(boolean isDontAskAgainChecked){
+		
+		IPreferenceStore store = CreatorActivator.getPrefsStore();
+
+		if(isDontAskAgainChecked){
+			store.setValue(CreatorPreferenceConstants.CREATOR_DONT_ASK_REPLACE, CreatorPreferenceConstants.TRUE);
+		}else{
+			store.setValue(CreatorPreferenceConstants.CREATOR_DONT_ASK_REPLACE, CreatorPreferenceConstants.FALSE);
+		}
+	}
+	
+	/**
+	 * Get "Don't ask again" value for show information to follow execution in device
+	 * @return <code>true</code> if preference "don't ask again" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getDontAskShowInformation(){
+		
+		String value = CreatorActivator.getPrefsStore().getString(CreatorPreferenceConstants.DONT_ASK_SHOW_INFORMATION);
+		if(value != null && value.equalsIgnoreCase(CreatorPreferenceConstants.TRUE)){
+			return true;
+		}else{
+			return false;
+		}
+		
+	}
+	
+	/**
+	 * Set "Don't ask again" value for show information to follow execution in device
+	 * @param isDontAskAgainChecked <code>true</code> if don't ask again is selected, <code>false</code> otherwise.
+	 */
+	public static void setDontAskShowInformation(boolean isDontAskAgainChecked){
+		
+		IPreferenceStore store = CreatorActivator.getPrefsStore();
+
+		if(isDontAskAgainChecked){
+			store.setValue(CreatorPreferenceConstants.DONT_ASK_SHOW_INFORMATION, CreatorPreferenceConstants.TRUE);
+		}else{
+			store.setValue(CreatorPreferenceConstants.DONT_ASK_SHOW_INFORMATION, CreatorPreferenceConstants.FALSE);
+		}
+	}
+
+
+	
+	/**
+	 * Get "Don't ask again" value for replace files in device
+	 * @return <code>true</code> if preference "don't ask again" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getDontAskShutdownCreator(){
+		
+		String value = CreatorActivator.getPrefsStore().getString(CreatorPreferenceConstants.CREATOR_DONT_ASK_SHUTDOWN);
+		if(value != null && value.equalsIgnoreCase(CreatorPreferenceConstants.TRUE)){
+			return true;
+		}else{
+			return false;
+		}
+		
+	}
+	
+	/**
+	 * Set "Don't ask again" value for replace files in device
+	 * @param isDontAskAgainChecked <code>true</code> if don't ask again is selected, <code>false</code> otherwise.
+	 */
+	public static void setDontAskShutdownCreator(boolean isDontAskAgainChecked){
+		
+		IPreferenceStore store = CreatorActivator.getPrefsStore();
+
+		if(isDontAskAgainChecked){
+			store.setValue(CreatorPreferenceConstants.CREATOR_DONT_ASK_SHUTDOWN, CreatorPreferenceConstants.TRUE);
+		}else{
+			store.setValue(CreatorPreferenceConstants.CREATOR_DONT_ASK_SHUTDOWN, CreatorPreferenceConstants.FALSE);
+		}
+	}	
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/resources/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.creator.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.creator.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	/**
+	 * @param key
+	 * @return message string
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/resources/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+RunInDeviceJob.Upload_File_SubTaskName=Uploading file to device
+RunInDeviceJob.Upload_Failed_ConsoleErrorMsg=Failed to upload file.
+RunInDeviceJob.CheckIfRunning_SubTaskName=Checking if Creator already running in device
+RunInDeviceJob.StopCreator_SubTaskName=Closing Creator in device before running script
+RunInDeviceJob.Run_File_SubTaskName=Running file in device
+RunInDeviceJob.Run_Failed_ConsoleErrorMsg=Failed to run script file in device.
+RunInDeviceJob.HTINotRunning_ErrMsg=HTI Connection is not running. Please configure and start HTI Connection from Carbide > HTI Connection.
+RunInDeviceJob.CheckFileExistence_TaskName=Checking if file already exist
+RunInDeviceJob.JobCanceledByUser_Msg=Job canceled by user
+
+CreatorPreferencePage.PreferencesGroup_Txt=Run in device via HTI
+CreatorPreferencePage.Upload_Group_Txt=Upload scripts in S60 device to folder:
+CreatorPreferencePage.DontAskAgainFileReplace_Group_Txt=Confirm file replace in upload
+CreatorPreferencePage.DontAskAgainFileReplace_ToolTip_Txt=If you select, script file will be replaced without question when uploading to device/emulator.
+CreatorPreferencePage.DontAskAgainFileReplace_Txt=Always replace existing file in S60 device without confirmation.
+CreatorPreferencePage.DontAskAgainShowInformation_Group_Txt=Showing information dialog
+CreatorPreferencePage.DontAskAgainShowInformation_ToolTip_Txt=If you select, information dialog is not shown when script is executed.
+CreatorPreferencePage.DontAskAgainShowInformation_Txt=Don't show an information dialog when script is executed.
+CreatorPreferencePage.DontAskAgainShutdown_Group_Txt=Showing shutdown dialog
+CreatorPreferencePage.DontAskAgainShutdown_ToolTip_Txt=If you select, Creator will be closed without question if running when script is executed.
+CreatorPreferencePage.DontAskAgainShutdown_Txt=Always close Creator application in S60 device without confirmation.
+
+ConfirmFileReplaceDialog.Confirm_Replace_DlgMsg_Postfix=Would you like to replace the existing file?
+ConfirmFileReplaceDialog.Confirm_Replace_DlgMsg_Prefix=Destination device already contains a file 
+ConfirmFileReplaceDialog.Confirm_Replace_DlgLabel=Confirm File Replace
+ConfirmFileReplaceDialog.DontAskAgainFileReplace_Txt=Always replace without confirmation
+
+WatchDeviceInformationDialog.Msg_Part1=Please follow execution of script '
+WatchDeviceInformationDialog.Msg_Part2=' in device/emulator.
+WatchDeviceInformationDialog.Msg_Part3=Status of the execution is not known in
+WatchDeviceInformationDialog.DontAskAgain_Txt=Don't show again
+
+ShutdownCreatorInDeviceDialog.Msg=Creator is running in device/emulator and it must be closed before script can be executed.\n\nClose Creator now? 
+ShutdownCreatorInDeviceDialog.DontAskAgain_Txt=Always close without confirmation
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/ui/actions/ToolsMenuAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.ui.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+import com.nokia.s60tools.creator.wizards.CreatorScriptNewWizard;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Action for menu action "New Creator script". Launches {@link CreatorScriptNewWizard} wizard.
+ */
+public class ToolsMenuAction implements IWorkbenchWindowActionDelegate  {
+	
+	/**
+	 * Reference to workbench window
+	 */
+	private IWorkbenchWindow window;
+	
+	/**
+	 * Constructor.
+	 */
+	public ToolsMenuAction(){			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		this.window = window;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			
+			IProject projects [] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			if(projects.length < 1){
+				showErrorDialog( "Creator Script Editor Error", 
+						"No existing projects in workspace! Please create a project before creating scripts!");
+				return;
+			}
+
+			
+    		CreatorScriptNewWizard wiz = new CreatorScriptNewWizard();
+    		IWorkbench wp = window.getWorkbench();
+    		
+    		ISelectionService selser = window.getSelectionService();
+    		ISelection sel = selser.getSelection(); 
+    		IStructuredSelection structSel = null;
+    		//pre-select selection if made in resource tree
+    		if(sel instanceof IStructuredSelection){
+    			structSel = (IStructuredSelection)sel;
+    		}
+
+    		
+    		wiz.init(wp, structSel);
+    		//Opening new Creator script file dialog.
+  	      	WizardDialog dialog = new WizardDialog
+	         (wp.getActiveWorkbenchWindow().getShell(),wiz);
+    		dialog.open();
+
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			CreatorEditorConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+	
+	/**
+	 * Show an error dialog
+	 * @param title
+	 * @param message
+	 * @param errors
+	 */
+	private void showErrorDialog(String title, String message) {
+		Shell sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+		MessageDialog.openError(sh, title, message);
+		
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		//Not needed
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/util/CreatorEditorConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.common.ProductInfoRegistry;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+
+/**
+ * Singleton class that offers console printing
+ * services for the AppDep product.
+ */
+public class CreatorEditorConsole extends AbstractProductSpecificConsole {
+	
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private CreatorEditorConsole instance = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public CreatorEditorConsole getInstance(){
+		if(instance == null ){
+			instance = new CreatorEditorConsole();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private CreatorEditorConsole(){		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleName()
+	 */
+	protected String getProductConsoleName() {
+		return ProductInfoRegistry.getConsoleWindowName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleImageDescriptor()
+	 */
+	protected ImageDescriptor getProductConsoleImageDescriptor() {
+		return CreatorActivator.getImageDescriptorForKey(CreatorActivator.CREATOR_SCRIPT_EDITOR_ICON);
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/wizards/CreatorScriptNewWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,213 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.creator.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.s60tools.creator.CreatorActivator;
+import com.nokia.s60tools.creator.xml.CreatorXML;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+
+/**
+ * This is a new wizard for Creator Script. Its role is to create a new file 
+ * resource in the provided container. If the container resource
+ * (a folder or a project) is selected in the workspace 
+ * when the wizard is opened, it will accept it as the target
+ * container. The wizard creates one file with the extension
+ * "creatorxml". 
+ */
+
+public class CreatorScriptNewWizard extends Wizard implements INewWizard {
+	private CreatorScriptNewWizardPage page;
+	private ISelection selection;
+
+	/**
+	 * Constructor for CreatorScriptNewWizard.
+	 * @throws Exception 
+	 */
+	public CreatorScriptNewWizard() throws Exception {
+		super();
+		
+		IProject projects [] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+		if(projects.length < 1){
+			String title = "Creator Script Editor Error" ; 
+			String msg = "No existing projects in workspace! Please create a project before creating scripts!";
+			Shell sh = CreatorActivator.getCurrentlyActiveWbWindowShell();
+			MessageDialog.openError(sh, title, msg);
+			//This is need to be done because wizard can be launched also from File -> New -> Other...
+			throw new Exception(msg);
+		}
+				
+		
+		setNeedsProgressMonitor(true);
+	}
+	
+	/**
+	 * Adding the page to the wizard.
+	 */
+
+	public void addPages() {
+		page = new CreatorScriptNewWizardPage(selection);
+		addPage(page);
+	}
+
+	/**
+	 * This method is called when 'Finish' button is pressed in
+	 * the wizard. We will create an operation and run it
+	 * using wizard as execution context.
+	 */
+	public boolean performFinish() {
+		final String containerName = page.getContainerName();
+		final String fileName = page.getFileName();
+		IRunnableWithProgress op = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException {
+				try {
+					doFinish(containerName, fileName, monitor);
+				} catch (CoreException e) {
+					throw new InvocationTargetException(e);
+				} finally {
+					monitor.done();
+				}
+			}
+		};
+		try {
+			getContainer().run(true, false, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			Throwable realException = e.getTargetException();
+			MessageDialog.openError(getShell(), "Error", realException.getMessage());
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * The worker method. It will find the container, create the
+	 * file if missing or just replace its contents, and open
+	 * the editor on the newly created file.
+	 */
+
+	private void doFinish(
+		String containerName,
+		String fileName,
+		IProgressMonitor monitor)
+		throws CoreException {
+		// create a sample file
+		monitor.beginTask("Creating " + fileName, 2);
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IResource resource = root.findMember(new Path(containerName));
+		if (!resource.exists() || !(resource instanceof IContainer)) {
+			throwCoreException("Container \"" + containerName + "\" does not exist.");
+		}
+		IContainer container = (IContainer) resource;
+		final IFile file = container.getFile(new Path(fileName));
+		//File should not be possible to exist, because wizard page is chekking that
+		//Not creating file really in here, save file from editor will create file		
+		try {
+			InputStream stream = openContentStream(fileName);
+			file.create(stream, true, monitor);
+			file.setCharset(FileUtils.ENCODING_TYPE_UTF_8, monitor);
+			stream.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		monitor.worked(1);
+		monitor.setTaskName("Opening file for editing...");
+		getShell().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				IWorkbenchPage page =
+					PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				try {
+					IDE.openEditor(page, file, true);
+				} catch (PartInitException e) {
+				}
+			}
+		});
+		monitor.worked(1);
+	}
+	
+	/**
+	 * We will initialize file contents with a sample text.
+	 * @throws UnsupportedEncodingException 
+	 */
+	private InputStream openContentStream(String fileName) throws UnsupportedEncodingException {
+		String contents =  CreatorXML.NEW_API_CREATOR_FILE_UID + fileName ;
+		return new ByteArrayInputStream(contents.getBytes(FileUtils.ENCODING_TYPE_UTF_8));
+	}
+
+
+	/**
+	 * set image to wizard
+	 */
+	private void setImage() {
+		setDefaultPageImageDescriptor(CreatorActivator.getWizardImage());
+	}
+	
+	/**
+	 * Throws exception with error message
+	 * @param message
+	 * @throws CoreException
+	 */
+	private void throwCoreException(String message) throws CoreException {
+		IStatus status =
+			new Status(IStatus.ERROR, CreatorActivator.PLUGIN_ID, IStatus.OK, message, null);
+		throw new CoreException(status);
+	}
+
+	/**
+	 * We will accept the selection in the workbench to see if
+	 * we can initialize from it.
+	 * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		
+		this.selection = selection;
+		setImage();
+		setWindowTitle("New Creator Script File");
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/wizards/CreatorScriptNewWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.creator.wizards;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+import com.nokia.s60tools.creator.CreatorHelpContextIDs;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well
+ * as the file name. The page will only accept file name without the extension
+ * OR with the extension that matches the expected one (creatorxml).
+ */
+
+public class CreatorScriptNewWizardPage extends WizardPage {
+	
+	//
+	// private members
+	//
+	private Text containerText;
+	private Text fileText;
+	private ISelection selection;
+
+	/**
+	 * Constructor for SampleNewWizardPage.
+	 * 
+	 * @param pageName
+	 */
+	public CreatorScriptNewWizardPage(ISelection selection) {
+		super("wizardPage");
+		setTitle("Creator Script File");
+		setDescription("This wizard creates a new file with *.creatorxml extension that can be opened by a Creator Script Editor.");
+		this.selection = selection;
+	}
+
+	/**
+	 * Adding context sensitive help id:s to components
+	 *
+	 */
+	private void setHelps() {
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(containerText,
+				CreatorHelpContextIDs.CREATOR_HELP_CREATE_SCRIPT);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(fileText,
+				CreatorHelpContextIDs.CREATOR_HELP_CREATE_SCRIPT);
+	}	
+	
+	/**
+	 * @see IDialogPage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 3;
+		layout.verticalSpacing = 9;
+		Label label = new Label(container, SWT.NULL);
+		label.setText("&Project:");
+
+		containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		containerText.setLayoutData(gd);
+		containerText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		Button button = new Button(container, SWT.PUSH);
+		button.setText("Browse...");
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleBrowse();
+			}
+		});
+		label = new Label(container, SWT.NULL);
+		label.setText("&File name:");
+
+		fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fileText.setLayoutData(gd);
+		fileText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+		initialize();
+		dialogChanged();
+		setControl(container);
+		setHelps();
+	}
+
+
+	/**
+	 * Tests if the current workbench selection is a suitable container to use.
+	 */
+
+	private void initialize() {
+		if (selection != null && selection.isEmpty() == false
+				&& selection instanceof IStructuredSelection) {
+			IStructuredSelection ssel = (IStructuredSelection) selection;
+			if (ssel.size() > 1)
+				return;
+			Object obj = ssel.getFirstElement();
+			if (obj instanceof IResource) {
+				IContainer container;
+				if (obj instanceof IContainer)
+					container = (IContainer) obj;
+				else
+					container = ((IResource) obj).getParent();
+				containerText.setText(container.getFullPath().toString());
+			}
+		}else{
+			//If there is only one project in workspace, we can set that to container, because user has no option
+			IProject projects [] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			if(projects.length == 1){
+				containerText.setText(projects[0].getFullPath().makeAbsolute().toString());
+			}			
+		}
+		
+		
+		fileText.setText("new_file.creatorxml");
+	}
+
+	/**
+	 * Uses the standard container selection dialog to choose the new value for
+	 * the container field.
+	 */
+
+	private void handleBrowse() {
+		ContainerSelectionDialog dialog = new ContainerSelectionDialog(
+				getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+				"Select new file container");
+		if (dialog.open() == ContainerSelectionDialog.OK) {
+			Object[] result = dialog.getResult();
+			if (result.length == 1) {
+				containerText.setText(((Path) result[0]).toString());
+			}
+		}
+	}
+
+	/**
+	 * Ensures that both text fields are set.
+	 */
+
+	private void dialogChanged() {
+		IResource container = ResourcesPlugin.getWorkspace().getRoot()
+				.findMember(new Path(getContainerName()));
+		String fileName = getFileName();
+
+		if (getContainerName().length() == 0) {
+			updateStatus("File container must be specified");
+			return;
+		}
+		if (container == null
+				|| (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
+			updateStatus("File container must exist");
+			return;
+		}
+		if (!container.isAccessible()) {
+			updateStatus("Project must be writable");
+			return;
+		}
+		if (fileName.length() == 0) {
+			updateStatus("File name must be specified");
+			return;
+		}
+		if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
+			updateStatus("File name must be valid");
+			return;
+		}
+		int dotLoc = fileName.lastIndexOf('.');
+		if (dotLoc != -1) {
+			String ext = fileName.substring(dotLoc + 1);
+			if (ext.equalsIgnoreCase("creatorxml") == false) {
+				updateStatus("File extension must be \"creatorxml\"");
+				return;
+			}
+		}
+		updateStatus(null);
+	}
+
+	/**
+	 * Update status to UI
+	 * @param message
+	 */
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+
+	/**
+	 * Get project name
+	 * @return project name where file was created
+	 */
+	public String getContainerName() {
+		return containerText.getText();
+	}
+
+	/**
+	 * Get file name
+	 * @return file name greated
+	 */
+	public String getFileName() {
+		return fileText.getText();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorScriptNotValidException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.xml;
+
+import com.nokia.s60tools.creator.xml.CreatorXML;
+
+/**
+ * Exception thrown when XML is not valid
+ */
+public class CreatorScriptNotValidException extends Exception {
+
+	/**
+	 * Member to store unvalid XML file
+	 */
+	CreatorXML xml = null;
+	
+	
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Exception must have description, no default constructor
+	 */
+	@SuppressWarnings("unused")
+	private CreatorScriptNotValidException() {
+	}
+
+	/* (non-Javadoc)
+	 * @see Exception#Exception(String) 
+	 */
+	public CreatorScriptNotValidException(String arg0) {
+		super(arg0);
+	}
+
+	/* (non-Javadoc)
+	 * @see Exception#Exception(String, Throwable) 
+	 */
+	public CreatorScriptNotValidException(String arg0, Throwable arg1) {
+		super(arg0, arg1);
+	}
+
+	/**
+	 * Construction with error descriptions and xml containing errors
+	 * @param errors
+	 * @param xml
+	 */
+	public CreatorScriptNotValidException(String errors, CreatorXML xml) {
+		super(errors);
+		this.xml = xml;
+	}
+
+	/**
+	 * Get so far parsed XML. Not necessarily contain all information what 
+	 * is in xml file. Contains only that information what was found before
+	 * parsing fails, rest of the elements was not parsed.
+	 * 
+	 * @return a XML that could not be parsed. 
+	 */
+	public CreatorXML getCreatorXML() {
+		return this.xml;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorXML.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,917 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.creator.xml;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.IComponentServices;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.calendar.Calendar;
+import com.nokia.s60tools.creator.components.calendar.CalendarValue;
+import com.nokia.s60tools.creator.components.calendar.CalendarVariables;
+import com.nokia.s60tools.creator.components.contact.Contact;
+import com.nokia.s60tools.creator.components.contact.ContactGroup;
+import com.nokia.s60tools.creator.components.contact.ContactGroupValue;
+import com.nokia.s60tools.creator.components.contact.ContactSet;
+import com.nokia.s60tools.creator.components.filetype.FileType;
+import com.nokia.s60tools.creator.components.filetype.FileTypeVariables;
+import com.nokia.s60tools.creator.components.messaging.Message;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.editors.CreatorScriptEditor;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+import com.nokia.s60tools.util.resource.FileUtils;
+import com.nokia.s60tools.util.xml.XMLIndentor;
+
+/**
+ * Creator class representing metadata in Editor area as well as Creator XML file in
+ * hard drive. Use {@link CreatorXML#toString()} to get XML String representing this metadata file. 
+ * 
+ * This class is quite opposite for Creator XML parsing class {@link CreatorXMLParser}.
+ * 
+ * When user is updating values in UI and using 
+ * {@link CreatorScriptEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)} 
+ * or {@link CreatorScriptEditor#doSaveAs()} functionality, 
+ * update corresponding values from UI to {@link CreatorXML} and get XML data to save
+ * by using {@link CreatorXML#toString()}.
+ *
+ */
+public class CreatorXML {
+
+	/**
+	 * New line "\r\n"
+	 */
+	public static final String NEW_LINE = "\r\n";
+
+	/**
+	 * Header for XML file
+	 */
+	private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" +NEW_LINE;
+	
+	/**
+	 * Value in version attributes when not set
+	 */
+	public static final String NOT_SET = "";
+	
+	/**
+	 * Current XML data version. Only change when XML format is changing.
+	 * NOTE: When XML format is changed, also backward compatibility issues
+	 * should be taken care of!
+	 */
+	public static final String DATA_VERSION = "1.0";
+	
+	/**
+	 * Unique ID for new with wizard created metadata xml file.
+	 * When file content is just this, UI will know that it's a new file. 
+	 */
+	public static final String NEW_API_CREATOR_FILE_UID = "com.nokia.s60tools.creator.new_file";
+
+
+	
+	
+	/**
+	 * Name of this XML file in file system
+	 */
+	private String fileName;
+
+
+	/**
+	 * Component services provider
+	 */
+	private IComponentServices componentServices;
+	
+	/**
+	 * Public construction
+	 * @param componentServices
+	 */
+	public CreatorXML(IComponentServices componentServices) {		
+		this.componentServices = componentServices;
+		this.fileName = NOT_SET;
+	}	
+		
+
+	/**
+	 * Get name of this XML file
+	 * @return
+	 */
+	public String getFileName() {
+		return fileName;
+	}
+	/**
+	 * Set name of this XML file
+	 * @param fileName
+	 */
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	
+	/**
+	 * Returns indented XML string representing components given through <{@link IComponentServices}.
+	 */
+	public String toString() {
+
+		String notIntendedXML = toXMLString();
+		
+		try {
+			String intendedXML;
+			intendedXML = XMLIndentor.indentXML(notIntendedXML, FileUtils.ENCODING_TYPE_UTF_8, XMLIndentor.DEFAULT_INDENT_NUMBER);
+			return intendedXML;
+		} catch (UnsupportedEncodingException e) {
+			logErrorMessage(e);			
+		} catch (TransformerException e) {
+			logErrorMessage(e);			
+		}
+		return notIntendedXML;
+	}
+
+	private void logErrorMessage(Exception e) {
+		e.printStackTrace();		
+		CreatorEditorConsole.getInstance().println(
+				"Error when indenting XML, error was: " +e
+				+". File: '"  +getFileName() +"' was not intended.",
+				CreatorEditorConsole.MSG_ERROR);
+	}
+	
+	/** 
+	 * Get this object as XML String.
+	 * @return a XML String representing this Creator file
+	 */
+	private String toXMLString(){
+		
+		
+		StringBuffer b = new StringBuffer();
+		
+		b.append(XML_HEADER);
+		b.append("<creatorscript version=\"1.0\">");
+		
+		b.append(getAllComponentsAsXML());
+		
+		b.append("</creatorscript>");
+	
+		return b.toString();
+	}
+	
+	
+	/**
+	 * Looping through components and creating XML
+	 * @return XML as StringBuffer
+	 */
+	private StringBuffer getAllComponentsAsXML() {
+
+		StringBuffer b = new StringBuffer();
+
+		Set<String> componentKeys = componentServices.getComponents().keySet();
+				
+		//looping through all component types
+		for (Iterator<String> compKeysIt = componentKeys.iterator(); compKeysIt
+				.hasNext();) {
+			String componentTypeKey = (String) compKeysIt.next();
+
+			Vector<AbstractComponent> componentsInOneType = componentServices.getComponents().get(componentTypeKey);
+			
+			//Some items needs to be handled differently because of special elements/attributes.
+			//Messages and calendars will be handled differently later in private void addOneComponentToXML(StringBuffer b, AbstractComponent comp)
+			if(componentTypeKey.equals(CreatorEditorSettings.TYPE_CONTACT)){				
+				//All contacts to XML
+				addContactsToXML(b, componentsInOneType);				
+			}
+			else if(componentTypeKey.equals(CreatorEditorSettings.TYPE_CONTACT_SET)){				
+				//All contacts to XML
+				addEmptyContactSetsToXML(b, componentsInOneType);
+			}
+			else if(componentTypeKey.equals(CreatorEditorSettings.TYPE_CONTACT_GROUP)){				
+				//All contacts to XML
+				addContactGroupsToXML(b, componentsInOneType);
+			}		
+			else{
+				//All all components in type of "componentTypeKey" to XML
+				addOneTypeOfComponentsToXML(b, componentsInOneType);
+			}
+		}// for componentKeys
+
+		return b;
+	}
+
+
+
+	/**
+	 * Add all components in one type to XML
+	 * @param b
+	 * @param componentsInOneType
+	 */
+	private void addOneTypeOfComponentsToXML(StringBuffer b,
+			Vector<AbstractComponent> componentsInOneType) {
+		//Looping through all components at one type
+		
+		for (Iterator<AbstractComponent> iterator = componentsInOneType.iterator(); iterator
+				.hasNext();) {
+			AbstractComponent comp = (AbstractComponent) iterator.next();
+			
+			addOneComponentToXML(b, comp);
+
+		}//for componentsInOneType
+	}
+	
+	
+	/**
+	 * Add contacts to XML
+	 * @param b
+	 * @param componentsInOneType
+	 */
+	private void addContactsToXML(StringBuffer b,
+			Vector<AbstractComponent> componentsInOneType) {
+		//Looping through all components at one type
+		
+		//Table to store contacts which belongs to set
+		Hashtable<AbstractComponent, Vector<AbstractComponent>> contactSetsWithContacts = 
+			new Hashtable<AbstractComponent, Vector<AbstractComponent>>();
+
+		//looping through all contacts
+		for (Iterator<AbstractComponent> iterator = componentsInOneType.iterator(); iterator
+				.hasNext();) {
+			AbstractComponent comp = (AbstractComponent) iterator.next();
+			Contact con = (Contact)comp;
+			
+			//if that contact has a reference to contact set
+			if(con.hasReferenceToAnotherComponent()){
+				//get vector where is all contacts belongs to this set
+				Vector<AbstractComponent> v = contactSetsWithContacts.get(con.getReferenceToAnotherComponent());
+				if(v == null){
+					//if this was first contact in that set, creating new vector
+					v = new Vector<AbstractComponent>();
+				}
+				v.add(con);//adding this contact to that contact set
+				contactSetsWithContacts.put(con.getReferenceToAnotherComponent(), v);
+			}
+			//If there is no reference to set, just adding this contact like any other component
+			else{			
+				addOneComponentToXML(b, con);
+			}
+
+		}//for componentsInOneType
+		
+		if(contactSetsWithContacts.size() > 0){
+			Set<AbstractComponent> sets = contactSetsWithContacts.keySet();
+			for (Iterator<AbstractComponent> iterator = sets.iterator(); iterator.hasNext();) {
+				AbstractComponent comp = (AbstractComponent) iterator.next();
+				ContactSet set = (ContactSet)comp;
+				b.append("<contact-set id=\"");
+				b.append(set.getId());
+				b.append("\"" );
+				//If there is added number of existing contacts
+				if(set.getNumberOfExistingContacts() != 0){
+					b.append(" ");
+					b.append(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID);
+					b.append("=\"");
+					b.append(set.getNumberOfExistingContacts() );
+					b.append("\"");
+				}					
+				
+				b.append(">");
+				
+				Vector<AbstractComponent> contactsInSet = contactSetsWithContacts.get(comp);
+				for (Iterator<AbstractComponent> iterator2 = contactsInSet.iterator(); iterator2
+						.hasNext();) {
+					AbstractComponent con = (AbstractComponent) iterator2
+							.next();
+					addOneComponentToXML(b, con);
+					
+				}
+				b.append("</contact-set>");
+			}
+		}
+	}
+	
+	/**
+	 * Adding contact sets what is not referenced by any other component
+	 * @param b
+	 * @param v
+	 */
+	private void addContactGroupsToXML(StringBuffer b, Vector<AbstractComponent> v) {		
+		
+		for (Iterator<AbstractComponent> iterator = v.iterator(); iterator.hasNext();) {
+
+			ContactGroup group = (ContactGroup) iterator
+					.next();
+			
+			b.append("<");
+			b.append(group.getXMLElementName());
+			
+			if(group.getName() != null && group.getName().trim().length() > 0){
+				b.append(" ");
+				b.append(AbstractComponent.NAME_PARAMETER_ID);
+				b.append("=\"");
+				b.append(group.getName() );
+				b.append("\"");
+			}			
+			
+			b.append("><members>");
+
+			//adding elements
+
+			Set<String> keys = group.getKeys();
+			//Looping through all items in one type of component
+			for (Iterator<String> iterator2 = keys.iterator(); iterator2
+					.hasNext();) {
+				String key = (String) iterator2.next();
+				String xmlKey = group.getIdByValue(key);
+
+				Vector<AbstractValue> value = group.getAttribute(key);
+
+				//Looping through all values of this type of item
+				for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+					ContactGroupValue val = (ContactGroupValue) valueIt.next();
+					//adding element data
+					addContactGroupValueData(b, xmlKey, val);
+				}			
+
+			}
+
+		
+			b.append("</members>");
+
+			b.append("</");
+			b.append(group.getXMLElementName());
+			b.append(">");
+			
+				
+		}
+	}	
+	
+	/**
+	 * Adding element data to contact group
+	 * @param b
+	 * @param xmlKey
+	 * @param val
+	 */
+	private void addContactGroupValueData(StringBuffer b, String xmlKey, ContactGroupValue val) {
+
+		//If its not a random value, there is real value
+		
+		b.append("<");
+		b.append(xmlKey);
+		
+		if(val.getAmount() > 0){
+			b.append(" maxamount=\"");
+			b.append(val.getMaxAmount());
+			b.append("\"");
+		}
+
+		b.append(" id=\"");
+		b.append(val.getId());//Value must be valid
+		b.append("\"");
+		b.append("/>");			
+
+	}	
+	
+	
+	
+	/**
+	 * Adding contact sets what is not referenced by any other component
+	 * @param b
+	 * @param v
+	 */
+	private void addEmptyContactSetsToXML(StringBuffer b, Vector<AbstractComponent> v) {
+		
+		
+		for (Iterator<AbstractComponent> iterator = v.iterator(); iterator.hasNext();) {
+
+			ContactSet set = (ContactSet) iterator
+					.next();
+			
+			//If there is no references to this contact set by any other component
+			//then an empty contact set will be created.
+			//But if there is some components that references to this contact-set
+			//when creating these components, also contact sets will be added.
+			if(!componentServices.isReferencedByAnotherComponent(set)){
+
+				int id = set.getId();
+				
+				if(id == AbstractComponent.NULL_ID){			
+					b.append("<contact-set/>");
+				}
+				else{			
+					b.append("<contact-set id=\"" );
+					b.append(id);
+					b.append("\"");
+					
+					//If there is added number of existing contacts
+					if(set.getNumberOfExistingContacts() != 0){
+						b.append(" ");
+						b.append(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID);
+						b.append("=\"");
+						b.append(set.getNumberOfExistingContacts() );
+						b.append("\"");
+					}										
+					
+					b.append(">" );
+					
+					b.append("</contact-set>");
+				}
+				
+			}			
+		}
+	}		
+
+	/**
+	 * Adding a component to xml
+	 * @param b
+	 * @param comp
+	 */
+	private void addOneComponentToXML(StringBuffer b, AbstractComponent comp) {
+		int amount = comp.getAmount();
+		//e.g. <calendar>
+		if (amount == 0 || amount == 1) {
+			b.append("<");
+			b.append(comp.getXMLElementName());
+			addAdditionalComponentParameters(comp, b);
+			b.append(">");
+		} else {
+			b.append("<");
+			b.append(comp.getXMLElementName());
+			b.append(" amount=\"");
+			b.append(amount);
+			b.append("\"");
+			addAdditionalComponentParameters(comp, b);
+			b.append(">");
+		}
+		b.append("<fields>");
+
+		//Calendar
+		if (comp instanceof Calendar){
+			addOneCalendarComponentData(b, (Calendar)comp );
+		}
+		//Messages
+		else if (comp instanceof Message){
+			addOneMessageComponentData(b, (Message)comp );
+		}		
+		//FileType handling varies about default handling because of DRM Support 
+		else if (comp instanceof FileType){
+			addOneFileTypeComponentData(b, (FileType)comp );
+		}			
+		else{				
+			addOneAbstractComponentData(b, comp);
+		}
+
+		b.append("</fields>");
+
+		b.append("</");
+		b.append(comp.getXMLElementName());
+		b.append(">");
+	}
+
+	/**
+	 * FileType handling, because of DRM in ui does not match right to XML needed special handling
+	 * @param b
+	 * @param comp
+	 */
+	private void addOneFileTypeComponentData(StringBuffer b, FileType comp) {
+
+		Map<String, Vector<AbstractValue>> encValues = new LinkedHashMap<String, Vector<AbstractValue>>();
+		Set<String> keys = comp.getKeys();
+		String encType = null;
+		//Looping through all items in one type of component
+		for (Iterator<String> iterator2 = keys.iterator(); iterator2
+				.hasNext();) {
+			String key = (String) iterator2.next();
+			String xmlKey = comp.getIdByValue(key);
+
+			Vector<AbstractValue> value = comp.getAttribute(key);
+			if(FileTypeVariables.isEncryptionValue(key)){
+				encValues.put(xmlKey, value);
+			}
+			else if(xmlKey.equalsIgnoreCase(FileTypeVariables.ENCRYPTION_TYPE_XML)){
+				//Looping through all values of this type of item
+				for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+					AbstractValue val =  valueIt.next();
+					encType = val.getValue();//If there is many values, first will remain
+					break;///all other values will be skipped
+				}				
+			}
+			else{
+				//Looping through all values of this type of item
+				for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+					AbstractValue val =  valueIt.next();
+					//adding element data
+					addValueData(b, xmlKey, val);
+				}			
+			}
+			
+		}
+		try{
+		//If encryption is set
+		if(encType != null){
+			b.append("<");
+			b.append(FileTypeVariables.ENCRYPTION_TYPE_XML);
+			b.append(" type=\"");
+			b.append(encType);
+			b.append("\">");
+			
+			
+			//Checking DRM-CD attributes
+			///Should we check that its CD type of encryption? Possibility to loss data then.
+			if(!encValues.isEmpty()){
+				StringBuffer encB = addOneEncryptionToFileType(FileTypeVariables.PRINT_TYPE , FileTypeVariables.PRINT_KEYS, encValues);
+				if(encB != null){
+					b.append(encB);
+				}
+				
+				encB = addOneEncryptionToFileType(FileTypeVariables.DISPLAY_TYPE , FileTypeVariables.DISPLAY_KEYS, encValues);
+				if(encB != null){
+					b.append(encB);
+				}
+				
+				encB = addOneEncryptionToFileType(FileTypeVariables.PLAY_TYPE , FileTypeVariables.PLAY_KEYS, encValues);
+				if(encB != null){
+					b.append(encB);
+				}
+				
+				encB = addOneEncryptionToFileType(FileTypeVariables.EXECUTE_TYPE , FileTypeVariables.EXECUTE_KEYS, encValues);
+				if(encB != null){
+					b.append(encB);
+				}								
+			}
+			
+			b.append("</");
+			b.append(FileTypeVariables.ENCRYPTION_TYPE_XML);
+			b.append(">");			
+			
+		}		
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Creates one type of encryption and returns it
+	 * @param type
+	 * @param keys
+	 * @param encValues
+	 * @return buffer where <right type=[given type]>... or <code>null</code> 
+	 * if there was no type values 
+	 * for that type in Map given
+	 */
+	private StringBuffer addOneEncryptionToFileType(String type, String [][]keys,
+			Map<String, Vector<AbstractValue>> encValues) {
+		
+		StringBuffer encB = new StringBuffer();
+
+		boolean wasItems = false;
+		
+		String rightType = "<right type=\"";
+		String close = "\">";
+		String rightTypeClose = "</right>";
+		encB.append(rightType);
+		encB.append(type);
+		encB.append(close);
+		
+		for (int i = 0; i < keys[0].length; i++) {
+			Vector<AbstractValue> values = encValues.get(keys[0][i]);
+			if(values==null){
+				continue;
+			}
+			for (Iterator<AbstractValue> iterator2 = values.iterator(); iterator2.hasNext();) {
+				AbstractValue value = (AbstractValue) iterator2.next();
+				addValueData(encB, keys[1][i], value);				
+				wasItems = true;
+			}					
+		}
+		encB.append(rightTypeClose);
+		
+		if(wasItems){
+			return encB;
+		}else{
+			return null;
+		}
+	}
+
+
+	/**
+	 * Adds one message to XML
+	 * @param b
+	 * @param comp
+	 */
+	private void addOneMessageComponentData(StringBuffer b, Message comp) {
+		Set<String> keys = comp.getKeys();
+		//Looping through all items in one type of component
+		for (Iterator<String> iterator2 = keys.iterator(); iterator2
+				.hasNext();) {
+			String key = (String) iterator2.next();
+			String xmlKey = comp.getIdByValue(key);
+
+			Vector<AbstractValue> value = comp.getAttribute(key);
+
+			//Looping through all values of this type of item
+			for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+				AbstractValue val =  valueIt.next();
+				//adding element data when component is a contact set reference 
+				if(CreatorEditorSettings.isContactSetReference(key))
+				{
+					b.append("<");
+					String idByValue = comp.getIdByValue( val.getType() );
+					b.append( idByValue );//<to> or <from>
+					b.append(">");
+					addContactSetReferenceToBuffer(b, val);
+					b.append("</");
+					b.append( idByValue );
+					b.append(">");
+					
+				}
+				//Add all other values than contact set references
+				else {//if(key.equals(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE)){
+					addValueData(b, xmlKey, val);
+				}	
+			}			
+		}
+	}
+
+	/**
+	 * Add additional parameters for component
+	 * @param comp
+	 * @param b
+	 */
+	private void addAdditionalComponentParameters(AbstractComponent comp,
+			StringBuffer b) {
+
+		if(comp.hasAdditionalParameters()){
+			
+			Set<String> keys = comp.getAdditionalParameters().keySet();
+			for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
+				String type = (String) iterator.next();
+				String value = comp.getAdditionalParameter(type);
+
+				b.append(" ");
+				b.append(type);
+				b.append("=\"");
+				b.append(value);
+				b.append("\"");
+				
+			}
+		}		
+	}
+
+	/**
+	 * Add XML data for one component inside of <fields></fields>
+	 * @param b
+	 * @param comp
+	 */
+	private void addOneAbstractComponentData(StringBuffer b, AbstractComponent comp) {
+		
+		
+		Set<String> keys = comp.getKeys();
+		//Looping through all items in one type of component
+		for (Iterator<String> iterator2 = keys.iterator(); iterator2
+				.hasNext();) {
+			String key = (String) iterator2.next();
+			String xmlKey = comp.getIdByValue(key);
+
+			Vector<AbstractValue> value = comp.getAttribute(key);
+
+			//Looping through all values of this type of item
+			for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+				AbstractValue val =  valueIt.next();
+				//adding element data
+				addValueData(b, xmlKey, val);
+			}			
+
+		}
+	}
+	
+	/**
+	 * Add XML data for one Calendar component inside of <fields></fields>
+	 * @param b
+	 * @param comp
+	 */
+	private void addOneCalendarComponentData(StringBuffer b, Calendar comp) {
+
+		//Store all attendees found to here
+		Vector <CalendarValue> attendees = new Vector<CalendarValue>();
+		Vector <AbstractValue> contactSetReferences = new Vector<AbstractValue>();
+		String xmlKeyForAttendees = CalendarVariables.ATTENDEE_XML_ELEMENT;
+		
+		Set<String> keys = comp.getKeys();
+		//Looping through all items in one type of component
+		for (Iterator<String> iterator2 = keys.iterator(); iterator2
+				.hasNext();) {
+			String key = (String) iterator2.next();
+			String xmlKey = comp.getIdByValue(key);
+
+			Vector<AbstractValue> value = comp.getAttribute(key);
+			
+			//Looping through all values of this type of item
+			for (Iterator<AbstractValue> valueIt = value.iterator(); valueIt.hasNext();) {
+				AbstractValue val =  valueIt.next();
+				CalendarValue calVal = (CalendarValue)val;
+
+				
+				//Adding contact set references to attendees
+				
+				//If its not a contact set reference or attendee
+				if(!CreatorEditorSettings.isContactSetReference(key) 
+						&& !calVal.isAttendee())
+				{
+					addValueData(b, xmlKey, calVal);
+				}
+				//if it is contact set reference
+				else if(CreatorEditorSettings.isContactSetReference(key)){
+					contactSetReferences.add(calVal);
+				}	
+				//otherwise it's attendee
+				else{					
+					attendees.add(calVal);
+				}				
+			}			
+		}
+		//Handle attendees and contact set references
+		if(attendees.size() > 0 || contactSetReferences.size() > 0 ){
+			addAttendeesToCalendar(b, xmlKeyForAttendees, attendees, contactSetReferences);
+		}
+	}	
+	
+	
+
+	/**
+	 * Add attendees to calendar
+	 * @param b
+	 * @param xmlKey
+	 * @param attendees
+	 * @param contactSetReferences
+	 */
+	private void addAttendeesToCalendar(StringBuffer b, String xmlKey,
+			Vector<CalendarValue> attendees, Vector<AbstractValue> contactSetReferences) {
+		
+		b.append("<attendees>");
+		
+		addContactSetReferencesToBuffer(b, contactSetReferences);
+		
+		for (Iterator<CalendarValue> iterator = attendees.iterator(); iterator.hasNext();) {
+			CalendarValue calVal = (CalendarValue) iterator.next();
+			
+			b.append("<");
+			b.append(xmlKey);//attendee
+			
+			if(calVal.getAmount() > 0){
+				b.append(" amount=\"");
+				b.append(calVal.getAmount());
+				b.append("\"");
+			}
+			
+			if(!calVal.isRandom()){
+				b.append(">");//close attendee element
+
+				//Adding all attendee attributes as elements to XML
+				if(calVal.getAttendeeEmail() != null){
+					b.append("<");
+					b.append(CalendarVariables.ATTENDEEEMAIL_XML_ELEMENT);
+					b.append(">");
+					b.append(calVal.getAttendeeEmail());
+					b.append("</");
+					b.append(CalendarVariables.ATTENDEEEMAIL_XML_ELEMENT);
+					b.append(">");					
+				}
+				if(calVal.getAttendeeCommonName() != null){
+					b.append("<");
+					b.append(CalendarVariables.ATTENDEECOMMONNAME_XML_ELEMENT);
+					b.append(">");
+					b.append(calVal.getAttendeeCommonName());
+					b.append("</");
+					b.append(CalendarVariables.ATTENDEECOMMONNAME_XML_ELEMENT);
+					b.append(">" );					
+				}				
+				
+				
+				b.append("</");
+				b.append(xmlKey);//attendee
+				b.append(">");
+			}
+			//Else its a random value, close element "<element/>" and set possible random type attribute
+			else{
+				if(calVal.getModeType() == ModeTypes.RandomTypeMaxLength){
+					b.append(" randomlength=\"max\"");
+				}
+				else if(calVal.getModeType() == ModeTypes.RandomTypeUserDefinedLength){
+					b.append(" randomlength=\"");
+					b.append(calVal.getRandomValueLenght());
+					b.append("\"");
+				}				
+
+				b.append("/>");				
+			}			
+		}
+		b.append("</attendees>");
+	}
+
+	/**
+	 * Adds contact set references to XML
+	 * @param b
+	 * @param contactSetReferences
+	 */
+	private void addContactSetReferencesToBuffer(StringBuffer b,
+			Vector<AbstractValue> contactSetReferences) {
+		//Contact set references
+		for (Iterator<AbstractValue> iterator = contactSetReferences.iterator(); iterator
+				.hasNext();) {
+			AbstractValue set = (AbstractValue) iterator.next();
+			addContactSetReferenceToBuffer(b, set);
+		}
+	}
+
+	/**
+	 * Adds contact set reference to XML
+	 * @param b
+	 * @param val
+	 */
+	private void addContactSetReferenceToBuffer(StringBuffer b,
+			AbstractValue val) {
+		b.append("<");
+		b.append(CreatorEditorSettings.TYPE_CONTACT_SET_REFERENCE_XML_ELEMENT);
+		b.append(" id=\"");
+		b.append(val.getId());
+		b.append("\"");
+		
+		if(val.getMaxAmount() > 0){
+			b.append(" maxamount=\"");
+			b.append(val.getMaxAmount());
+			b.append("\"");
+			 	
+		}
+		b.append("/>" );
+	}
+
+	/**
+	 * Add one value data to XML
+	 * @param b
+	 * @param xmlKey
+	 * @param val
+	 */
+	private void addValueData(StringBuffer b, String xmlKey, AbstractValue val) {
+
+			//If its not a random value, there is real value
+			
+			b.append("<");
+			b.append(xmlKey);
+			
+			if(val.getAmount() > 0){
+				b.append(" amount=\"");
+				b.append(val.getAmount());
+				b.append("\"");
+			}
+			//adding incvalueforeachcopy parameter
+			if(val.getModeType() == ModeTypes.ModeTypeIncValueForEachCopy){
+				b.append(" ");
+				b.append(AbstractComponent.INCVALUEFOREACHCOPY_PARAMETER_ID);
+				b.append("=\"");					
+				b.append(AbstractComponent.TRUE);
+				b.append("\"");
+			}				
+			if(!val.isRandom()){
+				b.append(">");
+				b.append(val.getValue());
+				b.append("</");
+				b.append(xmlKey);
+				b.append(">");	
+			}
+			//Else its a random value, close element "<element/>" and set possible random type attribute
+			else{
+				if(val.getModeType() == ModeTypes.RandomTypeMaxLength){
+					b.append(" randomlength=\"max\"");
+				}
+				else if(val.getModeType() == ModeTypes.RandomTypeUserDefinedLength){
+					b.append(" randomlength=\"");
+					b.append(val.getRandomValueLenght());
+					b.append("\"");
+				}
+
+				b.append("/>");				
+			}
+
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatorextension/com.nokia.s60tools.creator/src/com/nokia/s60tools/creator/xml/CreatorXMLParser.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1053 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.creator.xml;
+
+import java.io.CharArrayWriter;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.Vector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import com.nokia.s60tools.creator.components.AbstractComponent;
+import com.nokia.s60tools.creator.components.AbstractValue;
+import com.nokia.s60tools.creator.components.AbstractVariables;
+import com.nokia.s60tools.creator.components.ComponentServices;
+import com.nokia.s60tools.creator.components.Components;
+import com.nokia.s60tools.creator.components.AbstractValue.ModeTypes;
+import com.nokia.s60tools.creator.components.calendar.CalendarValue;
+import com.nokia.s60tools.creator.components.filetype.FileTypeValue;
+import com.nokia.s60tools.creator.components.filetype.FileTypeVariables;
+import com.nokia.s60tools.creator.components.messaging.MessageValue;
+import com.nokia.s60tools.creator.components.messaging.MessageVariables;
+import com.nokia.s60tools.creator.core.CreatorEditorSettings;
+import com.nokia.s60tools.creator.util.CreatorEditorConsole;
+
+/**
+ * Class for parsing Creator XML Script file to Object model (Components)
+ */
+public class CreatorXMLParser {
+
+	public CreatorXMLParser() {
+	}
+
+	CreatorXMLHandler handler = null;
+
+	/**
+	 * Was there errors when parsing (e.g. component type that is not supported)
+	 * 
+	 * @return true if there was some errors, false otherwise
+	 */
+	public boolean wasErrors() {
+		return handler.getErrors().trim().length() == 0 ? false : true;
+	}
+
+	/**
+	 * Get errors
+	 * 
+	 * @return description for errors or empty string if not any
+	 */
+	public String getErrors() {
+		return handler.getErrors();
+	}
+
+	/**
+	 * 
+	 * @param fileName
+	 *            file to be parsed
+	 * @return CreatorXML object with all elements and attributes set
+	 * @throws SAXException
+	 * @throws IOException
+	 * @throws CreatorScriptNotValidException
+	 *             if parsed data was not valid
+	 */
+	public Components parse(InputStream inStreamAsUTF8)
+			throws CreatorScriptNotValidException {
+		XMLReader reader;
+		Components components = null;
+		try {
+			handler = new CreatorXMLHandler();
+			reader = XMLReaderFactory.createXMLReader();
+
+			reader.setContentHandler(handler);
+			CreatorXMLErrorHandler errorHandler = new CreatorXMLErrorHandler();
+			reader.setErrorHandler(errorHandler);
+
+			InputSource in = new InputSource();			
+			in.setByteStream(inStreamAsUTF8);
+
+			reader.parse(in);
+
+			components = handler.getComponents();
+
+			if (components != null) {
+				return components;
+			} else {
+				throw new CreatorScriptNotValidException(handler.getErrors());
+			}
+
+		} catch (SAXException e) {
+			e.printStackTrace();
+			CreatorEditorConsole.getInstance().println(
+					"SAXException on parsing: " + e.toString());
+			throw new CreatorScriptNotValidException(e.getMessage());
+		} catch (FileNotFoundException e) {
+			CreatorEditorConsole.getInstance().println(
+					"FileNotFoundException on parsing: " + e.toString());
+			e.printStackTrace();
+			throw new CreatorScriptNotValidException(e.getMessage());
+		} catch (IOException e) {
+			CreatorEditorConsole.getInstance().println(
+					"IOException on parsing: " + e.toString());
+			e.printStackTrace();
+			throw new CreatorScriptNotValidException(e.getMessage());
+		}
+
+	}
+
+	/**
+	 * Error handler implementation
+	 */
+	public class CreatorXMLErrorHandler implements ErrorHandler {
+
+		public void error(SAXParseException e) throws SAXException {
+			CreatorEditorConsole.getInstance().println(
+					"SAXParseException (error) on parsing: " + e.toString());
+
+		}
+
+		public void fatalError(SAXParseException e) throws SAXException {
+			CreatorEditorConsole.getInstance().println(
+					"SAXParseException (fatal) on parsing: " + e.toString());
+		}
+
+		public void warning(SAXParseException e) throws SAXException {
+			CreatorEditorConsole.getInstance().println(
+					"SAXParseException (warning) on parsing: " + e.toString());
+		}
+
+	}
+
+	// //////////////////////////////////////////////////////////////////
+	// Event handlers.
+	// //////////////////////////////////////////////////////////////////
+
+	/**
+	 * Handler implementaion
+	 */
+	public class CreatorXMLHandler extends DefaultHandler {
+
+
+
+		private static final String AMOUNT = "amount";
+
+		private static final String CREATORSCRIPT = "creatorscript";
+
+		private static final String MEMBERS = "members";
+
+		// Local variables and flags
+
+		private static final String FIELDS = "fields";
+
+		// flags to know depth
+		private int depth = 0;
+
+		private boolean creatorscript = false;
+		private boolean fields = false;
+		private boolean component = false;
+		private boolean subComponent = false;
+		private boolean item = false;
+		private boolean subitem = false;
+		private String subItemBaseName = "";
+		private Map<String, String> subItemMap;
+		Stack<String> elementNames = new Stack<String>();
+
+		private AbstractComponent aComponent;
+		private AbstractComponent aSubComponent;
+		private String componentType = "";
+		private String subComponentType = "";
+		// A name of element e.g. "<mobile>" on:
+		// <creatorscript version="1.0"><contact><fields><mobile>
+		private String itemName = "";
+		private Map<String, Vector<AbstractValue>> componentItems;
+		private Map<String, Vector<AbstractValue>> subComponentItems;
+		private Components components;
+		private CharArrayWriter elementContent = new CharArrayWriter();
+
+		private StringBuffer errors = new StringBuffer();
+		private int itemAmountParam;
+		private ModeTypes randomType;
+
+		private int itemIdParam;
+
+		private int itemMaxAmountParam;
+		
+		private String rightType = null;
+		
+		private String incvalueforeachcopy = null;
+
+		private int userDefinedRandomLen = -1;
+
+
+		public CreatorXMLHandler() {
+			components = new Components();
+
+		}
+
+		/**
+		 * Get components
+		 * @return components parsed
+		 */
+		public Components getComponents() {
+			return components;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.xml.sax.helpers.DefaultHandler#startDocument()
+		 */
+		public void startDocument() {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.xml.sax.helpers.DefaultHandler#endDocument()
+		 */
+		public void endDocument() {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+		 *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
+		 */
+		public void startElement(String uri, String name_, String qName,
+				Attributes atts) {
+
+			String name = name_.toLowerCase();//Element names is fixed always to be on lowercase
+			
+			elementNames.push(name);
+			 depth++;
+
+			 
+			// <creatorscript>
+			if (name.equalsIgnoreCase(CREATORSCRIPT)) {
+				creatorscript = true;
+			}
+			// <fields>
+			else if (name.equalsIgnoreCase(FIELDS) || name.equalsIgnoreCase(MEMBERS)) {
+				fields = true;
+			}			 
+			// <component>
+			else if (creatorscript && !component && !fields && !item) {
+				aComponent = ComponentServices
+						.getComponentByXMLElementName(name);
+				if (aComponent != null) {
+					component = true;
+					componentType = name;
+					componentItems = new LinkedHashMap<String, Vector<AbstractValue>>();
+					
+					handleComponentParameters(atts, aComponent);
+
+				}// if(aComponent != null){
+				else {
+					String errMsg = "Could not found component type: " + name + CreatorXML.NEW_LINE;
+					CreatorEditorConsole.getInstance().println("Error on parsing: " + errMsg);
+					errors.append(errMsg);
+				}
+			}// if(creatorscript &&!component && !fields && !item){
+
+			//sub component <component><component> e.g. <contact-set><contact>
+			else if (creatorscript && component && !fields && !item) {
+				//We found a sub component, if component is open, and field is not opened
+				aSubComponent = ComponentServices
+						.getComponentByXMLElementName(name);
+				if (aSubComponent != null) {
+					subComponent = true;
+					subComponentType = name;
+					subComponentItems = new LinkedHashMap<String, Vector<AbstractValue>>();
+					handleComponentParameters(atts, aSubComponent);
+					
+
+				}// if(aComponent != null){
+				else {
+					String errMsg = "Could not found component type: " + name + CreatorXML.NEW_LINE;
+					CreatorEditorConsole.getInstance().println("Error on parsing: " + errMsg);
+					errors.append(errMsg);
+				}
+			}// if(creatorscript &&!component && !fields && !item){			
+			
+			// <item>
+			else if (creatorscript && component && fields) {
+
+				// subitem, e.g.
+				// <creatorscript><calendar><items><attendees><attendee>
+				if (item) {
+					if (!subitem) {
+						subitem = true;
+						// subItemsStack = new Stack<AbstractValue>();
+						subItemMap = new LinkedHashMap<String, String>();
+						subItemBaseName = name;
+					}
+
+				}// else if(creatorscript && component && fields && item){
+				itemName = name;//ItemName is used with item, newer with the subitem
+				item = true;
+
+				//handle params for item
+				handleItemParams(atts, aComponent, name);
+			}// else if(creatorscript && component && fields
+
+
+			// If component was unknown (errors on XML) and we are inside of
+			// field.
+			else if (creatorscript && !component && fields) {
+				// Skipping all attributes of this component.
+			}
+			else{
+				errors.append("Unknown error when parsing component: '"+getComponent().getType() +"' with element: '" + uri +"', element local name: '" +name +"', name: '" + qName +"'." );
+			}
+
+			elementContent.reset();
+
+		}
+
+		/**
+		 * handles item level parameters
+		 * @param atts
+		 */
+		private void handleItemParams(Attributes atts,
+				AbstractComponent com, String elementName) {
+
+
+			boolean foundRandomLen = false;
+			int len = atts.getLength();
+			for (int i = 0; i < len; i++) {
+				String key = atts.getQName(i);
+				if(key.equalsIgnoreCase(AMOUNT)){
+					//Set amount to component
+					itemAmountParam = getIntParameter(key, atts.getValue(key));					
+				}
+				else if(key.equalsIgnoreCase("randomlength")){
+				
+					// randomlength parameter 
+					handleRandomParam(atts.getValue(key), com);
+					foundRandomLen = true;
+				}
+				else if(key.equalsIgnoreCase(AbstractComponent.ID_PARAMETER_ID)){
+				
+					itemIdParam = getIntParameter(key, atts.getValue(key));
+				}				
+				else if(key.equalsIgnoreCase("maxamount")){
+					itemMaxAmountParam = getIntParameter(key, atts.getValue(key));
+				}
+				else if(key.equalsIgnoreCase(AbstractComponent.INCVALUEFOREACHCOPY_PARAMETER_ID)){
+					incvalueforeachcopy = atts.getValue(key);
+				}				
+				
+				//Ecryption right type on FileType <encryption type="DRM-CD"><right type="print">
+				else if(key.equalsIgnoreCase(FileTypeVariables.TYPE_XML)){
+
+					//Handling encryption type parameter for File
+					if(elementName.equalsIgnoreCase(FileTypeVariables.ENCRYPTION_TYPE_XML)){
+						handleFileTypeEncryptionTypeParam(atts, com, elementName, key);						
+					}
+					//It's encryption right type parameter
+					else{
+						rightType = atts.getValue(key);
+					}
+					
+				}				
+				
+			}	
+			//Always must handle randomlength, even if parameter was not found
+			if(!foundRandomLen){
+				handleRandomParam(null, com);
+			}
+		}
+
+		/**
+		 * Handle <encryption type=[type]> -parameter from FileType Component
+		 * @param atts
+		 * @param com
+		 * @param elementName
+		 * @param key
+		 */
+		private void handleFileTypeEncryptionTypeParam(Attributes atts,
+				AbstractComponent com, String elementName, String key) {
+			
+			String encryptionType = atts.getValue(key);
+
+			if(com.getType().equals(CreatorEditorSettings.TYPE_FILE)){
+				AbstractValue val = ComponentServices
+					.getValueByXMLElementName(com.getXMLElementName());							
+			
+				if(encryptionType != null && !CreatorEditorSettings.isRandomText(encryptionType)){
+					val.setValue(encryptionType);								
+					val.setRandom(false);
+				}else{
+					val.setModeType(AbstractValue.ModeTypes.RandomTypeDefaultLength);
+				}
+				String itemId = com.getValueById(elementName);
+				addValueToComponent(val, itemId, componentItems);								
+			}
+		}
+
+		/**
+		 * Handles possible component level parameters
+		 * @param atts
+		 * @param comp
+		 */
+		private void handleComponentParameters(Attributes atts, AbstractComponent comp) {
+			
+			int len = atts.getLength();
+			for (int i = 0; i < len; i++) {
+				String key = atts.getQName(i);
+			
+				if(key.equalsIgnoreCase(AMOUNT)){
+					//Set amount to component
+					handleComponentAmountParameter(atts.getValue(key), comp);
+				}
+				else if(key.equalsIgnoreCase(AbstractComponent.TYPE_PARAMETER_ID)){
+				
+					//Required Type parameter for Calendar and Messages
+					handleTypeParameter(atts.getValue(key), comp);
+				}
+				else if(key.equalsIgnoreCase(AbstractComponent.ID_PARAMETER_ID)){
+				
+					//If there is "id" parameter set that to component id
+					handleIdParameter(atts.getValue(key), comp);
+				}				
+				else if(key.equalsIgnoreCase(AbstractComponent.NAME_PARAMETER_ID)){
+					String name = atts.getValue(key);
+					if(name != null && name.trim().length() > 0){
+						comp.addAdditionalParameter(AbstractComponent.NAME_PARAMETER_ID,
+								name.trim());
+					}				
+				}
+				else if(key.equalsIgnoreCase(AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID)){
+					//handle numberofexistingcontacts parameter
+					handleNumberOfExistingContactsParameters(atts.getValue(key), comp);
+				}
+				
+			}
+
+		}
+
+		/**
+		 * Handles AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID and AbstractComponent.NAME_PARAMETER_ID parameters
+		 * @param atts
+		 * @param comp
+		 */
+		private void handleNumberOfExistingContactsParameters(String value,
+				AbstractComponent comp) {
+
+			int numberOfExistingParams = AbstractComponent.NULL_ID;
+			if (value != null && value.trim().length() > 0) {
+				try {
+					numberOfExistingParams = Integer.parseInt(value);
+					comp
+							.addAdditionalParameter(
+									AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID,
+									"" + numberOfExistingParams);
+
+				} catch (Exception e) {
+					// Adding error message
+					errors
+							.append("Invalid '"
+									+ "AbstractComponent.NUMBER_OF_EXISTING_CONTACTS_PARAMETER_ID"
+									+ "' parameter in component: '"
+									+ comp.getType() + "'.");
+				}
+			}
+
+		}
+
+		/**
+		 * Sets id parameter to compoent if valid
+		 * @param value
+		 * @param com
+		 */
+		private void handleIdParameter(String value,
+				AbstractComponent com) {
+
+			if(value != null && value.trim().length() > 0){
+				try {
+					int id = Integer.parseInt(value);
+					com.setId(id);
+				} catch (Exception e) {
+					errors.append("Invalid id parameter value: '" +value +"' in component: '" +com.getType() +"'.");
+				}
+			}
+			
+		}
+
+		/**
+		 * Handles type parameter to component
+		 * @param typeParameter
+		 * @param comp
+		 */
+		private void handleTypeParameter(String typeParameter, AbstractComponent comp) {
+			if(typeParameter != null && typeParameter.trim().length() > 0){
+				comp.addAdditionalParameter(AbstractComponent.TYPE_PARAMETER_ID, typeParameter.trim());
+			}
+		}
+
+		/**
+		 * Handles random parameter
+		 * @param randomlength
+		 */
+		private void handleRandomParam(String randomlength,
+				AbstractComponent com) {
+			//if randomlenght parameter is set
+			if (randomlength != null && randomlength.trim().length() > 0) {
+
+				if (randomlength.equalsIgnoreCase(AbstractVariables.RANDOM_LEN_DEFAULT_XML_VALUE)) {
+					randomType = ModeTypes.RandomTypeDefaultLength;
+				} else if (randomlength.equalsIgnoreCase(AbstractVariables.RANDOM_LEN_MAX_XML_VALUE)) {
+					randomType = ModeTypes.RandomTypeMaxLength;
+				}
+				else {
+					// Set to user defined random length
+					try {
+						userDefinedRandomLen = Integer
+									.parseInt(randomlength);
+						randomType = ModeTypes.RandomTypeUserDefinedLength;
+					} catch (Exception e) {
+						// set to default length when error occurs
+						randomType = ModeTypes.RandomTypeDefaultLength;
+						errors.append("Invalid randomlength parameter value: '" +randomlength +"' in component: '" +com.getType() +"'.");
+						userDefinedRandomLen = -1;
+					}
+
+				}
+			}
+			//randomlength parameter was not set 
+			else {
+				// NOTE: item might also be default len random type if not
+				// set and there is no value
+				// that will be taken care of in endElement. In here just
+				// setting value so known at it was not set
+				randomType = ModeTypes.RandomTypeNotRandom;
+			}
+		}
+
+
+		
+		
+		/**
+		 * Get int parameter
+		 * @param value
+		 * @return 0 if not found or invalid, value as int otherwise
+		 */
+		private int getIntParameter(String parameterName, String value) {
+			int valueInt = 0;
+			if (value != null && value.trim().length() > 0) {
+				try {
+					valueInt = Integer.parseInt(value);
+				} catch (Exception e) {
+					errors.append("Not supported '" +parameterName +"' value: '" + value
+							+ "' attribute in item: '" + itemName
+							+ "' in component: '" + componentType + "'");
+					valueInt = 0;
+				}
+			} 
+			return valueInt;
+		}
+		
+		
+		/**
+		 * Handles component amount parameter
+		 * @param amount
+		 * @param comp
+		 */
+		private void handleComponentAmountParameter(String amount, AbstractComponent comp) {
+			if (amount != null && amount.trim().length() > 0) {
+				try {
+					int am = Integer.parseInt(amount);
+					comp.setAmount(am);
+				} catch (Exception e) {
+					errors.append("Not supported amout: '" + amount
+							+ "' attribute in component: '"
+							+ componentType + "'");
+				}
+			}// if(aComponent != null){
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+		 *      java.lang.String, java.lang.String)
+		 */
+		public void endElement(String uri, String name_, String qName) {
+
+			String name = name_.toLowerCase();//Element names is fixed always to be on lowercase
+			
+			
+			elementNames.pop();
+			depth--;
+
+			
+			// </creatorscript>
+			if (name.equalsIgnoreCase(CREATORSCRIPT)) {
+				creatorscript = false;
+			}
+
+			// </fields>
+			else if (name.equalsIgnoreCase(FIELDS) || name.equalsIgnoreCase(MEMBERS)) {
+				fields = false;
+			}			
+			// </component>
+			else if (creatorscript && component && !subComponent && !fields) {
+
+				if (name.equals(componentType)) {
+					aComponent.setAttributes(componentItems);
+					// If component is known, e.g. is not type UnknownCompoment
+					// (CreatorEditorSettings.TYPE_UNKNOWN)
+					if (!aComponent.getType().equals(
+							CreatorEditorSettings.TYPE_UNKNOWN)) {
+						components.addComponent(aComponent);
+					}
+					// Else component is UnknownComponent and is added to errors
+					else {
+						String errMsg = "Component type: '" + componentType
+							+ "' not supported. Component with following information was skipped: "
+							+ aComponent.toString();
+						errors.append(errMsg);
+						CreatorEditorConsole.getInstance().println(
+								"Error on parsing component, error was; " + errMsg);							
+
+					}
+					component = false;
+					componentType = "";
+					//Making sure that also sub component is closed when component is closed
+					subComponent = false;
+					subComponentType = "";
+				}
+
+			}
+			// </component></component> == subcomponent closing
+			else if (creatorscript && component && subComponent && !fields) {
+
+				//Collecting subcomponent data, and adding it as reference to component
+				if (name.equals(subComponentType)) {
+					aSubComponent.setAttributes(subComponentItems);
+					// If component is known, e.g. is not type UnknownCompoment
+					// (CreatorEditorSettings.TYPE_UNKNOWN)
+					if (!aSubComponent.getType().equals(
+							CreatorEditorSettings.TYPE_UNKNOWN)) {
+						//This might seems to be hazard code, but it goest that way, that 
+						//sub component has a reference to component, not vice versa
+						aSubComponent.setReferenceToAnotherComponent(aComponent);
+						components.addComponent(aSubComponent);
+					}
+					// Else component is UnknownComponent and is added to errors
+					else {
+						String errMsg = "Component type: '" + subComponentType
+										+ "' under component: '" +componentType 
+										+ "' not supported. Component with following information was skipped: "
+										+ aSubComponent.toString();
+						errors.append(errMsg);
+						CreatorEditorConsole.getInstance().println(
+								"Error on parsing sub component, error was; " + errMsg);						
+					}
+					subComponent = false;
+					subComponentType = "";
+				}
+
+			}			
+			
+			// </item>
+			else if (creatorscript && component && fields && item && !subitem) {
+				
+				if (name.equals(itemName) ) {					
+
+					// Get real value type by component type
+					AbstractValue val = ComponentServices
+							.getValueByXMLElementName(getComponent().getXMLElementName());								
+
+					// If there was component type that is not supported
+					if (val != null) {
+						
+						if (val instanceof FileTypeValue && name.equalsIgnoreCase(FileTypeVariables.ENCRYPTION_TYPE_XML)){
+							
+							//Because of file type encryption is handled in #handleFileTypeEncryptionTypeParam()
+							//We skip handling it here. Thats because of encryption has no value, but only parameter
+							//and default implementation is that empty element means random value, and there is no random 
+							//encryption values. Element is added earlier because of component order in list occurs how they
+							//added and it causes other issues to handle first possible elements and later on element parameters
+							//(mainly element parameters is handled first, and so its done with encryption parameters also).
+							
+						}else{
+						
+							setValueParamsAndSetAsContactSetReference(val, itemName);
+	
+							// Get Vector where all same named values is stored,
+							// e.g. if one contact has many "First names" all is
+							// stored to same vector
+							String itemId = getComponent().getValueById(itemName);
+							if (itemId != null) {
+								
+								// When found closing point to subitem		
+								if(subComponent){
+									addValueToComponent(val, itemId, subComponentItems);
+								}else{
+									addValueToComponent(val, itemId, componentItems);
+								}
+								
+							}					
+							else {
+								String errMsg = "Element: ' " + itemName
+										+ "' in component: '"
+										+ getComponent().getXMLElementName()
+										+ "' is not supported." +CreatorXML.NEW_LINE;
+								errors.append(errMsg);
+							}
+						}
+
+					}// if(val != null){					
+					// Else we found a component value that is not supported.
+					else {
+						String errMsg = "Could not found values for component: "
+								+ getComponent().getType() + CreatorXML.NEW_LINE;
+						CreatorEditorConsole.getInstance().println(
+								"Error on parsing: " + errMsg);
+						errors.append(errMsg);
+					}
+				}
+					
+				
+				itemName = "";
+				item = false;
+				itemAmountParam = 0;						
+
+			}// else if(creatorscript && component && fields && item &&  !subitem){
+			//<subitem>
+			else if (creatorscript && component && fields && item && subitem) {
+				
+				//E.g. <attendee> in calendar are subitems
+				//<calendar type="appointment"><fields><summary>MEETING</summary><attendees><attendee><email>...
+				
+				// Get real value type by component type
+				AbstractValue val = ComponentServices
+						.getValueByXMLElementName(aComponent.getXMLElementName());
+
+				// If there was component type that is not supported
+				if (val != null) {
+
+					setValueParamsAndSetAsContactSetReference(val, subItemBaseName);
+
+					//If sub item is closing
+					if (name.equals(subItemBaseName)) {
+						
+						subitem = false;
+
+						// Get Vector where all same named values is stored,
+						// e.g. if one contact has many "First names" all is
+						// stored to same vector
+						String itemId = aComponent.getValueById(subItemBaseName);
+						
+						if (itemId != null) {
+
+							// If we are inside of element where is sub elements
+							if (val instanceof CalendarValue) {
+
+								handleCalendarSubValue(name, qName, val, itemId);
+
+
+							}// if(subitem && val instanceof CalendarValue){
+							//When its message value, and its under from or to, get item ID so it will be from / to							
+							else if (val instanceof MessageValue) {
+								
+								handleMessageSubValue(name, qName, val, subItemBaseName, elementNames.lastElement());
+
+							}// if(subitem && val instanceof CalendarValue){
+							//When it's a FileType, there can be encryption 
+							//<ecryption><type="DRM-CD"><right type="[value]"><count></count>...  
+							else if (val instanceof FileTypeValue) {
+								
+								handleFileTypeSubValue(name);
+
+							}// if(subitem && val instanceof CalendarValue){								
+							// Error: 
+							else {
+								errors.append("Unknown subelement type: '" +itemId +"' found in: " +val.getType() +CreatorXML.NEW_LINE);
+							}
+						}// if(itemId != null){
+						else {
+							String errMsg = "Element: ' " + subItemBaseName + "' in component: '" 
+								+ aComponent.getXMLElementName() + "' is not supported." +CreatorXML.NEW_LINE;
+							errors.append(errMsg);
+						}
+
+						
+						
+					}// if(name.equals(subItemBaseName)){
+					//else sub item does not closed yet but it was a element of sub element
+					else {
+						// Creating sub value values and put them a side for waiting until closing point of
+						// sub element is found  e.g. email and common name in
+						// <attendee><email/><commonname/></attendee> 
+						
+						//When type is file, there can be several count, starttime, endtime, 
+						//interval and accumulated elemets, those must be possible to distinguish each other, 
+						//thats why encryption Right type is used in parameter name inside of Creator editor  
+						if(val instanceof FileTypeValue && rightType != null) {
+
+							String uiId = FileTypeVariables.getEncryptionId(rightType, name);
+							String uiCompName = aComponent.getValueById(uiId);
+							if(uiCompName != null){
+								addValueToComponent(val, uiCompName, componentItems);
+							}else{
+								String errMsg = "Element: ' " + name + "' under " +FileTypeVariables.RIGHT_XML +" " 
+									+FileTypeVariables.TYPE_XML +": '" +rightType
+									+  "' in component: '" + aComponent.getXMLElementName() 
+									+ "' is not supported." +CreatorXML.NEW_LINE;
+								errors.append(errMsg);
+							}
+						}else{
+							subItemMap.put(name, val.getValue());
+						}
+					}
+				}// if(val != null){
+
+				// Else we found a sub component value that is not supported.
+				else {
+					String errMsg = "Could not found values for component: " + aComponent.getType() + CreatorXML.NEW_LINE;
+					CreatorEditorConsole.getInstance().println( "Error on parsing: " + errMsg);
+					errors.append(errMsg);
+				}
+
+			}//else if (creatorscript && component && fields && item && subitem) {
+
+		}
+
+		/**
+		 * @param name
+		 */
+		private void handleFileTypeSubValue(String name) {
+			
+			if(name.equalsIgnoreCase(FileTypeVariables.RIGHT_XML)){
+				rightType = null;
+			}
+
+		}
+
+		/**
+		 * @param name
+		 * @param qName
+		 * @param val
+		 * @param currentElementName
+		 * @param superElementType
+		 */
+		private void handleMessageSubValue(String name, String qName,
+				AbstractValue val, String currentElementName, String superElementType) {
+
+
+			MessageValue mesVal = (MessageValue) val; 
+
+			//What value types was in under <item><subitem> -subitems
+			Set<String> subItemKeys = subItemMap
+						.keySet();
+				// Looping through all sub elements and add
+				// them to element (value)
+				for (Iterator<String> iterator = subItemKeys
+						.iterator(); iterator.hasNext();) {
+
+					String key = (String) iterator.next();
+					mesVal.setValue(subItemMap
+							.get(key));
+				}
+				mesVal.setType(MessageVariables.getValueByIds(superElementType, name));
+
+				String id = MessageVariables.getInstance().getIDByValueAndType(currentElementName, superElementType);
+				
+				// When found closing point to subitem									
+				if(subComponent){
+					addValueToComponent(val, id, subComponentItems);
+				}else{
+					addValueToComponent(val, id, componentItems);
+				}									
+		}		
+		
+		/**
+		 * Handles sub value of calendar type
+		 * @param name
+		 * @param qName
+		 * @param val
+		 * @param itemId
+		 */
+		private void handleCalendarSubValue(String name, String qName,
+				AbstractValue val, String itemId) {
+			// If this is the closing point of element where
+			// was sub elements
+			// Collecting sub element datas and add them to
+			// element
+			// e.g. //e.g. attendee in
+			// <calendar><attendee><email/><commonname/></attendee></calendar>
+
+
+				CalendarValue calVal = (CalendarValue) val;
+
+				Set<String> subItemKeys = subItemMap
+						.keySet();
+				// Looping through all sub elements and add
+				// them to element (value)
+				for (Iterator<String> iterator = subItemKeys
+						.iterator(); iterator.hasNext();) {
+
+					String key = (String) iterator.next();
+					calVal.setValue(key, subItemMap
+							.get(key));
+				}
+
+				// When found closing point to subitem									
+				if(subComponent){
+					addValueToComponent(val, itemId, subComponentItems);
+				}else{
+					addValueToComponent(val, itemId, componentItems);
+				}									
+		}
+
+		/**
+		 * Get component or sub component, depending on value of subComponent
+		 * @return a aSubComponent if subComponent == true
+		 */
+		private AbstractComponent getComponent() {
+			if(subComponent){
+				return aSubComponent;
+			}else{
+				return aComponent;
+			}
+		}
+
+		/**
+		 * Set Parameters to value, resets Parameter values when used.
+		 * @param value
+		 * @param XML element name where parameters belongs to.
+		 */
+		private void setValueParamsAndSetAsContactSetReference(AbstractValue val, String xmlElementName) {
+			
+			
+			if(CreatorEditorSettings.isContactSetReference(xmlElementName)){
+				val.setContactSetReference(true);
+			}
+			
+			// If there is some content, its not a random value,
+			// otherwise it is a random value
+			if (itemAmountParam != 0) {
+				val.setAmount(itemAmountParam);
+				itemAmountParam = 0;
+			}
+			
+			if ( itemIdParam != 0) {
+				val.setId(itemIdParam);
+				itemIdParam = 0;
+			}
+
+			if ( itemMaxAmountParam != 0) {
+				val.setMaxAmount(itemMaxAmountParam);
+				itemMaxAmountParam = 0;
+			}		
+			
+			
+			//
+			//Setting random values & modes
+			//
+
+			if (elementContent != null
+					&& elementContent.toString().trim().length() > 0) {
+				val.setValue(elementContent.toString());
+				val.setRandom(false);
+				
+				if(incvalueforeachcopy != null && incvalueforeachcopy.equalsIgnoreCase(AbstractComponent.TRUE)){
+					//Setting value to null when its used.
+					val.setModeType(ModeTypes.ModeTypeIncValueForEachCopy);					
+					incvalueforeachcopy = null;
+				}					
+				
+			}else if(val.isContactSetReference()){
+				val.setRandom(false);//Contact set reference cannot be random
+			}
+			//Otherwise its a random
+			else {
+				if (randomType != ModeTypes.RandomTypeNotRandom) {
+					val.setModeType(randomType);
+					if(randomType == ModeTypes.RandomTypeUserDefinedLength){
+						val.setRandomValueLenght(userDefinedRandomLen);
+					}
+				} else {
+					val.setModeType(ModeTypes.RandomTypeDefaultLength);
+				}
+
+			}
+		}
+
+		/**
+		 * Add a value to component
+		 * @param val
+		 * @param itemId
+		 * @param items
+		 */
+		private void addValueToComponent(AbstractValue val, String itemId, Map<String, Vector<AbstractValue>> items) {
+			Vector<AbstractValue> itemValues = items.get(itemId);
+			if (itemValues == null) {
+				// If this was a first item with this name, creating a new
+				// Vector to store values
+				itemValues = new Vector<AbstractValue>();
+			}
+			itemValues.add(val);
+			//putting items bact to table
+			items.put(itemId, itemValues);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+		 */
+		public void characters(char ch[], int start, int length) {
+			elementContent.write(ch, start, length);
+		}
+
+		/**
+		 * @return Errors String
+		 */
+		public String getErrors() {
+			return errors.toString();
+		}
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="FrameWork" default="cc" basedir=".">
+
+	<!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+	<property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	
+	<property name="feature.project.folder" location="com.nokia.s60tools.extensions.framework"/>
+	<property name="feature.project.name" value="com.nokia.s60tools.extensions.framework"/>
+	<property name="feature.name" value="framework"/>
+	<property name="help.project.name" value="com.nokia.carbide.tool.help"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	<property name="feature.name" value="Framework"/>
+	
+	<!-- Folder definitions -->
+	
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="carbide.adt.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="test.sdk.folder" location="com.nokia.s60tools.sdk.tests"/>
+	<property name="test.util.folder" location="com.nokia.s60tools.util.tests"/>
+	
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+	
+		<!--<buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.int.folder}" projectname="com.nokia.carbide.tool.help" destDir="${destination.path}" packageAsJar="true">
+  			<javacLibraryCompiler>
+  					<compilerSettings debug="true" fork="true"/>
+  			</javacLibraryCompiler>
+  	</buildPlugin>-->
+	
+  	<!-- Build MultiTestRunner feature -->
+  	<buildFeature workspace="${workspace.path}"
+               targetPlatformLocation="${carbide.int.folder}"
+               projectname="${feature.project.name}"
+               buildPluginTarget="build.plugin"
+               destDir="${destination.path}" />
+  </target>
+  
+  <target name="feature" depends="">
+  
+		<copy todir="plugins">
+				<fileset dir="C:\hudson\jobs\Framework SDK\workspace\com.nokia.s60tools.sdk\plugins"/>
+		</copy>		
+		<copy todir="plugins">
+				<fileset dir="C:\hudson\jobs\Framework UI\workspace\com.nokia.s60tools.ui\plugins"/>
+		</copy>
+		<copy todir="plugins">
+				<fileset dir="C:\hudson\jobs\Framework Util\workspace\com.nokia.s60tools.util\plugins"/>
+		</copy>
+				
+		<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+				<fileset dir="C:\hudson\jobs\Framework Testsupport\workspace\com.nokia.s60tools.testsupport\plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+				<fileset dir="C:\hudson\jobs\Framework Testsupport\workspace\com.nokia.s60tools.testsupport\plugins"/>
+		</copy>
+		<copy todir="${carbide.adt.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+				<fileset dir="C:\hudson\jobs\Framework Testsupport\workspace\com.nokia.s60tools.testsupport\plugins"/>
+		</copy>
+		
+  </target>
+  <target name="create.zip">
+  
+  	<delete dir="${binaries.folder}/nightly_builds"/>
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+  	
+ 		 <!-- Zip jars to ActiveObjectAnalyser.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia*.*/"/>
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+	
+	<target name="cc" depends="build.plugins, feature, create.zip" description="build.plugins, instrument, run unit tests and analyze code"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.extensions.framework/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.extensions.framework/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.s60tools.extensions.framework"
+      label="Carbide.c++ Extensions - Framework plug-ins"
+      version="1.7.0"
+      provider-name="Nokia">
+
+   <description>
+      Common framework plug-ins feature contains following plug-ins:
+com.nokia.s60tools.util:
+Util plug-in provides miscellaneous utility classes for logging
+to Eclipse’s Console view output, for parametrizable debugging,
+and for interaction with external command line tools. 
+com.nokia.s60tools.ui:
+UI plug-in provides classes providing reusable UI services, such
+as, dialogs, customized UI components, custom sorters, and other
+UI related helper classes.
+com.nokia.s60tools.sdk (deprecated):
+Plug-in SDK provides from Carbide.c++ v1.2 onwards a stable API
+for accessing SDK related services. This API is deprecated, and
+by com.nokia.carbide.cpp.sdk.core should be used instead whenever 
+possible. This SDK plugin is still however in use because of backward
+compatibility reasons, and it also offers some services that 
+are not available via Carbide&apos;s SDK API.
+   </description>
+
+   <copyright>
+      Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+   </copyright>
+
+   <license>
+Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="com.nokia.carbide.cpp.sdk.core"/>
+      <import plugin="org.eclipse.cdt.core"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.ui.console"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="com.freescale.cdt.debug.cw.core" version="1.4.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.cdt.core" version="5.0.1" match="greaterOrEqual"/>
+      <import plugin="com.nokia.carbide.cpp.project.core"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.sdk"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.util"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.extensions.framework/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/.settings/org.eclipse.core.resources.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3 @@
+#Tue Apr 03 14:55:18 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/sdk/internal/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Mon Aug 18 15:47:30 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - SDK Manager Service
+Bundle-SymbolicName: com.nokia.s60tools.sdk
+Bundle-Version: 1.5.0
+Bundle-Activator: com.nokia.s60tools.sdk.internal.SdkPlugin
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.core.runtime,
+ com.nokia.carbide.cpp.sdk.core,
+ org.eclipse.cdt.core
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.sdk
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>October 5, 2009</p>	
+
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               about.html
+javacSource=1.5
+javacTarget=1.5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,191 @@
+  
+<project name="com.nokia.s60tools.sdk" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="FrameworkSDK"/>
+  <property name="project.name" value="com.nokia.s60tools.sdk" />
+  <property name="jar.filename" value="${ant.project.name}.jar"/>
+  
+  <!-- Folder definitions -->
+  <property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+  
+  <property name="carbide.folder" value="C:/Carbide_internal" />
+	<property name="carbide.int.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	
+	<property name="test.folder" location="../${ant.project.name}.tests"/>
+  <property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<!-- Folders -->
+	<delete dir="${instr.folder}"/>
+	<mkdir dir="${instr.folder}"/>
+	
+	<delete dir="${reports.folder}"/>
+	<mkdir dir="${reports.folder}"/>
+	
+	<!-- Carbide_classpath -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+  <!-- Delete old plugins and features -->
+  <target name="delete">
+	  <delete dir="plugins" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+	  <delete dir="bin" failonerror="false"/>
+  </target>
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+  
+  <!-- Copy necessary resources -->
+		<copy todir="bin/" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+  
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+  
+  
+  <!-- Instrumentation target, depends on build.mtrunner -->
+	<target name="instr" depends="build.plugins">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="bin" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+  
+  
+  <target name="create.zip">
+  
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+ 		 <!-- Zip jars to ActiveObjectAnalyser.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia.carbide.extensions.*/"/>
+  </target>
+  
+  <!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd shortFileNames="true">
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="../${ant.project.name}.tests/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr, analyze" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="carbide_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="${ant.project.name}.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+  
+  
+  <!-- Target Build all -->
+  <target name="build.all" depends="delete, build.plugins, instr, create.zip, analyze,test" />
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.sdk" default="cc" basedir=".">
+	
+		<target name="cc" depends="build, instr, analyze, test" description="Build, instrument, run unit tests and analyze code"/>
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	<property name="feature.name" value="Framework"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="carbide.adt.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="test.folder" location="../com.nokia.s60tools.sdk.tests"/>
+	<property name="binaries.folder" location="C:\Hudson\jobs\Framework\workspace\trunk\${feature.name}.binaries"/>
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<delete dir="${instr.folder}"/>
+		<mkdir dir="${instr.folder}"/>
+		
+		<delete dir="../plugins"/>
+		<mkdir dir="../plugins"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+		
+		<zip destfile="../plugins/${jar.filename}">
+				<fileset dir="${build.result.folder}">
+							<include name="com/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="about.html"/>
+				</fileset>
+		</zip>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+	</target>
+	
+	
+	
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="build">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="../plugins/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+	
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="${test.folder}/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+
+
+		<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<fileset dir="${carbide.adt.folder}" includes="**/*.jar" />
+		</path>
+  
+  <!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+	    
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.sdk.tests.AllPureJUnitTests" todir="${reports.folder}"/> 	
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+  
+	
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/RVCTToolChainInfo.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.sdk;
+
+/**
+ * Stores information about single RVCT
+ * (=RealView Compiler Tools) toolchain 
+ * installation
+ */
+public class RVCTToolChainInfo {
+	
+	/**
+	 * Toolchain installation directory location.
+	 */
+	private String rvctToolBinariesDirectory = null;
+	
+	/**
+	 * Toolchain version.
+	 */
+	private String rvctToolsVersion = null;
+	
+	/**
+	 * Default constructor.
+	 * Cannot be constructed outside of this package.
+	 */
+	RVCTToolChainInfo(){
+		rvctToolBinariesDirectory = new String(""); //$NON-NLS-1$
+		rvctToolsVersion = new String("");		 //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets RVCT toolchain installation directory.
+	 * @return Returns the rvctToolBinariesDirectory.
+	 */
+	public String getRvctToolBinariesDirectory() {
+		return rvctToolBinariesDirectory;
+	}
+
+	/**
+	 * Sets RVCT toolchain installation directory. 
+	 * Setters cannot be used outside this package.
+	 * @param rvctToolBinariesDirectory The rvctToolBinariesDirectory to set.
+	 */
+	void setRvctToolBinariesDirectory(String rvctToolBinariesDirectory) {
+		this.rvctToolBinariesDirectory = rvctToolBinariesDirectory;
+	}
+
+	/**
+	 * Gets RVCT toolchain version.
+	 * @return Returns the rvctToolsVersion.
+	 */
+	public String getRvctToolsVersion() {
+		return rvctToolsVersion;
+	}
+
+	/**
+	 * Sets RVCT toolchain version.
+	 * Setters cannot be used outside this package.
+	 * @param rvctToolsVersion The rvctToolsVersion to set.
+	 */
+	void setRvctToolsVersion(String rvctToolsVersion) {
+		this.rvctToolsVersion = rvctToolsVersion;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkEnvInfomationResolveFailureException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.sdk;
+
+/**
+ * Exception thrown in case something fails when trying
+ * find out facts about current SDK/Platform environment.
+ */
+public class SdkEnvInfomationResolveFailureException extends Exception {
+		
+	static final long serialVersionUID = -6103977959428981590L;
+
+	/**
+	 * Default constructor.
+	 */
+	public SdkEnvInfomationResolveFailureException(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message.
+	 * @param message Informative message about situation causing the exception.
+	 */
+	public SdkEnvInfomationResolveFailureException(String message){
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkInformation.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,205 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.sdk;
+
+import java.io.File;
+import java.util.ArrayList;
+
+
+/**
+ * Stores SDK/Platform related information.
+ */
+public class SdkInformation {
+	
+	
+	/**
+	 * SDK/Platform identifier,
+	 */
+	private String sdkId = null;
+	
+	/**
+	 * Name of the SDK/Platform.
+	 */
+	private String sdkName = null;
+	
+	/**
+	 * Epoc root directory i.e. SDK/Platform installation directory
+	 * location (absolute path).
+	 */
+	private String epocRootDir = null;
+	
+	/**
+	 * Tools directory location under epoc32 directory (absolute path).
+	 */
+	private String epoc32ToolsDir = null;
+	
+	/**
+	 * Release directory location under epoc32 directory (absolute path).
+	 */
+	private String releaseRootDir = null;
+	
+	/**
+	 * Default construtor.
+	 * Cannot be constructed outside of this package.
+	 */
+	SdkInformation(){
+		sdkId = new String(""); //$NON-NLS-1$
+		sdkName = new String(""); //$NON-NLS-1$
+		epocRootDir = new String(""); //$NON-NLS-1$
+		epoc32ToolsDir = new String(""); //$NON-NLS-1$
+		releaseRootDir = new String(""); //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets epoc root directory. 
+	 * @return Returns the epocRootDir.
+	 */
+	public String getEpocRootDir() {
+		return epocRootDir;
+	}
+
+	/**
+	 * Sets epoc root directory.
+	 * Setters cannot be used outside this package.
+	 * @param epocRoot The epocRootDir to set.
+	 */
+	void setEpocRootDir(String epocRoot) {
+		this.epocRootDir = epocRoot;
+	}
+
+	/**
+	 * Gets the name of the SDK/Platform.
+	 * @return Returns the sdkName.
+	 */
+	public String getSdkName() {
+		return sdkName;
+	}
+
+	/**
+	 * Sets the name of the SDK/Platform.
+	 * Setters cannot be used outside this package.
+	 * @param sdkName The sdkName to set.
+	 */
+	void setSdkName(String sdkName) {
+		this.sdkName = sdkName;
+	}
+
+	/**
+	 * Gets SDK/Platform identifier.
+	 * @return Returns the sdkId.
+	 */
+	public String getSdkId() {
+		return sdkId;
+	}
+
+	/**
+	 * Sets SDK/Platform identifier.
+	 * Setters cannot be used outside this package.
+	 * @param sdkId The sdkId to set.
+	 */
+	void setSdkId(String sdkId) {
+		this.sdkId = sdkId;
+	}
+
+	/**
+	 * Gets epoc32 tools directory.
+	 * @return Returns the epoc32ToolsDir.
+	 */
+	public String getEpoc32ToolsDir() {
+		return epoc32ToolsDir;
+	}
+
+	/**
+	 * Sets epoc32 tools directory.
+	 * Setters cannot be used outside this package.
+	 * @param epoc32ToolsDir The epoc32ToolsDir to set.
+	 */
+	void setEpoc32ToolsDir(String epoc32ToolsDir) {
+		this.epoc32ToolsDir = epoc32ToolsDir;
+	}
+
+	/**
+	 * Gets release directory residing under epoc32 directory.
+	 * @return Returns the releaseRootDir.
+	 */
+	public String getReleaseRootDir() {
+		return releaseRootDir;
+	}
+
+	/**
+	 * Sets release root directory.
+	 * Setters cannot be used outside this package.
+	 * @param releaseRootDir The releaseRootDir to set.
+	 */
+	void setReleaseRootDir(String releaseRootDir) {
+		this.releaseRootDir = releaseRootDir;
+	}
+	
+	/**
+	 * Return target platform names that are found under 
+	 * release root directory (e.g. armi, thumb, armv5 etc.) for 
+	 * this SDK/Platform.
+	 * @return String array of target platform names.
+	 */
+	public String[] getPlatforms(){
+		ArrayList<String> platforms = new ArrayList<String>();
+		File releaseDir = new File(releaseRootDir);
+		if(releaseDir.isDirectory()){
+			File[] fileListArr = releaseDir.listFiles();
+			for (int i = 0; i < fileListArr.length; i++) {
+				File f = fileListArr[i];
+				if(f.isDirectory()){
+					platforms.add(f.getName());					
+				}
+				
+			}
+		}
+		return (String[]) platforms.toArray(new String[0]);
+	}
+	
+	/**
+	 * Returns build types found for the given target platform. 
+	 * @param platformName Name of the platform.
+	 * @return String array of build type names.
+	 */
+	public String[] getBuildTypesForPlatform(String platformName){
+		ArrayList<String> builtTypes = new ArrayList<String>();
+		File platformDir = new File(releaseRootDir + File.separatorChar + platformName);
+		if(platformDir.isDirectory()){
+			File[] fileListArr = platformDir.listFiles();
+			for (int i = 0; i < fileListArr.length; i++) {
+				File f = fileListArr[i];
+				if(f.isDirectory()){
+					builtTypes.add(f.getName());					
+				}
+				
+			}
+		}
+		return (String[]) builtTypes.toArray(new String[0]);
+	}
+	
+	/**
+	 * Checks if the EPOCROOT directory exists for the SDK.
+	 * @return <code>true</code> if EPOCROOT directory exists, otherwise <code>false</code>.
+	 */
+	public boolean epocRootExists() {
+		File epocrootDir = new File(getEpoc32ToolsDir());
+		return epocrootDir.exists();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,457 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.sdk;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.utils.WindowsRegistry;
+import org.eclipse.core.runtime.Plugin;
+
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.s60tools.sdk.internal.Messages;
+
+
+/**
+ * This class acts as a facade to the services that are 
+ * used to query the information related to installed SDKs.
+ * It is not possible to create instance of this class
+ * because all the SDK information query methods can 
+ * be accessed in static fashion as shown in the following 
+ * usage example:
+ *  
+ * <code>
+ * <pre>
+ * 
+ * RVCTToolChainInfo[] rvctTools = SdkManager.getInstalledRVCTTools();
+ * 
+ * if(rvctTools.length > 0){
+ *     for (int i = 0; i < rvctTools.length; i++) {
+ *       // Doing the wanted operations on RVCT toolchain information...
+ *     }
+ * }
+ * else{
+ *    // No RVCT tools found error handling...
+ * }
+ * 
+ * </pre>
+ * </code> 
+ * @see SdkInformation
+ * @see RVCTToolChainInfo
+ */
+public class SdkManager extends Plugin {
+		
+	/**
+	 * Search string used to find Sourcery G++ toolchain installation from path variable. 
+	 */
+	private static final String SOURCERY_TOOLCHAIN_SEARCH_STR = "sourcery"; //$NON-NLS-1$
+
+	/**
+	 * Binaries for CSL Arm toolchain and Sourcery G++ are stores in bin sub directory.
+	 */
+	private static final String BIN_DIR_NAME_FOR_GCC_TOOLS = "bin"; //$NON-NLS-1$
+
+	/**
+	 * Separator character in Win32 to separated directory entries in path environement variable.
+	 */
+	private static final String WIN32_PATH_ENTRY_SEPARATOR_STRING = ";"; //$NON-NLS-1$
+
+	/**
+	 * Environment variable name in Win32 to store currently used path. 
+	 */
+	private static final String WIN32_PATH_ENV_VAR_NAME = "PATH"; //$NON-NLS-1$
+
+	/**
+	 * RVCT compiler executable name.
+	 */
+	private static final String ARMCC_EXE_FILE_NAME = "armcc.exe"; //$NON-NLS-1$
+
+	/**
+	 * Registry key location under HKEY_LOCAL_MACHINE for checking CSL Arm Toolchain installation directory. 
+	 */
+	private static final String CSL_ARM_TOOLCHAIN_REG_PATH="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\CSL Arm Toolchain (arm-symbianelf)_is1"; //$NON-NLS-1$
+
+	/**
+	 * Registry key location under HKEY_LOCAL_MACHINE for checking Sourcery G++ Lite installation directory. 
+	 */
+	private static final String SOURCERY_GPP_LITE_TOOLCHAIN_REG_PATH="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Sourcery G++ Lite for ARM SymbianOS"; //$NON-NLS-1$
+	
+	/**
+	 * Registry key for checking installation directory for a toolchain. 
+	 */
+	private static final String TOOLCHAIN_INSTALL_LOC_REG_KEY="InstallLocation"; //$NON-NLS-1$
+	
+	/**
+	 * This environment variable points to the RVCT tools
+	 * that are used by default in the user's workstation.
+	 * List contains all known RVCT tool version environment
+	 * variable names. If new variables found, they will be added 
+	 * to this list. First item on list is oldest (smallest version number)
+	 * and last item on list is the newest one (greatest version number).
+	 * 
+	 * Currently first one is RVCT22BIN and last RVCT31BIN.
+	 * 
+	 * Remember to update also RVCT_BIN_ENV_VARIABLE_VERSION_NUMBERS when updated.
+	 * 
+	 */
+	private static final String [] RVCT_BIN_ENV_VARIABLES = {
+		"RVCT22BIN",//$NON-NLS-1$
+		"RVCT30BIN", //$NON-NLS-1$
+		"RVCT31BIN", //$NON-NLS-1$
+		"RVCT40BIN"}; //$NON-NLS-1$
+	
+	/**
+	 * Version numbers for RVCT_BIN_ENV_VARIABLES, order and count must mach ones in {@link SdkManager.RVCT_BIN_ENV_VARIABLES}}
+	 * 
+	 * Remember to update also RVCT_BIN_ENV_VARIABLES when updated.
+	 */
+	private static final String [] RVCT_BIN_ENV_VARIABLE_VERSION_NUMBERS = {
+		"2.2",//$NON-NLS-1$
+		"3.0", //$NON-NLS-1$
+		"3.1", //$NON-NLS-1$
+		"4.0"}; //$NON-NLS-1$
+		
+	
+	/**
+	 * The constructor is private for prohibiting
+	 * the creation of the class because all the
+	 * service method are static ones.
+	 */
+	private SdkManager() {
+	}
+
+	/**
+	 * Gets the list of all configured SDKs with the
+	 * all the information required by the application.
+	 * @return Collection of SdkInformation objects.
+	 * @throws SdkEnvInfomationResolveFailureException 
+	 */
+	public static SdkInformation[] getSdkInformation() throws SdkEnvInfomationResolveFailureException{
+		
+		Vector<SdkInformation> configuredSdks = new Vector<SdkInformation>();		
+				    	
+		List<ISymbianSDK> sdkList = null;
+
+		ISDKManager spPlugin = SDKCorePlugin.getSDKManager();
+		sdkList = spPlugin.getSDKList();
+					
+		extractSdkInformation(configuredSdks, sdkList);		
+		
+		return configuredSdks.toArray(new SdkInformation[0]);
+	}
+
+	/**
+	 * Extracts per SDK information.
+	 * @param configuredSdks Vector to store found SDKs into. 
+	 * @param sdkListMap SDK list map to browse for necessary information.
+	 */
+	private static void extractSdkInformation(Vector<SdkInformation> configuredSdks, List<ISymbianSDK> sdkList) {
+		
+		SdkInformation sdkInfoReturned = null;	
+		//Collection sdkCollection = sdkListMap.values();
+		
+		for (Iterator<ISymbianSDK> iter = sdkList.iterator(); iter.hasNext();) {			
+			// Creating new SDK information object instance
+			sdkInfoReturned = new SdkInformation();
+			
+			// Getting SDK properties
+			ISymbianSDK sdk = (ISymbianSDK) iter.next();
+			
+			// NOTE: ID given in SDK Preferences/devices.xml 
+			//       is somehow stored in Label field instead 
+			//       of actual ID field, which may contain following
+			//       kind of strings based on the source where it is 
+			//       got from: 
+			//
+			//          (none), unsupportedSDK, S60_3rd, ...
+			//
+			//       i.e. call to sdk.getId() does not return 
+			//       valid SDK ID, but sdk.getLabel() does.
+			sdkInfoReturned.setSdkId(sdk.getUniqueId());
+			sdkInfoReturned.setSdkName(sdk.getName());
+			sdkInfoReturned.setEpocRootDir(sdk.getEPOCROOT());
+			sdkInfoReturned.setReleaseRootDir(sdk.getReleaseRoot().toOSString());//Returns IPath
+			sdkInfoReturned.setEpoc32ToolsDir(sdk.getToolsPath().toOSString());
+						
+			// When all required information is successfully gathered,
+			// we'll add the information into the vector
+			configuredSdks.add(sdkInfoReturned);			
+		}
+		
+	}
+
+	
+	/**
+	 * Returns toolchain info for all detected RVCT tools.
+	 * @return Array of toolchain information objects.
+	 */
+	public static RVCTToolChainInfo[] getInstalledRVCTTools() {
+		
+		ArrayList<RVCTToolChainInfo> tools = new ArrayList<RVCTToolChainInfo>();
+		
+		RVCTToolChainInfo rvctInfo = null;
+			//Seek all predefined RVCT tool environment variable names, and if predefined variable was found
+			//setting it as default RVCT tool.
+			for(int j=0; j<SdkManager.RVCT_BIN_ENV_VARIABLES.length; j++){
+				String rvctBinDir = System.getenv(SdkManager.RVCT_BIN_ENV_VARIABLES[j]);
+				if(rvctBinExist(rvctBinDir)){
+					rvctInfo = new RVCTToolChainInfo();
+					rvctInfo.setRvctToolsVersion(RVCT_BIN_ENV_VARIABLE_VERSION_NUMBERS[j]);			
+					rvctInfo.setRvctToolBinariesDirectory(rvctBinDir);			
+					tools.add(rvctInfo);
+				}
+			}
+		return (RVCTToolChainInfo[])tools.toArray(new RVCTToolChainInfo[0]);
+		
+	}
+	
+	
+	/**
+	 * Check if <code>armcc.exe</code> file exist in directory found
+	 * @param rvctBinDir
+	 * @return true if <code>armcc.exe</code> exist, false otherwise.
+	 */
+	private static boolean rvctBinExist(String rvctBinDir) {
+		String executablePath = rvctBinDir + File.separatorChar + ARMCC_EXE_FILE_NAME;
+		File file = new File(executablePath);
+		return file.exists();
+	}
+
+
+	/**
+	 * Gets bin-directory path for Sourcery G++/CSL Arm Toolchain.
+	 * Sourcery G++ is preferred, and returned as result if found.
+	 * Otherwise seeking CSL Arm Toolchain install location.
+	 * The method also checks that the all required tools exist.
+	 * @return Path to tool binaries under installation path directory, 
+	 *         successful. Otherwise throws an exception.
+	 * @throws SdkEnvInfomationResolveFailureException 
+	 */
+	public static String getCSLArmToolchainInstallPathAndCheckReqTools() throws SdkEnvInfomationResolveFailureException{
+		
+		String installPath = null;
+		String gcceToolBinDir = null;
+		
+		//First checking existence Sourcery G++ toolchain from registry
+		try {
+			String toolchainRegPath = SOURCERY_GPP_LITE_TOOLCHAIN_REG_PATH;
+			String toolchainRegKey = TOOLCHAIN_INSTALL_LOC_REG_KEY;
+			installPath = getRegKeyValue(toolchainRegPath, toolchainRegKey);
+			checkInstallPathValidity(toolchainRegPath, installPath);
+			gcceToolBinDir = installToBinPath(installPath);
+			if(checkRequiredBinaries(gcceToolBinDir)){
+				return gcceToolBinDir;
+			}
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			// We can ignore this at this phase, because we can continue search 
+		}
+		
+		// Then checking existence Sourcery G++ toolchain from PATH environment variable
+		try {
+			String searchString = SOURCERY_TOOLCHAIN_SEARCH_STR; 
+			String searchRegExp = ".*" + searchString + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
+			Pattern searchPattern = Pattern.compile(searchRegExp, Pattern.CASE_INSENSITIVE);
+			return searchPathEnvVarForGccBinariesPath(searchPattern);
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			// We can ignore this at this phase, because we can continue search 
+		}
+
+		// Fallback 1: Trying to located older toolchain version
+		try {
+			gcceToolBinDir = getOlderCSLArmToolchainInstallPathAndCheckReqTools();
+			return gcceToolBinDir;
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			// We can ignore this at this phase, because we can continue search 
+		}
+		
+		// Fallback 2: Going through all directories from PATH variable, and seek for binaries
+		String searchRegExp = ".*"; //$NON-NLS-1$
+		Pattern searchPattern = Pattern.compile(searchRegExp, Pattern.CASE_INSENSITIVE);
+		return searchPathEnvVarForGccBinariesPath(searchPattern);
+	}
+
+	/**
+	 * Search binaries path based on the given search string and current PATH environment variable.
+	 * Throws an exception if something fails or no valid binaries path was found
+	 * @param searchPattern Search pattern to be used for matching directories from PATH environment variable.
+	 * @return Binaries path containing all required GCC binaries.
+	 * @throws SdkEnvInfomationResolveFailureException
+	 */
+	private static String searchPathEnvVarForGccBinariesPath(Pattern searchPattern) throws SdkEnvInfomationResolveFailureException {
+		
+		String errMsg = Messages.getString("SdkManager.Toolchain_Not_Found_From_Path_ErrMsg")  //$NON-NLS-1$
+						+ " " + searchPattern.pattern(); //$NON-NLS-1$
+		try {
+			// Parsing PATH environment variable - Win32 dependent environment variable 
+			String pathEnvStr = System.getenv(WIN32_PATH_ENV_VAR_NAME); 
+			String[] pathDirArr = pathEnvStr.split(Pattern.quote(WIN32_PATH_ENTRY_SEPARATOR_STRING)); 
+			for (int i = 0; i < pathDirArr.length; i++) {
+				String dir = pathDirArr[i];
+				// Does directory name match with search pattern?
+				if(searchPattern.matcher(dir).matches()){
+					// If matches checking the required tools
+					if(checkRequiredBinaries(dir)){
+						return dir;
+					}					
+				}
+			}
+		} catch (Exception e) {
+			// We can ignore exception => all exceptions are mapped into same exception 
+			errMsg = errMsg + " (" + e.getMessage() + ")."; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		// If could not find anything ending up in here
+		throw new SdkEnvInfomationResolveFailureException(errMsg);			
+	}
+
+	/**
+	 * Gets bin-directory path for CSL Arm Toolchain.
+	 * The method also checks that the all required tools exist.
+	 * @return Path to tool binaries under installation path directory, 
+	 *         successful. Otherwise throws an exception.
+	 * @throws SdkEnvInfomationResolveFailureException
+	 */
+	private static String getOlderCSLArmToolchainInstallPathAndCheckReqTools()
+			throws SdkEnvInfomationResolveFailureException {
+
+		String toolchainRegPath = CSL_ARM_TOOLCHAIN_REG_PATH;
+		String toolchainRegKey = TOOLCHAIN_INSTALL_LOC_REG_KEY;
+		String installPath = getRegKeyValue(toolchainRegPath, toolchainRegKey);		
+		checkInstallPathValidity(toolchainRegPath, installPath);
+		String gcceToolBinDir = installToBinPath(installPath);
+		if(checkRequiredBinaries(gcceToolBinDir)){
+			return gcceToolBinDir;
+		}
+		// Required binaries were not existing
+		String errMsg = Messages.getString("SdkManager.Required_Tool_For_CSL_Arm_Missing")  //$NON-NLS-1$
+						+ gcceToolBinDir;
+		throw new SdkEnvInfomationResolveFailureException(errMsg);
+	}
+
+	/**
+	 * Checks that given install path pointed by given registry key is valid one.
+	 * Throws an exception in case of invalid path.
+	 * @param toolchainRegPath Registry path
+	 * @param installPath Install path to check.
+	 * @throws SdkEnvInfomationResolveFailureException
+	 */
+	private static void checkInstallPathValidity(String toolchainRegPath,
+			String installPath) throws SdkEnvInfomationResolveFailureException {
+		if(installPath == null){
+			String errMsg = Messages.getString("SdkManager.Local_Machine_Key") +  toolchainRegPath  //$NON-NLS-1$
+								+ Messages.getString("SdkManager.Does_Not_Exist_Ending"); //$NON-NLS-1$
+			throw new SdkEnvInfomationResolveFailureException(errMsg);			
+		}
+		
+		if (!new File(installPath).exists()){
+			String errMsg = Messages.getString("SdkManager.CSL_Arm_Toolchain_InstallPath_Pointed_By_Registry")  //$NON-NLS-1$
+							+  toolchainRegPath 
+							+ Messages.getString("SdkManager.Does_Not_Exist_Ending"); //$NON-NLS-1$
+			throw new SdkEnvInfomationResolveFailureException(errMsg);
+		}
+	}
+
+	/**
+	 * Gets value for given registry key from given registry path.
+	 * @param toolchainRegPath Registry path
+	 * @param toolchainRegKey  Registry key
+	 * @return string value for given registry key
+	 * @throws SdkEnvInfomationResolveFailureException
+	 */
+	private static String getRegKeyValue(String toolchainRegPath,
+			String toolchainRegKey)
+			throws SdkEnvInfomationResolveFailureException {
+		String installPath = null;
+		
+		try {			
+			WindowsRegistry wr = WindowsRegistry.getRegistry();
+			installPath = wr.getLocalMachineValue(toolchainRegPath, 
+													 toolchainRegKey);			
+		} catch (Exception e) {					
+			String errMsg = Messages.getString("SdkManager.Could_Not_Read_Registry") +  CSL_ARM_TOOLCHAIN_REG_PATH  //$NON-NLS-1$
+								+ " (" + e.getMessage() +")."; //$NON-NLS-1$ //$NON-NLS-2$
+			throw new SdkEnvInfomationResolveFailureException(errMsg);
+		}
+		return installPath;
+	}
+
+	/**
+	 * Checks that binaries path contains required binaries.
+	 * @param binariesPath Suggested installation path for "arm-none-symbianelf-*.exe" binaries.
+	 * @return <code>true</code> if all required binaries were found, otherwise <code>false</code>.
+	 * @throws SdkEnvInfomationResolveFailureException
+	 */
+	private static boolean checkRequiredBinaries(String binariesPath)
+			throws SdkEnvInfomationResolveFailureException {
+		
+		String[] gccBinToolList = { "arm-none-symbianelf-nm.exe", //$NON-NLS-1$
+									"arm-none-symbianelf-readelf.exe", //$NON-NLS-1$
+									"arm-none-symbianelf-c++filt.exe" //$NON-NLS-1$
+									};
+		String toolName = null;
+		String toolPathName = null;
+		for (int i = 0; i < gccBinToolList.length; i++) {
+			toolName = gccBinToolList[i];
+			toolPathName = binariesPath + File.separator + toolName; //$NON-NLS-1$
+			
+			if (!new File(toolPathName).exists()){
+				return false;
+			}			
+		}
+		return true;
+	}
+
+	/**
+	 * Converts installation path into binaries path.
+	 * @param installPath Toolchain installation path
+	 * @return Toolchain binaries path.
+	 */
+	private static String installToBinPath(String installPath) {
+		return installPath + File.separator + BIN_DIR_NAME_FOR_GCC_TOOLS; 
+	}
+	
+	/**
+	 * Created SDK information object based on the given parameters.
+	 * This method is needed only for enabling JUnit tests that simulate
+	 * existence of an SDK instead of using installed SDKs.
+	 * @param sdkId SDK identifier.
+	 * @param sdkName SDK name.
+	 * @param epocRootDir SDK's epoc32 directory path.
+	 * @param epoc32ToolsDir SDK's epoc32\tools directory path.
+	 * @param releaseRootDir SDK's epoc32\release directory path.
+	 */
+	public static SdkInformation createTestSdkInformationObject(String sdkId, String sdkName, String epocRootDir, String epoc32ToolsDir, String releaseRootDir) {
+		
+		SdkInformation sdkInfoReturned = new SdkInformation();	
+		
+		sdkInfoReturned.setSdkId(sdkId);
+		sdkInfoReturned.setSdkName(sdkName);
+		sdkInfoReturned.setEpocRootDir(epocRootDir);
+		sdkInfoReturned.setEpoc32ToolsDir(epoc32ToolsDir);
+		sdkInfoReturned.setReleaseRootDir(releaseRootDir);
+		
+		return sdkInfoReturned;
+		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/SdkUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,226 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.sdk;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+/**
+ * Utility class for getting SDK/Platform related information.
+ */
+public class SdkUtils {
+	
+	/**
+	 * Platform folders that are ignored when map folders are searched.
+	 * Win* folders are ignored if excludeWinFolders is true.
+	 */
+	private static final String[] IGNORED_PLATFORM_FOLDERS = {
+		"tools",//$NON-NLS-1$
+		"thumb"}; //$NON-NLS-1$
+	
+	/**
+	 * Folders that are ignore when getting build types.
+	 */
+	private static final String[] IGNORED_BUILD_FOLDERS = {
+		"lib"}; //$NON-NLS-1$
+	
+	/**
+	 * This class is not meant to be instantiated.
+	 */
+	private SdkUtils() {
+	}
+	
+	/**
+	 * Method goes through all SDKs and searches for folders which can contain .map files. It will collect
+	 * all folders in to a HashMap. Tools and thumb folders are ignored. Also win* folders
+	 * are ignored if ecludeWinFolders is true.
+	 * 
+	 * HashMap contains e.g.:
+	 * [S60_32 armv5 UREL][C:\Build_C\S60_3_2_200820\epoc32\release\armv5\UREL]
+	 * [S60_32 arm9e udeb][C:\Build_C\S60_3_2_200820\epoc32\release\arm9e\UDEB]
+	 *
+	 * @param excludeWinFolders defines whether wins, winscw folders are excluded from the result
+	 * @return HashMap containing sdk names and their map folders
+	 */
+	public static HashMap<String, String> getSdkMapFileFolders(boolean excludeWinFolders) {
+		return getSdkMapFileFolders(excludeWinFolders, false);
+	}
+	
+	/**
+	 * Method goes through all SDKs and searches for folders which can contain .map files. It will collect
+	 * all folders in to a HashMap. Tools and thumb folders are ignored. Also win* folders
+	 * are ignored if ecludeWinFolders is true.
+	 * 
+	 * HashMap contains e.g.:
+	 * [S60_32 armv5 UREL][C:\Build_C\S60_3_2_200820\epoc32\release\armv5\UREL]
+	 * [S60_32 arm9e udeb][C:\Build_C\S60_3_2_200820\epoc32\release\arm9e\UDEB]
+	 * 
+	 * if epocrootPath parameter is true, then HashMap contains e.g.:
+	 * [S60_32 armv5 UREL][Z:\]
+	 * [S60_32 arm9e udeb][Z:\]
+	 *
+	 * @param excludeWinFolders defines whether wins, winscw folders are excluded from the result
+	 * @param epocrootPath defines whether folders should be epocroot folders instead of map files folders
+	 * @return HashMap containing sdk names and their map folders
+	 */
+	public static HashMap<String, String> getSdkMapFileFolders(boolean excludeWinFolders, boolean epocrootPath) {
+		try {
+			HashMap<String, String> folders = new HashMap<String, String>();
+		
+			// get all SDKs
+			SdkInformation[] sdks = SdkManager.getSdkInformation();
+			// if SDKs exists
+			if (sdks != null && sdks.length > 0) {
+				// go through all SDKs
+				for (int i = 0; i < sdks.length; i++) {
+					SdkInformation sdk = sdks[i];
+					// if SDK's epocroot does not exist, ignore SDK
+					if (!sdk.epocRootExists())
+						continue;
+					// get all SDK's platforms
+					String[] platforms = sdk.getPlatforms();
+					// if platforms exist
+					if (platforms != null && platforms.length > 0) {
+						// go through all platforms (armv5, gcce, winscw, ...)
+						for (int j = 0; j < platforms.length; j++) {
+							String platform = platforms[j];
+							boolean isWinFolder = platform.toLowerCase().startsWith("win");
+							
+							// ignore emulator platforms
+							if (isWinFolder) {
+								if (excludeWinFolders) {
+									continue;
+								}
+								// Win folder is accepted, not checking if it is in predefined platforms.
+							}
+							// ignoring platforms which shouldn't contain map files.
+							else if (isIgnoredPlatformFolder(platform)) {
+								continue;
+							}
+							
+							// get platform's build types (urel, udeb)
+							String[] buildTypes = sdk.getBuildTypesForPlatform(platform);
+							// if build types exist
+							if (buildTypes != null && buildTypes.length > 0) {
+								// go through all build types
+								for (int k = 0; k < buildTypes.length; k++) {
+									String buildType = buildTypes[k];
+									// Check if is not valid build type.
+									if(isIgnoredBuildType(buildType)) {
+										continue;
+									}
+									String mapFolder = sdk.getReleaseRootDir() + File.separator;
+									mapFolder += platform + File.separator + buildType;
+									
+									String sdkFormat = sdk.getSdkId() + " " + platform + " " + buildType;
+									if (epocrootPath)
+										folders.put(sdkFormat, sdk.getEpocRootDir());
+									else
+										folders.put(sdkFormat, mapFolder);
+								}
+							}
+						}
+					}
+				}
+			}
+			if (folders.size() > 0)
+				return folders;
+		} catch (Exception e) {
+		}
+
+		return null;
+	}
+	
+	/**
+	 * Checks whether given type is ignored build type
+	 * @param buildType type to be checked
+	 * @return true if build type is ignored, false if not
+	 */
+	private static boolean isIgnoredBuildType(String buildType) {
+		for(String ignoredFolder : IGNORED_BUILD_FOLDERS) {
+			if(ignoredFolder.equalsIgnoreCase(buildType)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * checks whether given platform should be ignored
+	 * @param platform platform to be checked
+	 * @return true if platform should be ignored files, false if not
+	 */
+	private static boolean isIgnoredPlatformFolder(String platform) {
+		for(String mapFilePlatform : IGNORED_PLATFORM_FOLDERS) {
+			if(platform.toLowerCase().startsWith(mapFilePlatform.toLowerCase())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Checks whether given folder contains any .map files.
+	 * This method takes can time, if there are many files in the folder.
+	 * @param folder folder to be checked for .map files
+	 * @return true if folder contains .map files, false if not
+	 */
+	public static boolean folderContainsMapFiles(String folder) {
+		File path = new File(folder);
+		if (path.isDirectory() && path.exists()) {
+
+			String[] files = path.list();
+			if (files != null && files.length > 0) {
+				for (int i = 0; i < files.length; i++) {
+					if (files[i].endsWith(".map"))
+						return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * Checks whether given zip file contains any .map files
+	 * @param zipFilePath zip file's path
+	 * @return true if zip file contains .map files, false if not
+	 */
+	public static boolean zipContainsMapFiles(String zipFilePath) {
+		try {
+			FileInputStream fis = new FileInputStream(zipFilePath);
+			ZipInputStream zis = new ZipInputStream(fis);
+			ZipEntry ze;
+			while((ze=zis.getNextEntry())!=null){
+				if (ze.getName().toLowerCase().endsWith("map")) { //$NON-NLS-1$
+					zis.closeEntry();
+					zis.close();
+					return true;
+				}
+				zis.closeEntry();
+			}
+			zis.close();
+		} catch (Exception e) {
+		}
+		
+		return false;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.sdk.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.sdk.internal.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/SdkPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.sdk.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class that is internal
+ * for the plugina and not used by plugin
+ * clients.
+ */
+public class SdkPlugin extends Plugin {
+		
+	/**
+	 * The shared plug-in instance. 
+	 */
+	private static SdkPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public SdkPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 * @return Plug.in instance.
+	 */
+	public static SdkPlugin getDefault() {
+		return plugin;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/internal/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+SdkManager.Could_Not_Read_Registry=Could not read registry for local machine key: '
+SdkManager.Local_Machine_Key=Local machine key: '
+SdkManager.CSL_Arm_Toolchain_InstallPath_Pointed_By_Registry=Toolchain installation path pointed by registry key '
+SdkManager.Does_Not_Exist_Ending=' does not exist.
+SdkManager.Required_Tool_For_CSL_Arm_Missing=Required tool from SourceryG++ or CSL Arm Toolchain is missing: 
+SdkManager.Toolchain_Not_Found_From_Path_ErrMsg=Toolchain could not be detected from PATH environment variable based regular expression search: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/com/nokia/s60tools/sdk/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides SDK information query services.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.sdk/src/overview.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for plug-in long description text-->
+Carbide.c++ Extensions SDK Manager Service plug-in API reference.
+
+<p>
+<!-- Place for plug-in long description text-->
+This plug-in provides services for accessing information about the currently
+used SDK environment.
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/.settings/org.eclipse.core.resources.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3 @@
+#Tue Apr 03 16:49:29 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/ui/internal/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Mon Aug 18 15:47:36 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - UI Services
+Bundle-SymbolicName: com.nokia.s60tools.ui;singleton:=true
+Bundle-Version: 1.7.0
+Bundle-Activator: com.nokia.s60tools.ui.internal.S60ToolsUiPlugin
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.ui,
+ com.nokia.s60tools.ui.actions,
+ com.nokia.s60tools.ui.dialogs,
+ com.nokia.s60tools.ui.preferences,
+ com.nokia.s60tools.ui.wizards
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>October 5, 2009</p>	
+
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               about.html,\
+               icons/
+javacSource=1.5
+javacTarget=1.5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,188 @@
+  
+<project name="com.nokia.s60tools.ui" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="FrameworkUI"/>
+  <property name="project.name" value="com.nokia.s60tools.sdk" />
+  <property name="jar.filename" value="${ant.project.name}.jar"/>
+  
+  <!-- Folder definitions -->
+  <property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+  
+  <property name="carbide.folder" value="C:/Carbide_internal" />
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	
+	<property name="test.folder" location="../${ant.project.name}.tests"/>
+  <property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<!-- Folders -->
+	<delete dir="${instr.folder}"/>
+	<mkdir dir="${instr.folder}"/>
+	
+	<delete dir="${reports.folder}"/>
+	<mkdir dir="${reports.folder}"/>
+	
+	<!-- Carbide_classpath -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+  <!-- Delete old plugins and features -->
+  <target name="delete">
+	  <delete dir="plugins" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+	  <delete dir="bin" failonerror="false"/>
+  </target>
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+  
+  <!-- Copy necessary resources -->
+		<copy todir="bin/" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+  
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+  
+  
+  <!-- Instrumentation target, depends on build.mtrunner -->
+	<target name="instr" depends="build.plugins">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="bin" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+  
+  
+  <target name="create.zip">
+  
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+ 		 <!-- Zip jars to ActiveObjectAnalyser.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia.carbide.extensions.*/"/>
+  </target>
+  
+  <!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd shortFileNames="true">
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr, analyze" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="carbide_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="${ant.project.name}.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+  
+  
+  <!-- Target Build all -->
+  <target name="build.all" depends="delete, build.plugins, instr, create.zip, analyze" />
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.ui" default="cc" basedir=".">
+	
+	<target name="cc" depends="build, analyze" description="Build, instrument, run unit tests and analyze code"/>
+	
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	<property name="feature.name" value="Framework"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="test.folder" location="../com.nokia.s60tools.ui.tests"/>
+
+	<property name="binaries.folder" location="../${feature.name}.binaries"/>
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.dev.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<delete dir="../plugins"/>
+		<mkdir dir="../plugins"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+		
+		<zip destfile="../plugins/${jar.filename}">
+				<fileset dir="${build.result.folder}">
+							<include name="com/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="about.html"/>
+					    <include name="icons/**"/>		    
+				</fileset>
+		</zip>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+	</target>
+	
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+
+	
+	
+</project>
Binary file frameworkplugins/com.nokia.s60tools.ui/icons/empty_banner.png has changed
Binary file frameworkplugins/com.nokia.s60tools.ui/icons/preferences.png has changed
Binary file frameworkplugins/com.nokia.s60tools.ui/icons/s60tools_action_icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/AbstractTextClipboardCopyHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * This class defines common interface for all 
+ * clipboard copy handlers supporting plain text.
+ * This abstract class uses Template method design
+ * pattern.
+ * 
+ * This class may be subclasses in the following way:
+ * 
+ * <code>
+ * <pre>
+ * 
+ * public class MylipboardCopyHandler extends AbstractTextClipboardCopyHandler 
+ *                                                  implements ICopyActionHandler {
+ * 	
+ *  MyDataHolderClass[] dataArr = null;
+ * 
+ *  protected String buildTextString() {
+ *      StringBuffer strBuf = new StringBuffer();
+ * 		
+ *      for (int i = 0; i < dataArr.length; i++) {
+ *          MyDataHolderClass dataItem = dataArr[i];
+ * 			
+ *          // Adding data fields to buffer as text
+ *          strBuf.append(dataItem.getSomeData() + "\t");
+ *          strBuf.append(dataItem.getSomeOtherData() + "\t");
+ *          // Other possible fields, and e.g. new line to the end
+ *          // The format might be specific for each data type.
+ *          strBuf.append("\n");
+ * 			
+ *      }
+ *      return strBuf.toString();
+ *  }
+ * 
+ *  public boolean acceptAndCopy(List objectsToCopy) {
+ * 
+ *          // Checking that there are objects to copy and 
+ *          // this is a correct copy handler for the passed objects 
+ *          if(objectsToCopy.size() > 0){
+ *              if(!(objectsToCopy.get(0) instanceof MyDataHolderClass)){
+ *              return false;
+ *              }
+ *          }
+ *          else{
+ *              // No objects to copy
+ *              return false;
+ *          }
+ * 
+ *          dataArr = (MyDataHolderClass[]) objectsToCopy.toArray(new MyDataHolderClass[0]);
+ *          // Class cast succeeded, and we can perform copy
+ *          performCopy();
+ *          // Copy was performed succesfully
+ *          return true;
+ *  }
+ * 
+ * }
+ *
+ * </pre>
+ * </code>
+ * 
+ */
+public abstract class AbstractTextClipboardCopyHandler implements ICopyActionHandler{
+		
+	/**
+	 * Constructor.
+	 */
+	public AbstractTextClipboardCopyHandler(){		
+	}
+	
+	/**
+	 * Performs the actual copy operation that
+	 * calls <code>buildTextString</code> template method.
+	 * This method binds the clipboard into
+	 * currently used display.
+	 */
+	protected void performCopy(){
+		Display disp = Display.getCurrent();
+		Clipboard clipBrd  = new Clipboard(disp);
+		String strToCopy = buildTextString();
+		TextTransfer txtTransfInstance = TextTransfer.getInstance();
+		clipBrd.setContents(new String[]{ strToCopy },
+							new Transfer[] {txtTransfInstance});
+		clipBrd.dispose();
+	}
+
+	/**
+	 * Abstract template method that each sub class must implement.
+	 * @return Returns text string to be copied into the clipboard.
+	 */
+	abstract protected String buildTextString();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/AbstractUIComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Layout;
+
+/**
+ * Abstract class that defines an abstract template 
+ * for the composites that should be used to populate
+ * the contents a tab area or sub are inside a tab.
+ * 
+ * Example usage (without comment blocks for making example shorter):
+ * 
+ * <code>
+ * public class MyUIComposite extends AbstractUIComposite {
+ *	private final int COLUMN_COUNT = 1;
+ *	
+ *  public MyUIComposite(Composite parentComposite) {
+ * 		super(parentComposite);
+ *	}
+ *
+ *	protected Layout createLayout() {
+ *		return new GridLayout(COLUMN_COUNT, false);
+ *	}
+ *
+ *	protected Object createLayoutData(){
+ *		return 	new GridData(GridData.FILL_HORIZONTAL);
+ *	}
+ *	
+ *	protected void createControls() {
+ *		Label testLabel = new Label(this, SWT.HORIZONTAL | SWT.LEFT);
+ *		testLabel.setText("TODO: Add widgets for the UI composite here...");
+ *	}
+ * </code>
+ */
+public abstract class AbstractUIComposite extends Composite {
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 */
+	public AbstractUIComposite(Composite parentComposite, int style) {
+		super(parentComposite, style);
+		initComposite();
+	}
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public AbstractUIComposite(Composite parentComposite) {
+		super(parentComposite, SWT.NONE);
+		initComposite();
+	}
+	
+	/**
+	 * Performs template methods that take care
+	 * of finalizing composite construction.
+	 */
+	private void initComposite(){
+		setLayout(createLayout());
+		setLayoutData(createLayoutData());
+		createControls();
+	}
+	
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should initialize the composite's layout
+	 * in the implementation of this method.
+	 * @return Layout for the composite.
+	 */
+	protected abstract Layout createLayout();
+
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should initialize the composite's layout data
+	 * in the implementation of this method.
+	 * @return Layout for the composite.
+	 */
+	protected abstract Object createLayoutData();
+
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should create all the composite's controls
+	 * in the implementation of this method.
+	 */
+	protected abstract void createControls();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/ICopyActionHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import java.util.List;
+
+/**
+ * Defines common interface used by copy handler
+ * clients. Clients can have a set of possible 
+ * copy handler implementations, and this
+ * interface helps to select correct implementation
+ * for the object type at hand.
+ * 
+ * Copy handlers are implemented by subclassing
+ * <code>AbstractTextClipboardCopyHandler</code> class .
+ * 
+ * There should be only one copy handler defined per object 
+ * type.
+ * 
+ * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler
+ */
+public interface ICopyActionHandler {
+	
+	/**
+	 * This methods tests if the given object type is supported, 
+	 * and copies object data to the clipboard if the object 
+	 * type was supported.
+	 * @param objectsToCopyList List of objects to perform copy for.
+	 * @return Returns <code>true</code> if the object type was
+	 *         recognized and copy was performed, otherwise returns
+	 *         <code>false</code>.
+	 */
+	public boolean acceptAndCopy(List<Object> objectsToCopyList);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/IImageProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/ 
+package com.nokia.s60tools.ui;
+
+
+import org.eclipse.swt.graphics.Drawable;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Interface to providing image to copy into clipboard by <code>CopyImageToClipboardAction</code> action.
+ */
+public interface IImageProvider {
+	
+	/**
+	 * Get the image object instance to copy into clipboard. Create image e.g
+	 * <code>Image image = new Image(Display.getCurrent(), {@link org.eclipse.swt.widgets.Composite#getClientArea()#width}, {@link org.eclipse.swt.widgets.Composite#getClientArea()#height});</code>
+	 * @return {@link Image} 
+	 */
+	public Image getImage();
+
+	/**
+	 * Gets Drawable.
+	 * @return get the  {@link Drawable} e.g. {@link Composite} 
+	 */
+	public Drawable getDrawable();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/IStringProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.ui;
+
+/**
+ * Interface to get String. Implement this class when class needs to provide a String.
+ */
+public interface IStringProvider {
+	
+	/**
+	 * Get {@link String}.
+	 * @return String or <code>null</code>.
+	 */
+	public String getString();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/ProgrammaticSelection.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * This class represents a selection of objects 
+ * that are part of some UI component that implements
+ * <code>org.eclipse.jface.viewers.ISelectionProvider</code> interface.
+ * 
+ * This class can be used to make programmatic selection,
+ * for example, in the following way:
+ * 
+ * <code>
+ * <pre>
+ * // Some component supporting selections
+ * ISelectionProvider selProvider = (ISelectionProvider) ...;
+ * // In this example we select a single object
+ * ConcreteObjectToSelect objToSelect = ...;
+ * // Creating selection
+ * ProgrammaticSelection newSelection;
+ *                        = new ProgrammaticSelection(
+ *                                          new Object[]{
+ *                                          objToSelect
+ *                                                            }
+ *                                                   );
+ * // Setting selection
+ * selProvider.setSelection(newSelection);                                         
+ *
+ * </pre>
+ * </code>
+ * 
+ * NOTE: Some selection providers like subclasses of <code>org.eclipse.jface.viewers.Viewer</code>
+ * have a slightly different setSelection method.
+ * 
+ * @see org.eclipse.jface.viewers.ISelectionProvider
+ * @see org.eclipse.jface.viewers.Viewer
+ */
+public class ProgrammaticSelection implements IStructuredSelection {
+
+	/**
+	 * Object list to include into selection.
+	 */
+	ArrayList<Object> objectList = null;
+	
+	/**
+	 * Constructor
+	 * @param items Objects to include into selection.
+	 */
+	public ProgrammaticSelection(Object[] items){
+
+		// Node array cannot be empty one	
+		if( ! (items.length > 0) ){
+			throw new IllegalArgumentException();
+		}
+		
+		objectList = new ArrayList<Object>();
+		
+		for (int i = 0; i < items.length; i++) {
+			objectList.add(items[i]);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredSelection#getFirstElement()
+	 */
+	public Object getFirstElement() {
+		return objectList.get(0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredSelection#iterator()
+	 */
+	public Iterator<Object> iterator() {
+		return objectList.iterator();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredSelection#size()
+	 */
+	public int size() {
+		return objectList.size();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredSelection#toArray()
+	 */
+	public Object[] toArray() {
+		return objectList.toArray();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredSelection#toList()
+	 */
+	public List<Object> toList() {
+		return objectList;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
+	 */
+	public boolean isEmpty() {
+		return false;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60TableColumnSelectionListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+
+/**
+ * The purpose of this class is to be instantiated as anonymous class 
+ * that can access parent table's properties. The inheriting class can 
+ * override the the default implementation that does not invoke any actions. 
+ * For example,
+ * 
+ * <code>
+ * <pre>
+ * 
+ * TableColumn tblColumn;
+ * // Table column related initialization ...
+ * tblColumn.addSelectionListener(new S60TableColumnSelectionListener(tbl){
+ *             public void widgetDefaultSelected(SelectionEvent e){
+ *                  // Overridden implementation if needed...						
+ *                  }
+ *
+ *             public void widgetSelected(SelectionEvent e){
+ *                  // Overridden implementation if needed...						
+ *                  }
+ * });
+ *
+ * </pre>
+ * </code>
+ * 
+ * @see com.nokia.s60tools.ui.S60ToolsTable
+ */
+class S60TableColumnSelectionListener implements SelectionListener{
+	
+	/**
+	 * Reference to table that owns the column to be listened.
+	 */
+	private final S60ToolsTable parentTable;
+	
+	/**
+	 * Constructor.
+	 * @param parentTable Parent table to be listened for.
+	 */
+	public S60TableColumnSelectionListener(S60ToolsTable parentTable){
+		this.parentTable = parentTable;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+	}
+
+	/**
+	 * Gets parent table.
+	 * @return Returns the parentTable.
+	 */
+	public S60ToolsTable getParentTable() {
+		return parentTable;
+	}
+	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTable.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1294 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import java.security.InvalidParameterException;
+
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.Accessible;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.HelpListener;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GCData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Monitor;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+import com.nokia.s60tools.ui.internal.Messages;
+
+/**
+ * Because <code>org.eclipse.swt.widgets.Table</code> class cannot be subclassed, it is wrapped 
+ * inside this class. This class implements the all the public methods 
+ * for the wrapped class, and delegates them further.
+ * 
+ * This class adds the following functionalities to the original
+ * <code>Table</code> class:<br>
+ * - <code>S60ToolsTable</code> can be hosted by a <code>TableViewer</code>
+ *   which can be set after the instantion of this class. Therefore it is possible
+ *   to get reference to hosting viewer, if such is set, and query for the
+ *   properties of the viewer. For example, set properties of the current
+ *   sorter instance. <code>S60ToolsTable</code> is designed to be used
+ *   with <code>S60ToolsViewerSorter</code> class, and instances of this
+ *   class can be created with <code>S60ToolsTableFactory.create</code>
+ *   method that used information stored in <code>S60ToolsTableColumnData</code>
+ *   instances.
+ * @see org.eclipse.swt.widgets.Table
+ * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+ * @see com.nokia.s60tools.ui.S60ToolsTableFactory#create
+ * @see com.nokia.s60tools.ui.S60ToolsTableColumnData
+ */
+public class S60ToolsTable{
+
+	/**
+	 * Table viewer instance that owns
+	 * this table.
+	 */
+	private TableViewer hostingViewer = null;
+	
+	/**
+	 * Wrapped Table instance.
+	 */
+	private Table tableInstance = null;
+
+	public static final String TXT_ITEMS_IN_COLUMN_HEADER = " " + Messages.getString("S60ToolsTable.Items_Str"); //$NON-NLS-1$ //$NON-NLS-2$
+	private final String columnDataHeaderName;
+	private final int showItemCountInColumn;
+	private static final int COLUMN_DATA_COUNT_NOT_SET = -1;
+	
+	/**
+	 * Constructor.
+	 * @param parent Parent composite.
+	 * @param style Style bits used for wrapped Table instance.
+	 */
+	public S60ToolsTable(Composite parent, int style) {
+		tableInstance = new Table(parent, style);
+		columnDataHeaderName = null;
+		showItemCountInColumn = COLUMN_DATA_COUNT_NOT_SET;
+	}
+
+	/**
+	 * Constructor.
+	 * @param parent Parent composite.
+	 * @param style Style bits used for wrapped Table instance.
+	 * @param columnDataHeaderName Column name to be updated when 
+	 * 			refreshing refreshHostingViewer(int columnDateHeaderCount) 
+	 * @param showItemCountInColumn Column index used for showing item count. 
+	 * 			Must reference to columnDataArr[<code>showItemCountInColumn</code>>].
+
+	 * @param showItemCountInColumn
+	 */
+	
+	public S60ToolsTable(Composite parent, int style, 
+			String columnDataHeaderName, int showItemCountInColumn) {
+		this.columnDataHeaderName = columnDataHeaderName;
+		this.showItemCountInColumn = showItemCountInColumn;
+		tableInstance = new Table(parent, style);
+	}	
+
+	/**
+	 * @return Returns the hostingViewer.
+	 */
+	public TableViewer getHostingViewer() {
+		return hostingViewer;
+	}
+
+	/**
+	 * Sets the hosting viewer for the table instance.
+	 * @param hostingViewer The hostingViewer to set.
+	 */
+	public void setHostingViewer(TableViewer hostingViewer) {
+		if((getStyle() & SWT.CHECK) != 0){
+			// Table with check support must be hosted with corresponding viewer
+			if(! (hostingViewer instanceof CheckboxTableViewer)){
+				throw new InvalidParameterException(Messages.getString("S60ToolsTable.TableMustBeViewerInstance_Exception")); //$NON-NLS-1$
+			}
+		}
+		this.hostingViewer = hostingViewer;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setHeaderVisible(boolean)
+	 */
+	public void setHeaderVisible(boolean show) {
+		tableInstance.setHeaderVisible(show);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setLayoutData(java.lang.Object)
+	 */
+	public void setLayoutData(Object layoutData) {
+		tableInstance.setLayoutData(layoutData);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setLinesVisible(boolean)
+	 */
+	public void setLinesVisible(boolean show) {
+		tableInstance.setLinesVisible(show);
+	}
+
+	/**
+	 * @return Returns the tableInstance.
+	 */
+	public Table getTableInstance() {
+		return tableInstance;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addControlListener(org.eclipse.swt.events.ControlListener)
+	 */
+	public void addControlListener(ControlListener listener) {
+		tableInstance.addControlListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#addDisposeListener(org.eclipse.swt.events.DisposeListener)
+	 */
+	public void addDisposeListener(DisposeListener listener) {
+		tableInstance.addDisposeListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addFocusListener(org.eclipse.swt.events.FocusListener)
+	 */
+	public void addFocusListener(FocusListener listener) {
+		tableInstance.addFocusListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addHelpListener(org.eclipse.swt.events.HelpListener)
+	 */
+	public void addHelpListener(HelpListener listener) {
+		tableInstance.addHelpListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addKeyListener(org.eclipse.swt.events.KeyListener)
+	 */
+	public void addKeyListener(KeyListener listener) {
+		tableInstance.addKeyListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#addListener(int, org.eclipse.swt.widgets.Listener)
+	 */
+	public void addListener(int eventType, Listener listener) {
+		tableInstance.addListener(eventType, listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addMouseListener(org.eclipse.swt.events.MouseListener)
+	 */
+	public void addMouseListener(MouseListener listener) {
+		tableInstance.addMouseListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addMouseMoveListener(org.eclipse.swt.events.MouseMoveListener)
+	 */
+	public void addMouseMoveListener(MouseMoveListener listener) {
+		tableInstance.addMouseMoveListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addMouseTrackListener(org.eclipse.swt.events.MouseTrackListener)
+	 */
+	public void addMouseTrackListener(MouseTrackListener listener) {
+		tableInstance.addMouseTrackListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addPaintListener(org.eclipse.swt.events.PaintListener)
+	 */
+	public void addPaintListener(PaintListener listener) {
+		tableInstance.addPaintListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#addSelectionListener(org.eclipse.swt.events.SelectionListener)
+	 */
+	public void addSelectionListener(SelectionListener listener) {
+		tableInstance.addSelectionListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#addTraverseListener(org.eclipse.swt.events.TraverseListener)
+	 */
+	public void addTraverseListener(TraverseListener listener) {
+		tableInstance.addTraverseListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#changed(org.eclipse.swt.widgets.Control[])
+	 */
+	public void changed(Control[] changed) {
+		tableInstance.changed(changed);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#clear(int, int)
+	 */
+	public void clear(int start, int end) {
+		tableInstance.clear(start, end);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#clear(int)
+	 */
+	public void clear(int index) {
+		tableInstance.clear(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#clear(int[])
+	 */
+	public void clear(int[] indices) {
+		tableInstance.clear(indices);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#clearAll()
+	 */
+	public void clearAll() {
+		tableInstance.clearAll();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#computeSize(int, int, boolean)
+	 */
+	public Point computeSize(int wHint, int hHint, boolean changed) {
+		return tableInstance.computeSize(wHint, hHint, changed);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#computeSize(int, int)
+	 */
+	public Point computeSize(int wHint, int hHint) {
+		return tableInstance.computeSize(wHint, hHint);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Scrollable#computeTrim(int, int, int, int)
+	 */
+	public Rectangle computeTrim(int x, int y, int width, int height) {
+		return tableInstance.computeTrim(x, y, width, height);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#deselect(int, int)
+	 */
+	public void deselect(int start, int end) {
+		tableInstance.deselect(start, end);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#deselect(int)
+	 */
+	public void deselect(int index) {
+		tableInstance.deselect(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#deselect(int[])
+	 */
+	public void deselect(int[] indices) {
+		tableInstance.deselect(indices);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#deselectAll()
+	 */
+	public void deselectAll() {
+		tableInstance.deselectAll();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		tableInstance.dispose();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object arg0) {
+		return tableInstance.equals(arg0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#forceFocus()
+	 */
+	public boolean forceFocus() {
+		return tableInstance.forceFocus();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getAccessible()
+	 */
+	public Accessible getAccessible() {
+		return tableInstance.getAccessible();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getBackground()
+	 */
+	public Color getBackground() {
+		return tableInstance.getBackground();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getBorderWidth()
+	 */
+	public int getBorderWidth() {
+		return tableInstance.getBorderWidth();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getBounds()
+	 */
+	public Rectangle getBounds() {
+		return tableInstance.getBounds();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#getChildren()
+	 */
+	public Control[] getChildren() {
+		return tableInstance.getChildren();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Scrollable#getClientArea()
+	 */
+	public Rectangle getClientArea() {
+		return tableInstance.getClientArea();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getColumn(int)
+	 */
+	public TableColumn getColumn(int index) {
+		return tableInstance.getColumn(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getColumnCount()
+	 */
+	public int getColumnCount() {
+		return tableInstance.getColumnCount();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getColumnOrder()
+	 */
+	public int[] getColumnOrder() {
+		return tableInstance.getColumnOrder();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getColumns()
+	 */
+	public TableColumn[] getColumns() {
+		return tableInstance.getColumns();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#getData()
+	 */
+	public Object getData() {
+		return tableInstance.getData();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#getData(java.lang.String)
+	 */
+	public Object getData(String key) {
+		return tableInstance.getData(key);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#getDisplay()
+	 */
+	public Display getDisplay() {
+		return tableInstance.getDisplay();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getEnabled()
+	 */
+	public boolean getEnabled() {
+		return tableInstance.getEnabled();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getFont()
+	 */
+	public Font getFont() {
+		return tableInstance.getFont();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getForeground()
+	 */
+	public Color getForeground() {
+		return tableInstance.getForeground();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getGridLineWidth()
+	 */
+	public int getGridLineWidth() {
+		return tableInstance.getGridLineWidth();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getHeaderHeight()
+	 */
+	public int getHeaderHeight() {
+		return tableInstance.getHeaderHeight();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getHeaderVisible()
+	 */
+	public boolean getHeaderVisible() {
+		return tableInstance.getHeaderVisible();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Scrollable#getHorizontalBar()
+	 */
+	public ScrollBar getHorizontalBar() {
+		return tableInstance.getHorizontalBar();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getItem(int)
+	 */
+	public TableItem getItem(int index) {
+		return tableInstance.getItem(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getItem(org.eclipse.swt.graphics.Point)
+	 */
+	public TableItem getItem(Point point) {
+		return tableInstance.getItem(point);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getItemCount()
+	 */
+	public int getItemCount() {
+		return tableInstance.getItemCount();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getItemHeight()
+	 */
+	public int getItemHeight() {
+		return tableInstance.getItemHeight();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getItems()
+	 */
+	public TableItem[] getItems() {
+		return tableInstance.getItems();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#getLayout()
+	 */
+	public Layout getLayout() {
+		return tableInstance.getLayout();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getLayoutData()
+	 */
+	public Object getLayoutData() {
+		return tableInstance.getLayoutData();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#getLayoutDeferred()
+	 */
+	public boolean getLayoutDeferred() {
+		return tableInstance.getLayoutDeferred();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getLinesVisible()
+	 */
+	public boolean getLinesVisible() {
+		return tableInstance.getLinesVisible();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getLocation()
+	 */
+	public Point getLocation() {
+		return tableInstance.getLocation();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getMenu()
+	 */
+	public Menu getMenu() {
+		return tableInstance.getMenu();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getMonitor()
+	 */
+	public Monitor getMonitor() {
+		return tableInstance.getMonitor();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getParent()
+	 */
+	public Composite getParent() {
+		return tableInstance.getParent();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getSelection()
+	 */
+	public TableItem[] getSelection() {
+		return tableInstance.getSelection();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getSelectionCount()
+	 */
+	public int getSelectionCount() {
+		return tableInstance.getSelectionCount();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getSelectionIndex()
+	 */
+	public int getSelectionIndex() {
+		return tableInstance.getSelectionIndex();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getSelectionIndices()
+	 */
+	public int[] getSelectionIndices() {
+		return tableInstance.getSelectionIndices();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getShell()
+	 */
+	public Shell getShell() {
+		return tableInstance.getShell();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getSize()
+	 */
+	public Point getSize() {
+		return tableInstance.getSize();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#getStyle()
+	 */
+	public int getStyle() {
+		return tableInstance.getStyle();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#getTabList()
+	 */
+	public Control[] getTabList() {
+		return tableInstance.getTabList();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getToolTipText()
+	 */
+	public String getToolTipText() {
+		return tableInstance.getToolTipText();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#getTopIndex()
+	 */
+	public int getTopIndex() {
+		return tableInstance.getTopIndex();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Scrollable#getVerticalBar()
+	 */
+	public ScrollBar getVerticalBar() {
+		return tableInstance.getVerticalBar();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#getVisible()
+	 */
+	public boolean getVisible() {
+		return tableInstance.getVisible();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return tableInstance.hashCode();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#indexOf(org.eclipse.swt.widgets.TableColumn)
+	 */
+	public int indexOf(TableColumn column) {
+		return tableInstance.indexOf(column);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#indexOf(org.eclipse.swt.widgets.TableItem)
+	 */
+	public int indexOf(TableItem item) {
+		return tableInstance.indexOf(item);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#internal_dispose_GC(int, org.eclipse.swt.graphics.GCData)
+	 */
+	public void internal_dispose_GC(int hDC, GCData data) {
+		tableInstance.internal_dispose_GC(hDC, data);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#internal_new_GC(org.eclipse.swt.graphics.GCData)
+	 */
+	public int internal_new_GC(GCData data) {
+		return tableInstance.internal_new_GC(data);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#isDisposed()
+	 */
+	public boolean isDisposed() {
+		return tableInstance.isDisposed();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#isEnabled()
+	 */
+	public boolean isEnabled() {
+		return tableInstance.isEnabled();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#isFocusControl()
+	 */
+	public boolean isFocusControl() {
+		return tableInstance.isFocusControl();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#isLayoutDeferred()
+	 */
+	public boolean isLayoutDeferred() {
+		return tableInstance.isLayoutDeferred();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#isListening(int)
+	 */
+	public boolean isListening(int eventType) {
+		return tableInstance.isListening(eventType);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#isReparentable()
+	 */
+	public boolean isReparentable() {
+		return tableInstance.isReparentable();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#isSelected(int)
+	 */
+	public boolean isSelected(int index) {
+		return tableInstance.isSelected(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#isVisible()
+	 */
+	public boolean isVisible() {
+		return tableInstance.isVisible();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#layout()
+	 */
+	public void layout() {
+		tableInstance.layout();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#layout(boolean, boolean)
+	 */
+	public void layout(boolean changed, boolean all) {
+		tableInstance.layout(changed, all);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#layout(boolean)
+	 */
+	public void layout(boolean changed) {
+		tableInstance.layout(changed);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#layout(org.eclipse.swt.widgets.Control[])
+	 */
+	public void layout(Control[] changed) {
+		tableInstance.layout(changed);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#moveAbove(org.eclipse.swt.widgets.Control)
+	 */
+	public void moveAbove(Control control) {
+		tableInstance.moveAbove(control);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#moveBelow(org.eclipse.swt.widgets.Control)
+	 */
+	public void moveBelow(Control control) {
+		tableInstance.moveBelow(control);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#notifyListeners(int, org.eclipse.swt.widgets.Event)
+	 */
+	public void notifyListeners(int eventType, Event event) {
+		tableInstance.notifyListeners(eventType, event);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#pack()
+	 */
+	public void pack() {
+		tableInstance.pack();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#pack(boolean)
+	 */
+	public void pack(boolean changed) {
+		tableInstance.pack(changed);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#redraw()
+	 */
+	public void redraw() {
+		tableInstance.redraw();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#redraw(int, int, int, int, boolean)
+	 */
+	public void redraw(int x, int y, int width, int height, boolean all) {
+		tableInstance.redraw(x, y, width, height, all);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#remove(int, int)
+	 */
+	public void remove(int start, int end) {
+		tableInstance.remove(start, end);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#remove(int)
+	 */
+	public void remove(int index) {
+		tableInstance.remove(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#remove(int[])
+	 */
+	public void remove(int[] indices) {
+		tableInstance.remove(indices);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#removeAll()
+	 */
+	public void removeAll() {
+		tableInstance.removeAll();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeControlListener(org.eclipse.swt.events.ControlListener)
+	 */
+	public void removeControlListener(ControlListener listener) {
+		tableInstance.removeControlListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#removeDisposeListener(org.eclipse.swt.events.DisposeListener)
+	 */
+	public void removeDisposeListener(DisposeListener listener) {
+		tableInstance.removeDisposeListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeFocusListener(org.eclipse.swt.events.FocusListener)
+	 */
+	public void removeFocusListener(FocusListener listener) {
+		tableInstance.removeFocusListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeHelpListener(org.eclipse.swt.events.HelpListener)
+	 */
+	public void removeHelpListener(HelpListener listener) {
+		tableInstance.removeHelpListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeKeyListener(org.eclipse.swt.events.KeyListener)
+	 */
+	public void removeKeyListener(KeyListener listener) {
+		tableInstance.removeKeyListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#removeListener(int, org.eclipse.swt.widgets.Listener)
+	 */
+	public void removeListener(int eventType, Listener listener) {
+		tableInstance.removeListener(eventType, listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeMouseListener(org.eclipse.swt.events.MouseListener)
+	 */
+	public void removeMouseListener(MouseListener listener) {
+		tableInstance.removeMouseListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeMouseMoveListener(org.eclipse.swt.events.MouseMoveListener)
+	 */
+	public void removeMouseMoveListener(MouseMoveListener listener) {
+		tableInstance.removeMouseMoveListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeMouseTrackListener(org.eclipse.swt.events.MouseTrackListener)
+	 */
+	public void removeMouseTrackListener(MouseTrackListener listener) {
+		tableInstance.removeMouseTrackListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removePaintListener(org.eclipse.swt.events.PaintListener)
+	 */
+	public void removePaintListener(PaintListener listener) {
+		tableInstance.removePaintListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#removeSelectionListener(org.eclipse.swt.events.SelectionListener)
+	 */
+	public void removeSelectionListener(SelectionListener listener) {
+		tableInstance.removeSelectionListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#removeTraverseListener(org.eclipse.swt.events.TraverseListener)
+	 */
+	public void removeTraverseListener(TraverseListener listener) {
+		tableInstance.removeTraverseListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#select(int, int)
+	 */
+	public void select(int start, int end) {
+		tableInstance.select(start, end);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#select(int)
+	 */
+	public void select(int index) {
+		tableInstance.select(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#select(int[])
+	 */
+	public void select(int[] indices) {
+		tableInstance.select(indices);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#selectAll()
+	 */
+	public void selectAll() {
+		tableInstance.selectAll();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
+	 */
+	public void setBackground(Color color) {
+		tableInstance.setBackground(color);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setBounds(int, int, int, int)
+	 */
+	public void setBounds(int x, int y, int width, int height) {
+		tableInstance.setBounds(x, y, width, height);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setBounds(org.eclipse.swt.graphics.Rectangle)
+	 */
+	public void setBounds(Rectangle rect) {
+		tableInstance.setBounds(rect);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setCapture(boolean)
+	 */
+	public void setCapture(boolean capture) {
+		tableInstance.setCapture(capture);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setColumnOrder(int[])
+	 */
+	public void setColumnOrder(int[] order) {
+		tableInstance.setColumnOrder(order);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setCursor(org.eclipse.swt.graphics.Cursor)
+	 */
+	public void setCursor(Cursor cursor) {
+		tableInstance.setCursor(cursor);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#setData(java.lang.Object)
+	 */
+	public void setData(Object data) {
+		tableInstance.setData(data);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#setData(java.lang.String, java.lang.Object)
+	 */
+	public void setData(String key, Object value) {
+		tableInstance.setData(key, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
+	 */
+	public void setEnabled(boolean enabled) {
+		tableInstance.setEnabled(enabled);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setFocus()
+	 */
+	public boolean setFocus() {
+		return tableInstance.setFocus();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setFont(org.eclipse.swt.graphics.Font)
+	 */
+	public void setFont(Font font) {
+		tableInstance.setFont(font);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setForeground(org.eclipse.swt.graphics.Color)
+	 */
+	public void setForeground(Color color) {
+		tableInstance.setForeground(color);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setItemCount(int)
+	 */
+	public void setItemCount(int count) {
+		tableInstance.setItemCount(count);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setLayout(org.eclipse.swt.widgets.Layout)
+	 */
+	public void setLayout(Layout layout) {
+		tableInstance.setLayout(layout);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setLayoutDeferred(boolean)
+	 */
+	public void setLayoutDeferred(boolean defer) {
+		tableInstance.setLayoutDeferred(defer);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setLocation(int, int)
+	 */
+	public void setLocation(int x, int y) {
+		tableInstance.setLocation(x, y);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setLocation(org.eclipse.swt.graphics.Point)
+	 */
+	public void setLocation(Point location) {
+		tableInstance.setLocation(location);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setMenu(org.eclipse.swt.widgets.Menu)
+	 */
+	public void setMenu(Menu menu) {
+		tableInstance.setMenu(menu);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setParent(org.eclipse.swt.widgets.Composite)
+	 */
+	public boolean setParent(Composite parent) {
+		return tableInstance.setParent(parent);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setRedraw(boolean)
+	 */
+	public void setRedraw(boolean redraw) {
+		tableInstance.setRedraw(redraw);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setSelection(int, int)
+	 */
+	public void setSelection(int start, int end) {
+		tableInstance.setSelection(start, end);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setSelection(int)
+	 */
+	public void setSelection(int index) {
+		tableInstance.setSelection(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setSelection(int[])
+	 */
+	public void setSelection(int[] indices) {
+		tableInstance.setSelection(indices);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setSelection(org.eclipse.swt.widgets.TableItem[])
+	 */
+	public void setSelection(TableItem[] items) {
+		tableInstance.setSelection(items);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setSize(int, int)
+	 */
+	public void setSize(int width, int height) {
+		tableInstance.setSize(width, height);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setSize(org.eclipse.swt.graphics.Point)
+	 */
+	public void setSize(Point size) {
+		tableInstance.setSize(size);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setTabList(org.eclipse.swt.widgets.Control[])
+	 */
+	public void setTabList(Control[] tabList) {
+		tableInstance.setTabList(tabList);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setToolTipText(java.lang.String)
+	 */
+	public void setToolTipText(String string) {
+		tableInstance.setToolTipText(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#setTopIndex(int)
+	 */
+	public void setTopIndex(int index) {
+		tableInstance.setTopIndex(index);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#setVisible(boolean)
+	 */
+	public void setVisible(boolean visible) {
+		tableInstance.setVisible(visible);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#showColumn(org.eclipse.swt.widgets.TableColumn)
+	 */
+	public void showColumn(TableColumn column) {
+		tableInstance.showColumn(column);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#showItem(org.eclipse.swt.widgets.TableItem)
+	 */
+	public void showItem(TableItem item) {
+		tableInstance.showItem(item);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Table#showSelection()
+	 */
+	public void showSelection() {
+		tableInstance.showSelection();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#toControl(int, int)
+	 */
+	public Point toControl(int x, int y) {
+		return tableInstance.toControl(x, y);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#toControl(org.eclipse.swt.graphics.Point)
+	 */
+	public Point toControl(Point point) {
+		return tableInstance.toControl(point);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#toDisplay(int, int)
+	 */
+	public Point toDisplay(int x, int y) {
+		return tableInstance.toDisplay(x, y);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#toDisplay(org.eclipse.swt.graphics.Point)
+	 */
+	public Point toDisplay(Point point) {
+		return tableInstance.toDisplay(point);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#toString()
+	 */
+	public String toString() {
+		return tableInstance.toString();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#traverse(int)
+	 */
+	public boolean traverse(int traversal) {
+		return tableInstance.traverse(traversal);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#update()
+	 */
+	public void update() {
+		tableInstance.update();
+	}
+	/**
+	 * Refreshing hosting TableViewer this.getHostingViewer().refresh()	 
+	 */
+	public void refreshHostingViewer() {
+		getHostingViewer().refresh();
+	}
+	/**
+	 * Refreshing hosting TableViewer this.getHostingViewer().refresh().
+	 * Updating items count to column header set in Construction. 
+	 * If <code>columnDataHeaderName</code> or <code>showItemCountInColumn</code>
+	 * is not set in Construction, just refreshing hosting TableViewer.
+	 * 
+	 * @param columnDateHeaderCount
+	 */
+	public void refreshHostingViewer(int columnDateHeaderCount) {
+		
+		if(columnDataHeaderName!=null 
+				&& this.showItemCountInColumn != COLUMN_DATA_COUNT_NOT_SET){
+			TableColumn tblColumn = getColumn(this.showItemCountInColumn);				
+			tblColumn.setText(columnDataHeaderName
+						+ " (" + columnDateHeaderCount + TXT_ITEMS_IN_COLUMN_HEADER +")"); //$NON-NLS-1$ //$NON-NLS-2$
+		}		
+		getHostingViewer().refresh();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTableColumnData.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,228 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.swt.SWT;
+
+/**
+ * Defines necessary information for a single 
+ * column. This class is used for constructing
+ * <b>S60ToolsTable</b> instance.
+ * @see com.nokia.s60tools.ui.S60ToolsTable
+ * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+ */
+public class S60ToolsTableColumnData {
+   
+	/**
+	 * Column's header text.
+	 */
+	private final String columnHeader;
+	
+	/**
+	 * Column width.
+	 */
+	private final int columnWidth;
+	
+	/**
+	 * Column index (from zero onwards).
+	 */
+	private final int columnIndex;
+	
+	/**
+	 * Sorting criteria for the column.
+	 */
+	private final int columnSortCriteria;
+
+	/**
+	 * <code>true</code> if we want to show item count for this column,
+	 * and <code>false</code> if not (default is <code>false</code>).
+	 */
+	private final boolean showItemCount;
+	
+	/**
+	 * Default column style unless otherwise defined during construction.
+	 */
+	private static final int DEFAULT_COLUMN_STYLE = SWT.LEFT;
+
+	/**
+	 * Column style bits.
+	 */
+	private int columnsStyle = DEFAULT_COLUMN_STYLE;	
+
+	/**
+	 * Constructor using default sorting criteria (no sorting).
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+     * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, int columnIndex) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.showItemCount = false;
+		this.columnSortCriteria = S60ToolsViewerSorter.CRITERIA_NO_SORT;
+	}
+
+	
+	/**
+	 * Constructor using default sorting criteria (no sorting).
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+	 * @param showItemCount <code>true</code> if we want to show item count for this column,
+	 *                     and <code>false</code> if not.
+     * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, int columnIndex,
+			                       boolean showItemCount) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.showItemCount = showItemCount;
+		this.columnSortCriteria = S60ToolsViewerSorter.CRITERIA_NO_SORT;
+	}
+	
+	/**
+	 * Constructor using given sorting criteria.
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+	 * @param columnSortCriteria Sorting criteria for the column.
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, 
+			                       int columnIndex, int columnSortCriteria) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.showItemCount = false;
+		this.columnSortCriteria = columnSortCriteria;
+	}
+
+	/**
+	 * Constructor using given sorting criteria and item count showing status.
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+	 * @param columnSortCriteria Sorting criteria for the column.
+	 * @param showItemCount <code>true</code> if we want to show item count for this column,
+	 *                     and <code>false</code> if not.
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, 
+			                       int columnIndex, int columnSortCriteria,
+			                       boolean showItemCount) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.columnSortCriteria = columnSortCriteria;
+		this.showItemCount = showItemCount;
+	}	
+	
+	/**
+	 * Constructor using given sorting criteria and style bits.
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+	 * @param columnSortCriteria Sorting criteria for the column.
+	 * @param columnsStyle Column style bits, if other than default value.
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, 
+			                       int columnIndex, int columnSortCriteria,
+			                       int columnsStyle) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.columnSortCriteria = columnSortCriteria;
+		this.showItemCount = false;
+		this.columnsStyle = columnsStyle;
+	}	
+	
+	/**
+	 * Constructor using given sorting criteria, item count showing status, and style bits.
+	 * @param columnHeader Column's header text.
+	 * @param columnWidth Column width.
+	 * @param columnIndex Column index (from zero onwards).
+	 * @param columnSortCriteria Sorting criteria for the column.
+	 * @param showItemCount <code>true</code> if we want to show item count for this column,
+	 *                     and <code>false</code> if not.
+	 * @param columnsStyle Column style bits, if other than default value.
+	 */
+	public S60ToolsTableColumnData(String columnHeader, int columnWidth, 
+			                       int columnIndex, int columnSortCriteria,
+			                       boolean showItemCount,
+			                       int columnsStyle) {
+		this.columnHeader = columnHeader;
+		this.columnWidth = columnWidth;
+		this.columnIndex = columnIndex;
+		this.columnSortCriteria = columnSortCriteria;
+		this.showItemCount = showItemCount;
+		this.columnsStyle = columnsStyle;
+	}	
+	
+	/**
+	 * Gets column header.
+	 * @return Returns the columnHeader.
+	 */
+	public String getColumnHeader() {
+		return columnHeader;
+	}
+
+
+	/**
+	 * Gets column width. 
+	 * @return Returns the columnWidth.
+	 */
+	public int getColumnWidth() {
+		return columnWidth;
+	}
+
+	/**
+	 * Gets column index (from zero onwards).
+	 * @return Returns the columnIndex.
+	 */
+	public int getColumnIndex() {
+		return columnIndex;
+	}
+
+	/**
+	 * Gets sorting criteria for the column.
+	 * @return Returns the columnSortCriteria.
+	 */
+	public int getColumnSortCriteria() {
+		return columnSortCriteria;
+	}
+
+
+	/**
+	 * Returns item count showing status.
+	 * @return <code>true</code> if we want to show item count for this column,
+	 *                     and <code>false</code> if not.
+	 */
+	public boolean isShowItemCount() {
+		return showItemCount;
+	}
+	
+	/**
+	 * Gets style bits for the column.
+	 * @return style bits for the column.
+	 */
+	public int getColumnsStyle() {
+		return columnsStyle;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsTableFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,270 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TableColumn;
+
+
+/**
+ * Factory class that creates custom <code>S60ToolsTable</code> component
+ * that is automatically enhanced with sorting functionality.
+ * Columns selections are listened by an instance of 
+ * <code>S60TableColumnSelectionListener</code> and sorting is done
+ * by a concrete sorter class that inherits from <code>S60ToolsViewerSorter</code>
+ * class.
+ * 
+ * An example for creating TableViewer by help of this factory class:
+ * 
+ * <code>
+ * <pre>
+ * ArrayList columnDataArr = new ArrayList();		
+ * //
+ * // NOTE: Column indices must start from zero (0) and
+ * // the columns must be added in ascending numeric
+ * // order.
+ * //
+ *	
+ * // Defining column data for the custom table
+ *    
+ * columnDataArr.add(new S60ToolsTableColumnData("Property", // Column name
+ *                                                80, // Column width
+ *                                                // Column index
+ *                                                ComponentPropertiesData.PROPERTY_COLUMN_INDEX,
+ *                                                // Sorting criteria for the column
+ *                                                PropertyDataSorter.CRITERIA_PROPERTY));
+ *
+ * columnDataArr.add(new S60ToolsTableColumnData("Value",
+ *                                                380,
+ *                                                ComponentPropertiesData.VALUE_COLUMN_INDEX,
+ *                                                PropertyDataSorter.CRITERIA_VALUE));
+ *		
+ * S60ToolsTableColumnData[] arr 
+ *                  = (S60ToolsTableColumnData[]) columnDataArr.toArray(
+ *                                                     new S60ToolsTableColumnData[0]);
+ *		
+ * // Creating custom table with pre-defined column data
+ * S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr);
+ *		
+ * // Creating table viewer from existing Table widget
+ * TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+ *
+ * // It is mandatory to set hosting viewer in order to enable automatic sorting!
+ * tbl.setHostingViewer(tblViewer);
+ *
+ * </pre>
+ * </code>
+ * 
+ * @see com.nokia.s60tools.ui.S60ToolsTable
+ * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+ * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+ * @see org.eclipse.jface.viewers.TableViewer
+ */
+public class S60ToolsTableFactory{
+
+	/**
+	 * Style for the table.
+	 */
+	private static final int DEFAULT_TABLE_STYLE = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | 
+	SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+	
+	/**
+	 * Vertical grabbing mode for the table.
+	 */
+	private static final boolean GRAB_EXCESS_VERTICAL_SPACE = true;
+	
+	/**
+	 * Horizontal grabbing for the table.
+	 */
+	private static final boolean GRAB_EXCESS_HORIZONAL_SPACE = true;
+
+	/**
+	 * Constant for not having column count feature.
+	 */
+	private static final int NO_COLUMN_COUNTING = -1;	
+
+	/**
+	 * Creates custom table type supporting automatic sorting.
+	 * @param parent Parent composite for the table.
+	 * @param columnDataArr Column data for the table.
+	 * @return Custom table instance.
+	 * @see com.nokia.s60tools.ui.S60ToolsTable
+	 * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+	 * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 * @see org.eclipse.jface.viewers.TableViewer
+	 */
+	public static S60ToolsTable create(Composite parent, S60ToolsTableColumnData[] columnDataArr) {
+		return create(parent, columnDataArr, NO_COLUMN_COUNTING);
+	}
+	
+	/**
+	 * Creates custom table type supporting automatic sorting 
+	 * 	and updateable column header.
+	 * @param parent Parent composite for the table.
+	 * @param columnDataArr Column data for the table.
+	 * @param showItemCountInColumn Column index used for showing item count. 
+	 * 			Must reference to <code>columnDataArr</code>[<code>showItemCountInColumn</code>].
+	 * @return Custom table instance.
+	 * @see com.nokia.s60tools.ui.S60ToolsTable
+	 * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+	 * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 * @see org.eclipse.jface.viewers.TableViewer
+	 */
+	public static S60ToolsTable create(Composite parent, S60ToolsTableColumnData[] columnDataArr,
+            						   int showItemCountInColumn) {
+		return create(parent, columnDataArr,
+				     showItemCountInColumn, DEFAULT_TABLE_STYLE);
+	}
+		
+	/**
+	 * Creates custom table type supporting automatic sorting
+	 * that has possibility for checkbox selection of rows.
+	 * @param parent Parent composite for the table.
+	 * @param columnDataArr Column data for the table.
+	 * @return Custom table instance.
+	 * @see com.nokia.s60tools.ui.S60ToolsTable
+	 * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+	 * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 * @see org.eclipse.jface.viewers.TableViewer
+	 */
+	public static S60ToolsTable createCheckboxTable(Composite parent, S60ToolsTableColumnData[] columnDataArr) {
+		return createCheckboxTable(parent, columnDataArr, NO_COLUMN_COUNTING);
+	}
+	
+	/**
+	 * Creates custom table type supporting automatic sorting
+	 * that has possibility for checkbox selection of rows
+	 * with updateable column header.
+	 * @param parent Parent composite for the table.
+	 * @param columnDataArr Column data for the table.
+	 * @param showItemCountInColumn Column index used for showing item count. 
+	 * 			Must reference to <code>columnDataArr</code>[<code>showItemCountInColumn</code>].
+	 * @return Custom table instance.
+	 * @see com.nokia.s60tools.ui.S60ToolsTable
+	 * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+	 * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 * @see org.eclipse.jface.viewers.TableViewer
+	 */
+	public static S60ToolsTable createCheckboxTable(Composite parent, S60ToolsTableColumnData[] columnDataArr,
+            						   int showItemCountInColumn) {
+		return create(parent, columnDataArr,
+				     showItemCountInColumn, DEFAULT_TABLE_STYLE | SWT.CHECK);
+	}
+		
+	/**
+	 * Creates custom table type supporting automatic sorting 
+	 * 	and updateable column header.
+	 * @param parent Parent composite for the table.
+	 * @param columnDataArr Column data for the table.
+	 * @param showItemCountInColumn Column index used for showing item count. 
+	 * 			Must reference to <code>columnDataArr</code>[<code>showItemCountInColumn</code>].
+	 * @param tableStyle Style for the table to be created.
+	 * @return Custom table instance.
+	 * @see com.nokia.s60tools.ui.S60ToolsTable
+	 * @see com.nokia.s60tools.ui.S60TableColumnSelectionListener
+	 * @see com.nokia.s60tools.ui.S60ToolsViewerSorter
+	 * @see org.eclipse.jface.viewers.TableViewer
+	 */
+	private static S60ToolsTable create(Composite parent, S60ToolsTableColumnData[] columnDataArr,
+            						   int showItemCountInColumn, int tableStyle) {
+		
+		S60ToolsTable tbl;
+		if(showItemCountInColumn != NO_COLUMN_COUNTING 
+				&& showItemCountInColumn < columnDataArr.length){
+			tbl = new S60ToolsTable(parent, tableStyle,
+					columnDataArr[showItemCountInColumn].getColumnHeader(), 
+					showItemCountInColumn);
+		}
+		else{
+			tbl = new S60ToolsTable(parent, tableStyle);
+		}
+		
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd.grabExcessVerticalSpace = GRAB_EXCESS_VERTICAL_SPACE;
+		gd.grabExcessHorizontalSpace = GRAB_EXCESS_HORIZONAL_SPACE;
+		gd.horizontalSpan = columnDataArr.length;
+		tbl.setLayoutData(gd);		
+					
+		tbl.setLinesVisible(true);
+		tbl.setHeaderVisible(true);
+		
+		TableColumn tblColumn = null;
+		for (int i = 0; i < columnDataArr.length; i++) {
+			S60ToolsTableColumnData columnData = columnDataArr[i];
+			tblColumn = new TableColumn(tbl.getTableInstance(), 
+										columnData.getColumnsStyle(), 
+									    columnData.getColumnIndex());
+			
+			//If items count in this column is shown, initializin header with value 0
+			if(columnData.isShowItemCount()){
+				tblColumn.setText(
+						columnData.getColumnHeader() + " ("  //$NON-NLS-1$
+						+ 0 +S60ToolsTable.TXT_ITEMS_IN_COLUMN_HEADER + ")"); //$NON-NLS-1$
+			}
+			else{
+				tblColumn.setText(columnData.getColumnHeader());				
+			}
+			tblColumn.setWidth(columnData.getColumnWidth());
+			
+			// Settings sorting to happen in column selection
+			// if sorting criteria has been set.
+			final int sortCriteria = columnData.getColumnSortCriteria();
+			if(sortCriteria != S60ToolsViewerSorter.CRITERIA_NO_SORT){
+				tblColumn.addSelectionListener(new S60TableColumnSelectionListener(tbl){
+					public void widgetSelected(SelectionEvent e){						
+						S60ToolsTable parentTbl = getParentTable();
+						if(parentTbl != null){							
+							TableViewer viewer = parentTbl.getHostingViewer();
+							if(viewer != null){								
+								ViewerSorter sorter = viewer.getSorter();
+								if(sorter != null){									
+									if(sorter instanceof S60ToolsViewerSorter){										
+										S60ToolsViewerSorter s60ToolsSorter = (S60ToolsViewerSorter)sorter;
+										int currentSortCriteria = s60ToolsSorter.getSortCriteria();
+										if(currentSortCriteria != sortCriteria){
+											// If previously using different criteria
+											// => updating the criteria.
+											s60ToolsSorter.setSortCriteria(sortCriteria);																						
+										}
+										else{
+											// If already using this criteria
+											// => no sorting. Back to original ordering.
+											s60ToolsSorter.setSortCriteria(S60ToolsViewerSorter.CRITERIA_NO_SORT);																						
+										}
+										// Refresh forces sort with the new criteria.
+										viewer.refresh();
+									}
+								}
+							}
+						}
+					}
+				});
+			}
+			
+		}
+		
+		return tbl;		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsUIConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+/**
+ * This class defines a set constants that are specified
+ * in Carbide branding guideline:<br><br>
+ * 
+ * <b>CARBIDE LOOK & FEEL SPECIFICATION<br>
+ * Top of Eclipse User Interface Guidelines</b>
+ *
+ */
+public class S60ToolsUIConstants {
+
+	/**
+	 * Margin between title bar and icon placeholder
+	 * Defined in section <b>3.2.2 Wizard dialogs</b>.
+	 */
+	public static final int MARGIN_BTW_TITLE_BAR_AND_ICON_PLACEHOLDER= 10; //c
+
+	/**
+	 * Margin between frame and icon placeholder
+	 * Defined in section <b>3.2.2 Wizard dialogs</b>.
+	 */
+	public static final int MARGIN_BTW_FRAME_AND_ICON_PLACEHOLDER= 17; //d
+
+	/**
+	 * Margin between title bar and title text
+	 * Defined in section <b>3.2.2 Wizard dialogs</b>.
+	 */
+	public static final int MARGIN_BTW_TITLE_BAR_AND_TITLE_TEXT= 20; //e
+
+	/**
+	 * Margin between between text fields
+	 * Defined in section <b>3.2.2 Wizard dialogs</b>.
+	 */
+	public static final int MARGIN_BTW_TEXT_FIELDS= 12; //f
+
+	/**
+	 * Margin between frame and its contents
+	 * Defined in section <b>3.2.2 Wizard dialogs</b>.
+	 */
+	public static final int MARGIN_BTW_FRAME_AND_CONTENTS= 13; //g
+	
+	/**
+	 * Wizards should by default have this width.
+	 * Width can be enforced to a wizard instance
+	 * with the following kind of code:
+	 * <code>
+	 * WizardDialog wizDialog = new ... // Creating concrete dialog instance
+	 * // Forcing preferred initial size
+	 * wizDialog.getShell().setSize(S60ToolsUIConstants.WIZARD_DEFAULT_WIDTH, 
+	 *                              S60ToolsUIConstants.WIZARD_DEFAULT_HEIGHT);
+	 * </code>				              		
+	 */
+	public static final int WIZARD_DEFAULT_WIDTH = 440;
+	
+	/**
+	 * Wizards should by default have this height.
+	 * Height can be enforced to a wizard instance
+	 * with the following kind of code:
+	 * <code>
+	 * WizardDialog wizDialog = new ... // Creating concrete dialog instance
+	 * // Forcing preferred initial size
+	 * wizDialog.getShell().setSize(S60ToolsUIConstants.WIZARD_DEFAULT_WIDTH, 
+	 *                              S60ToolsUIConstants.WIZARD_DEFAULT_HEIGHT);
+	 * </code>				              		
+	 */
+	public static final int WIZARD_DEFAULT_HEIGHT = 463;
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/S60ToolsViewerSorter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * Provides and abstract base class for sorters
+ * that do sorting according some criteria which
+ * can be changed during sorter object lifetime.
+ * Stores sorting criteria, and in addition 
+ * provides some sorting helper methods.
+ * 
+ * Each inheriting class is forced to
+ * implement <code>compare</code> method.
+ */
+public abstract class S60ToolsViewerSorter extends ViewerSorter {
+
+	/**
+	 * By default there is no sort criteria set.
+	 * Sort criterias should be expressed as
+	 * positive integers.
+	 */
+	public static final int CRITERIA_NO_SORT = -1;
+	
+	/**
+	 * Sorting criteria currently in effect.
+	 */
+	protected int sortCriteria = CRITERIA_NO_SORT;
+
+	
+	/**
+	 * This is the radix to be given into Integer.parseInt
+	 * when parsing hexadecimal numbers.
+	 */
+	protected static final int HEX_RADIX = 16;
+	
+	/**
+	 * Alphabetic sort.
+	 * @param str1 1st string to compare.
+	 * @param str2 2nd  string to compare.
+	 * @return Returns a negative integer, zero, 
+	 * 	       or a positive integer as the first argument 
+	 * 	       is less than, equal to, or greater 
+	 *	       than the second. 
+	 */
+	protected int alphabeticSort(String str1, String str2){
+		return str1.compareTo(str2);
+	}
+	
+	/**
+	 * Numeric sort.
+	 * @param num1 1st number to compare.
+	 * @param num2 2nd  number to compare.
+	 * @return Returns a negative integer, zero, 
+	 * 	       or a positive integer as the first argument 
+	 * 	       is less than, equal to, or greater 
+	 *	       than the second. 
+	 */
+	protected int numericSort(long num1, long num2){
+		long result = (num1 - num2);
+		// Trying to avoid situation where long -> int 
+		// casting might fail => instead making
+		// the needed comparisons instead.
+		if(result > 0){
+			return 1;
+		}
+		else if(result < 0){
+			return -1;
+		}
+		else{
+			return 0;
+		}
+	}
+
+	/**
+	 * Numeric sort for strings that should 
+	 * fit into long integer represenation.
+	 * @param numStr1 1st decimal number as string to compare.
+	 * @param numStr2 2nd decimal number as string to compare.
+	 * @return Returns a negative integer, zero, 
+	 * 	       or a positive integer as the first argument 
+	 * 	       is less than, equal to, or greater 
+	 *	       than the second. 
+	 */
+	protected int numericSortFromDecString(String numStr1, String numStr2){
+
+		long num1 = 0;
+		long num2 = 0;
+
+		try {
+			num1 = Long.parseLong(numStr1);
+		} catch (NumberFormatException e) {
+			// num1 is not an integer
+			// 1st argument is less than 2nd => negative
+			return -1;			
+		} 
+		
+		try {
+			num2 = Long.parseLong(numStr2);
+		} catch (NumberFormatException e) {
+			// num2 is not an integer
+            // 1st argument is greater than 2nd => positive
+			return 1;
+		}
+		
+		// Both arguments were normal numeric values
+		return numericSort(num1, num2);
+	}
+	
+	
+	/**
+	 * Parses hexadecimal character string prefixed with 0x
+	 * into numeric representation.
+	 * @param hexString Hexadecimal character string
+	 * @return Corresponding long integer
+	 */
+	protected long parseHexString(String hexString){		
+		if(hexString.startsWith("0x")){ //$NON-NLS-1$
+			// Skipping "0x" characters from the start
+			hexString = hexString.substring(2);
+		}
+		return Long.parseLong(hexString, HEX_RADIX);		
+	}
+
+	/**
+	 * Numeric sort for hexadecimal strings that should 
+	 * fit into long integer represenation.
+	 * @param hexStr1 1st hexadecimal number as string to compare.
+	 * @param hexStr2 2nd hexadecimal number as string to compare.
+	 * @return Returns a negative integer, zero, 
+	 * 	       or a positive integer as the first argument 
+	 * 	       is less than, equal to, or greater 
+	 *	       than the second. 
+	 */
+	protected int numericSortFromHexString(String hexStr1, String hexStr2){
+
+		long num1 = 0;
+		long num2 = 0;
+
+		try {
+			num1 = parseHexString(hexStr1);
+		} catch (NumberFormatException e) {
+			// num1 is not an integer
+			// 1st argument is less than 2nd => negative
+			return -1;			
+		} 
+		
+		try {
+			num2 = parseHexString(hexStr2);
+		} catch (NumberFormatException e) {
+			// num2 is not an integer
+            // 1st argument is greater than 2nd => positive
+			return 1;
+		}
+		
+		// Both arguments were normal numeric values
+		return numericSort(num1, num2);
+	}
+	
+	
+	/**
+	 * Gets currently active sort criteria.
+	 * @return Returns the sortCriteria.
+	 */
+	public int getSortCriteria() {
+		return sortCriteria;
+	}
+
+	/**
+	 * Sets currently active sort criteria.
+	 * @param sortCriteria The sortCriteria to set.
+	 */
+	public void setSortCriteria(int sortCriteria) {
+		this.sortCriteria = sortCriteria;
+	}
+		
+	/**
+	 * Comparison operation for two objects.
+	 * @param viewer Reference to the viewer component.
+	 * @param e1 1st object to compare.
+	 * @param e2 2nd object to compare.
+	 * @return Returns a negative integer, zero, 
+	 * 	       or a positive integer as the first argument 
+	 * 	       is less than, equal to, or greater 
+	 *	       than the second. 
+	 *
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	abstract public int compare(Viewer viewer, Object e1, Object e2);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/SimpleAlphabeticSorter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * This viewer sorter just sorts object names alphabetically
+ * based on value they return when <code>toString</code> method
+ * is called for the object.
+ */
+public class SimpleAlphabeticSorter extends ViewerSorter {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		return e1.toString().compareTo(e2.toString());
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/StringArrayClipboardCopyHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.ui;
+
+import java.util.List;
+
+
+/**
+ * Generic clipboard copy handler, supports String arrays and returns one string.
+ * Each array items is separated with new line.
+ */
+public class StringArrayClipboardCopyHandler extends AbstractTextClipboardCopyHandler{
+	
+	String[] propDataArr = null;
+
+	/** 
+	 * Returns a String if only one line of text was selected.
+	 * If multiple lines of text was selected, String contains lines separeted with new line <code>"\n"</code>.
+	 * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler#buildTextString()
+	 */
+	protected String buildTextString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		for (int i = 0; i < propDataArr.length; i++) {			
+			strBuf.append(propDataArr[i]); //$NON-NLS-1$
+			//If we have more than one line of text, adding new lines between them.
+			if(propDataArr.length > 1 && i != (propDataArr.length -1 )){
+				strBuf.append("\r\n"); //$NON-NLS-1$
+			}
+		}
+		return strBuf.toString();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.ICopyActionHandler#acceptAndCopy(java.util.List)
+	 */
+	public boolean acceptAndCopy(List<Object> objectsToCopy) {
+		
+		try {
+			// Trying avoid unnecessary exceptions
+			
+			if(objectsToCopy.size() > 0){
+				if(!(objectsToCopy.get(0) instanceof String)){
+					return false;
+				}
+			}
+			else{
+				// No objects to copy
+				return false;
+			}
+			propDataArr = (String[]) objectsToCopy.toArray(new String[0]);
+			// Class cast succeeded, and we can perform copy
+			performCopy();
+			return true;
+		} catch (ClassCastException e) {
+			// We can ignore this, this means just that we d
+			// do not suppor the given object type
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/UiUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.ui.internal.S60ToolsUiPlugin;
+
+/**
+ * Miscellaneous utility methods related to UI.
+ */
+public class UiUtils {
+
+	/**
+	 * Empty banner image name.
+	 */
+	public static String NOKIA_TOOLS_BANNER = "empty_banner.png"; //$NON-NLS-1$
+
+    /**
+     * Method for retrieving wizard banner background for the given icon.
+     * @param toolWizardIcon Tool's wizard icon to be added on top of background banner.
+     * @return given icon with the wizard banner background
+     */
+    public static ImageDescriptor getBannerImageDescriptor(ImageDescriptor toolWizardIcon) {
+
+    	// Getting background image.
+    	ImageDescriptor bannerDesc = S60ToolsUiPlugin.getImageDescriptorForKey(NOKIA_TOOLS_BANNER);
+
+	    // If icon is null, return only the banner
+	    if(toolWizardIcon == null)
+	        return bannerDesc;
+
+	    Image bannerImage = bannerDesc.createImage();
+	    Image iconImage = toolWizardIcon.createImage();
+
+	    GC imageGC = new GC(bannerImage);
+
+	    // Draw icon over the banner, in the middle
+	    imageGC.drawImage(iconImage,
+	        bannerImage.getBounds().width / 2 - iconImage.getBounds().width / 2,
+	        bannerImage.getBounds().height / 2 - iconImage.getBounds().height / 2);
+
+	    ImageDescriptor finalDesc = ImageDescriptor.createFromImageData(bannerImage.getImageData());
+
+	    // Dispose graphics
+	    imageGC.dispose();
+	    bannerImage.dispose();
+	    iconImage.dispose();
+
+	    return finalDesc;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyFromStringProviderToClipboardAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+
+import com.nokia.s60tools.ui.ICopyActionHandler;
+import com.nokia.s60tools.ui.IStringProvider;
+import com.nokia.s60tools.ui.internal.Messages;
+
+/**
+ * This is an example of reusable copy handler action
+ * that utilizes <code>ICopyActionHandler</code> interface
+ * and acts as client for a concrete copy handler subclassed
+ * from <code>AbstractTextClipboardCopyHandler</code> class.
+ * 
+ * Usage:
+ * 
+ * <code>
+ * <pre>
+ *   public class MyStringProvider implements IStringProvider{
+ *      public String getString(){return "myString";}    
+ *   }
+ *   
+ *   ...
+ *   
+ *   List list = new List(...) //List from org.eclipse.swt.widgets
+ *   MyStringProvider myStringProvider = new MyStringProvider();
+ *   StringArrayClipboardCopyHandler copyHandler = new StringArrayClipboardCopyHandler();		
+ *   Action myCopyAction = new CopyFromStringProviderToClipboardAction(myStringProvider,
+ *                                                           new ICopyActionHandler[]{ copyHandler });
+ *                                                           
+ *   MenuManager menuMgr = new MenuManager("#PopupCopyMenu");
+ *   menuMgr.addMenuListener(new IMenuListener() {
+ * 			public void menuAboutToShow(IMenuManager manager) {
+ *				ThisClass.this.fillViewContextMenu(manager);
+ *			}
+ *		});
+ *	 Menu menu = menuMgr.createContextMenu(list);
+ *	 list.setMenu(menu);   
+ *
+ *  ...
+ *
+ * 	 private void fillViewContextMenu(IMenuManager manager) {
+ *		manager.add(actionCompPropertiesDataCopy);
+ *		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ *	 }  
+ *                                                      
+ * </pre>
+ * </code>
+ *
+ * @see com.nokia.s60tools.ui.ICopyActionHandler
+ * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler
+ */
+public class CopyFromStringProviderToClipboardAction extends Action{
+	
+	
+	/**
+	 * Array of copy handler candidates offering copying services.
+	 * The list is gone through until copy handler supporting the selected
+	 * objects has been found.
+	 */
+	private final ICopyActionHandler[] copyHandlerArr;
+	private final IStringProvider stringProvider;
+
+	/**
+	 * Constructor using default description (Copy) and tooltip text
+	 * (Copies the selected information to clipboard).
+	 * @param  stringProvider Class which provides a String.
+	 * @param copyHandlerArr Array of copy handler candidates offering copying services.
+	 */
+	public CopyFromStringProviderToClipboardAction(IStringProvider stringProvider,  ICopyActionHandler[] copyHandlerArr){		
+		this.stringProvider = stringProvider;
+		this.copyHandlerArr = copyHandlerArr;
+		setText(Messages.getString("CopyFromTableViewerAction.Copy_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("CopyFromTableViewerAction.Copy_Action_Tooltip"));		 //$NON-NLS-1$
+	}
+	
+	/**
+	 * Constructor allowing creator to define description and
+	 * tooltip text.
+	 * @param stringProvider Class which provides a String
+	 * @param copyHandlerArr Array of copy handler candidates offering copying services.
+	 * @param actionDescrText Action's text that is visible in menus etc.
+	 * @param actionTooltipText Hover text shown when mouse cursor is over the action.
+	 */
+	public CopyFromStringProviderToClipboardAction(IStringProvider stringProvider, ICopyActionHandler[] copyHandlerArr,
+									 String actionDescrText, String actionTooltipText){		
+		this.stringProvider = stringProvider;
+		this.copyHandlerArr = copyHandlerArr;
+		setText(actionDescrText);
+		setToolTipText(actionTooltipText);		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */	
+	public void run() {
+		
+		List<Object> objList = new ArrayList<Object>(1);
+		objList.add(stringProvider.getString());
+		for (int i = 0; i < copyHandlerArr.length; i++) {
+			ICopyActionHandler handler = copyHandlerArr[i];
+			if(handler.acceptAndCopy(objList)){
+				// Handler accepted the input
+				break;
+			}
+			
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyFromTableViewerAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.ui.ICopyActionHandler;
+import com.nokia.s60tools.ui.internal.Messages;
+
+/**
+ * This is an example of reusable copy handler action
+ * that utilizes <code>ICopyActionHandler</code> interface
+ * and acts as client for a concrete copy handler subclassed
+ * from <code>AbstractTextClipboardCopyHandler</code> class.
+ * 
+ * Usage:
+ * 
+ * <code>
+ * <pre>
+ * 
+ *   TableViewer myTableViewer;
+ *   Action myTableViewerCopyAction;
+ *   MyConcreteClipboardCopyHandler copyHandler = new MyConcreteClipboardCopyHandler();		
+ *   myTableViewerCopyAction = new CopyFromTableViewerAction(myTableViewer,
+ *                                                           new ICopyActionHandler[]{ copyHandler });
+ * </pre>
+ * </code>
+ *
+ * @see com.nokia.s60tools.ui.ICopyActionHandler
+ * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler
+ */
+public class CopyFromTableViewerAction extends Action{
+	
+	/**
+	 * Table viewer from which to get objects to be copied
+	 * when action is triggered.
+	 */
+	private final TableViewer viewer;
+	
+	/**
+	 * Array of copy handler candidates offering copying services.
+	 * The list is gone through until copy handler supporting the selected
+	 * objects has been found.
+	 */
+	private final ICopyActionHandler[] copyHandlerArr;
+
+	/**
+	 * Constructor using default description (Copy) and tooltip text
+	 * (Copies the selected information to clipboard).
+	 * @param viewer Table viewer from which to get objects to be copied.
+	 * @param copyHandlerArr Array of copy handler candidates offering copying services.
+	 */
+	public CopyFromTableViewerAction(TableViewer viewer, ICopyActionHandler[] copyHandlerArr){		
+		this.viewer = viewer;
+		this.copyHandlerArr = copyHandlerArr;
+		setText(Messages.getString("CopyFromTableViewerAction.Copy_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("CopyFromTableViewerAction.Copy_Action_Tooltip"));		 //$NON-NLS-1$
+	}
+	
+	/**
+	 * Constructor allowing creator to define description and
+	 * tooltip text.
+	 * @param viewer Table viewer from which to get objects to be copied.
+	 * @param copyHandlerArr Array of copy handler candidates offering copying services.
+	 * @param actionDescrText Action's text that is visible in menus etc.
+	 * @param actionTooltipText Hover text shown when mouse cursor is over the action.
+	 */
+	public CopyFromTableViewerAction(TableViewer viewer, ICopyActionHandler[] copyHandlerArr,
+									 String actionDescrText, String actionTooltipText){		
+		this.viewer = viewer;
+		this.copyHandlerArr = copyHandlerArr;
+		setText(actionDescrText);
+		setToolTipText(actionTooltipText);		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */	
+	@SuppressWarnings("unchecked") //$NON-NLS-1$
+	public void run() {
+		
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		List<Object> objList = selection.toList();
+		for (int i = 0; i < copyHandlerArr.length; i++) {
+			ICopyActionHandler handler = copyHandlerArr[i];
+			if(handler.acceptAndCopy(objList)){
+				// Handler accepted the input
+				break;
+			}
+			
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/CopyImageToClipboardAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/ 
+package com.nokia.s60tools.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.ImageTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.graphics.Drawable;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.ui.IImageProvider;
+import com.nokia.s60tools.ui.internal.Messages;
+
+/**
+ * Action class for copying Image to clipboard
+ */
+public class CopyImageToClipboardAction extends S60ToolsBaseAction {
+	
+	
+	/**
+	 * Image to copy to clipboard
+	 */
+	private IImageProvider imageProvider;
+
+	/**
+	 * Constructor
+	 * @param provider image provider that provides {@link Image} and {@link Drawable}
+	 * @see com.nokia.s60tools.ui.IImageProvider
+	 */
+	public CopyImageToClipboardAction(IImageProvider provider) {
+		super(Messages.getString("CopyFromTableViewerAction.Copy_Action_Text"), //$NON-NLS-N1
+				Messages.getString("CopyFromTableViewerAction.Copy_Action_Tooltip"), //$NON-NLS-N1
+				IAction.AS_PUSH_BUTTON, null);
+		this.imageProvider = provider;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		performCopy();
+	}	
+	
+	/**
+	 * Performs copy action by copying Image to clipboard.
+	 */
+	private void performCopy(){
+		
+		//Runnable is used to avoid e.g. pop-up menu to appear in image in case when 
+		//image is based on screen capture.
+		Runnable runCopy = new Runnable(){
+
+			public void run() {
+				if (imageProvider != null && imageProvider.getDrawable() != null && imageProvider.getImage() != null) {
+					GC gc = new GC(imageProvider.getDrawable());
+					Image image = imageProvider.getImage();
+					gc.copyArea(image, 0, 0);
+					gc.dispose();
+					
+					Display disp = Display.getCurrent();
+					Clipboard clipBrd  = new Clipboard(disp);
+					
+					ImageTransfer imageTransfer = ImageTransfer.getInstance();
+					clipBrd.setContents(new Object[]{image.getImageData()}, 
+							new Transfer[]{imageTransfer});
+					clipBrd.dispose();
+				}				
+			}						
+		};
+		
+		Display.getDefault().asyncExec(runCopy);
+
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/OpenPreferencePageAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.ui.internal.Messages;
+import com.nokia.s60tools.ui.internal.S60ToolsUiPlugin;
+import com.nokia.s60tools.ui.preferences.PreferenceUtils;
+
+
+/**
+ * Action for opening a preferences page
+ */
+public class OpenPreferencePageAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Preference page icon
+	 */
+	public static final String IMG_PREFERENCE_PAGE = "IMG_PREFERENCE_PAGE";
+	private String preferencePageID = null;
+	private String preferencePageTabID = null;
+	private Shell shell = null;
+
+	
+	
+	/**
+	 * Constructor for creating Action to open preference page tab
+	 * @param preferencePageID
+	 * @param preferencePageTabID
+	 * @param shell
+	 */
+	public OpenPreferencePageAction(String preferencePageID,
+			String preferencePageTabID, Shell shell) {
+		super(Messages.getString("OpenPreferencePageAction.OpenPreferences_Action_Text"), //$NON-NLS-1$
+				Messages.getString("OpenPreferencePageAction.OpenPreferences_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				S60ToolsUiPlugin.getImageDescriptorForKey(IMG_PREFERENCE_PAGE));
+		this.preferencePageID = preferencePageID;
+		this.preferencePageTabID = preferencePageTabID;
+		this.shell = shell;
+	}
+	
+	/**
+	 * Constructor for creating Action to open preference page 
+	 * @param preferencePageID
+	 * @param shell
+	 */
+	public OpenPreferencePageAction(String preferencePageID,
+			Shell shell) {
+		this(preferencePageID, null, shell);
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		openPreferencePage();
+	}
+
+	
+	
+	/**
+	 * Open HTI API preferences page preference page
+	 */
+	private void openPreferencePage(){
+		
+		if(preferencePageTabID == null){
+			PreferenceUtils.openPreferencePage(preferencePageID, shell);
+		}
+		else{
+			PreferenceUtils.openPreferencePage(preferencePageID, preferencePageTabID, shell);
+		}						
+	}	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/S60ToolsBaseAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.ui.internal.S60ToolsUiPlugin;
+
+/**
+ * A base action that can be used by inheriting
+ * it and by overriding default run()-method.
+ * 
+ * By sub-classing this action it is easy to create actions for prototyping
+ * purposes during the development start-up phases.
+ */
+public class S60ToolsBaseAction extends Action {
+
+	/**
+	 * Image key for default S60 tools action icon
+	 */
+	public final static String S60TOOLS_ACTION_ICON = "S60TOOLS_ACTION_ICON"; //$NON-NLS-1$		
+	
+	/**
+	 * Constructor.
+	 */
+	public S60ToolsBaseAction(){
+		super();
+	}
+
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 */
+	public S60ToolsBaseAction(String text, String tooltip){
+		// Creates action by using default push button style.
+		this(text, tooltip, IAction.AS_PUSH_BUTTON);
+	}
+
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param buttonStyle Style supported
+	 */
+	public S60ToolsBaseAction(String text, String tooltip, int buttonStyle){
+		this(text, tooltip, IAction.AS_PUSH_BUTTON, S60ToolsUiPlugin.getImageDescriptorForKey(S60TOOLS_ACTION_ICON));
+	}
+	
+	
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param buttonStyle Style supported
+	 * @param imageDescriptor ImageDescriptor of the image used for the action. 
+	 */
+	public S60ToolsBaseAction(String text, String tooltip, int buttonStyle, ImageDescriptor imageDescriptor){
+		super(text, buttonStyle);
+		setToolTipText(tooltip);
+		if(imageDescriptor != null){
+			setImageDescriptor(imageDescriptor);						
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/actions/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides reusable actions.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/dialogs/S60ToolsListBoxDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,359 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.ui.S60ToolsUIConstants;
+
+/**
+ * Implements a list box dialog with read-only text content.
+ * The dialog can be parameterized with title, resizable property,
+ * scroll bar owning property, and with size attributes. 
+ * Dialog has just OK button which closes the dialog.<br>
+ *
+ * Usage example:
+ *
+ * <code>
+ * <pre>
+ * 
+ * // Parent shell
+ * Shell sh = Display.getCurrent().getActiveShell()
+ * 
+ * String dialogTitle = "Product Name";
+ * String listBoxContent = "My List Box Content String";
+ * 
+ * S60ToolsListBoxDialog dlg = new S60ToolsListBoxDialog(sh, 
+ *                                                       dialogTitle, 
+ *                                                       listBoxContent, 
+ *                                                       false, // not resizable
+ *                                                       true, // no vertical scroll bar
+ *                                                       true,  // has horizontal scroll bar
+ *                                                       300,    // default width
+ *                                                       250    // default height
+ *                                                       );
+ * dlg.create();
+ * dlg.open();			
+ *  
+ * </pre> 
+ * </code>
+ * 
+ * It is also possible to enhance the dialog with Cancel button and
+ * with optional message for the contents shown in the list box.
+ * 
+ * <code>
+ * <pre>
+ * 		
+ * // Parent shell
+ * Shell sh = Display.getCurrent().getActiveShell()
+ * 
+ * String dialogTitle = "Product Name";
+ * String listBoxContent = "My List Box Content String";
+ * String confirmMsg = "Do you want to really perform this operation?";
+ * 
+ * S60ToolsListBoxDialog dlg = new S60ToolsListBoxDialog(sh, 
+ *                                                       dialogTitle, 
+ *                                                       listBoxContent, 
+ *                                                       false, // not resizable
+ *                                                       true,  // no vertical scroll bar
+ *                                                       true,  // has horizontal scroll bar
+ *                                                       300,   // default width
+ *                                                       250    // default height
+ *               										 true, 	//Creating Cancel button
+ *                                                       confirmMsg // message show above text box
+ *                );		 
+ *		dlg.create();
+ *		int userAnswer = dlg.open();
+ *		if(userAnswer == Dialog.OK){
+ *			// Performing queried operation only, if user selected OK
+ *          ...
+ *			}					
+ *		}
+ *
+ * </pre> 
+ * </code>
+ * 
+ * @see org.eclipse.jface.dialogs.Dialog
+ */
+public class S60ToolsListBoxDialog extends Dialog{
+
+	/**
+	 * List box dialog title.
+	 */
+	private final String dialogTitle;
+	
+	/**
+	 * List box dialog content.
+	 */
+	private final String listBoxContentString;
+	
+	/**
+	 * List box dialog text control for showing the content.
+	 */
+	private Text listBoxContentTextControl;
+	
+	/**
+	 * Owning of vertical scroll bar.
+	 */
+	private final boolean hasVerticalScrollBar;
+	
+	/**
+	 * Owning of horizontal scroll bar.
+	 */
+	private final boolean hasHorizontalScrollBar;
+	
+	/**
+	 * Preferred width.
+	 */
+	private final int widthHint;
+	
+	/**
+	 * Preferred height.
+	 */
+	private final int heightHint;
+
+	/**
+	 * Default style for the list box dialog 
+	 */
+	private static final int DEFAULT_STYLE = SWT.MULTI | SWT.READ_ONLY | SWT.BORDER;
+
+	/**
+	 * This is set to <code>true</code> if the dialog has a Cancel button, 
+	 * otherwise set to <code>false</code>.
+	 */
+	private final boolean hasCancelButton;
+
+	/**
+	 * This stores optional text that can be shown 
+	 * on top of the text box control.
+	 */
+	private final String optionalTextAboveListBox;
+	
+	/**
+	 * This is the UI control for showing <code>optionalTextAboveListBox</code>.
+	 */
+	private Label labelControlAboveListBox;
+
+	/**
+	 * ID for context sensitive-help, <code>null</code> means not used/supported by default.
+	 */
+	private String contextHelpID = null;	
+		
+	/**
+	 * Constructor, with OK button only and with no extra Label.
+	 * @param parentShell Parent shell.
+	 * @param dialogTitle Dialog title.
+	 * @param listBoxContent Content to be showed in the dialog.
+	 * @param isResizable If <code>true</code>, dialog will be resizable.
+	 * @param hasVerticalScrollBar If <code>true</code>, dialog will have vertical scroll bar.
+	 * @param hasHorizontalScrollBar If <code>true</code>, dialog will have horizontal scroll bar.
+	 * @param widthHint	Preferred width for the dialog.
+	 * @param heightHint Preferred height for the dialog.
+	 */
+	public S60ToolsListBoxDialog(Shell parentShell, 
+			                     String dialogTitle,
+								 String listBoxContent,
+								 boolean isResizable, 
+								 boolean hasVerticalScrollBar,
+								 boolean hasHorizontalScrollBar,
+								 int widthHint,
+								 int heightHint) {
+
+		
+		this(parentShell,dialogTitle, listBoxContent, isResizable, 
+				hasVerticalScrollBar, hasHorizontalScrollBar,
+				widthHint,heightHint, false, null );
+	}
+	
+	/**
+	 * Constructor, with support for Cancel button, extra label 
+	 * but not context-sensitive help ID.
+	 * @param parentShell Parent shell.
+	 * @param dialogTitle Dialog title.
+	 * @param listBoxContent Content to be showed in the dialog.
+	 * @param isResizable If <code>true</code>, dialog will be resizable.
+	 * @param hasVerticalScrollBar If <code>true</code>, dialog will have vertical scroll bar.
+	 * @param hasHorizontalScrollBar If <code>true</code>, dialog will have horizontal scroll bar.
+	 * @param widthHint	Preferred width for the dialog.
+	 * @param heightHint Preferred height for the dialog.
+	 * @param hasCancelButton If <code>true</code>, dialog will have also Cancel button.
+	 * @param optionalTextAboveListBox If not <code>null</code>, dialog will have also a label above the list box.
+	 */
+	public S60ToolsListBoxDialog(Shell parentShell, 
+			                     String dialogTitle,
+								 String listBoxContent,
+								 boolean isResizable, 
+								 boolean hasVerticalScrollBar,
+								 boolean hasHorizontalScrollBar,
+								 int widthHint,
+								 int heightHint,
+								 boolean hasCancelButton,
+								 String optionalTextAboveListBox) {
+
+		this(parentShell,dialogTitle, listBoxContent, isResizable, 
+				hasVerticalScrollBar, hasHorizontalScrollBar,
+				widthHint,heightHint, hasCancelButton, 
+				optionalTextAboveListBox, null );
+	}	
+	
+	
+	/**
+	 * Constructor, with support for Cancel button, extra label 
+	 * and context-sensitive help ID.
+	 * @param parentShell Parent shell.
+	 * @param dialogTitle Dialog title.
+	 * @param listBoxContent Content to be showed in the dialog.
+	 * @param isResizable If <code>true</code>, dialog will be resizable.
+	 * @param hasVerticalScrollBar If <code>true</code>, dialog will have vertical scroll bar.
+	 * @param hasHorizontalScrollBar If <code>true</code>, dialog will have horizontal scroll bar.
+	 * @param widthHint	Preferred width for the dialog.
+	 * @param heightHint Preferred height for the dialog.
+	 * @param hasCancelButton If <code>true</code>, dialog will have also Cancel button.
+	 * @param optionalTextAboveListBox If not <code>null</code>, dialog will have also a label above the list box.
+	 * @param contextHelpID ID for context sensitive-help, <code>null</code> means not used.
+	 */
+	public S60ToolsListBoxDialog(Shell parentShell, 
+								 String dialogTitle,
+								 String listBoxContent,
+								 boolean isResizable, 
+								 boolean hasVerticalScrollBar,
+								 boolean hasHorizontalScrollBar,
+								 int widthHint,
+								 int heightHint,
+								 boolean hasCancelButton,
+								 String optionalTextAboveListBox,
+								 String contextHelpID) {
+
+		super(parentShell);
+		if(isResizable){
+			setShellStyle(getShellStyle() | SWT.RESIZE);			
+		}		
+		this.dialogTitle = dialogTitle;
+		this.listBoxContentString = listBoxContent;
+		this.hasVerticalScrollBar = hasVerticalScrollBar;
+		this.hasHorizontalScrollBar = hasHorizontalScrollBar;
+		this.widthHint = widthHint;
+		this.heightHint = heightHint;
+		
+		this.hasCancelButton = hasCancelButton;
+		this.optionalTextAboveListBox = optionalTextAboveListBox;
+		this.contextHelpID = contextHelpID;		
+	}	
+	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		//If label is set, showing it
+		if(optionalTextAboveListBox != null){
+			Composite container = new Composite(parent, SWT.NO_FOCUS);
+			labelControlAboveListBox = new Label(container, SWT.LEFT);
+			container.setLayout(new GridLayout(1,false));
+			labelControlAboveListBox.setText(optionalTextAboveListBox);
+		}		
+		
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+	
+		//
+		//Adding custom controls
+		//
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = widthHint;
+		gd.heightHint = heightHint;
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);
+		
+		int style = DEFAULT_STYLE;
+		
+		if(hasHorizontalScrollBar){
+			style = style | SWT.H_SCROLL;
+		}
+		
+		if(hasVerticalScrollBar){
+			style = style | SWT.V_SCROLL;
+		}
+		
+		GridLayout gdl2 = new GridLayout(cols, false);
+		GridData gd2 = new GridData(GridData.FILL_BOTH);
+		final int margins = 2 * S60ToolsUIConstants.MARGIN_BTW_FRAME_AND_CONTENTS;
+		gd2.widthHint = widthHint - margins;
+		gd2.heightHint = heightHint - margins;
+		
+		dialogAreaComposite.setLayoutData(gd2);
+
+		listBoxContentTextControl = new Text(dialogAreaComposite, style);
+		listBoxContentTextControl.setText(listBoxContentString);		
+		dialogAreaComposite.setLayout(gdl2);
+		listBoxContentTextControl.setLayoutData(gd2);				
+		
+		// Optionally adding context-sensitive help support
+		if(contextHelpID != null){
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(listBoxContentTextControl, contextHelpID);
+		}
+		
+		return dialogAreaComposite;
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        if (dialogTitle != null)
+            shell.setText(dialogTitle);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        // Creating OK button
+        Button okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+                true);
+		// Optionally adding context-sensitive help support
+		if(contextHelpID != null){
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(okButton, contextHelpID);
+		}
+        //if cancel button also required
+        if(hasCancelButton){
+            Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,
+                    true);
+    		// Optionally adding context-sensitive help support
+    		if(contextHelpID != null){
+    			PlatformUI.getWorkbench().getHelpSystem().setHelp(cancelButton, contextHelpID);
+    		}        	
+        }
+    }
+       
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/dialogs/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides reusable dialog classes.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.ui.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.ui.internal.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/S60ToolsUiPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.ui.UiUtils;
+import com.nokia.s60tools.ui.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class S60ToolsUiPlugin extends AbstractUIPlugin {
+
+	/**
+	 * Shared plug-in ID.
+	 */
+	public static final String PLUGIN_ID = "com.nokia.s60tools.ui";
+
+	/**
+	 * The shared plug-in instance.
+	 */
+	private static S60ToolsUiPlugin plugin;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;
+	
+	/**
+	 * The constructor.
+	 */
+	public S60ToolsUiPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		pluginInstallLocation = getPluginInstallPath();
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static S60ToolsUiPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path); //$NON-NLS-1$
+	}
+
+	/**
+	 * 
+	 * @return plugin install path
+	 * @throws IOException
+	 */
+	public String getPluginInstallPath() throws IOException{
+		 // URL to the plugin's root ("/")
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		//	Converting into local path
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		//	Getting install location in correct form
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+				
+		return pluginInstallLocation;		
+	}
+	
+	/**
+	 * Gets images path relative to given plugin install path.
+	 * @return Path were image resources are located.
+	 */
+	private String getImagesPath(){
+		return pluginInstallLocation
+				+ File.separatorChar
+				+ "icons"; //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
+     */
+    protected void initializeImageRegistry(ImageRegistry imgReg) {
+    	
+    	//
+    	// Storing images to plugin's image registry
+    	//
+    	Display disp = Display.getCurrent();
+    	
+    	Image img = new Image( disp, getImagesPath() + File.separator + "empty_banner.png" );        	 //$NON-NLS-1$
+        imgReg.put( UiUtils.NOKIA_TOOLS_BANNER, img );
+        
+    	img = new Image( disp, getImagesPath() + File.separator + "s60tools_action_icon.png" );        	 //$NON-NLS-1$
+        imgReg.put( S60ToolsBaseAction.S60TOOLS_ACTION_ICON, img );
+        
+    	img = new Image( disp, getImagesPath() + File.separator + "preferences.png"); //$NON-NLS-1$
+        imgReg.put( OpenPreferencePageAction.IMG_PREFERENCE_PAGE, img );        
+        
+    }
+    
+	/**
+	 * Returns image descriptor for the given key from the plugin's image registry.
+	 * @param key Key to search descriptor for.
+	 * @return Image descriptor for the given key from the plugin's image registry.
+	 */
+	public static ImageDescriptor getImageDescriptorForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}	
+
+	/**
+	 * Returns image for the given key from the plugin's image registry.
+	 * @param key Key to search image for.
+	 * @return Image for the given key from the plugin's image registry.
+	 */
+	public static Image getImageForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();    	
+    	return  imgReg.get(key);		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+CopyFromTableViewerAction.Copy_Action_Text=Copy
+CopyFromTableViewerAction.Copy_Action_Tooltip=Copies the selected information to clipboard
+S60ToolsTable.Items_Str=items
+S60ToolsTable.TableMustBeViewerInstance_Exception=Table with SWT.CHECK property must be hosted by CheckboxTableViewer instance.
+OpenPreferencePageAction.OpenPreferences_Action_Text=Preferences
+OpenPreferencePageAction.OpenPreferences_Action_Tooltip=Open Preference page dialog
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/resources/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.ui.internal.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.ui.internal.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/internal/resources/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+DebugMetadataWizardPage.SelgeIniDescription=Define selge.ini path. See help for more information.
+DebugMetadataWizardPage.UseSelgeIni=Use selge.ini
+DebugMetadataWizardPage.DefinePathsManually=Define paths to symbol file & map files
+DebugMetadataWizardPage.SelgeIniFile=Selge.ini file
+DebugMetadataWizardPage.Browse=Browse...
+DebugMetadataWizardPage.ShowDetails=Show Details
+DebugMetadataWizardPage.SymbolDescription=Define paths to symbol files, map files and image files. See help for more information
+DebugMetadataWizardPage.SymbolFiles=Symbol files
+DebugMetadataWizardPage.Add=Add...
+DebugMetadataWizardPage.Remove=Remove
+DebugMetadataWizardPage.MapFiles=Map Files
+DebugMetadataWizardPage.MapFilesFolder=Map Files folder
+DebugMetadataWizardPage.MapFilesZip=MapFiles.zip
+DebugMetadataWizardPage.SdkMapFilesFolder=SDK Map files folder
+DebugMetadataWizardPage.NoMapFiles=No Map files
+DebugMetadataWizardPage.ImageFiles=Image Files (.fpsx, .Cxx, .Vxx, .img)
+DebugMetadataWizardPage.SelectSelgeIniFile=Select selge.ini file
+DebugMetadataWizardPage.SelectSymbolFile=Select symbol file
+DebugMetadataWizardPage.SelectImageFile=Select image file
+DebugMetadataWizardPage.SelectMapFilesZip=Select MapFiles.zip
+DebugMetadataWizardPage.InvalidSelgeIni=Invalid selge.ini
+DebugMetadataWizardPage.InvalidMapFilesFolder=Invalid Map Files folder.
+DebugMetadataWizardPage.SelectedZipContainsNoMapFiles=Selected MapFiles.zip does not contain any map files.
+DebugMetadataWizardPage.InvalidMapFilesZip=Invalid MapFiles.zip
+DebugMetadataWizardPage.SdkMapFilesFolderNotSelected=SDK Map files folder not selected.
+DebugMetadataWizardPage.RomIdsDoNotMatch=ROM IDs of selected files do not match. Only selge.ini can be used.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides miscellaneous reusable UI related classes (interfaces, custom components, sorters).
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/preferences/PreferenceUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/ 
+package com.nokia.s60tools.ui.preferences;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+
+public class PreferenceUtils {
+
+	/**
+	 * Open a preference page by ID introduced in <code>plugin.xml</code>
+	 * 
+	 * @param preferencePageID ID for preference page
+	 * @param shell {@link Shell}
+	 */
+	public static void openPreferencePage(String preferencePageID, Shell shell) {
+
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
+				shell, preferencePageID, null, null);
+
+		dialog.open();
+	}		
+	
+	/**
+	 * Open a preference page tab by ID introduced in <code>plugin.xml</code>
+	 * 
+	 * If the preference page contains tabs, and one tab is wanted to open, use this. 
+	 * 
+	 * @param preferencePageID ID for preference page
+	 * @param preferencePageTabID ID for preference page tab under preference page with ID <preferencePageID>
+	 * @param shell {@link Shell}
+	 */
+	// Warning comes from org.eclipse.jface.preference.PreferenceManager.getElements(int) because it uses raw List type as return value	
+	@SuppressWarnings("unchecked")
+	public static void openPreferencePage(String preferencePageID,
+			String preferencePageTabID, Shell shell) {
+
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
+				shell, preferencePageID, null, null);
+
+		List<IPreferenceNode> elemns = dialog.getPreferenceManager()
+				.getElements(PreferenceManager.PRE_ORDER);
+		IPreferenceNode preferenceNode = null;
+		//check all preference pages, if required is found
+		for (Iterator<IPreferenceNode> iterator = elemns.iterator(); iterator
+				.hasNext();) {
+			preferenceNode = iterator.next();
+			if (preferenceNode.getId().equals(preferencePageTabID)) {
+				break;
+			}
+		}
+		
+		//If required preference page tab was found, set that as selection
+		if (preferenceNode != null) {
+			dialog.getTreeViewer().setSelection(
+					new StructuredSelection(preferenceNode));
+		}
+
+		dialog.open();
+
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/DebugMetadataWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1315 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+package com.nokia.s60tools.ui.wizards;
+
+import java.io.File;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.jface.dialogs.IDialogSettings;
+
+import com.nokia.s60tools.ui.internal.resources.Messages;
+
+import java.util.*;
+
+/**
+ * Wizard page for querying user for: Symbol, map and image files.
+ * 
+ * This page can also be used to query selge.ini location, but this
+ * functionality is hidden from the user at the moment. It might 
+ * be restored in the future.
+ *
+ */
+public abstract class DebugMetadataWizardPage extends S60ToolsWizardPage implements
+		SelectionListener, ModifyListener, DropTargetListener {
+
+	// defines for map file radio buttons
+	final int NO_MAP_FILES_RADIO = 0;
+	final int SDK_MAP_FILES_FOLDER_RADIO = 1;
+	final int MAP_FILES_ZIP_RADIO = 2;
+	final int MAP_FILES_FOLDER_RADIO = 3;
+	
+	// width hint for all buttons in the page
+	final int BUTTON_WIDTH = 60;
+	// height hint for all lists in the page
+	final int LIST_HEIGHT = 50;
+	
+	// filters for file selection dialogs
+	static final String SELGE_INI_FILTER = "selge.ini";
+	static final String SYMBOL_FILTER = "*.symbol";
+	static final String ZIP_FILTER = "*.zip";
+	static final String[] IMAGE_FILTER = {"*.fpsx", "*.img", "*.v??", ".c??", "*.*"};
+	
+	// wizard saves last entered values to these tags in dialog_settings.xml
+	static final String LAST_USED_SELGE_INI_FILES = "SelgeIniFiles"; //$NON-NLS-1$
+	static final String LAST_USED_SYMBOL_FILES = "SymbolFiles"; //$NON-NLS-1$
+	static final String LAST_USED_DECODING_STYLE = "SymbolFileWasUsedLast"; //$NON-NLS-1$
+	static final String LAST_USED_MAPFILES_FOLDER = "MapFilesFolder"; //$NON-NLS-1$
+	static final String LAST_USED_MAPZIP_FILES = "MapZipFiles"; //$NON-NLS-1$
+	static final String LAST_USED_IMAGE_FILES = "ImageFiles"; //$NON-NLS-1$
+	static final String LAST_USED_MAPFILE_TYPE = "LastUsedMapFileType"; //$NON-NLS-1$
+	static final String LAST_USED_SDK = "LastUsedSdk"; //$NON-NLS-1$
+
+	// top level containers
+	protected Composite composite;
+	protected Group groupSelge; // selge group is hidden at all times. Might be restored in the future
+
+	// selge.ini page items. Page cannot be show at the moment. Might be restored in the future.
+	protected Button buttonSelgeRadio;
+	protected Button buttonSelgeBrowse;
+	protected Button buttonShowSelgeDetails;
+	protected Text textSelgeDetails;
+	protected Combo comboSelge;
+	protected Label labelSelge;
+
+	// symbol page items
+	protected Button buttonSymbolRadio = null;
+	protected Button buttonMapFolderBrowse;
+	protected Button buttonZipBrowse;
+	protected Button buttonMapFilesZipRadio;
+	protected Button buttonMapFilesFolderRadio;
+	protected Button buttonSdkFolderRadio;
+	protected Button buttonNoMapFilesRadio;
+	protected Button buttonAddSymbol;
+	protected Button buttonRemoveSymbol;
+	protected Button buttonAddImageFile;
+	protected Button buttonRemoveImageFile;
+	protected Combo comboMapFilesFolder;
+	protected Combo comboMapFilesZip;
+	protected Combo comboSdkFolder;
+	protected Group groupSymbolFiles;
+	protected Group groupMapFiles;
+	protected Group groupImageFiles;
+	protected Group groupSelgeSymbolRadios;
+	protected Label labelMapFilesFolder;
+	protected Label labelZip;
+	protected Label labelSdkFolder;
+	protected Label labelNoMapFiles;
+	protected List listSymbols;
+	protected List listImageFiles;
+	
+	// owner can pass in ROM IDs so that we can check that correct symbol is selected
+	protected String[] romIds = null;
+	
+	// holds SDK names and their folders
+	protected HashMap<String, String> sdkFolders = null;
+	
+	// default location of selge.ini. 
+	protected String defaultSelgeIniFile = "\\\\Vagrp014\\groups4\\Builds\\S60RnD\\S60_5_0\\SelgeIniFile\\selge.ini"; //$NON-NLS-1$
+	
+	// defines whether image files selection should be visible in the page
+	boolean showImageFilesGroup = false;
+	
+	// section where this wizard pages data is saved
+	IDialogSettings previousValuesSection;
+	
+	// defines how many previous user entered values are saved
+	final int MAX_SAVED_VALUES;
+	
+	/**
+	 * Constructor.
+	 * 
+	 * @param pageName name of the page
+	 * @param title page title
+	 * @param imageFilesGroup if true, image files are queried from user. If false, image file are not queried
+	 * @param section section where wizard reads/saves previously entered values
+	 * @param maxSavedValues how many previously entered values are saved
+	 */
+	public DebugMetadataWizardPage(String pageName, 
+									String title, 
+									boolean imageFilesGroup,
+									IDialogSettings section,
+									int maxSavedValues){
+		super(pageName);
+		MAX_SAVED_VALUES = maxSavedValues;
+		showImageFilesGroup = imageFilesGroup;
+		previousValuesSection = section;
+			
+		setTitle(title);
+			
+		setDescription(Messages.getString("DebugMetadataWizardPage.SelgeIniDescription")); //$NON-NLS-1$
+
+		setPageComplete(true);
+	 }
+	
+	public abstract String getHelpContext();
+	public abstract boolean canFinish();
+	public abstract HashMap<String, String> getSdkMapFolders(); 
+	public abstract boolean folderContainsMapFiles(String folder);
+	public abstract boolean zipContainsMapFiles(String path);
+	
+	
+
+	@Override
+	public void recalculateButtonStates() {
+	}
+
+	@Override
+	public void setInitialFocus() {
+		if (buttonSelgeRadio.getSelection())
+			comboSelge.setFocus();
+		else
+			listSymbols.setFocus();
+	}
+
+	/**
+	 * @see org.eclipse.jface.wizard.WizardPage
+	 */
+	public void createControl(Composite parent) {
+		composite = new Composite(parent, SWT.NULL);
+		GridLayout gl = new GridLayout();
+		gl.numColumns = 1;
+		composite.setLayout(gl);
+		
+		groupSelgeSymbolRadios = new Group(composite, SWT.NONE);
+		groupSelgeSymbolRadios.setLayout(gl);
+		groupSelgeSymbolRadios.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		// Selge.ini radio button
+		buttonSelgeRadio = new Button(groupSelgeSymbolRadios, SWT.RADIO);
+		buttonSelgeRadio.setText(Messages.getString("DebugMetadataWizardPage.UseSelgeIni")); //$NON-NLS-1$
+		buttonSelgeRadio.setSelection(!symbolFileWasUsedPreviously());
+		buttonSelgeRadio.addSelectionListener(this);
+		
+		// symbol & map files radio button
+		buttonSymbolRadio = new Button(groupSelgeSymbolRadios, SWT.RADIO);
+		buttonSymbolRadio.setText(Messages.getString("DebugMetadataWizardPage.DefinePathsManually")); //$NON-NLS-1$
+		buttonSymbolRadio.setSelection(symbolFileWasUsedPreviously());
+		
+		createSelgeGroup();
+		
+		createSymbolGroup();
+		
+		setHelps();
+		
+		setInitialFocus();
+
+		// selge.ini is not used at the moment, but it might be restored later
+		hideSelgeIniSelection();
+		
+		Transfer[] types = new Transfer[] { FileTransfer.getInstance() };
+	    DropTarget dropTarget = new DropTarget(composite, DND.DROP_COPY);
+	    dropTarget.setTransfer(types);
+	    dropTarget.addDropListener(this);		
+		
+		setControl(composite);
+	}
+
+	/**
+	 * Creates UI controls for selge.ini usage
+	 *
+	 */
+	void createSelgeGroup() {
+		// Selge.ini group
+		groupSelge = new Group(composite, SWT.NONE);
+		GridLayout gl = new GridLayout();
+		GridData selgeGd = new GridData(GridData.FILL_BOTH);
+		gl.numColumns = 2;
+		groupSelge.setLayout(gl);
+		
+		// show selge group if user used selge.ini last time, hide if symbol & map files was used
+		groupSelge.setVisible(!symbolFileWasUsedPreviously()); 
+		selgeGd.exclude = symbolFileWasUsedPreviously();
+		groupSelge.setLayoutData(selgeGd);
+		
+		// Selge.ini label
+		labelSelge = new Label(groupSelge, SWT.LEFT);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 2;
+		labelSelge.setLayoutData(gd);
+		labelSelge.setText(Messages.getString("DebugMetadataWizardPage.SelgeIniFile")); //$NON-NLS-1$
+		
+		// Selge.ini combo
+		comboSelge = new Combo(groupSelge, SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		comboSelge.setLayoutData(gd);
+		comboSelge.addModifyListener(this);
+		
+		String[] lastUsed = getPreviousPaths(LAST_USED_SELGE_INI_FILES);
+		// set the previous selge.ini file as default
+		if (lastUsed != null) {
+			comboSelge.setItems(lastUsed);
+			comboSelge.select(0);
+		// user has not defined selge.ini previously, show default location
+		} else {
+			comboSelge.setText(defaultSelgeIniFile);
+		}
+		
+		// Selge.ini browse button
+		buttonSelgeBrowse = new Button(groupSelge, SWT.PUSH);
+		buttonSelgeBrowse.setText(Messages.getString("DebugMetadataWizardPage.Browse")); //$NON-NLS-1$
+		buttonSelgeBrowse.addSelectionListener(this);
+		
+		// Show selge.ini details button is not yet used i.e. shown to user
+		GridData gdDetailsButton = new GridData();
+		gdDetailsButton.horizontalSpan = 2;
+		buttonShowSelgeDetails = new Button(groupSelge, SWT.PUSH);
+		buttonShowSelgeDetails.setText(Messages.getString("DebugMetadataWizardPage.ShowDetails")); //$NON-NLS-1$
+		buttonShowSelgeDetails.setLayoutData(gdDetailsButton);
+		buttonShowSelgeDetails.addSelectionListener(this);
+		buttonShowSelgeDetails.setVisible(false);
+		
+		// textbox for selge.ini details. Not yet used.
+		textSelgeDetails = new Text(groupSelge, SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);
+		textSelgeDetails.setLayoutData(new GridData(GridData.FILL_BOTH));
+	}
+	
+	/**
+	 * Creates UI controls for symbol & map & image files usage.
+	 *
+	 */
+	void createSymbolGroup() {
+		// Symbol group
+		GridLayout gl = new GridLayout();
+		gl.numColumns = 2;
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		
+		boolean visible = symbolFileWasUsedPreviously();
+		// show symbol group if user used symbol & map files last time, hide if selge.ini was used
+		gd.exclude = !visible;
+		if (visible)
+			setDescription(Messages.getString("DebugMetadataWizardPage.SymbolDescription")); //$NON-NLS-1$
+		
+		// Symbol files group
+		groupSymbolFiles = new Group(composite, SWT.LEFT);
+		groupSymbolFiles.setLayout(gl);
+		groupSymbolFiles.setLayoutData(new GridData(GridData.FILL_BOTH));
+		GridData gdTwoSpan = new GridData(GridData.FILL_HORIZONTAL);
+		gdTwoSpan.horizontalSpan = 2;
+		groupSymbolFiles.setText(Messages.getString("DebugMetadataWizardPage.SymbolFiles")); //$NON-NLS-1$
+		
+		// Symbol file list
+		listSymbols = new List(groupSymbolFiles, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
+		GridData gdHorizontalTop = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdHorizontalTop.verticalSpan = 2;
+		gdHorizontalTop.heightHint = LIST_HEIGHT;
+		listSymbols.setLayoutData(gdHorizontalTop);
+
+		// read last used symbol files to combo
+		String[] lastUsed = getPreviousPaths(LAST_USED_SYMBOL_FILES);
+		if (lastUsed != null) {
+			listSymbols.setItems(lastUsed);
+		}				
+
+		GridData gdButtons = new GridData();
+		gdButtons.widthHint =  BUTTON_WIDTH;
+		
+		// Add Symbol file button
+		buttonAddSymbol = new Button(groupSymbolFiles, SWT.PUSH);
+		buttonAddSymbol.setText(Messages.getString("DebugMetadataWizardPage.Add")); //$NON-NLS-1$
+		buttonAddSymbol.setLayoutData(gdButtons);
+		buttonAddSymbol.addSelectionListener(this);
+
+		// Remove Symbol file button
+		buttonRemoveSymbol = new Button(groupSymbolFiles, SWT.PUSH);
+		buttonRemoveSymbol.setText(Messages.getString("DebugMetadataWizardPage.Remove")); //$NON-NLS-1$
+		buttonRemoveSymbol.setLayoutData(gdButtons);
+		buttonRemoveSymbol.addSelectionListener(this);
+		
+		createMapFilesGroup(composite);
+		
+		// if image files UI is wanted, create it
+		if (showImageFilesGroup)
+			createImageFilesGroup(composite);
+	}
+	
+	/**
+	 * Creates UI controls for map files usage.
+	 *
+	 */
+	void createMapFilesGroup(Composite parent) {
+		// Map Files group
+		groupMapFiles = new Group(parent, SWT.NONE);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = 2;
+		gd.verticalIndent = 10;
+		GridLayout gl = new GridLayout();
+		gl.numColumns = 3;
+		groupMapFiles.setLayout(gl);
+		groupMapFiles.setText(Messages.getString("DebugMetadataWizardPage.MapFiles")); //$NON-NLS-1$
+		groupMapFiles.setLayoutData(gd);		
+		
+		// empty label to make layout correct
+		new Label(groupMapFiles, SWT.LEFT);
+		
+		// Map files folder label
+		labelMapFilesFolder = new Label(groupMapFiles, SWT.LEFT);
+		GridData gdTwoSpanWithIndent = new GridData(GridData.FILL_HORIZONTAL);
+		gdTwoSpanWithIndent.horizontalSpan = 2;
+		gdTwoSpanWithIndent.verticalIndent = 10;
+		labelMapFilesFolder.setLayoutData(gdTwoSpanWithIndent);
+		labelMapFilesFolder.setText(Messages.getString("DebugMetadataWizardPage.MapFilesFolder")); //$NON-NLS-1$
+		
+		// Map files folder radio button
+		buttonMapFilesFolderRadio = new Button(groupMapFiles, SWT.RADIO);
+		buttonMapFilesFolderRadio.addSelectionListener(this);
+		
+		// Map files folder combo
+		comboMapFilesFolder = new Combo(groupMapFiles, SWT.BORDER);
+		GridData gdHorizontal = new GridData(GridData.FILL_HORIZONTAL);
+		comboMapFilesFolder.setLayoutData(gdHorizontal);
+		comboMapFilesFolder.addModifyListener(this);
+		
+		// read last used map file folders to combo
+		String[] lastUsed = getPreviousPaths(LAST_USED_MAPFILES_FOLDER);
+		if (lastUsed != null) {
+			comboMapFilesFolder.setItems(lastUsed);
+			comboMapFilesFolder.select(0);
+		}						
+		
+		// Map files folder browse button
+		buttonMapFolderBrowse = new Button(groupMapFiles, SWT.PUSH);
+		buttonMapFolderBrowse.setText(Messages.getString("DebugMetadataWizardPage.Browse")); //$NON-NLS-1$
+		buttonMapFolderBrowse.addSelectionListener(this);
+		
+		// empty label to make layout correct
+		new Label(groupMapFiles, SWT.LEFT);
+
+		// MapFiles.zip label
+		labelZip = new Label(groupMapFiles, SWT.LEFT);
+		GridData gdTwoSpan = new GridData(GridData.FILL_HORIZONTAL);
+		gdTwoSpan.horizontalSpan = 2;
+		labelZip.setLayoutData(gdTwoSpan);
+		labelZip.setText(Messages.getString("DebugMetadataWizardPage.MapFilesZip")); //$NON-NLS-1$
+		
+		// MapFiles.zip radio button
+		buttonMapFilesZipRadio = new Button(groupMapFiles, SWT.RADIO);
+		buttonMapFilesZipRadio.addSelectionListener(this);
+		
+		// MapFiles.zip combo
+		comboMapFilesZip = new Combo(groupMapFiles, SWT.BORDER);
+		comboMapFilesZip.setLayoutData(gdHorizontal);
+		comboMapFilesZip.addModifyListener(this);
+		
+		// read last used mapfiles.zip file paths to combo
+		lastUsed = getPreviousPaths(LAST_USED_MAPZIP_FILES);
+		if (lastUsed != null) {
+			comboMapFilesZip.setItems(lastUsed);
+			comboMapFilesZip.select(0);
+		}						
+		
+		// MapFiles.zip browse button
+		buttonZipBrowse = new Button(groupMapFiles, SWT.PUSH);
+		buttonZipBrowse.setText(Messages.getString("DebugMetadataWizardPage.Browse")); //$NON-NLS-1$
+		buttonZipBrowse.addSelectionListener(this);
+		
+		// empty label to make layout correct
+		new Label(groupMapFiles, SWT.LEFT);
+		
+		// SDK folder label
+		labelSdkFolder = new Label(groupMapFiles, SWT.LEFT);
+		labelSdkFolder.setLayoutData(gdTwoSpan);
+		labelSdkFolder.setText(Messages.getString("DebugMetadataWizardPage.SdkMapFilesFolder")); //$NON-NLS-1$
+		
+		// SDK folder radio button
+		buttonSdkFolderRadio = new Button(groupMapFiles, SWT.RADIO);
+		buttonSdkFolderRadio.addSelectionListener(this);
+
+		// SDK folder combo
+		comboSdkFolder = new Combo(groupMapFiles, SWT.BORDER | SWT.READ_ONLY);
+		comboSdkFolder.setLayoutData(gdHorizontal);
+		comboSdkFolder.addModifyListener(this);
+		comboSdkFolder.setVisibleItemCount(50);
+		
+		sdkFolders = getSdkMapFolders();
+		
+		// if no SDK folders were found disable SDK combo
+		if (sdkFolders == null || sdkFolders.size() < 1) {
+			disableSdkSelection();
+		// SDK folders were found, fill SDK combo with those values
+		} else {
+			Set<String> keySet = sdkFolders.keySet();
+			String[] keys = keySet.toArray(new String[keySet.size()]);
+			Arrays.sort(keys);
+			comboSdkFolder.setItems(keys);
+		}
+		
+		// read which SDK folder was used last, and select it in SDK combo if possible
+		lastUsed = getPreviousPaths(LAST_USED_SDK);
+		if (lastUsed != null && sdkFolders != null && buttonSdkFolderRadio.getEnabled()) {
+			String[] items = comboSdkFolder.getItems();
+			for (int i = 0; i < items.length; i++) {
+				if (items[i].equalsIgnoreCase(lastUsed[0])) {
+					comboSdkFolder.select(i);
+					break;
+				}
+			}
+		}										
+		
+		// empty label to make layout correct
+		new Label(groupMapFiles, SWT.LEFT);
+		
+		// No map files radio button
+		buttonNoMapFilesRadio = new Button(groupMapFiles, SWT.RADIO);
+		buttonNoMapFilesRadio.addSelectionListener(this);
+		
+		// No map files label
+		labelNoMapFiles = new Label(groupMapFiles, SWT.LEFT);
+		labelNoMapFiles.setText(Messages.getString("DebugMetadataWizardPage.NoMapFiles")); //$NON-NLS-1$
+		labelNoMapFiles.setLayoutData(gdTwoSpan);
+		
+		// read how map files were used last time (i.e. which radio button
+		// was selected) and select the same radio button this time.
+		int lastUsedMapRadio = lastUsedMapFileType();
+		switch (lastUsedMapRadio) {
+		case MAP_FILES_FOLDER_RADIO:
+			buttonMapFilesFolderRadio.setSelection(true);
+			break;
+		case MAP_FILES_ZIP_RADIO:
+			buttonMapFilesZipRadio.setSelection(true);
+			break;
+		case SDK_MAP_FILES_FOLDER_RADIO:
+			buttonSdkFolderRadio.setSelection(true);
+			break;
+		default:
+			buttonNoMapFilesRadio.setSelection(true);
+			break;
+		}
+		
+		enableMapSelections();
+	}
+	
+	/**
+	 * Creates UI controls for image files usage.
+	 *
+	 */
+	void createImageFilesGroup(Composite parent) {
+		// Image files group
+		groupImageFiles = new Group(parent, SWT.NONE);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = 2;
+		gd.verticalIndent = 10;
+		GridLayout gl = new GridLayout();
+		gl.numColumns = 2;
+		groupImageFiles.setLayout(gl);
+		groupImageFiles.setText(Messages.getString("DebugMetadataWizardPage.ImageFiles")); //$NON-NLS-1$
+		groupImageFiles.setLayoutData(gd);		
+		
+		// Image file list
+		listImageFiles = new List(groupImageFiles, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
+		GridData gdHorizontalTop = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdHorizontalTop.verticalSpan = 2;
+		gdHorizontalTop.heightHint = LIST_HEIGHT;
+		listImageFiles.setLayoutData(gdHorizontalTop);
+
+		// read last used image files and fill them into the list
+		String[] lastUsed = getPreviousPaths(LAST_USED_IMAGE_FILES);
+		if (lastUsed != null) {
+			listImageFiles.setItems(lastUsed);
+		}				
+
+		GridData gdButtons = new GridData();
+		gdButtons.widthHint =  BUTTON_WIDTH;
+		
+		// Add image file button
+		buttonAddImageFile = new Button(groupImageFiles, SWT.PUSH);
+		buttonAddImageFile.setText(Messages.getString("DebugMetadataWizardPage.Add")); //$NON-NLS-1$
+		buttonAddImageFile.setLayoutData(gdButtons);
+		buttonAddImageFile.addSelectionListener(this);
+
+		// Remove image file button
+		buttonRemoveImageFile = new Button(groupImageFiles, SWT.PUSH);
+		buttonRemoveImageFile.setText(Messages.getString("DebugMetadataWizardPage.Remove")); //$NON-NLS-1$
+		buttonRemoveImageFile.setLayoutData(gdButtons);
+		buttonRemoveImageFile.addSelectionListener(this);
+	}
+	
+	/**
+	 * This'll disable selge.ini selection from user
+	 */
+	void hideSelgeIniSelection() {
+		// hide radios group
+		GridData  gd = (GridData)groupSelgeSymbolRadios.getLayoutData();
+		gd.exclude = true;
+		groupSelgeSymbolRadios.setVisible(false);
+		buttonSymbolRadio.setSelection(true);
+		
+		// show symbol group
+// ROWS COMMENTED SO THAT THEY CAN BE RESTORED INCASE SELGE.INI USAGE IS RESTORED		
+/*		gd = (GridData)groupSymbol.getLayoutData();
+		groupSymbol.setVisible(true);
+		gd.exclude = false;
+*/		
+		// hide selge group
+		gd = (GridData)groupSelge.getLayoutData();
+		gd.exclude = true;
+		groupSelge.setVisible(false);
+		buttonSelgeRadio.setSelection(false);
+		
+		setDescription(Messages.getString("DebugMetadataWizardPage.SymbolDescription")); //$NON-NLS-1$
+		
+		composite.layout();	
+	}
+	
+	/**
+	 * Return the default selge.ini file 
+	 */
+	public String getDefaultSelgeIniFile() {
+		return defaultSelgeIniFile;
+	}
+	
+	/**
+	 * Returns the selected selge.ini file. Returns empty if symbol group
+	 * is visible.
+	 */
+	public String getSelgeIniFile() {
+		if (buttonSymbolRadio.getSelection()) {
+			return ""; //$NON-NLS-1$
+		} else {
+			return comboSelge.getText();
+		}
+	}
+	
+	/**
+	 * Returns symbols files selected by user. If selge.ini group is visible,
+	 * null is returned. 
+	 */
+	public String[] getSymbolFiles() {
+		if (buttonSelgeRadio.getSelection()) {
+			return null;
+		}
+		
+		return listSymbols.getItems();
+	}
+	
+	/**
+	 * Returns the selected map files folder. Return value depends on which
+	 * map files radio button is selected. Returns empty if MapFiles.zip radio
+	 * button is selected.  
+	 */
+	public String getMapFilesFolder() {
+		// if selge.ini group is visible, return empty
+		if (buttonSelgeRadio.getSelection()) {
+			return ""; //$NON-NLS-1$
+		// MapFiles.zip radio is selected, return empty
+		}else if (buttonMapFilesZipRadio.getSelection()) {
+			return ""; //$NON-NLS-1$
+		// Map Files folder radio button is selected
+		} else if (buttonMapFilesFolderRadio.getSelection()) {
+			return comboMapFilesFolder.getText();
+		// "SDK Map files folder" radio button is selected, return correct sdk folder
+		} else if (buttonSdkFolderRadio.getSelection() && 
+				   buttonSdkFolderRadio.getEnabled()   &&
+				   sdkFolders != null && sdkFolders.size() > 0 &&
+				   comboSdkFolder.getSelectionIndex() >= 0) {
+			return sdkFolders.get(comboSdkFolder.getText());
+		// otherwise return empty
+		} else {
+			return ""; //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Returns the MapFiles.zip location user has provided. If MapFiles.zip radio button
+	 * is not selected, this will return empty. 
+	 */
+	public String getMapFilesZip() {
+		// if selge.ini group is visible, return empty
+		if (buttonSelgeRadio.getSelection()) {
+			return ""; //$NON-NLS-1$
+		// return empty if MapFiles.zip radio button is not selected
+		} else if (!buttonMapFilesZipRadio.getSelection()) {
+			return ""; //$NON-NLS-1$
+		}
+		
+		return comboMapFilesZip.getText();
+	}
+	
+	/**
+	 * Returns image files selected by user. If selge.ini group is visible,
+	 * null is returned. 
+	 */
+	public String[] getImageFiles() {
+		if (buttonSelgeRadio.getSelection()) {
+			return null;
+		}
+		
+		return listImageFiles.getItems();
+	}
+	
+	/**
+	 * Returns the provided ROM IDs 
+	 */
+	public String[] getRomIds() {
+		return romIds;
+	}
+	
+
+	/**
+	 * Disables "SDK Map files folder" radio button & combo & label
+	 */
+	void disableSdkSelection() {
+		if (buttonSdkFolderRadio.getSelection())
+			buttonNoMapFilesRadio.setSelection(true);
+		buttonSdkFolderRadio.setEnabled(false);
+		comboSdkFolder.setEnabled(false);
+	}
+	
+	public void widgetDefaultSelected(SelectionEvent arg0) {
+	}
+
+	public void widgetSelected(SelectionEvent event) {
+		// change between selge.ini "view" and symbol&map files "view"
+		if (event.widget == buttonSelgeRadio || event.widget == buttonSymbolRadio) {
+			this.setErrorMessage(null);
+// ROWS COMMENTED SO THAT THEY CAN BE RESTORED INCASE SELGE.INI USAGE IS RESTORED			
+/*			boolean selgeButtonSelected = buttonSelgeRadio.getSelection();
+			GridData gd = (GridData)groupSymbol.getLayoutData();
+			boolean visible = !(gd.exclude = selgeButtonSelected);
+			groupSymbol.setVisible(visible);
+			
+			gd = (GridData)groupSelge.getLayoutData();
+			visible = !(gd.exclude = !selgeButtonSelected);
+			groupSelge.setVisible(visible);
+			if (visible) {
+				setDescription(Messages.getString("DebugMetadataWizardPage.SelgeIniDescription")); //$NON-NLS-1$
+			} else {
+*/				setDescription(Messages.getString("DebugMetadataWizardPage.SymbolDescription")); //$NON-NLS-1$
+//			}
+			
+			try {
+				getWizard().getContainer().updateButtons();
+			} catch (Exception E) {}
+			
+			composite.layout();	
+			
+		// selge.ini browse button pressed
+		} else if (event.widget == buttonSelgeBrowse) {
+			FileDialog dialog = new FileDialog(this.getShell(), SWT.OPEN);
+			dialog.setText(Messages.getString("DebugMetadataWizardPage.SelectSelgeIniFile")); //$NON-NLS-1$
+			String[] filterExt = {SELGE_INI_FILTER};
+	        dialog.setFilterExtensions(filterExt);
+	        dialog.setFilterPath(comboSelge.getText());
+			String result = dialog.open();
+			comboSelge.setText(result);
+			
+		// show selge.ini details button pressed
+		} else if (event.widget == buttonShowSelgeDetails) {
+						
+		// Add symbol file button pressed
+		} else if (event.widget == buttonAddSymbol) {
+			FileDialog dialog = new FileDialog(this.getShell(), SWT.OPEN | SWT.MULTI);
+			dialog.setText(Messages.getString("DebugMetadataWizardPage.SelectSymbolFile")); //$NON-NLS-1$
+			String[] filterExt = {SYMBOL_FILTER};
+	        dialog.setFilterExtensions(filterExt);
+			String result = dialog.open();
+			// if user selected files, check that files don't already exist in the list
+			// and add them if they don't already exist.
+			if (result != null) {
+				String[] fileNames = dialog.getFileNames();
+				if (fileNames != null) {
+					String path = dialog.getFilterPath() + File.separator;
+					for (int j = 0; j < fileNames.length; j++) {
+						String filePath = path + fileNames[j];
+						String[] listItems = listSymbols.getItems();
+						if (listItems != null && listItems.length > 0) {
+							boolean found = false;
+							for (int i = 0; i < listItems.length; i++) {
+								String listItem = listItems[i];
+								if (listItem.compareToIgnoreCase(filePath) == 0) {
+									found = true;
+									break;
+								}
+							}
+							if (!found)
+								listSymbols.add(filePath);
+						} else {
+							listSymbols.add(filePath);
+						}
+					}
+				}
+			}
+
+		// Remove symbol file button pressed
+		} else if (event.widget == buttonRemoveSymbol) {
+			int[] selectedItems = listSymbols.getSelectionIndices();
+			if (selectedItems != null && selectedItems.length > 0) {
+				listSymbols.remove(selectedItems);
+			}
+
+			// Add image file button pressed
+		} else if (event.widget == buttonAddImageFile) {
+			FileDialog dialog = new FileDialog(this.getShell(), SWT.OPEN | SWT.MULTI);
+			dialog.setText(Messages.getString("DebugMetadataWizardPage.SelectImageFile")); //$NON-NLS-1$
+			String[] filterExt = IMAGE_FILTER; 
+	        dialog.setFilterExtensions(filterExt);
+			String result = dialog.open();
+			// if user selected files, check that files don't already exist in the list
+			// and add them if they don't already exist.
+			if (result != null) {
+				String[] fileNames = dialog.getFileNames();
+				if (fileNames != null) {
+					String path = dialog.getFilterPath() + File.separator;
+					for (int j = 0; j < fileNames.length; j++) {
+						String filePath = path + fileNames[j];
+						String[] listItems = listImageFiles.getItems();
+						if (listItems != null && listItems.length > 0) {
+							boolean found = false;
+							for (int i = 0; i < listItems.length; i++) {
+								String listItem = listItems[i];
+								if (listItem.compareToIgnoreCase(filePath) == 0) {
+									found = true;
+									break;
+								}
+							}
+							if (!found)
+								listImageFiles.add(filePath);
+						} else {
+							listImageFiles.add(filePath);
+						}
+					}
+				}
+			}
+		
+		// Remove image file button pressed
+		} else if (event.widget == buttonRemoveImageFile) {
+			int[] selectedItems = listImageFiles.getSelectionIndices();
+			if (selectedItems != null && selectedItems.length > 0) {
+				listImageFiles.remove(selectedItems);
+			}			
+
+		// Map files folder browse button pressed
+		} else if (event.widget == buttonMapFolderBrowse) {
+			DirectoryDialog dialog = new DirectoryDialog(getShell());
+			dialog.setText(Messages.getString("DebugMetadataWizardPage.MapFilesFolder")); //$NON-NLS-1$
+			String result = dialog.open();
+			comboMapFilesFolder.setText(result);
+			
+		// MapFiles.zip browse button pressed
+		} else if (event.widget == buttonZipBrowse) {
+			FileDialog dialog = new FileDialog(this.getShell(), SWT.OPEN);
+			dialog.setText(Messages.getString("DebugMetadataWizardPage.SelectMapFilesZip")); //$NON-NLS-1$
+			String[] filterExt = {ZIP_FILTER};
+	        dialog.setFilterExtensions(filterExt);
+			String result = dialog.open();
+			comboMapFilesZip.setText(result);
+			
+		// map files radio selection changed
+		} else if (event.widget == buttonMapFilesFolderRadio || event.widget == buttonMapFilesZipRadio ||
+				   event.widget == buttonSdkFolderRadio || event.widget == buttonNoMapFilesRadio || event.widget == comboSdkFolder) {
+			enableMapSelections();
+		}
+
+		updateButtons();
+	}
+	
+	/**
+	 * Disables/Enables map file labels & combos & buttons accordingly to which
+	 * Map Files radio button is selected.
+	 */
+	void enableMapSelections() {
+		comboMapFilesFolder.setEnabled(false);
+		buttonMapFolderBrowse.setEnabled(false);
+		comboMapFilesZip.setEnabled(false);
+		buttonZipBrowse.setEnabled(false);
+		comboSdkFolder.setEnabled(false);
+
+		// Map Files folder radio button is selected
+		if (buttonMapFilesFolderRadio.getSelection()) {
+			comboMapFilesFolder.setEnabled(true);
+			buttonMapFolderBrowse.setEnabled(true);
+		// MapFiles.zip radio button is selected
+		} else if (buttonMapFilesZipRadio.getSelection()) {
+			comboMapFilesZip.setEnabled(true);
+			buttonZipBrowse.setEnabled(true);
+		// SDK map files radio button is selected
+		} else if (buttonSdkFolderRadio.getSelection()) {
+			comboSdkFolder.setEnabled(true);
+		}
+	}
+	
+	public void modifyText(ModifyEvent event) {
+		this.setErrorMessage(null);
+		updateButtons();
+	}
+	
+	/**
+	 * Checks that selected selge.ini file is valid.
+	 *
+	 */
+	private boolean checkSelgeIniFile() {
+		this.setErrorMessage(null);
+		File selge = new File(comboSelge.getText());
+		if (selge.isFile() && selge.exists() && selge.getName().trim().toLowerCase().equals(SELGE_INI_FILTER)) {
+			return true;
+		} else {
+			if (comboSelge.getText().length() > 0)
+				this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.InvalidSelgeIni")); //$NON-NLS-1$
+			return false;
+		}
+	}
+
+	/**
+	 * Checks that atleast one symbol file is in the list 
+	 */
+	boolean checkSymbol() {
+		if (listSymbols.getItemCount() < 1)
+			return false;
+		
+		return true;
+	}
+	
+	/**
+	 *  Checks that Map files folder or MapFiles.zip file is valid.
+	 */
+	boolean checkMapFiles(boolean cannotBeEmpty) {
+		// Map Files folder radio button is selected
+		if (buttonMapFilesFolderRadio.getSelection()) {
+			try {
+				File f = new File(comboMapFilesFolder.getText());
+				// given folder must exist and it must contain map files
+				if (f.isDirectory() && f.exists()) {
+					if (folderContainsMapFiles(comboMapFilesFolder.getText())) {
+						return true;
+					}
+					this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.SelectedMapFilesFolderContainsNoMapFiles")); //$NON-NLS-1$
+					return false;
+				}
+				this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.InvalidMapFilesFolder")); //$NON-NLS-1$
+				return false;
+			} catch (Exception e) {
+				this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.InvalidMapFilesFolder")); //$NON-NLS-1$
+				return false;
+			}
+		// MapFiles.zip radio button is selected
+		} else if (buttonMapFilesZipRadio.getSelection()) {
+			try {
+				File f = new File(comboMapFilesZip.getText());
+				// given zip file must exist and is must contain map files
+				if (f.isFile() && f.exists() && f.getName().toLowerCase().endsWith("zip")) {
+					if (zipContainsMapFiles(comboMapFilesZip.getText())) {
+						return true;
+					}
+					this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.SelectedZipContainsNoMapFiles")); //$NON-NLS-1$
+					return false;
+				}
+				this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.InvalidMapFilesZip")); //$NON-NLS-1$
+				return false;
+			} catch (Exception e) {
+				this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.InvalidMapFilesZip")); //$NON-NLS-1$
+				return false;
+			}
+		// SDK Map files folder" radio button is selected
+		} else if (buttonSdkFolderRadio.getSelection()) {
+			// an item must be selected in the combo
+			if (comboSdkFolder.getSelectionIndex() >= 0) {
+				return true;
+			}
+			this.setErrorMessage(Messages.getString("DebugMetadataWizardPage.SdkMapFilesFolderNotSelected")); //$NON-NLS-1$
+			return false;
+		} else if (buttonNoMapFilesRadio.getSelection() && cannotBeEmpty) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	/**
+	 * ROM IDs can be passed with this method. If the ROM ID list contains
+	 * multiple ROM IDs, only selge.ini group will be available for user. 
+	 */
+	public void setRomIds(String[] ids) {
+		if (buttonSymbolRadio != null) {
+			// if symbol&map group radio button is selected, and there are
+			// multiple ROM IDs, show selge.ini group
+			if (buttonSymbolRadio.getSelection() && ids.length > 1) {
+				buttonSymbolRadio.setSelection(false);
+// ROWS COMMENTED SO THAT THEY CAN BE RESTORED INCASE SELGE.INI USAGE IS RESTORED
+/*				groupSymbol.setVisible(false);
+				GridData gd = (GridData)groupSymbol.getLayoutData();
+				gd.exclude = true;
+				gd = (GridData)groupSelge.getLayoutData();
+				gd.exclude = false;
+*/				groupSelge.setVisible(true);
+				buttonSelgeRadio.setSelection(true);
+				setDescription(Messages.getString("DebugMetadataWizardPage.SelgeIniDescription")); //$NON-NLS-1$
+				updateButtons();
+				this.setMessage(Messages.getString("DebugMetadataWizardPage.RomIdsDoNotMatch"), 2); //$NON-NLS-1$
+				composite.layout();	
+			}
+			this.buttonSymbolRadio.setEnabled(!(ids.length > 1));
+		}
+	}
+	
+	public boolean canFlipToNextPage() {
+		return canProceed();
+	}
+	
+	/**
+	 * We can proceed to next page if selge.ini is a valid file (if selge.ini is used).
+	 * If selge.ini is not used, we'll check that symbol file and mapfiles.zip is valid or empty
+	 * @return true if we can proceed to next page, false if not
+	 */
+	protected boolean canProceed() {
+		// selge.ini is used, check that selge.ini is valid
+		if (buttonSelgeRadio.getSelection()) {
+			return checkSelgeIniFile();
+		// selge.ini is not used
+		} else {
+			this.setErrorMessage(null);
+
+			// no symbols provided
+			if (listSymbols.getItemCount() < 1) {
+				if (checkMapFiles(true))
+					return true;
+				
+			// symbols are provided
+			} else {
+				if (checkSymbols() && checkMapFiles(false))
+					return true;
+			}
+			
+			return false;
+		}
+	}	
+	
+	boolean checkSymbols() {
+		for (int i = 0; i < listSymbols.getItemCount(); i++) {
+			File f = new File(listSymbols.getItem(i));
+			if (!f.exists() || !f.isFile()) {
+				this.setErrorMessage("Invalid symbol files");
+				return false;
+			}
+		}
+		return true;
+	}	
+	/**
+	 * Saves the values currently displayed in the UI. These values are
+	 * automatically shown when this UI is shown the next time.
+	 */
+	public void saveUserEnteredData() {
+		// selge.ini is used
+		if (buttonSelgeRadio.getSelection()) {
+			saveValue(comboSelge.getText(), LAST_USED_SELGE_INI_FILES, false);
+			savePreviousDecodingStyle(false);
+		// symbol & map files are used
+		} else {
+			savePreviousDecodingStyle(true);
+			saveValues(listSymbols.getItems(), LAST_USED_SYMBOL_FILES); 
+			saveValue(comboMapFilesZip.getText(), LAST_USED_MAPZIP_FILES, false);
+			saveValue(comboMapFilesFolder.getText(), LAST_USED_MAPFILES_FOLDER, false);
+			saveValue(comboSdkFolder.getText(), LAST_USED_SDK, true);
+			if (showImageFilesGroup)
+				saveValues(listImageFiles.getItems(), LAST_USED_IMAGE_FILES);
+			int mapType = NO_MAP_FILES_RADIO;
+			if (buttonMapFilesFolderRadio.getSelection())
+				mapType = MAP_FILES_FOLDER_RADIO;
+			else if (buttonMapFilesZipRadio.getSelection())
+				mapType = MAP_FILES_ZIP_RADIO;
+			else if (buttonSdkFolderRadio.getSelection())
+				mapType = SDK_MAP_FILES_FOLDER_RADIO;
+			savePreviousMapFilesType(mapType);
+		}
+	}
+	
+	/**
+	 * Updates next, finish button states
+	 */
+	protected void updateButtons() {
+		try {
+			getWizard().getContainer().updateButtons();
+		} catch (Exception E) {}		
+	}
+	
+	/**
+	 * Set help contexts for UI items.
+	 */
+	protected void setHelps() {
+		String helpContext = getHelpContext();
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonSelgeRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonSymbolRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonSelgeBrowse, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(listSymbols, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonZipBrowse, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboSelge, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonAddSymbol, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonRemoveSymbol, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboMapFilesZip, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonMapFolderBrowse, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonMapFilesZipRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonMapFilesFolderRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonSdkFolderRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonNoMapFilesRadio, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboMapFilesFolder, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboSdkFolder, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonShowSelgeDetails, helpContext);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(textSelgeDetails, helpContext);
+		if (showImageFilesGroup) {
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(listImageFiles, helpContext);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonAddImageFile, helpContext);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(buttonRemoveImageFile, helpContext);
+		}
+	}	
+	
+	/**
+	 * If symbol file group was used when this UI was used last time, returns true. 
+	 * Otherwise returns false.  
+	 */	
+	boolean symbolFileWasUsedPreviously() {
+		try {
+			boolean retval = false;
+			if (previousValuesSection != null) {
+				retval = previousValuesSection.getBoolean(LAST_USED_DECODING_STYLE);
+			}
+			return retval;
+		} catch (Exception e) {
+			return false;
+		}
+	}
+
+	/**
+	 * Saves whether selge.ini group or symbol group is used for decoding.
+	 * This info can be restored when this UI is shown the next time. 
+	 */
+	void savePreviousDecodingStyle(boolean symbolFile) {
+		try {
+			if (previousValuesSection != null) {
+				previousValuesSection.put(LAST_USED_DECODING_STYLE, symbolFile);
+			}			
+		} catch (Exception E) {
+		}
+	}
+	
+	/**
+	 * Returns which map files radio button was selected the last time this 
+	 * UI was used. 
+	 */
+	int lastUsedMapFileType() {
+		try {
+			int retval = 0;
+			if (previousValuesSection != null) {
+				retval = previousValuesSection.getInt(LAST_USED_MAPFILE_TYPE);
+			}
+			return retval;
+		} catch (Exception e) {
+			return 0;
+		}
+	}
+	
+	/**
+	 * Saves which map file radio button is selected.
+	 * This info can be restored when this UI is shown the next time.
+	 */
+	void savePreviousMapFilesType(int type) {
+		try {
+			if (previousValuesSection != null) {
+				previousValuesSection.put(LAST_USED_MAPFILE_TYPE, type);
+			}
+		} catch (Exception E) {
+		}
+	}
+	
+	/**
+	 * Returns previously entered values of given item. 
+	 */
+	String[] getPreviousPaths(String item) {
+		String[] retVal = null;
+		if (previousValuesSection != null) {
+			retVal = previousValuesSection.getArray(item);
+		}
+		
+		return retVal;
+	}
+	
+	/**
+	 * Saves values so that they can be used next this this UI is used. 
+	 */
+	void saveValues(String[] values, String item) {
+		try {
+			if (previousValuesSection != null) {
+				previousValuesSection.put(item, values);
+			}
+		} catch (Exception E) {
+		}
+	}
+	
+	/**
+	 * Saves given value to correct section in dialog_settings.xml
+	 * @param value value to save
+	 * @param item name of the array which contains correct values
+	 * @param saveJustOne if true, only 'value' is saved. If false, 'value' is added to previously used values.
+	 */
+	void saveValue(String value, String item, boolean saveJustOne) {
+		if (previousValuesSection != null) {
+			String[] previousValues = previousValuesSection.getArray(item);
+			
+			// No previous values exist
+			if (previousValues == null) {
+				previousValues = new String[1];
+				previousValues[0] = value;
+			// Previous values exists
+			} else {
+				int valuesCount = previousValues.length;
+				
+				boolean valueExisted = false;
+				// see if passed value already exist.
+				for (int i = 0; i < valuesCount; i++) {
+					if (previousValues[i].compareToIgnoreCase(value) == 0) {
+						valueExisted = true;
+						
+						// passed value exists, move it to first position
+						for (int j = i; j > 0; j--) {
+							previousValues[j] = previousValues[j-1];
+						}
+						previousValues[0] = value;
+						
+						break;
+					}
+				}
+				
+				// passed value did not exist, add it to first position (and move older values "down")
+				if (!valueExisted) {
+					if (valuesCount >= MAX_SAVED_VALUES) {
+						for (int i = valuesCount-1; i > 0; i--) {
+							previousValues[i] = previousValues[i-1];
+						}
+						previousValues[0] = value;
+					} else {
+						String[] values = new String[valuesCount + 1];
+						values[0] = value;
+						for (int i = 0; i < valuesCount; i++) {
+							values[i+1] = previousValues[i];
+						}
+						previousValues = values;
+					}
+				}
+			}
+
+			if (saveJustOne) {
+				previousValues = new String[1];
+				previousValues[0] = value;
+			}
+			
+			previousValuesSection.put(item, previousValues);
+		}
+	}	
+	
+	public void dragEnter(DropTargetEvent event) {
+		event.detail = DND.DROP_COPY;
+	}
+
+	public void dragLeave(DropTargetEvent event) {
+		// nothing to be done
+	}
+
+	public void dragOperationChanged(DropTargetEvent event) {
+		// nothing to be done
+	}
+
+	public void dragOver(DropTargetEvent event) {
+		event.feedback = DND.FEEDBACK_NONE;
+	}
+
+	public void drop(DropTargetEvent event) {
+		// we accept only file drops
+		if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+			if (event.data != null) {
+				String[] files = (String[])event.data;
+				executeDrop(files);
+			}
+		}
+	}
+
+	public void dropAccept(DropTargetEvent event) {
+		// nothing to be done
+	}
+	
+	/**
+	 * Executes drop functionality when files are drag&dropped to wizard page.
+	 * Checks whether dropped files are supported and places them into correct UI element
+	 * @param files drag&dropped files (paths)
+	 */
+	protected void executeDrop(String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			String file = files[i].toLowerCase();
+			
+			// symbols file, add to symbols list
+			if (file.endsWith(".symbol") &&
+				!listContains(listSymbols, file)) {
+				listSymbols.add(files[i]);
+			}
+			
+			// image file, add to images list
+			if ( isImageFile(file) &&
+				 !listContains(listImageFiles, file)) {
+				listImageFiles.add(files[i]);
+			}
+			
+			// zip file, select correct radio button and add file to combo
+			if (file.endsWith(".zip")) {
+				comboMapFilesZip.setText(file);
+				if (buttonMapFilesFolderRadio.getSelection())
+					buttonMapFilesFolderRadio.setSelection(false);
+				else if (buttonNoMapFilesRadio.getSelection())
+					buttonNoMapFilesRadio.setSelection(false);
+				else if (buttonSdkFolderRadio.getSelection())
+					buttonSdkFolderRadio.setSelection(false);
+				buttonMapFilesZipRadio.setSelection(true);
+				enableMapSelections();
+			}
+		}
+		
+		updateButtons();
+	}
+	
+	protected boolean isImageFile(String file) {
+		if (file.endsWith(".fpsx") ||
+			file.endsWith(".img"))
+			return true;
+		
+		// .C?? and .V?? file
+		if (file.substring(file.length()-4, file.length()-3).equals(".") &&
+			(file.substring(file.length()-3, file.length()-2).equalsIgnoreCase("v") ||
+			 file.substring(file.length()-3, file.length()-2).equalsIgnoreCase("c")))
+			return true;
+
+		return false;
+	}
+	
+	protected boolean listContains(List list, String item) {
+		for (int i = 0; i < list.getItemCount(); i++) {
+			if (list.getItem(i).equalsIgnoreCase(item))
+				return true;
+		}
+		
+		return false;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/IS60ToolsWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.s60tools.ui.wizards;
+
+/**
+ * Common method interface for wizard pages that are 
+ * designed to work together with wizard implementations
+ * inherited from <code>S60ToolsWizard</code>, which
+ * expects all contained pages to adhere to 
+ * this interface.
+ *
+ *@see com.nokia.s60tools.ui.wizards.S60ToolsWizard
+ */
+public interface IS60ToolsWizardPage {
+
+	/**
+	 * This method is called when buttons states needs to 
+	 * be recalculated.   
+	 * Called by <code>S60ToolsWizard</code> class
+	 * when wizard page has been changed.
+	 * This method can be also called by listeners
+	 * attached to wizard page whenever button
+	 * stated needs to be recalculated.
+	 *@see com.nokia.s60tools.ui.wizards.S60ToolsWizard#pageChanged
+	 */
+	public abstract void recalculateButtonStates();
+
+	/**
+	 * Sets the initial focus for the wizard page.
+	 * Called by <code>S60ToolsWizard</code> class
+	 * when wizard page has been changed.
+	 *@see com.nokia.s60tools.ui.wizards.S60ToolsWizard#pageChanged
+	 */
+	public abstract void setInitialFocus();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/S60ToolsWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,101 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui.wizards;
+
+import org.eclipse.jface.dialogs.IPageChangedListener;
+import org.eclipse.jface.dialogs.PageChangedEvent;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.Wizard;
+
+/**
+ * This class defines common structure for all S60 tool wizards.
+ * It can be subclasses in order to provide wizards that can
+ * utilize these services provided.
+ * 
+ * This class is planned to be used together with
+ * <code>com.nokia.s60tools.ui.wizards.S60ToolsWizardPage</code> 
+ * class.
+ * 
+ * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage
+ */
+public abstract class S60ToolsWizard extends Wizard  implements IPageChangedListener{
+	
+	/**
+	 * Default constructor.
+	 */
+	protected S60ToolsWizard(){		
+		init();
+	}
+
+	/**
+	 * Constructor allowing to use product-specific banner image.
+	 * @param bannerImgDescriptor Banner image descriptor.
+	 */
+	protected S60ToolsWizard(ImageDescriptor bannerImgDescriptor){
+		setDefaultPageImageDescriptor(bannerImgDescriptor);
+		init();
+	}
+	
+	/**
+	 * Initialized default settings for the wizard.
+	 */
+	private void init(){		
+		//By default there is no wizard help available. Can be overridedn by sub classes.
+		setHelpAvailable(false);
+		//By default is no progress monitor is needed.  Can be overridedn by sub classes.
+		setNeedsProgressMonitor(false);
+	}
+
+	/**
+	 * Overrides the base class implementation from  
+	 * <code>org.eclipse.jface.dialogs.IPageChangedListener</code>.
+	 * 
+	 * This overridden implementation 
+	 * gets current <code>S60ToolsWizardPage</code> instance and calls it
+	 * <code>recalculateButtonStates</code> and <code>setInitialFocus</code> methods
+	 * thus initializing page into correct initial state.
+	 * 
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage#recalculateButtonStates
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage#setInitialFocus
+	 */
+	public void pageChanged(PageChangedEvent event) {
+		//
+		// Updating buttons states when the page is changed
+		//
+    	IWizardContainer container = getContainer();
+    	if(container != null){
+    		S60ToolsWizardPage currPage = (S60ToolsWizardPage)container.getCurrentPage();
+    		if(currPage != null){
+    			currPage.recalculateButtonStates();
+    			currPage.setInitialFocus();
+    		}
+    	}
+	}
+		
+	/**
+	 * Overrides the base class implementation from  
+	 * <code>org.eclipse.jface.wizard.Wizard</code>
+	 * and defines this as abstract method, therefore enforcing
+	 * derived class to provide an implementation, which
+	 * would be otherwise optional.
+	 */
+    public abstract void addPages();
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/S60ToolsWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.ui.wizards;
+
+import org.eclipse.jface.wizard.WizardPage;
+
+/**
+ * Common base class for wizard pages that are 
+ * designed to work together with wizard implementations
+ * inherited from <code>S60ToolsWizard</code>, which
+ * expects all contained pages to adhere to the
+ * interface defined by this base class.
+ *
+ *@see com.nokia.s60tools.ui.wizards.S60ToolsWizard
+ */
+public abstract class S60ToolsWizardPage extends WizardPage implements IS60ToolsWizardPage {
+
+	/**
+	 * Constructor
+	 * @param pageName wizard page name
+	 */
+	protected S60ToolsWizardPage(String pageName){
+		super(pageName);
+	}
+		
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.IS60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public abstract void recalculateButtonStates();
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.IS60ToolsWizardPage#setInitialFocus()
+	 */
+	public abstract void setInitialFocus();
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/com/nokia/s60tools/ui/wizards/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides reusable wizard base classes.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.ui/src/overview.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for plug-in long description text-->
+Carbide.c++ Extensions UI Services API reference.
+
+<p>
+<!-- Place for plug-in long description text-->
+This plug-in provides services for common dialogs and wizards, 
+enhanced UI components, common constants, custom sorters etc.
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/.settings/org.eclipse.core.resources.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3 @@
+#Tue Apr 03 12:43:07 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/util/internal/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Mon Aug 18 15:47:41 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Utilities
+Bundle-SymbolicName: com.nokia.s60tools.util
+Bundle-Version: 1.7.0
+Bundle-Activator: com.nokia.s60tools.util.internal.UtilPlugin
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui.console,
+ org.eclipse.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.core.resources,
+ com.freescale.cdt.debug.cw.core;bundle-version="1.4.0",
+ org.eclipse.cdt.core;bundle-version="5.0.1",
+ com.nokia.carbide.cpp.project.core,
+ com.nokia.carbide.cpp.sdk.core
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.util.cmdline,
+ com.nokia.s60tools.util.console,
+ com.nokia.s60tools.util.debug,
+ com.nokia.s60tools.util.exceptions,
+ com.nokia.s60tools.util.python,
+ com.nokia.s60tools.util.resource,
+ com.nokia.s60tools.util.serial,
+ com.nokia.s60tools.util.sourcecode,
+ com.nokia.s60tools.util.xml
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>October 5, 2009</p>	
+
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               about.html
+javacSource=1.5
+javacTarget=1.5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,193 @@
+  
+<project name="com.nokia.s60tools.util" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="FrameworkUtil"/>
+  <property name="project.name" value="com.nokia.s60tools.sdk" />
+  <property name="jar.filename" value="${ant.project.name}.jar"/>
+  
+  <!-- Folder definitions -->
+  <property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+  
+  <property name="carbide.folder" value="C:/Carbide_internal" />
+	<property name="carbide.int.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	
+	<property name="test.folder" location="../${ant.project.name}.tests"/>
+  <property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<!-- Folders -->
+	<delete dir="${instr.folder}"/>
+	<mkdir dir="${instr.folder}"/>
+	
+	<delete dir="${reports.folder}"/>
+	<mkdir dir="${reports.folder}"/>
+	
+	<!-- Carbide_classpath -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+  <!-- Delete old plugins and features -->
+  <target name="delete">
+	  <delete dir="plugins" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+	  <delete dir="bin" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+  </target>
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+  
+  <!-- Copy necessary resources -->
+		<copy todir="bin/" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+  
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+  
+  
+  <!-- Instrumentation target, depends on build.mtrunner -->
+	<target name="instr" depends="build.plugins">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="bin" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+  
+  
+  <target name="create.zip">
+  
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+ 		 <!-- Zip jars to ActiveObjectAnalyser.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia.carbide.extensions.*/"/>
+  </target>
+  
+  <!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd shortFileNames="true">
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="../${ant.project.name}.tests/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr, analyze" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="carbide_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+	    <jvmarg value="-D_S60TOOLS_WS_PATH=C:\hudson\jobs\Framework Util\workspace" />
+
+			<!-- Test classes -->
+	      	<test name="${ant.project.name}.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+  
+  
+  <!-- Target Build all -->
+  <target name="build.all" depends="delete, build.plugins, instr, create.zip, analyze,test" />
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.util" default="cc" basedir=".">
+
+	<target name="cc" depends="build, instr, analyze, test" description="Build, instrument, run unit tests and analyze code"/>
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	<property name="feature.name" value="Framework"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.sym.folder" location="c:/Carbide_SymSee/plugins"/>
+	<property name="carbide.idl.folder" location="c:/Carbide_IDL/plugins"/>
+	<property name="carbide.adt.folder" location="c:/Carbide_ADT/plugins"/>
+	
+	<property name="test.folder" location="../com.nokia.s60tools.util.tests"/>
+	
+	<property name="binaries.folder" location="../${feature.name}.binaries"/>
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.idl.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<delete dir="${instr.folder}"/>
+		<mkdir dir="${instr.folder}"/>
+		
+		<delete dir="../plugins"/>
+		<mkdir dir="../plugins"/>
+		
+		<delete dir="${build.result.folder}/com"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<zip destfile="../plugins/${jar.filename}">
+				<fileset dir="${build.result.folder}">
+							<include name="com/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="about.html"/>
+				</fileset>
+		</zip>
+	
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+	</target>
+	
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="${test.folder}/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="build">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="../plugins/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+		
+	
+	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<fileset dir="${carbide.adt.folder}" includes="**/*.jar" />
+		</path>
+  
+  <!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+	    <jvmarg value="-D_S60TOOLS_WS_PATH=C:\hudson\jobs\Framework_Util\workspace" />
+	    
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.util.tests.AllPureJUnitTests" todir="${reports.folder}"/> 	
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+
+	
+	
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/CmdLineCommandExecutorFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Creates command line executor based on the underlying
+ * operating system.
+ */
+public class CmdLineCommandExecutorFactory {
+	
+	/**
+	 * Creates command line executor based on the underlying
+     * operating system.
+	 * @param observer Command line executor observer instance.
+	 * @param consolePrintUtility Instance of concrete console print utility.
+	 * @return New command line executor instance.
+	 * @throws UnsupportedOSException
+	 */
+	public static ICmdLineCommandExecutor CreateOsDependentCommandLineExecutor(ICmdLineCommandExecutorObserver observer,
+			                                                                   IConsolePrintUtility consolePrintUtility) throws UnsupportedOSException{
+		
+        String osName = System.getProperty("os.name" ); //$NON-NLS-1$
+
+        if( osName.toUpperCase().startsWith("WINDOWS")){ //$NON-NLS-1$
+       	return new Win32CmdLineCommandExecutor(observer, consolePrintUtility);
+        }
+        
+        throw new UnsupportedOSException(); // non-windows OS:s are not supported
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/CmdLineExeption.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.cmdline;
+
+/**
+ * Exception is thrown, when errors occurred in command line execution.
+ */
+public class CmdLineExeption extends Exception {
+
+	/**
+	 * Serialization id.
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Default constructor. 
+	 */
+	public CmdLineExeption(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message.
+	 * @param message Exception's message.
+	 */
+	public CmdLineExeption( String message ){
+		super(message);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/DefaultLineReader.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+
+/**
+ * An example instance of ICustomLineReader interface.
+ * This is used by default if no user-defined custom
+ * parser has not been passed for command executor
+ * instance.
+ *
+ *@see com.nokia.s60tools.util.cmdline.ICustomLineReader
+ */
+public class DefaultLineReader implements ICustomLineReader {
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICustomLineReader#readLine(java.io.BufferedReader, com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver)
+	 */
+	public String readLine(BufferedReader br, 
+						   ICmdLineCommandExecutorObserver observer) throws IOException {		
+		return br.readLine();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+
+/**
+ * The interface to be implemented by 
+ * each command executors.
+ */
+public interface ICmdLineCommandExecutor {
+
+	/**
+	 * Runs the given command. Uses default stdout and
+	 * stderr readers to handle program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver</code> interface.
+	 * 
+	 * @param cmdLineArray Command line in an array form.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver
+	 */
+	public void runCommand(String[] cmdLineArray);
+	
+	/**
+	 * Runs the given command. Uses default stdout and
+	 * stderr readers to handle program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver</code> interface.
+	 * 
+	 * @param cmdLineArray Command line in an array form.
+	 * @param path Path to directory where to run this command
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver
+	 */
+	public void runCommand(String[] cmdLineArray, String path);
+	
+	/**
+	 * Runs the given command. Uses custom stdout and
+	 * stderr readers given as parameters for handling
+	 * the program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver</code> interface.
+	 * 
+	 * @param cmdLineArrayList List of command lines in a string array form.
+	 * @param stdOutReader Reference to custom stdout reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @param stdErrReader Reference to custom stderr reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @param jobContext   Job object under which the command will be executed.
+	 *                     If there is no job context existing, the parameter
+	 *                     can be set to <code>null</code>.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver
+	 */
+	public void runCommand(String[] cmdLineArray, 
+			 		  ICustomLineReader stdOutReader,
+			 		  ICustomLineReader stdErrReader,
+			 		  Job jobContext
+			 		  );
+	
+	/**
+	 * Runs the given list of commands. Uses default stdout and
+	 * stderr readers to handle program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver2</code> interface.
+	 * 
+	 * @param cmdLineArrayList List of command lines in a string array form.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver2
+	 */
+	public void runCommand(List<String[]> cmdLineArrayList);
+	
+	/**
+	 * Runs the given command. Uses custom stdout and
+	 * stderr readers given as parameters for handling
+	 * the program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver2</code> interface.
+	 * 
+	 * @param cmdLineArrayList List of command lines in a string array form.
+	 * @param stdOutReader Reference to custom stdout reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @param stdErrReader Reference to custom stderr reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @param jobContext   Job object under which the command will be executed.
+	 *                     If there is no job context existing, the parameter
+	 *                     can be set to <code>null</code>.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver2
+	 */
+	public void runCommand(List<String[]> cmdLineArrayList, 
+			 		  ICustomLineReader stdOutReader,
+			 		  ICustomLineReader stdErrReader,
+			 		  Job jobContext
+			 		  );
+
+	/**
+	 * For a group of commands stops the execution
+	 * of commands coming right after the currently executing 
+	 * command has finished, if this method has been called.
+	 * There is no way to reverse the cancellation after this
+	 * this method has been called.
+	 */
+	public void cancelCommandExecutions();
+	
+	/**
+	 * Runs a single command and wait for it's completion.
+	 * @param cmdLineArray Command line in an array form.
+	 * @param stdOutReader Reference to custom stdout reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @param stdErrReader Reference to custom stderr reader, or null if the usage 
+	 * 					   of the default reader is what is wanted.
+	 * @return exit value of the command, 0 indicates normal termination.
+	 * @throws InterruptedException if the current thread is interrupted by another thread while it is waiting.
+	 */
+
+	public int runSyncCommand(String[] cmdLineArray, ICustomLineReader stdOutReader, ICustomLineReader stdErrReader) throws InterruptedException;
+	
+	/**
+	 * Runs a single command and returns process that is created.
+	 * After returning process it waits until process is finished and informs to callback.
+	 * Uses default stdout and stderr readers to handle program output.
+	 *
+	 * In order to get information about command processing 
+	 * the client has to implement <code>ICmdLineCommandExecutorObserver</code> interface.
+	 * 
+	 * @param cmdLineArray Command line in an array form.
+	 * @param path Path to directory where to run this command
+	 * @return Process that was created or null if starting the process failed.
+	 */
+	public Process runAsyncCommand(String[] cmdLineArray, String path);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutorObserver.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+/**
+ * The implementation of this interface can observe the
+ * completion and progress of the command line tool
+ * execution.
+ */
+public interface ICmdLineCommandExecutorObserver {
+	
+	/**
+	 * Reports progress of a batch process like
+	 * execution. It depends on the invoked command
+	 * if any progress information can be gained. 
+	 * @param percentage Progress percentage.
+	 */
+	public void progress(int percentage);
+	
+	/**
+	 * Allows observer to get hands on the created process.
+	 * @param proc Process object that has been created for running
+	 * 			   the command currently under execution.
+	 */
+	public void processCreated(Process proc);
+
+	/**
+	 * Informs the observer that the execution of the currently
+	 * executed command was interrupted due to some reason.
+	 * @param reasonMsg Message describing the reason. 
+	 */
+	public void interrupted(String reasonMsg);
+	
+	/**
+	 * Informs about the completion of the execution
+	 * of a single command.
+	 * @param exitValue Exit value of the executed command.
+	 */
+	public void completed(int exitValue);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICmdLineCommandExecutorObserver2.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.util.cmdline;
+
+/**
+ * Extends <code>ICmdLineCommandExecutorObserver</code>
+ * interface for allowing to know when a whole group of commands
+ * to be executed has been executed.
+ */
+public interface ICmdLineCommandExecutorObserver2 extends ICmdLineCommandExecutorObserver {	
+
+	/**
+	 * Informs about the completion of the execution
+	 * of a single command.
+	 * This will be called for <code>ICmdLineCommandExecutorObserver2</code>
+	 * observer instances instead of <code>complete(int exitVal)</code>.
+	 * @param proc Process object that has been completed.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed
+	 */
+	public void completed(Process proc);
+	
+	/**
+	 * Informs about the completion of the execution
+	 * of all commands given to the executor.
+	 */
+	public void allCommandsExecuted();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/ICustomLineReader.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+
+/**
+ * Specifies interface that each custom line reader used 
+ * with command line executor must implement. Custom line
+ * readers enable parsing of output of a command line
+ * tool. This makes possible to invoke custom actions
+ * based on the output. The parsed and returned string
+ * goes then trough default handling.
+ * 
+ * DefaultLineReader implements a non-parsing instance
+ * of this interface.
+ * @see com.nokia.s60tools.util.cmdline.DefaultLineReader
+ */
+public interface ICustomLineReader {
+	
+	/**
+	 * Reads and parses from buffered reader input
+	 * and return the result to the caller.
+	 * @param br Buffered reader to read from.
+	 * @param observer Observer to notify about progress if the progress can 
+	 *                 be estimated based on the command line tool's output.
+	 * @return Read and parsed command line tool output string.
+	 * @throws IOException
+	 */
+	public String readLine(BufferedReader br, 
+					ICmdLineCommandExecutorObserver observer) throws IOException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/UnsupportedOSException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+/**
+ * Exception thrown when an unsupported operation
+ * system is detected.
+ */
+public class UnsupportedOSException extends Exception {
+		
+	static final long serialVersionUID = -4533538487088112779L;
+
+	/**
+	 * Default constructor. 
+	 */
+	public UnsupportedOSException(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message.
+	 * @param message Exception's message.
+	 */
+	public UnsupportedOSException( String message ){
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/Win32CmdLineCommandExecutor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,499 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.cmdline;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+
+
+/**
+ * Command line tool executor class for 
+ * Win32 platform.
+ */
+class Win32CmdLineCommandExecutor implements ICmdLineCommandExecutor {
+	
+	private final ICmdLineCommandExecutorObserver observer;
+	private final IConsolePrintUtility consolePrintUtility;
+	private ICustomLineReader stdOutReader = null;
+	private ICustomLineReader stdErrReader = null;
+	
+	private boolean isCurrentExecutionCancelled = false;
+	
+	/**
+	 * Constructor.
+	 */
+	Win32CmdLineCommandExecutor(ICmdLineCommandExecutorObserver observer, 
+			                    IConsolePrintUtility consolePrintUtility){
+		this.observer = observer;
+		this.consolePrintUtility = consolePrintUtility;
+	}
+	
+	/**
+	 * Helper class that can be used to consume 
+	 * given input stream in its own thread and
+	 * print the results to the console.
+	 */
+	private class StreamConsumerWorkerThread extends Thread	{
+		
+		public static final int STDOUT_STREAM = 0;
+		public static final int STDERR_STREAM = 1;
+		
+	    InputStream is = null;	    
+	    int streamType;
+	    ICustomLineReader customLineReader = null;
+	    
+	    StreamConsumerWorkerThread(InputStream is, 
+	    						   int streamType, 
+	    						   ICustomLineReader customLineReader){
+	        this.is = is;
+	        this.streamType = streamType;
+	        if(customLineReader != null){
+		        this.customLineReader = customLineReader;	        	
+	        }
+	        else{
+	        	this.customLineReader = new DefaultLineReader();
+	        }
+	    }
+	    	    
+	    /* (non-Javadoc)
+	     * @see java.lang.Thread#run()
+	     */
+	    public void run(){
+	        try{
+	            InputStreamReader isr = new InputStreamReader(is);
+	            BufferedReader br = new BufferedReader(isr);
+	            
+	            String line=null;
+	            while ( (line = customLineReader.readLine(br, observer)) != null){
+	                	            	
+	            	//      All spaces are seen by default as ÿ characters, and there is currently 
+	            	//      no better way to correct it than by using replaceAll	            	
+	            	String reformattedLine = line.replaceAll("ÿ", " "); //$NON-NLS-1$ //$NON-NLS-2$
+
+	            	if(streamType == STDERR_STREAM){
+	            		consolePrintUtility.println(
+	            									reformattedLine,
+	            									IConsolePrintUtility.MSG_ERROR
+	            										);	
+	            	}
+	            	else{
+	            		consolePrintUtility.println(	
+													reformattedLine);
+	            	}	            	
+	            }
+	        } catch (IOException ioe){
+                ioe.printStackTrace();  
+              }
+	    }
+	} // End of private class StreamConsumerWorkerThread
+	
+	/**
+	 * Worker thread that allows the running of command line
+	 * tool as a background process, instead of UI blocking one.
+	 */
+	private class CmdLineCommandExecutorWorkerThread extends Thread {
+		
+		/**
+		 * Command-line string array list.
+		 */
+		private List<String[]> cmdLineArrayList = null;
+		
+		/**
+		 * Path to directory where to run the commands.
+		 */
+		private String path = null;
+
+		/**
+		 * Constructor.
+		 * @param cmdLineArrayList List of command lines in a string array form.
+		 */
+		public CmdLineCommandExecutorWorkerThread(List<String[]> cmdLineArrayList){
+			this.cmdLineArrayList = cmdLineArrayList;				
+		}
+		
+		/**
+		 * Constructor.
+		 * @param cmdLineArrayList List of command lines in a string array form.
+		 * @param path Path to directory where to run the commands.
+		 */
+		public CmdLineCommandExecutorWorkerThread(List<String[]> cmdLineArrayList, String path){
+			this.cmdLineArrayList = cmdLineArrayList;		
+			this.path = path;
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run()
+		{
+			String cmdLine = null;
+	        Process proc = null;
+
+	        String msgUnexpectedException = Messages.getString("Win32CmdLineCommandExecutor.UnexpectedException_ConsoleMsg"); //$NON-NLS-1$
+	        String msgCmdLine = Messages.getString("Win32CmdLineCommandExecutor.Unexcepted_Exception_When_Running_ConsoleMsg"); //$NON-NLS-1$
+	        String msgException = Messages.getString("Win32CmdLineCommandExecutor.Exception_Desc_ConsoleMsg"); //$NON-NLS-1$
+	        
+	        for (String[] cmdLineArray : cmdLineArrayList) {		        
+		        try {
+		        	
+		        	if(isCurrentExecutionCancelled){
+		        		return;
+		        	}
+		        	
+					cmdLine = new String(""); //$NON-NLS-1$
+					for (int i = 0; i < cmdLineArray.length; i++) {
+						cmdLine = cmdLine +  " " + cmdLineArray[i];				 //$NON-NLS-1$
+					}							
+			        proc = executeCommand(cmdLine, msgCmdLine, msgException, path);		                                
+			        checkExitValue(cmdLine, proc, msgCmdLine, msgException);									
+			        
+				} catch (Exception e) {
+					e.printStackTrace();			
+		    		consolePrintUtility.println(msgUnexpectedException,
+							 IConsolePrintUtility.MSG_ERROR);	
+		    		consolePrintUtility.println(msgException + e.getMessage(),
+							 IConsolePrintUtility.MSG_ERROR);
+		    		observer.interrupted(e.getMessage());
+				}
+				
+			} // for
+	        
+	        // Informing that all commands has been executed.
+			if(observer instanceof ICmdLineCommandExecutorObserver2){
+				((ICmdLineCommandExecutorObserver2)observer).allCommandsExecuted();
+			}
+		} 
+		
+	}//End of private class CmdLineCommandExecutorWorkerThread
+	
+	/**
+	 * Waits for the end of the given process, checks the exit value,
+	 * and prints the necessary information to the console output. 
+	 * @param cmdLine Command line as a string.
+	 * @param proc Process to be waited for ending.
+	 * @param msgCmdLine Error message given if execution fails.
+	 * @param msgException Error message prefixed before exception's message.
+	 */
+	private void checkExitValue(String cmdLine, Process proc, String msgCmdLine, String msgException) {
+		// Waiting for the process to end and checking the exit status
+        int exitVal = 0;
+
+		String exitValMsg = Messages.getString("Win32CmdLineCommandExecutor.Cmd_ExitVal_ConsoleMsg"); //$NON-NLS-1$
+		String interruptedCmdMsg = Messages.getString("Win32CmdLineCommandExecutor.CmdExec_Interrupted_ConsoleMsg"); //$NON-NLS-1$
+
+		try {
+			observer.processCreated(proc);
+			exitVal = proc.waitFor();			
+
+			// Printing exitValue to console only in case of an error.
+			// In other cases the printout messes up the result printout.
+			if(exitVal != 0){
+        		consolePrintUtility.println(exitValMsg + exitVal,
+											 IConsolePrintUtility.MSG_ERROR);	
+        	}
+			
+			// Notifying the observer
+			if(observer instanceof ICmdLineCommandExecutorObserver2){
+				((ICmdLineCommandExecutorObserver2)observer).completed(proc);
+			}
+			else{
+				observer.completed(exitVal);					
+			}
+			
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+			consolePrintUtility.println(interruptedCmdMsg + cmdLine,
+					IConsolePrintUtility.MSG_WARNING);	
+			observer.interrupted(e.getMessage());
+		} catch (Exception e) {
+			e.printStackTrace();
+			consolePrintUtility.println(msgCmdLine + cmdLine,
+					 IConsolePrintUtility.MSG_ERROR);	
+			consolePrintUtility.println(msgException + e.getMessage(),
+					 IConsolePrintUtility.MSG_ERROR);	
+			observer.interrupted(e.getMessage());
+		}
+	}
+	
+	/**
+	 * Executed the command given in command line array and returns
+	 * the invoked process. Implements the necessary logging to the console.
+	 * @param cmdLine Command line as a string.
+	 * @param msgCmdLine Error message given if execution fails.
+	 * @param msgException Error message prefixed before exception message.
+	 * @param path Path to directory where to run this command
+	 * @return Newly created process for the invoked command.
+	 */
+	private Process executeCommand(String cmdLine, String msgCmdLine, String msgException, String path) {
+		File dir = null;
+		if(path != null) {
+			dir = new File(path);
+		}
+		return executeCommand(cmdLine, msgCmdLine, msgException, false, dir);
+	}
+	
+	/**
+	 * Executed the command given in command line array and returns
+	 * the invoked process. Implements the necessary logging to the console.
+	 * @param cmdLine Command line as a string.
+	 * @param msgCmdLine Error message given if execution fails.
+	 * @param msgException Error message prefixed before exception message.
+	 * @param isSyncCall set to <code>true</code> if there is need to make synchronous call.
+	 * @return Newly created process for the invoked command.
+	 */
+	private Process executeCommand(String cmdLine, String msgCmdLine, String msgException, boolean isSyncCall) {
+		return executeCommand(cmdLine, msgCmdLine, msgException, isSyncCall, null);
+	}
+	
+	/**
+	 * Executed the command given in command line array and returns
+	 * the invoked process. Implements the necessary logging to the console.
+	 * @param cmdLine Command line as a string.
+	 * @param msgCmdLine Error message given if execution fails.
+	 * @param msgException Error message prefixed before exception message.
+	 * @param isSyncCall set to <code>true</code> if there is need to make synchronous call.
+	 * @param dir Directory where to run this command
+	 * @return Newly created process for the invoked command.
+	 */
+	private Process executeCommand(String cmdLine, String msgCmdLine, String msgException, boolean isSyncCall, File dir) {
+		
+		Runtime rt = null;
+		Process proc = null;
+		
+        String msgExecuting = Messages.getString("Win32CmdLineCommandExecutor.Executing_Cmd_ConsoleMsg"); //$NON-NLS-1$
+
+        try {			
+			// Executing the command
+	        rt = Runtime.getRuntime();
+    		consolePrintUtility.println(msgExecuting + cmdLine);	
+			proc = rt.exec(cmdLine, null, dir);
+			
+	        // Setting up and starting stream consumers
+	        StreamConsumerWorkerThread errorStreamConsumer= null;            
+	        StreamConsumerWorkerThread outputStreamConsumer = null;		
+			
+	        errorStreamConsumer= new StreamConsumerWorkerThread(
+											proc.getErrorStream(), 
+											StreamConsumerWorkerThread.STDERR_STREAM,
+											stdErrReader
+															  );            
+	        outputStreamConsumer = new StreamConsumerWorkerThread(
+	        								proc.getInputStream(),
+	        								StreamConsumerWorkerThread.STDOUT_STREAM,
+	        								stdOutReader
+	        													);
+	        if(isSyncCall){
+	        	// If user wants to make synchronous call we do no invoke background processing threads
+		        outputStreamConsumer.run();
+		        errorStreamConsumer.run();	        	
+	        }
+	        else{
+	        	// In normal asynchronous case output is handled at background
+		        errorStreamConsumer.start();
+		        outputStreamConsumer.start();	        	
+	        }	        
+	        
+		} catch (Exception e) {
+			e.printStackTrace();
+    		consolePrintUtility.println(msgCmdLine + cmdLine,
+					 IConsolePrintUtility.MSG_ERROR);	
+    		consolePrintUtility.println(msgException + e.getMessage(),
+					 IConsolePrintUtility.MSG_ERROR);	
+			observer.interrupted(e.getMessage());
+		}
+		return proc;
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.lang.String[])
+	 */
+	public void runCommand(String[] cmdLineArray) {
+		// Delegating this call further by after parameter modification
+		ArrayList<String[]> cmdLineArrayList = new ArrayList<String[]>();
+		cmdLineArrayList.add(cmdLineArray);
+		runCommand(cmdLineArrayList);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.lang.String[], java.lang.String)
+	 */
+	public void runCommand(String[] cmdLineArray, String path) {
+		// Delegating this call further by after parameter modification
+		ArrayList<String[]> cmdLineArrayList = new ArrayList<String[]>();
+		cmdLineArrayList.add(cmdLineArray);
+		runCommand(cmdLineArrayList, path);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.lang.String[], com.nokia.s60tools.util.cmdline.ICustomLineReader, com.nokia.s60tools.util.cmdline.ICustomLineReader, org.eclipse.core.runtime.jobs.Job)
+	 */
+	public void runCommand(String[] cmdLineArray, 
+						   ICustomLineReader stdOutReader, 
+						   ICustomLineReader stdErrReader,
+						   Job jobContext) {
+		// Delegating this call further by after parameter modification
+		ArrayList<String[]> cmdLineArrayList = new ArrayList<String[]>();
+		cmdLineArrayList.add(cmdLineArray);
+		runCommand(cmdLineArrayList, stdOutReader, stdErrReader, jobContext);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.util.List)
+	 */
+	public void runCommand(List<String[]> cmdLineArrayList) {
+		// Making sure that we are using the default line reading
+		stdOutReader = null;
+		stdErrReader = null;	
+		isCurrentExecutionCancelled = false;
+		(new CmdLineCommandExecutorWorkerThread(cmdLineArrayList)).start();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.util.List)
+	 */
+	public void runCommand(List<String[]> cmdLineArrayList, String path) {
+		// Making sure that we are using the default line reading
+		stdOutReader = null;
+		stdErrReader = null;	
+		isCurrentExecutionCancelled = false;
+		(new CmdLineCommandExecutorWorkerThread(cmdLineArrayList, path)).start();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runCommand(java.util.List, com.nokia.s60tools.util.cmdline.ICustomLineReader, com.nokia.s60tools.util.cmdline.ICustomLineReader, org.eclipse.core.runtime.jobs.Job)
+	 */
+	public void runCommand(List<String[]> cmdLineArrayList, ICustomLineReader stdOutReader, ICustomLineReader stdErrReader, Job jobContext) {
+		// Setting up custom line readers
+		this.stdOutReader = stdOutReader;
+		this.stdErrReader = stdErrReader;	
+		Thread th = new CmdLineCommandExecutorWorkerThread(cmdLineArrayList);
+		if(jobContext != null){
+			// Setting thread for job context to observe
+			jobContext.setThread(th);
+		}
+		isCurrentExecutionCancelled = false;
+		th.start();		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#cancelCommandExecutions()
+	 */
+	public void cancelCommandExecutions() {
+		isCurrentExecutionCancelled = true;		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runSyncCommand(java.lang.String[], com.nokia.s60tools.util.cmdline.ICustomLineReader, com.nokia.s60tools.util.cmdline.ICustomLineReader)
+	 */
+	public int runSyncCommand(String[] cmdLineArray,
+			ICustomLineReader stdOutReader, ICustomLineReader stdErrReader) throws InterruptedException {
+
+		// Setting up custom line readers
+		this.stdOutReader = stdOutReader;
+		this.stdErrReader = stdErrReader;	
+		
+        Process proc = null;
+
+        String msgCmdLine = Messages.getString("Win32CmdLineCommandExecutor.Unexcepted_Exception_When_Running_ConsoleMsg"); //$NON-NLS-1$
+        String msgException = Messages.getString("Win32CmdLineCommandExecutor.Exception_Desc_ConsoleMsg"); //$NON-NLS-1$
+        
+		String cmdLine = new String(""); //$NON-NLS-1$
+		for (int i = 0; i < cmdLineArray.length; i++) {
+			cmdLine = cmdLine +  " " + cmdLineArray[i];				 //$NON-NLS-1$
+		}	
+        proc = executeCommand(cmdLine, msgCmdLine, msgException, true);
+        
+        //return value from Process, 0 indicates normal termination. 
+    	return proc.waitFor();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor#runAsyncCommand(java.lang.String[], java.lang.String)
+	 */
+	public Process runAsyncCommand(String[] cmdLineArray, String path) {
+		// Making sure that we are using the default line reading
+		stdOutReader = null;
+		stdErrReader = null;	
+		isCurrentExecutionCancelled = false;
+		
+		Process proc = null;
+
+        String msgCmdLine = Messages.getString("Win32CmdLineCommandExecutor.Unexcepted_Exception_When_Running_ConsoleMsg"); //$NON-NLS-1$
+        String msgException = Messages.getString("Win32CmdLineCommandExecutor.Exception_Desc_ConsoleMsg"); //$NON-NLS-1$
+        
+		String cmdLine = new String(""); //$NON-NLS-1$
+		for (int i = 0; i < cmdLineArray.length; i++) {
+			cmdLine = cmdLine +  " " + cmdLineArray[i];	//$NON-NLS-1$
+		}
+		
+		// Getting the process.
+        proc = executeCommand(cmdLine, msgCmdLine, msgException, path);
+        
+        // Starting thread that will wait until process ends and informs later through callback.
+        CheckExitValueThread newThread = new CheckExitValueThread(cmdLine, proc, msgCmdLine, msgException);
+        newThread.start();
+        
+		return proc;
+	}
+	
+	/**
+	 * Helper class that can be used to check exit value
+	 * in different thread.
+	 */
+	private class CheckExitValueThread extends Thread{
+
+		private final String cmdLine;
+		private final String msgCmdLine;
+		private final String msgException;
+		private final Process proc;
+
+		/**
+		 * Constructor.
+		 * @param cmdLine Command line as a string.
+		 * @param proc Process to be waited for ending.
+		 * @param msgCmdLine Error message given if execution fails.
+		 * @param msgException Error message prefixed before exception message.
+		 */
+		public CheckExitValueThread(String cmdLine, Process proc,
+				String msgCmdLine, String msgException) {
+			this.cmdLine = cmdLine;
+			this.proc = proc;
+			this.msgCmdLine = msgCmdLine;
+			this.msgException = msgException;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run(){
+			checkExitValue(cmdLine, proc, msgCmdLine, msgException);									
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/cmdline/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides command line tool interaction utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/AbstractProductSpecificConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,117 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.console;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * Declares abstract product-specific console
+ * that can be subclassed and configured with
+ * product name and product-specific image
+ * descriptor for the console.
+ * 
+ * Product specific console logging utility class
+ * could be implemented, for instance, as a singleton
+ * class that that extends this class and provides 
+ * implementations for the abstract methods.<br><br>
+ * 
+ * In the following is given an example of such implementation:
+ * 
+ * <code>
+ * <pre>
+ * 
+ * public class MyProductConsole extends AbstractProductSpecificConsole {
+ * 	
+ *     static private MyProductConsole instance = null;
+ *     // Product information may be stored in some common place and just
+ *     // initializing information in here order to use it in the methods.
+ *     static final private String PRODUCT_CONSOLE_NAME = "MyProduct Console";
+ *     static final private String PRODUCT_IMAGE_KEY = "MY_PROD_CONSOLE_IMG"
+ * 	
+ * 	static public MyProductConsole getInstance(){
+ * 	    if(instance == null ){
+ * 		instance = new MyProductConsole();
+ * 	    }
+ * 	    return instance;
+ * 	}
+ * 	
+ *     private MyProductConsole(){		
+ *     }
+ * 			
+ *     protected String getProductConsoleName() {
+ * 	return PRODUCT_CONSOLE_NAME;
+ *     }
+ * 
+ *     protected ImageDescriptor getProductConsoleImageDescriptor() {
+ * 	// Product-specific images are probably stored into plugin-specific image registry
+ * 	return MyProductPlugin.getDefault().getImageRegistry().getDescriptor(PRODUCT_IMAGE_KEY);
+ *     }
+ * 
+ * }
+ * 
+  * </pre>
+ * </code>
+ *  
+ */
+public abstract class AbstractProductSpecificConsole implements IConsolePrintUtility{
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String)
+	 */
+	public void println(String message){
+		ConsoleWindowUtility.println(getProductConsoleName(), getProductConsoleImageDescriptor(), message);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String, int)
+	 */
+	public void println(String message, int messageType){
+		ConsoleWindowUtility.println(getProductConsoleName(), getProductConsoleImageDescriptor(), message, messageType);
+	}
+	
+	/**
+	 * Prints given exception's stack trace element array contents to console as error message.
+	 * @param e exception for which stack trace is to be printed into the console
+	 */
+	public void printStackTrace(Exception e) {
+		
+		if(e == null){
+			return;
+		}
+		StackTraceElement[] stackTrace = e.getStackTrace();
+		
+		for (int i = 0; i < stackTrace.length; i++) {
+			StackTraceElement stackTraceElement = stackTrace[i];
+			String traceString = stackTraceElement.toString();
+			println(traceString, IConsolePrintUtility.MSG_ERROR);
+		}
+	}		
+
+	/**
+	 * Returns the name of the console used for a concrete product.
+	 * @return Console name string.
+	 */
+	protected abstract String getProductConsoleName(); 
+	
+	/**
+	 * Returns the image descriptor of the console used for a concrete product.
+	 * @return Console's image descriptor.
+	 */
+	protected abstract ImageDescriptor getProductConsoleImageDescriptor(); 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/ConsoleWindowUtility.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.console;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleManager;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+
+/**
+ * Offers service for writing of messages to the
+ * to the name console window in Console view.
+ * Tree message types with distinct fonts that can 
+ * be printed to the console output are provided:
+ * - normal message (default console font)
+ * - warning message (default console font + italics)
+ * - error message  (default console font + italics + bold)
+ */
+public class ConsoleWindowUtility {
+
+	/**
+	 * Gets message console stream for given console window name. Creates a new console
+	 * if there is not already console window existing with that name.
+	 * @param consoleWindowName Name of the console window to print into.
+	 * @param consoleWindowImageDescriptor Image descriptor for the image that is shown in drop-down
+	 *                                     menu of console selection in case there are several open
+	 *                                     console windows inside Console view.
+	 * @return Message console stream to print.
+	 */
+	private static MessageConsoleStream getConsoleStream(String consoleWindowName,
+														 ImageDescriptor consoleWindowImageDescriptor
+			                                             ) {		
+	      ConsolePlugin plugin = ConsolePlugin.getDefault();
+	      IConsoleManager conMan = plugin.getConsoleManager();	      
+	      IConsole[] consoleArray = conMan.getConsoles();
+	      
+	      for (int i = 0; i < consoleArray.length; i++){
+			 if (consoleWindowName.equals(consoleArray[i].getName())){
+				 MessageConsole console = (MessageConsole) consoleArray[i];
+				 return console.newMessageStream();		        	 
+			 }	    	  
+	      }
+
+	      MessageConsole msgConsole = new MessageConsole( 
+	    		  	                consoleWindowName,
+	    		  	                consoleWindowImageDescriptor,
+					    			false
+										    			);
+	      conMan.addConsoles(new IConsole[]{msgConsole});
+	      return msgConsole.newMessageStream();
+	   }
+	
+	/**
+	 * Gets font style bits for the given message type.
+	 * @param messageType Message type.
+	 * @return Font style bits.
+	 * @see IConsolePrintUtility#MSG_NORMAL
+	 * @see IConsolePrintUtility#MSG_WARNING
+	 * @see IConsolePrintUtility#MSG_ERROR
+	 */
+	private static int getFontStyleBits(int messageType){
+		
+		int fontStyleBits;
+		
+		switch (messageType) {
+		
+			case IConsolePrintUtility.MSG_WARNING:
+				fontStyleBits = SWT.ITALIC;			
+				break;
+	
+			case IConsolePrintUtility.MSG_ERROR:
+				fontStyleBits = SWT.ITALIC | SWT.BOLD;			
+				break;
+	
+			default:
+				fontStyleBits = SWT.NORMAL;
+				break;
+		}
+		
+		return fontStyleBits;
+	}
+	
+	/**
+	 * Prints message to the given console window with default message type.
+	 * @param consoleWindowName Name of the console window to print into.
+	 * @param consoleWindowImageDescriptor Image descriptor for the image that is shown in drop-down
+	 *                                     menu of console selection in case there are several open
+	 *                                     console windows inside Console view.
+	 * @param message					   Message to be printed.
+	 * @see IConsolePrintUtility#MSG_NORMAL
+	 */
+	public static void println(String consoleWindowName, ImageDescriptor consoleWindowImageDescriptor, String message){
+		println(consoleWindowName, consoleWindowImageDescriptor, message, IConsolePrintUtility.MSG_NORMAL);
+	}
+
+	/**
+	 * Prints message to the given console window.
+	 * @param consoleWindowName Name of the console window to print into.
+	 * @param consoleWindowImageDescriptor Image descriptor for the image that is shown in drop-down
+	 *                                     menu of console selection in case there are several open
+	 *                                     console windows inside Console view.
+	 * @param message					   Message to be printed.
+	 * @param messageType				   The type of the message.
+	 * @see IConsolePrintUtility#MSG_NORMAL
+	 * @see IConsolePrintUtility#MSG_WARNING
+	 * @see IConsolePrintUtility#MSG_ERROR
+	 */
+	public static void println(String consoleWindowName, ImageDescriptor consoleWindowImageDescriptor, String message, int messageType){
+		final MessageConsoleStream consoleStream = getConsoleStream(consoleWindowName, consoleWindowImageDescriptor);
+		final int fontStyleBits = getFontStyleBits(messageType);		
+		final String msg = message;
+		
+		// Runnable implementing the actual printing to console
+		Runnable printToConsoleRunnable = new Runnable(){
+			public void run(){
+				printlnImpl(msg, consoleStream, fontStyleBits);
+			}
+		};
+		
+		// Queuing the runnable for the execution in UI thread
+		Display.getDefault().asyncExec(printToConsoleRunnable);        		
+	}
+
+	/**
+	 * This method is used to do println in away that allows also access 
+	 * to console from non-UI thread.
+	 * @param message		 Message to be printed.
+	 * @param consoleStream	 Console stream to print into		
+	 * @param fontStyleBits  Style bits determining the used font style.
+	 */
+	private static void printlnImpl(String message, MessageConsoleStream consoleStream, int fontStyleBits) {
+		consoleStream.setFontStyle(fontStyleBits);
+		consoleStream.println(message);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/IConsolePrintUtility.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.console;
+
+
+/**
+ * Common interface for concrete console print utilities that are offered
+ * in product level. Concrete implementors should provide support for
+ * all message types defined as public class attributes.
+ * 
+ * This interface is implemented by AbstractProductSpecificConsole which
+ * uses further ConsoleWindowUtility class for formatting messages
+ * according the message type parameter and prints to message output. 
+ * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole
+ * @see com.nokia.s60tools.util.console.ConsoleWindowUtility
+ */
+public interface IConsolePrintUtility {
+	
+	/**
+	 * Constant denoting normal message type (default formatting type).
+	 */
+	public static final int MSG_NORMAL = 1;
+	/**
+	 * Constant denoting warning message type.
+	 */
+	public static final int MSG_WARNING = 2;
+	/**
+	 * Constant denoting error message type.
+	 */
+	public static final int MSG_ERROR = 3;
+
+	/**
+	 * Prints given message to console with default formatting.
+	 * @param message	Message to be printed.
+	 * @see #MSG_NORMAL
+	 */
+	public void println(String message);
+
+	/**
+	 * Prints given message to console.
+	 * @param message	  Message to be printed.
+	 * @param messageType The type of the message.
+	 * @see #MSG_NORMAL
+	 * @see #MSG_WARNING
+	 * @see #MSG_ERROR
+	 */
+	public void println(String message, int messageType);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/console/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides console print utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/debug/DbgUtility.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.debug;
+
+import com.nokia.s60tools.util.internal.Messages;
+
+/**
+ * Simple console debug utility that can be configured
+ * via property settings given as command line parameter 
+ * to JVM (-Dproperty=value).
+ * 
+ * JVM parameter usage example:
+ * 
+ * <code>
+ * <pre>
+ *  -Dcom.nokia.s60tools.debug=true -Dcom.nokia.s60tools.debugpriority=class|operation
+ * </pre>
+ * </code>
+ * 
+ * The aforementioned JVM arguments enable debugging, and print out
+ * all the debug messages with priority <code>PRIORITY_CLASS</code> 
+ * and <code>PRIORITY_OPERATION</code> but omit debug prints 
+ * with <code>PRIORITY_LOOP</code>.<br><br> 
+ * 
+ * After the following parameter is added in the end of the previous parameters
+ * 
+ * <code>
+ * <pre> 
+ *  -Dcom.nokia.s60tools.debugfilter=MyClass
+ * </pre>
+ * </code>
+ * 
+ * only those debug messages that start with string "MyClass" are printed to stdout.
+ * 
+ */
+public class DbgUtility {
+	
+	/**
+	 * Debug prints using this priority generate lots of information because priority
+	 * should be used only when debugging happens in a tight loop.
+	 */
+	public static String PRIORITY_LOOP = "loop"; //$NON-NLS-1$
+	/**
+	 * Debug prints using this priority generate a moderate amount of information because priority 
+	 * should be used only when there is need to debug operation level information.
+	 */
+	public static String PRIORITY_OPERATION = "operation"; //$NON-NLS-1$
+	/**
+	 * Debug prints using this priority generate a small amount of information because priority 
+	 * should be used only when a class is initialized or deinitialized.
+	 */	
+	public static String PRIORITY_CLASS = "class";	 //$NON-NLS-1$
+
+	/**
+	 * Value for this property can be any OR-combination of 
+	 * the priority types that are declared above.
+	 * 
+	 *  For example, <code>loop | operation | class</code>
+	 *   
+	 * The default value is <code>class</code>. 
+	 */
+	private static String PROPERTY_PRIORITY = "com.nokia.s60tools.debugpriority"; //$NON-NLS-1$
+	
+	/**
+	 * Value for this property can be either <code>true</code> or <code>false</code>.
+	 */
+	private static String PROPERTY_DEBUG = "com.nokia.s60tools.debug"; //$NON-NLS-1$
+	
+	/**
+	 * This property filters messages in a such way that it passes through
+	 * only the mesages starting with the string defined in this property.
+	 */
+	private static String PROPERTY_DEBUG_FILTER = "com.nokia.s60tools.debugfilter"; //$NON-NLS-1$
+
+	//
+	// Setting up the default values.
+	//
+	private static String DEFAULT_DEBUG_PRIORITY = "class"; //$NON-NLS-1$
+	private static String DEFAULT_DEBUG_FILTER = "";	 //$NON-NLS-1$
+	private static String CURRENT_DEBUG_PRIORITY = System.getProperty(PROPERTY_PRIORITY, DEFAULT_DEBUG_PRIORITY);
+	private static String CURRENT_DEBUG_FILTER = System.getProperty(PROPERTY_DEBUG_FILTER, DEFAULT_DEBUG_FILTER);		
+	
+	/**
+	 * Prints message to stdout if it is higher or equal with the current 
+	 * debug priority and passes the currently used debugging filter.
+	 * @param priorityString Priority type of the message.
+	 * @param msg Message string.
+	 */
+	public static void println(String priorityString, String msg){
+		if (Boolean.getBoolean(PROPERTY_DEBUG)
+			&&
+			priorityMatchesWithCurrentDebugSetting(priorityString)
+			&&
+			passesFilter(msg)
+			) {
+			System.out.println(msg);
+		}
+	}
+	
+	/**
+	 * Sets a new debug priority.
+	 * @param priority New debug priority
+	 */
+	public static void setCurrentDebugPriority(String priority){
+		if(
+			(priority.compareToIgnoreCase(PRIORITY_CLASS)== 0)
+			||
+			(priority.compareToIgnoreCase(PRIORITY_LOOP)== 0)
+			||
+			(priority.compareToIgnoreCase(PRIORITY_OPERATION)== 0)
+			){
+			CURRENT_DEBUG_PRIORITY = priority;
+		}
+		else
+		{
+			throw new IllegalArgumentException(Messages.getString("DbgUtility.Invalid_Debug_Priority_RunTime_Exception_Msg")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Debug priority filter.
+	 * @param priorityString Priority of the currently handled message.
+	 * @return Returns <code>true</code> if the debug message passes 
+	 *                 the filter, otherwise return <code>false</code>.
+	 */
+	private static boolean priorityMatchesWithCurrentDebugSetting(String priorityString){
+		return (CURRENT_DEBUG_PRIORITY.toLowerCase()).indexOf(priorityString) >= 0;	
+	}
+
+	/**
+	 * Debug string start prefix filter.
+	 * @param msg Debug message to be checked for filtering.
+	 * @return Returns <code>true</code> if the debug message passes 
+	 *                 the filter, otherwise return <code>false</code>.
+	 */
+	private static boolean passesFilter(String msg){
+		if(!CURRENT_DEBUG_FILTER.equalsIgnoreCase("")){ //$NON-NLS-1$
+			return msg.startsWith(CURRENT_DEBUG_FILTER);	
+		}
+		else{
+			return true;
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/debug/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides debugging utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/exceptions/JobCancelledByUserException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.exceptions;
+
+public class JobCancelledByUserException extends Exception {
+
+	static final long serialVersionUID = -2283577166005521183L;
+
+	/**
+	 * Constructor with attached message.
+	 * @param message Detailed message for the user.
+	 */
+	public JobCancelledByUserException(String string) {
+		super(string);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.util.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Messages class is used to fetch localised strings from properties file.
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.util.internal.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/UtilPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class that is internal
+ * for the plugin and not used by plugin
+ * clients.
+ */
+public class UtilPlugin extends Plugin {
+
+	/**
+	 * The shared plugin instance. 
+	 */
+	private static UtilPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public UtilPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static UtilPlugin getDefault() {
+		return plugin;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/internal/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+#
+# Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+Win32CmdLineCommandExecutor.Executing_Cmd_ConsoleMsg=Executing command: 
+Win32CmdLineCommandExecutor.Cmd_ExitVal_ConsoleMsg=Command exit value: 
+Win32CmdLineCommandExecutor.CmdExec_Interrupted_ConsoleMsg=The execution of the following command was interrupted: 
+Win32CmdLineCommandExecutor.UnexpectedException_ConsoleMsg=Unexpected exception encountered
+Win32CmdLineCommandExecutor.Unexcepted_Exception_When_Running_ConsoleMsg=Unexpected exception encountered when running command: 
+Win32CmdLineCommandExecutor.Exception_Desc_ConsoleMsg=Exception description: 
+DbgUtility.Invalid_Debug_Priority_RunTime_Exception_Msg=Invalid debug priority.
+FileFinder.BegingTask_Msg_Part1=Seeking '
+FileFinder.BegingTask_Msg_Part2=' file(s)...
+FileFinder.ErrorOnSeek_ErrMsg_Part1=Error occurs during seeking '
+FileFinder.ErrorOnSeek_ErrMsg_Part2=' file(s) from folder:'
+FileFinder.ErrorOnSeek_ErrMsg_Part3=', error was: 
+FileFinder.ErrorOnStart_ErrMsg_Part1=Error occurs when starting to seek '
+FileFinder.ErrorOnStart_ErrMsg_Part2=' files. Error was: 
+FileFinder.ErrorOnStartByName_ErrMsg_Part1=Error occurs when starting to seek file(s): '
+FileFinder.ErrorOnStartByName_ErrMsg_Part2='. Error was: 
+FileFinder.ProgressMsg_Part1=Seeking: '
+FileFinder.ProgressMsg_Part2=' file(s) from dir: 
+FileFinder.UnableToSeek_ErrMsg_Part1=Unable to seek '
+FileFinder.UnableToSeek_ErrMsg_Part2=' file(s) from directory: '
+FileFinder.UnableToSeek_ErrMsg_Part3=' because directory is not a directory or does not exist.
+FileUtils.NonExistingExternalFile_ErrMsg=Failed to open external file into editor area. File does not exists: 
+FileUtils.FAILED_TO_LOAD_DATA=Failed to load data from file '
+FileUtils.LESS_BYTES_THAN_EXPECTED='. Read less bytes than expected
+PetranDumpCMDLineRunner.Unexpected_Return_Value_Warning=Unexpected return value encountered in command line running, value was: 
+ProjectFinder.BldInfNotFound_Exception_Msg=Bld.inf file was not found for: 
+ProjectFinder.MmpFileNotFound_Exception_Msg=MMP file was not found for: 
+ProjectFinder.SourceFileNotFound_Exception_Msg=Can not find source file: 
+ProjectFinder.UnexpectedException_ErrMsg=Unexpected expeption caught during file checking in project finder
+ProjectFinderFactory.Monitor_ObjectNull_ErrMsg=Monitor object cannot be set to null.
+MapSourceFinder.CannotFoundAddress_ErrMsg_Part1=Cannot found address for method: '
+MapSourceFinder.CannotFoundAddress_ErrMsg_Part2=' in map file: '
+MapSourceFinder.FileDoesntExist_ErrMsg_Part1=Source file founder found file: '
+MapSourceFinder.FileDoesntExist_ErrMsg_Part2=' but it was not existing file, method name was: '
+MapSourceFinder.FileDoesntExist_ErrMsg_Part3=', keep seeking...
+MapSourceFinder.StrippingEpocrootFromPath_InfoMsg=Path contained already EPOCROOT stripping it away..
+MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part1=Source file founder found object file: '
+MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part2=' from file: '
+MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part3=', source file found is:'
+MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part4=', but file does not exist.
+MapSourceFinder.ObjectFileNotFound_ErrMsg_Part1=Source file founder did not found object file: '
+MapSourceFinder.ObjectFileNotFound_ErrMsg_Part2=' from file: '
+MapSourceFinder.SourceFileNotFoundForMethod_ErrMsg_Part1=Source file founder did not found source file for method: '
+MapSourceFinder.SourceFileNotFoundForMethod_ErrMsg_Part2=' in file: '
+MapSourceFinder.MapDoesntExist_ErrMsg_Part1=Map file:'
+MapSourceFinder.MapDoesntExist_ErrMsg_Part2=' can't be found.
+MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part1=cannot be found for seeking method: '
+MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part2=implementation.
+MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part3=map file was seeked under folders: 
+MapSourceFinder.MapFileNotFoundForSource_ErrMsg_Part1=cannot be found for seeking source files for: 
+MapSourceFinder.MapFileNotFoundForSource_ErrMsg_Part2=map file was seeked under folders:
+MapSourceFinder.OffsetSeek_Msg_Part_1=MapSourceFinder seeks offset for method:'
+MapSourceFinder.OffsetSeek_Msg_Part_2=', from file: ' 
+MapSourceFinder.OffsetSeek_Msg_Part_3=' and found line:'
+MapSourceFinder.OffsetSeek_Msg_Part_4=', but it was not implementation line.
+MapSourceFinder.ManyAddressLines_Msg_Part_1=MapSourceFinder found many method names :'
+MapSourceFinder.ManyAddressLines_Msg_Part_2=' in one map file:'
+MapSourceFinder.ManyAddressLines_Msg_Part_3=', line is:'
+ProjectUtils.Canceled_By_User_ConsoleMsg=Search of project files was canceled by user.
+ProjectUtils.SearchingBldInf_Msg_ToUser=Searching bld.inf for 
+ProjectUtils.SearchingMmpFile_Msg_ToUser=Searching mmp file for 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/python/PythonUtilities.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.util.python;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+
+/**
+ * Contains static methods to fetch the python installation path and to validate the installed version against the given version.
+ */
+public class PythonUtilities {
+
+	private static final String PATH_VARIABLE = "PATH";
+	private static final String PYTHON = "python";
+	private static final String PYTHON_EXE = "python.exe";
+	
+	/**
+	 * This method scans the PATH environment variable, to fetch the python installation path
+	 * @returns installation path of python. Returns <code>null</code> if python is not installed/found. 
+	 */
+	public static String getPythonPath()
+	{
+		String pathValue = System.getenv(PATH_VARIABLE); 
+		String [] values = pathValue.split(File.pathSeparator); 
+			
+		if(values != null)
+		{
+			for(String s:values){
+				if(s.toLowerCase().contains(PYTHON)){
+					
+					if(!s.endsWith(File.separator))
+						s += File.separator;
+					
+					return s + PYTHON_EXE; 
+				}
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * This method validates the installed python version against the given version.
+	 * If the python version installed in the system, is less than the given version, 
+	 * or version information fetch fails, then the method returns <code>false</code>. 
+	 * Otherwise, the method returns <code>true</code>.
+	 * @param pythonVersion version to be validated.
+	 */
+	public static boolean validatePython(String pythonVersion)
+	{
+		try
+		{
+			String pythonPath = getPythonPath();
+			
+			if(pythonPath != null)
+			{
+				String[] args = {pythonPath, "-V"}; 
+				Process pr = Runtime.getRuntime().exec(args);
+				BufferedInputStream br = new BufferedInputStream(pr.getErrorStream());
+				pr.waitFor();
+				
+				StringBuffer bf = new StringBuffer(""); 
+				int r = -1;
+				while((r = br.read()) != -1)
+				{
+					char ch = (char)r;
+					bf.append(ch);				
+				}
+		 	
+				StringBuffer version=new StringBuffer(""); 
+				char[] str=bf.toString().toCharArray();
+		 	
+				//We are interested in only the major version of Python
+				//So, reading only 3 characters from the version string
+				for (int i = 0; i < str.length; i++) {
+					if(Character.isDigit(str[i]))
+					{
+						version.append(str[i]);
+						version.append(str[i+1]);
+						version.append(str[i+2]);
+						break;
+					}
+				}
+				
+				float actualVersion = Float.parseFloat(version.toString());
+				float inputVersion = Float.parseFloat(pythonVersion);
+		 	
+		 		if(actualVersion >= inputVersion)
+		 		{
+		 			return true; 
+		 		}
+			
+			}
+		}catch(Exception e){			
+			e.printStackTrace();
+		}
+		return false;
+				
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/FileFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,539 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.resource;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IStatus;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+
+
+/**
+ * File finder utility.
+ */
+public class FileFinder {
+	
+	/**
+	 * Default deepness for creating own {@link Thread}s for new folders.
+	 */
+	public static final int DEFAULT_DEPTH_FOR_NEW_THREADS = 1;
+
+	/**
+	 * How deep to folder hierarchy we will notice to observer about progress.  
+	 */
+	private static final int FOLDERS_DEPTH_FOR_MONITORING = 2;
+	
+	
+	/**
+	 * How deep will be new {@link Thread} created for folders
+	 * 
+	 * Next diagram explains deepness for more detailed level.
+	 * 
+	 * Deepness 1, marked: "(1)" in diagram (also default value {@link FileFinder#DEFAULT_DEPTH_FOR_NEW_THREADS} )
+	 * means that all given folders will have new Thread and seeking under that folder occurs
+	 * under that {@link Thread}. E.g. folder structure 
+	 * under it means that there will be 2 {@link Thread}s. 
+	 * 
+	 * If value "2" is given, all given folders and folders
+	 * under that given folder will have new {@link Thread}, in diagram value "2" means that
+	 * folders with deepness (1) and (2) will have new {@link Thread}. E.g. folder structure 
+	 * under it means that there will be 5 {@link Thread}s.
+	 * 
+	 * [Given folder 1 (1)]
+	 * 		->[sub folder 1-1 (2)]
+	 * 			->[sub folder 1-1-1 (3)]
+	 * 		->[sub folder 1-2]
+	 * 			->[sub folder 1-2-1 (3)]
+	 * [Given folder 2 (1)]
+	 * 		->[sub folder 2-1 (2)]
+	 */
+	private final int maxDepthForNewThreads;
+	
+	/**
+	 * Keeping track of number of Threads in run
+	 */
+	Hashtable <Thread, String> runs;
+	
+	/**
+	 * Files to be returned to caller
+	 */
+	Vector<File> filesWanted;
+	
+	/**
+	 * Observer for passing messages to user and vice versa
+	 */
+	private IFileFinderObserver observer;
+	
+	/**
+	 * Application (Plug-in) specific console print utility
+	 */
+	private final IConsolePrintUtility printUtility;	
+
+	/**
+	 * Using Integer instead of int for synchronized update
+	 */
+	private Integer stepsCompleted = new Integer (0);
+	
+	/**
+	 * Create new FileFinde with additional max depth for new Threads parameter. Parameter
+	 * tells how deep new threads will be created to each folders when seeking files. 
+	 * Default value is {@link FileFinder#DEFAULT_DEPTH_FOR_NEW_THREADS}.
+	 * 
+	 * Next diagram explains deepness for more detailed level.
+	 * 
+	 * Deepness 1, marked: "(1)" in diagram (also default value {@link FileFinder#DEFAULT_DEPTH_FOR_NEW_THREADS} )
+	 * means that all given folders will have new Thread and seeking under that folder occurs
+	 * under that {@link Thread}. E.g. folder structure 
+	 * under it means that there will be 2 {@link Thread}s. 
+	 * 
+	 * If value "2" is given, all given folders and folders
+	 * under that given folder will have new {@link Thread}, in diagram value "2" means that
+	 * folders with deepness (1) and (2) will have new {@link Thread}. E.g. folder structure 
+	 * under it means that there will be 5 {@link Thread}s.
+	 * 
+	 * [Given folder 1 (1)]
+	 * 		->[sub folder 1-1 (2)]
+	 * 			->[sub folder 1-1-1 (3)]
+	 * 		->[sub folder 1-2]
+	 * 			->[sub folder 1-2-1 (3)]
+	 * [Given folder 2 (1)]
+	 * 		->[sub folder 2-1 (2)]
+	 *
+	 * Most effective amount of {@link Thread}s depends on folder structure, default (1) or 2 are recommended values. 
+	 * 
+	 * @param printUtility Utility into which print error, warning, and info messages.
+	 * @param maxDepthForNewThreads how deep will be new {@link Thread} made for each folder. 
+	 * Default value is {@link FileFinder#DEFAULT_DEPTH_FOR_NEW_THREADS}, 
+	 * minimum value is {@link FileFinder#DEFAULT_DEPTH_FOR_NEW_THREADS}.
+	 * 
+	 * @param isRunFromUIThread set <code>true</code> if run from UI Thread and <code>false</code> if not. 
+	 * Default values is <code>true</code>.
+	 */
+	public FileFinder(IConsolePrintUtility printUtility, int maxDepthForNewThreads){
+		this.printUtility = printUtility;
+		if(maxDepthForNewThreads > 0){
+			this.maxDepthForNewThreads = maxDepthForNewThreads;
+		}else{
+			this.maxDepthForNewThreads = DEFAULT_DEPTH_FOR_NEW_THREADS;
+		}
+		
+	}
+	
+	/**
+	 * Create new FileFinder with default max seeking depth.
+	 * @param printUtility Utility into which print error, warning, and info messages.
+	 */
+	public FileFinder(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+		this.maxDepthForNewThreads = DEFAULT_DEPTH_FOR_NEW_THREADS;		
+	}	
+	
+
+	/**
+	 * Seeks all folders under given folders and finds the wanted file types.
+	 * Files found are returned through {@link IFileFinderObserver#completed(int, Collection)}.
+	 * 
+	 * You can parameterize  How deep will be new {@link Thread} created for folders
+	 * 
+	 * @param observer Observer object to get results.
+	 * @param fileType File types wanted to seek.
+	 * @param folders Folders where to seek from.
+	 */
+	public void seekFilesFromFolders(IFileFinderObserver observer,
+			String fileType, final String[] folders){
+		
+		this.observer = observer;
+		
+		runs = new Hashtable <Thread, String>();
+		filesWanted = new Vector<File>();
+		
+		try {
+			final FileTypeFilter typeFilter = new FileTypeFilter(fileType);			
+			runSeeksFromFolders(folders, typeFilter);
+		} catch (Exception e) {
+			e.printStackTrace();
+			String message = Messages.getString("FileFinder.ErrorOnStart_ErrMsg_Part1") //$NON-NLS-1$
+				+fileType
+				+Messages.getString("FileFinder.ErrorOnStart_ErrMsg_Part2") +e; //$NON-NLS-1$
+			cancelAllJobs(message);
+		}
+
+	}
+	
+	/**
+	 * Seeks all folders under given folders and finds the wanted filea.
+	 * Files found are returned through {@link IFileFinderObserver#completed(int, Collection)}.
+	 * 
+	 * You can parameterize  How deep will be new {@link Thread} created for folders
+	 * 
+	 * @param observer Observer object to get results.
+	 * @param fileType File types wanted to seek.
+	 * @param folders Folders where to seek from.
+	 */
+	public void seekFilesFromFolders(IFileFinderObserver observer,
+			final String fileNames[], final String[] folders){
+		this.observer = observer;
+		
+		runs = new Hashtable <Thread, String>();
+		filesWanted = new Vector<File>();
+		final FileNameFilter nameFilter = new FileNameFilter(fileNames);
+		
+		try {
+			runSeeksFromFolders(folders, nameFilter);
+		} catch (Exception e) {
+			e.printStackTrace();
+			String message = Messages.getString("FileFinder.ErrorOnStartByName_ErrMsg_Part1") //$NON-NLS-1$
+				+nameFilter.getSearchItem()
+				+Messages.getString("FileFinder.ErrorOnStartByName_ErrMsg_Part2") +e; //$NON-NLS-1$
+			cancelAllJobs(message);
+		}		
+	}	
+	
+	/**
+	 * Seeks given folders with given file filter.
+	 * @param folders Folder name array.
+	 * @param typeFilter File type filter.
+	 */
+	private void runSeeksFromFolders(
+			final String[] folders,
+			final IFileFinderFileFilter typeFilter)  {
+
+		final FileFilter dirFilter = new DirFilter();
+			
+		int currentDepth = 1;
+
+		// Check number of folders and set steps to monitor by them
+		setMonitorSteps(folders, dirFilter, typeFilter);
+
+		boolean isJobStarted = false;
+		
+		//Looping through folders, staring new Thread for each main level folder
+		for (int i = 0; i < folders.length; i++) {
+			
+			final File dir = new File(folders[i]);
+			if (dir.exists() && dir.isDirectory()) {
+				isJobStarted = true;
+				seekFilesFromFolderWithThread(typeFilter, dirFilter, dir, currentDepth);
+			} else {
+				printUtility.println(Messages.getString("FileFinder.UnableToSeek_ErrMsg_Part1") +typeFilter.getSearchItem() +Messages.getString("FileFinder.UnableToSeek_ErrMsg_Part2") + folders[i] //$NON-NLS-1$ //$NON-NLS-2$
+						+ Messages.getString("FileFinder.UnableToSeek_ErrMsg_Part3")); //$NON-NLS-1$
+			}
+
+		}
+
+		// If there is no jobs to start, just telling observers that everything
+		// is done and returning empty list
+		if (!isJobStarted) {
+			observer.completed(IStatus.OK, filesWanted);
+		}
+
+	}
+		
+	/**
+	 * Counts and sets steps to monitor
+	 * @param folders Folder name array.
+	 * @param dirFilter Directory filter.
+	 * @param typeFilter File type filter.
+	 */
+	private void setMonitorSteps(String[] folders, FileFilter dirFilter,
+			IFileFinderFileFilter typeFilter) {
+		
+		if(isCanceled()){
+			return;
+		}		
+
+		//Count how many threads will be created, number of threads depends on folders given and
+		//depth for new threads under those folders
+		int dirCount = 0;
+		for (int j = 0; j < folders.length; j++) {
+			File dir = new File(folders[j]);
+			if(dir.exists() && dir.isDirectory()){
+				dirCount++;//One added for folder, and rest added for folders under that folder
+				dirCount += getDirCount(dirFilter, dir);
+			}
+		}
+		
+		observer.beginTask(Messages.getString("FileFinder.BegingTask_Msg_Part1") +typeFilter.getSearchItem() +Messages.getString("FileFinder.BegingTask_Msg_Part2"), dirCount /*IFileFinderObserver.STEPS*/); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * Gets sub directory count from the given directory.
+	 * @param dirFilter Directory filter to be applied for query.
+	 * @param dir Directory to check for sub directories. 
+	 * @return count of sub directories
+	 */
+	private int getDirCount(FileFilter dirFilter, File dir) {
+		
+		if(isCanceled()){
+			return 0;
+		}		
+		if(dir.isDirectory()){
+			File [] dirs = dir.listFiles(dirFilter);
+			return dirs.length;
+		}
+		return 0;
+	}
+	
+	/**
+	 * Creates threads for finding files according directory and file filter.
+	 * @param fileTypeFilter File type filter.
+	 * @param dirFilter Directory name filter.
+	 * @param dir Directory to start search from.
+	 * @param currentDepth Current depth of search.
+	 */
+	private void seekFilesFromFolderWithThread(final IFileFinderFileFilter fileTypeFilter, final FileFilter dirFilter,
+			final File dir, final int currentDepth) {
+		
+		if(isCanceled()){
+			return;
+		}
+		if(dir.exists() && dir.isDirectory()){
+			// Creating anonymous thread object
+			Thread seekFilesRunnable = new Thread(){
+				public void run(){
+					try {
+						Collection<File> paths = seekFilesFromFolder(fileTypeFilter, dirFilter, dir, currentDepth);
+						if(paths != null){
+							filesWanted.addAll(paths);
+						}
+					} catch (Exception e) {
+						e.printStackTrace();
+						String message = Messages.getString("FileFinder.ErrorOnSeek_ErrMsg_Part1") //$NON-NLS-1$
+							+fileTypeFilter.getSearchItem()
+							+Messages.getString("FileFinder.ErrorOnSeek_ErrMsg_Part2")  //$NON-NLS-1$
+							+dir.getAbsolutePath() 
+							+Messages.getString("FileFinder.ErrorOnSeek_ErrMsg_Part3") +e; //$NON-NLS-1$
+						cancelAllJobs(message);
+					}finally{
+						removeJob(this);						
+					}
+				}
+
+			};
+			//
+			// Setting parameters and starting thread
+			//
+			seekFilesRunnable.setPriority(Thread.MIN_PRIORITY);
+			
+			// Showing a visible message has to be done in its own thread
+			// in order not to cause invalid thread access
+			addJob(seekFilesRunnable, dir.getAbsolutePath());
+
+			//If job is started from UI Thread, Thread is started with Display
+			seekFilesRunnable.start();
+		}
+	}
+
+	/**
+	 * Checks if finder job canceled
+	 * @return <code>true</code> if canceled, <code>false</code> otherwise.
+	 */
+	private boolean isCanceled() {
+		boolean canceled = observer.isCanceled();
+		return canceled;
+	}
+	
+	/**
+	 * Finds files according directory and file filter.
+	 * @param fileTypeFilter File type filter.
+	 * @param dirFilter Directory name filter.
+	 * @param dir Directory to start search from.
+	 * @param currentDepth Current depth of search.
+	 * @return Collection of files found.
+	 * @throws Exception
+	 */
+	private Collection<File> seekFilesFromFolder(final IFileFinderFileFilter fileTypeFilter, FileFilter dirFilter ,
+			final File dir, int currentDepth) throws Exception{		
+		
+		//If canceled or not a existing directory, just returning
+		if(isCanceled() || ! dir.isDirectory() || !dir.exists()){
+			return null;
+		}		
+		
+		Thread.yield(); //Trying to give other Threads chance to do they things so seek don't get all resources 
+	
+		//Updating monitor status with progress percentages
+		String msg = Messages.getString("FileFinder.ProgressMsg_Part1") +fileTypeFilter.getSearchItem() + Messages.getString("FileFinder.ProgressMsg_Part2") +dir.getAbsolutePath(); //$NON-NLS-1$ //$NON-NLS-2$
+		if(currentDepth <= FOLDERS_DEPTH_FOR_MONITORING){//monitor steps is count by number of folders in given folders
+			synchronized (stepsCompleted) {			
+				observer.progress(stepsCompleted.intValue(), msg);
+				stepsCompleted++;	
+			}
+		}
+		
+		//Add files with wanted type to list from this folder
+		Collection<File> foundFiles = new Vector<File>();				
+		File [] files = dir.listFiles(fileTypeFilter);
+		for (int i = 0; i < files.length; i++) {
+			foundFiles.add(files[i]);
+		}
+		
+		//When all wanted files listed, checking all folders under given folder
+		File [] dirs = dir.listFiles(dirFilter);
+		int nextDepth = currentDepth + 1;
+
+		for (int i = 0; i < dirs.length; i++) {
+			//If parameters says that we create a new Thread to seek folders with this deepness
+			if(currentDepth < maxDepthForNewThreads){
+				seekFilesFromFolderWithThread(fileTypeFilter, dirFilter, dirs[i], nextDepth);
+			}
+			//Otherwise we already have as many Threads we want, just keep looking folders recursively
+			else{
+				Collection<File> paths = seekFilesFromFolder(fileTypeFilter, dirFilter, dirs[i], nextDepth);
+				if(paths != null){
+					foundFiles.addAll(paths);
+				}
+			}			
+		}		
+		
+		return foundFiles;
+	}
+
+	/**
+	 * Filter that accepts only files with given file type.
+	 */
+	private class FileTypeFilter implements IFileFinderFileFilter{
+		
+		private String fileType = null;
+
+		/**
+		 * Constructor.
+		 * @param fileType File types to be accepted.
+		 */
+		public FileTypeFilter(String fileType){
+			this.fileType = fileType.toLowerCase();			
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.io.FileFilter#accept(java.io.File)
+		 */
+		public boolean accept(File file) {
+			return file.getName().toLowerCase().endsWith(fileType) ? true : false;
+		}
+		
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.util.resource.IFileFinderFileFilter#getSearchItem()
+		 */
+		public String getSearchItem() {			
+			return fileType;
+		}	
+	}		
+	
+	/**
+	 * Filter accepts only files with given file name.
+	 */
+	private class FileNameFilter implements IFileFinderFileFilter{
+				
+		private String[] fileNames = null;
+
+		/**
+		 * Constructor
+		 * @param fileNames Filenames to be accepted.
+		 */
+		public FileNameFilter(String fileNames[]){
+			this.fileNames = fileNames;	
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.io.FileFilter#accept(java.io.File)
+		 */
+		public boolean accept(File file) {
+			for (int i = 0; i < fileNames.length; i++) {
+				if(file.getName().equalsIgnoreCase(fileNames[i])){
+					return true;
+				}
+			}
+			return false;
+		}
+		
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.util.resource.IFileFinderFileFilter#getSearchItem()
+		 */
+		public String getSearchItem() {		
+			StringBuffer files = new StringBuffer();
+			String separator = ", "; //$NON-NLS-1$
+			
+			for (int i = 0; i < fileNames.length; i++) {
+				files.append(fileNames[i]);
+				files.append(separator);
+			}
+			if(files.length() > 0){
+				return files.substring(0, files.length()-separator.length());
+			}
+			
+			return files.toString();
+		}	
+	}		
+	
+	/**
+	 * Filter that accepts only directories
+	 */
+	private class DirFilter implements FileFilter{
+		
+		public boolean accept(File file) {
+			return file.isDirectory();
+		}	
+	}		
+	
+	/**
+	 * Cancel all ongoing jobs. 
+	 */
+	private void cancelAllJobs(String message){
+		printUtility.println(message, IConsolePrintUtility.MSG_ERROR);
+		observer.interrupted(message);		
+	}
+	
+	/**
+	 * Removes a job from run list and if there is no runs left, 
+	 * returning completed to observer if no jobs left to be done
+	 * @param runnable Thread to be removed from run list.
+	 */
+	private void removeJob(Thread runnable) {
+		synchronized (runs) {
+			if (runnable != null) {
+				runs.remove(runnable);
+			}
+			if (runs.size() == 0) {
+				if (isCanceled()) {
+					observer.completed(IStatus.CANCEL, filesWanted);
+				} else {
+					// When there are no jobs left to be done, notifying observer
+					// that everything is done with files found.
+					observer.completed(IStatus.OK, filesWanted);
+				}
+			}
+		}// synchronized
+	}
+
+	/**
+	 * Adds a job to run list
+	 * @param seekFilesRunnable Thread to be added.
+	 * @param dirNameToSeek Directory name from which the thread seeks files.
+	 */
+	private void addJob(Thread seekFilesRunnable, String dirNameToSeek) {
+		synchronized (runs) {
+			runs.put(seekFilesRunnable, dirNameToSeek);
+		}// synchronized
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/FileUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,284 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.resource;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+import com.nokia.s60tools.util.internal.Messages;
+
+/**
+ * Miscellaneous utility methods related to files.
+ */
+public class FileUtils {
+	
+	/**
+	 * Constant for UTF-8 encoding type.
+	 */
+	public static final String ENCODING_TYPE_UTF_8 = "UTF-8"; //$NON-NLS-1$
+	/**
+	 * Constant for UTF-8 encoding type.
+	 */
+	public static final String ENCODING_TYPE_UTF_16 = "UTF-16"; //$NON-NLS-1$
+	
+	
+	/**
+	 * Queries user for an external file to be opened, and opens it.
+	 * @param projectName Name of the project to open file into.
+	 * @throws CoreException
+	 * @throws PartInitException
+	 * @throws FileNotFoundException 
+	 */
+	public static void openExternalFileDialog(String projectName) throws CoreException, PartInitException, FileNotFoundException {
+	   IWorkbench workbench = PlatformUI.getWorkbench();			   
+	   IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+	   
+	   Shell shell = window.getShell();
+	   String fileAbsolutePathName = new FileDialog(shell, SWT.OPEN).open();
+	   if (fileAbsolutePathName == null)
+	      return;
+	
+	   openExternalFileImpl(fileAbsolutePathName, workbench, projectName);
+	}
+
+	/**
+	 * Opens the external file given as parameter.
+	 * @param fileAbsolutePathName Absolute path name to the file to be opened.
+	 * @param projectName Name of the project to open file into.
+	 * @throws CoreException
+	 * @throws PartInitException
+	 * @throws FileNotFoundException 
+	 */
+	public static void openExternalFile(String fileAbsolutePathName, String projectName) throws CoreException, PartInitException, FileNotFoundException {		
+	   IWorkbench workbench = PlatformUI.getWorkbench();			   
+	   openExternalFileImpl(fileAbsolutePathName, workbench, projectName);
+	}
+
+	/**
+	 * Opens the external file given as parameter.
+	 * @param fileAbsolutePathName Absolute path name to the file to be opened.
+	 * @param workbench Workbench to be used.
+	 * @param projectName Name of the project to open file into.
+	 * @throws CoreException
+	 * @throws PartInitException
+	 * @throws FileNotFoundException 
+	 */
+	private static void openExternalFileImpl(String fileAbsolutePathName, IWorkbench workbench, String projectName) throws CoreException, PartInitException, FileNotFoundException {
+		
+		File f = new File(fileAbsolutePathName);
+		if(!f.exists()){
+			throw new FileNotFoundException(Messages.getString("FileUtils.NonExistingExternalFile_ErrMsg") + fileAbsolutePathName); //$NON-NLS-1$
+		}
+		
+	   IPath location = new Path(fileAbsolutePathName);		   		   
+	   IWorkspace ws = ResourcesPlugin.getWorkspace();
+	   IProject project = ws.getRoot().getProject(projectName); //$NON-NLS-1$
+		   
+	   if (!project.exists())
+	      project.create(null);
+	   if (!project.isOpen())
+	      project.open(null);
+	   IFile file = project.getFile(location.lastSegment());
+	   file.createLink(location, IResource.REPLACE, null);
+	   final FileEditorInput editorInput = new FileEditorInput(file);
+	   
+	   IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();	
+	   IWorkbenchPage page = window.getActivePage();
+	   if (page != null){
+		   IEditorDescriptor desc = workbench.getEditorRegistry().getDefaultEditor(file.getName());
+		   page.openEditor(editorInput, desc.getId());
+	   }
+	}
+
+	/**
+	 * Loads the contents of the given file into memory. 
+	 * @param filePathName Absolute path name for the file.
+	 * @return StringBuffer instance having the contents of the file.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	public static StringBuffer loadDataFromFile(String filePathName) throws FileNotFoundException, IOException {
+		StringBuffer dataBuffer = new StringBuffer();
+		File f = new File(filePathName);
+		FileInputStream fis = new FileInputStream(f);
+		BufferedInputStream br = new BufferedInputStream(fis);
+		int available = fis.available();
+		for(int readLoopCount=1; available > 0;readLoopCount++){
+			byte[] tmpByteArr = new byte[available];
+			int readBytes = br.read(tmpByteArr, 0, available);
+			if(readBytes == -1){
+				break;
+			}
+			else if(readBytes != available){
+				br.close();
+				fis.close();
+				throw new IOException(Messages.getString("FileUtils.FAILED_TO_LOAD_DATA")  //$NON-NLS-1$
+						              + filePathName 
+						              + Messages.getString("FileUtils.LESS_BYTES_THAN_EXPECTED")); //$NON-NLS-1$
+			}
+			dataBuffer.append(new String(tmpByteArr, 0, readBytes));
+			available = fis.available();
+		}
+		br.close();
+		fis.close();
+		return dataBuffer;
+	}
+
+	/**
+	 * Save text to file. If the folder where file is located does not exist, creating one.
+	 * @param filename file name with full path
+	 * @param file file contents
+	 * @throws IOException
+	 */
+	public static void writeToFile( String fileName, String fileContents ) throws IOException {		
+		writeToFile(fileName, fileContents, null);
+	}		
+	
+	/**
+	 * Save text to file. If the folder where file is located does not exist, creating one.
+	 * Sets file encoding type.
+	 * @param filename file name with full path
+	 * @param file file contents
+	 * @param encoding encoding type e.g. {@link FileUtils.ENCODING_TYPE_UTF_8}  
+	 * @throws IOException
+	 */
+	public static void writeToFile( String fileName, String fileContents, String encoding ) throws IOException {		
+		BufferedWriter out = null;
+		try {
+						
+			File file = new File(fileName);
+			File parent = file.getParentFile();
+			if(!parent.exists()){
+				parent.mkdirs();
+			}
+			
+			//If encoding is set
+			if(encoding != null){
+				out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), encoding));
+			}
+			else{
+				out = new BufferedWriter(new FileWriter(fileName));
+			}
+			
+			out.write(fileContents);			
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw e;
+		}finally{
+			if(out != null){
+				out.close();				
+			}
+		}
+	}	
+	
+	/**
+	 * Gets logical drive for the given file object pointing to a file or path name.
+	 * @param absolutePathNameFileObject File object containing a directory or a file path name..
+	 * @return logical drive for the file or path name including colon and file separator (e.g. C:\)
+	 */
+	public static String getLogicalDrive(File absolutePathNameFileObject) {
+		File parentFile = absolutePathNameFileObject;
+		while(parentFile.getParentFile() != null){
+			parentFile = parentFile.getParentFile();
+		}
+		return parentFile.getAbsolutePath();
+	}
+
+	/**
+	 * Gets logical drive for the given file or path name string. The given path should be absolute.
+	 * If given path is relative (i.e. does not contain logical drive in path name), a new file
+	 * object is created which adds current directory with current logical drive before the relative path.
+	 * @param absolutePathName Absolute path name string to a directory a file containing logical drive
+	 * @return logical drive for the file or path name including colon and file separator (e.g. C:\)
+	 */
+	public static String getLogicalDrive(String absolutePathName) {
+		return getLogicalDrive(new File(absolutePathName));
+	}
+
+	/**
+	 * Checks if the given path starts with drive letter sequence e.g. with C:\ and contains
+	 * at least a single character after the drive letter start sequence.
+	 * Check is done with the following regular expression <code>[a-zA-Z]:[\\/].+</code> that 
+	 * e.g. matches the following paths
+	 * - A:\my\example\path1, c:\my\example\path1, Z:/my\example\path3, and r:/my/example/path1
+	 * but does not match the following ones:
+	 * - :\my\example\path2, \my\example\path, z:\, R:/ 
+	 * If regular expression matches the first three letters are removed from the path.
+	 * @param pathName Path name to check for drive letter removal. Path can be absolute
+	 *                 or relative, and does not have point to valid file or directory. 
+	 * @return Source path without drive letter, if it existed previously.
+	 */
+	public static String removeDriveLetterPortionFromPathIfExists(String pathName) {
+		String pathWithDriveLetterRegExp = "[a-zA-Z]:[\\\\/].+"; //$NON-NLS-1$
+		if(pathName.matches(pathWithDriveLetterRegExp)){
+			// In case of match skipping first three letters
+			return pathName.substring(3); 		
+		}
+		return pathName;
+	}
+	
+  	/**
+	 * Replaces all characters that cannot be used in Win32 directory and file names.
+	 * @param stringToBeChecked string to be checked for illegal characters.
+	 * @param replaceChar replacement character for illegal filename characters found
+	 * @return string from which all illegal filename characters are replaced
+	 */
+	public static String removeIllegalWin32FilenameCharactersFromString(String stringToBeChecked, char replaceChar) {
+		// Set of characters that cannot be part of a file or directory name (list was got from win32 error message) 
+		final char illegalFilenameCharsArr[] = { '\\', '/', ':', '*', '?', '"', '<', '>', '|' };
+		// Checking that replacement character itself is not illegal character
+		if(new String(illegalFilenameCharsArr).indexOf(replaceChar) != -1){
+			throw new IllegalArgumentException("Tried to replace illegal Win32 filename character with also illegal character" + ": " + replaceChar);
+		}
+		String resultString = new String(stringToBeChecked);
+		if(resultString != null){
+			for (int i = 0; i < illegalFilenameCharsArr.length; i++) {
+				char ch = illegalFilenameCharsArr[i];				
+				resultString = resultString.replace(ch, replaceChar);
+			}		
+		}
+		return resultString;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/IFileFinderFileFilter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.resource;
+
+import java.io.FileFilter;
+
+/**
+ * File filter interface for file finder functionality.
+ */
+public abstract interface IFileFinderFileFilter extends FileFilter {
+
+	/**
+	 * Get search item, it can be file type, file name...
+	 * Use with messages.
+	 * @return search item
+	 */
+	public abstract String getSearchItem();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/IFileFinderObserver.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+ 
+package com.nokia.s60tools.util.resource;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * The implementation of this interface can observe the
+ * completion and progress of the file finder tool
+ * execution.
+ */
+public interface IFileFinderObserver {
+	
+	
+	/**
+	 * Notifies that the main task is beginning.  This must only be called once
+	 * on a given progress monitor instance.
+	 * 
+	 * This call is meant to pass on to {@link IProgressMonitor#beginTask(String, int)}.
+	 * 
+	 * <p>Tip: If you want to do something else within same {@link Job} you
+	 * can increase the totalWork amount before giving it to {@link IProgressMonitor#beginTask(String, int)}.
+	 * 
+	 * @param name the name (or description) of the main task
+	 * @param steps the total number of work units into which
+	 *                  the main task is been subdivided. Allways returning {@link IFileFinderObserver#STEPS}.
+	 *  @see {@link IProgressMonitor#beginTask(String, int)}
+	 */	
+	public void beginTask(String name, int steps); 
+	
+	/**
+	 * Reports progress of a batch process like
+	 * execution. It depends on the invoked command
+	 * if any progress information can be gained. 
+	 * @param stepsCompleted how many of steps has been completed
+	 * @param taskName task name in progress.
+	 */
+	public void progress(int stepsCompleted, String taskName);
+	
+
+	/**
+	 * Informs the observer that the execution of the currently
+	 * executed command was interrupted due to some reason.
+	 * @param reasonMsg Message describing the reason. 
+	 */
+	public void interrupted(String reasonMsg);
+	
+	/**
+	 * Informs about the completion of the execution
+	 * of a single command.
+	 * @param exitValue Exit value of the executed command.
+	 * @param filePaths Collection of file objects found.
+	 */
+	public void completed(int exitValue, Collection<File> files);
+	
+	/**
+	 * Checks if the job is canceled.
+	 * This call is meant to pass on to {@link IProgressMonitor#isCanceled()}.
+	 * @return <code>true</code> if job is canceled, otherwise <code>false</code>.
+	 */
+	public boolean isCanceled();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/resource/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides resource management related utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/serial/ComPortUtil.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.serial;
+
+import com.freescale.cdt.debug.cw.core.ComPortHelper;
+
+/**
+ * Class for getting information of serial ports from OS.
+ */
+public class ComPortUtil {
+	
+	private static final String COM_PORT_PREFIX = "COM"; //$NON-NLS-1$
+	private static final int COM_PORT_NUMBER = 256;
+
+	/**
+	 * Gets array of COM ports. Shows names for registered ports.
+	 * In case of failure returns anyway all ports as array without
+	 * additional information from OS.
+	 * @return Array of COM ports
+	 */
+	static public String[] getComPortNames() {
+		String[] comPortNames = null;
+		boolean excOccured = false; 
+		
+		try {
+			comPortNames = ComPortHelper.getComPortNames();
+		} catch (Exception e) {
+			excOccured = true;
+		}
+		
+		if (excOccured || comPortNames == null || !comPortNames[0].startsWith(COM_PORT_PREFIX + 1)) {
+			// Failed to get port names from ComPortHelper
+			// Generate list of COM ports
+			comPortNames = new String[COM_PORT_NUMBER];
+			for (int i = 0; i < comPortNames.length; i++)
+			{
+				comPortNames[i] = COM_PORT_PREFIX + (i+1); 
+			}
+		}
+		
+		return comPortNames;
+	}
+}
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/serial/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides serial communication related utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/CannotFoundFileException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.sourcecode;
+
+/**
+ * Exception is thrown when another Exception occurs while seeking a source file location. 
+ * Original Exception can be stored as member, if needed.
+ */
+public class CannotFoundFileException extends Exception {
+
+	/**
+	 * Serialization ID.
+	 */
+	private static final long serialVersionUID = 2936572400459479759L;
+	
+	/**
+	 * Storing original exception that occurred initially.
+	 */
+	private Exception exception = null;
+	
+	/**
+	 * Default construction
+	 */
+	public CannotFoundFileException(){
+		super();		
+	}
+
+	/**
+	 * Exception with message 
+	 * @param message
+	 */
+	public CannotFoundFileException(String message){
+		super(message);
+	}
+	/**
+	 * Exception with message and original exception.
+	 * @param message Error message.
+	 * @param exception Original exception mapped to this exception type.
+	 */
+	public CannotFoundFileException(String message, Exception exception){
+		super(message);
+		this.exception = exception;
+	}
+
+	/**
+	 * Gets original exception mapped into this exception type.
+	 * @return the original exception
+	 */
+	public Exception getException() {
+		return exception;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/IProjectFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.util.sourcecode;
+
+import java.io.IOException;
+
+/**
+ * Interface for finding Symbian project files.
+ */
+public interface IProjectFinder {
+	
+	/**
+	 * Finds MMP file where source file belongs to.
+	 * @param sourceFilePath Path for source file.
+	 * @return path for MMP file or null if search was canceled.
+	 * @throws CannotFoundFileException if an error occurs when searching file.
+	 */
+	public String findMMPFile(String sourceFilePath) throws CannotFoundFileException;
+	
+	/**
+	 * Finds bld.inf file where .mmp file belongs to.
+	 * @param MMPFilePath Path for mmp file.
+	 * @return path for bld.inf file or null if search was canceled.
+	 * @throws CannotFoundFileException if an error occurs when searching file.
+	 */
+	public String findBLDINFFile(String MMPFilePath) throws CannotFoundFileException;
+
+	/**
+	 * Parses bld.inf file and return how much difference is with root directory
+	 * and directory that contains bld.inf file.
+	 * @param bldInfFilePath Path to bld.inf file.
+	 * @return Count on where root level is from bld.inf file.
+	 * @throws IOException if exception occurs when handling the bld.inf file.
+	 */
+	public int getRootLevelFromBldInf(String bldInfFilePath) throws IOException;
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ISourceFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode;
+
+import java.util.Collection;
+
+
+/**
+ * Interface for finding source file locations by ordinal and/or method name.
+ */
+public interface ISourceFinder {
+	
+	/**
+	 * Finds source file location by ordinal and method name
+	 * @param ordinal Function ordinal.
+	 * @param methodName Method name.
+	 * @param componentName Component name.
+	 * @param variant Build variant.
+	 * @param build	Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @throws CannotFoundFileException if something unexpected occurs
+	 * @return Information about wanted source file
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String methodName,
+			String componentName, String variant, String build, String epocRootPath) throws CannotFoundFileException; 
+	/**
+	 * Finds source file location by ordinal
+	 * @param ordinal Function ordinal.
+	 * @param componentName Component name.
+	 * @param variant Build variant.
+	 * @param build	Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @throws CannotFoundFileException if something unexpected occurs
+	 * @return Information about wanted source file
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String componentName,
+			String variant, String build, String epocRootPath) throws CannotFoundFileException;
+	
+	/**
+	 * Finds source file location by ordinal
+	 * @param ordinal Function ordinal.
+	 * @param methodName Method name.
+	 * @param componentName Component name.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param pathsToSeekMapFile Collection of path names to seek map files from.
+	 * @throws CannotFoundFileException if something unexpected occurs
+	 * @return Information about wanted source file
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String methodName,
+			String componentName, String epocRootPath, Collection<String> pathsToSeekMapFile) throws CannotFoundFileException; 
+	/**
+	 * Finds source file location under SDK by method name.
+	 * @param methodName Method name.
+	 * @param componentName Component name.
+	 * @param variant Build variant.
+	 * @param build	Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @throws CannotFoundFileException if something unexpected occurs
+	 * @return Information about wanted source file
+	 */
+	public SourceFileLocation findSourceFileByMethodName(String methodName,
+			String componentName, String variant, String build, String epocRootPath) throws CannotFoundFileException; 	
+
+	
+	/**
+	 * Found source file location by method name. To seek <code>.map</code> file
+	 * given paths is used to find correct one. <code>.map</code> file
+	 * named <code>[componentName].map</code> is seeked.  
+	 * @param methodName Method name.
+	 * @param componentName Component name.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param pathsToSeekMapFile Collection of path names to seek map files from.
+	 * @return Information about wanted source file
+	 * @throws CannotFoundFileException
+	 */
+	public SourceFileLocation findSourceFileByMethodName(String methodName,
+			String componentName, String epocRootPath, Collection<String> pathsToSeekMapFile) throws CannotFoundFileException; 	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ISourcesFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode;
+
+import java.util.Collection;
+
+/**
+ * Interface for finding source file locations by ordinal and/or method name. 
+ */
+public interface ISourcesFinder {
+	
+	/**
+	 * Finds all source files belonging to selected DLL.
+	 * @param dllName DLL name.
+	 * @param variant Build variant.
+	 * @param build Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @throws CannotFoundFileException if something unexpected occurs
+	 * @return source file names with full paths found belonging to DLL.
+	 */
+	public String [] findSourceFiles(String dllName,
+			String variant, String build, String epocRootPath) throws CannotFoundFileException;
+		
+	/**
+	 * Finds all source files belonging to selected DLL.
+	 * @param dllName DLL name. 
+	 * @param epocRootPath EPOCROOT path.
+	 * @param pathsToSeekMapFile Collection of path names to seek map file from
+	 * @return source file names along with paths belonging to given DLL.
+	 * @throws CannotFoundFileException if something unexpected occurs.
+	 */
+	public String[] findSourceFiles(String dllName,
+			 String epocRootPath, Collection<String> pathsToSeekMapFile
+			) throws CannotFoundFileException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ProjectFinderFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+import com.nokia.s60tools.util.sourcecode.internal.ProjectFinder;
+
+/**
+ * Factory class for creating {@link IProjectFinder} class implementations.
+ * Real implementations is not allowed to use directly, 
+ * but only through {@link IProjectFinder} interface created with this Factory.
+ */
+public class ProjectFinderFactory {
+	
+	/**
+	 * Creates an default implementation for {@link IProjectFinder}
+	 * @return {@link IProjectFinder}
+	 * @param printUtility Console utility used to report error, warnings, and info message.
+	 *                     If set to <code>null</code> no reporting is done.
+	 * @param monitor Progress monitor used to check cancel status of the calling job.
+	 *                Cannot be <code>null</code>.
+	 * @return New project finder utility instance.
+	 */
+	public static IProjectFinder createProjectFinder(IConsolePrintUtility printUtility, IProgressMonitor monitor){
+		if(monitor == null){
+			throw new IllegalArgumentException(Messages.getString("ProjectFinderFactory.Monitor_ObjectNull_ErrMsg")); //$NON-NLS-1$
+		}
+		return new ProjectFinder(printUtility, monitor);
+
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/ProjectUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,302 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.util.sourcecode;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.carbide.cpp.project.core.ProjectCorePlugin;
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+import com.nokia.s60tools.util.internal.Messages;
+
+/**
+ * Utility methods for handling Carbide/Eclipse projects.
+ */
+public class ProjectUtils {
+
+
+	/**
+	 * Print utility used to report error, warning, and info messages.
+	 */
+	private IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Print utility used to report error, warning, and info messages.
+	 */
+	public ProjectUtils(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;		
+	}
+	
+	/**
+	 * Create a Carbide C++ project by given <code>source file</code> file.
+	 * Seeks <code>mmp</code> -file where given source code belongs to, and
+	 * by <code>mmp</code> -file, seeks <code>bld.inf</code> -file where
+	 * <code>mmp</code> -file belongs to. By <code>bld.inf</code> -file
+	 * creating Carbide C++ project.
+	 * 
+	 * @param monitor Job progress monitor.
+	 * @param srcLocation Source location
+	 * @param sdkID SDK Id identifying the used SDK.
+	 * @return a Carbide C++ project.
+	 * @throws JobCancelledByUserException
+	 * @throws CannotFoundFileException
+	 * @throws IOException
+	 * @throws CacheFileDoesNotExistException
+	 * @throws PartInitException
+	 * @throws CoreException
+	 */
+	public ICProject createProject(IProgressMonitor monitor, SourceFileLocation srcLocation, String sdkID) 
+		throws JobCancelledByUserException, CannotFoundFileException, 
+				IOException, PartInitException, CoreException
+	{
+
+		monitor.subTask(Messages.getString("ProjectUtils.SearchingMmpFile_Msg_ToUser") + srcLocation.getSourceFileLocation()); //$NON-NLS-1$
+		String mmpFilePath = getMMPFilePath(srcLocation, monitor);
+		// Throwing JobCancelledByUserException if job was canceled when search was ongoing. 
+        if (monitor.isCanceled()){
+        	String msg = Messages.getString(Messages.getString("ProjectUtils.Canceled_By_User_ConsoleMsg")); //$NON-NLS-1$
+        	printUtility.println(msg);    				
+		    throw new JobCancelledByUserException(msg);
+        }
+        
+        monitor.subTask(Messages.getString("ProjectUtils.SearchingBldInf_Msg_ToUser") + mmpFilePath); //$NON-NLS-1$
+		String bldInfFilePath = getBldInfFilePath(srcLocation, mmpFilePath, monitor);
+		// Throwing JobCancelledByUserException if job was canceled when search was ongoing. 
+        if (monitor.isCanceled()){
+        	String msg = Messages.getString(Messages.getString("ProjectUtils.Canceled_By_User_ConsoleMsg")); //$NON-NLS-1$
+        	printUtility.println(msg);    				
+		    throw new JobCancelledByUserException(msg);
+        }
+		IProjectFinder finder = ProjectFinderFactory.createProjectFinder(printUtility, monitor);
+		int rootLevel = finder.getRootLevelFromBldInf(bldInfFilePath);
+		String projectName = getProjectName(bldInfFilePath, rootLevel);
+		projectName = checkProjectName(projectName);
+		return createProject(bldInfFilePath, projectName, rootLevel, sdkID, monitor);
+	}
+	
+	/**
+	 * Create a Carbide C++ project by given <code>bld.inf</code> file.
+	 * 
+	 * @param monitor Progress monitor.
+	 * @param <code>bld.inf</code> file path
+	 * @param sdkID SDK Id identifying the used SDK.
+	 * @return a Carbide C++ project.
+	 * @throws JobCancelledByUserException
+	 * @throws CannotFoundFileException
+	 * @throws IOException
+	 * @throws CacheFileDoesNotExistException
+	 * @throws PartInitException
+	 * @throws CoreException
+	 */
+	public ICProject createProject(IProgressMonitor monitor, String bldInfFilePath, String sdkID) 
+		throws JobCancelledByUserException, CannotFoundFileException, 
+				IOException, PartInitException, CoreException
+	{
+		
+		IProjectFinder finder = ProjectFinderFactory.createProjectFinder(printUtility, monitor);
+		int rootLevel = finder.getRootLevelFromBldInf(bldInfFilePath);
+		String projectName = getProjectName(bldInfFilePath, rootLevel);
+		projectName = checkProjectName(projectName);
+		return createProject(bldInfFilePath, projectName, rootLevel, sdkID, monitor);
+		
+	}	
+	
+	/**
+	 * Create a Carbide C++ project by given <code>bld.inf</code> file.
+	 * @param bldInfFilePath Path name to bld.inf file to create project from.
+	 * @param projectName Name of the project to be created.
+	 * @param rootLevel How many directories upwards is the root level 
+	 *                  for the workspace compared to bld.inf file absolute path. 
+	 * @param sdkID SDK Id identifying the used SDK.
+	 * @param monitor Job progress monitor.
+	 * @return a C++ project imported by given bld.inf file.
+	 * @throws CoreException
+	 * @throws PartInitException
+	 * @throws FileNotFoundException
+	 */
+	public ICProject createProject( String bldInfFilePath,
+								String projectName, int rootLevel, String sdkID, IProgressMonitor monitor)
+										throws CoreException, PartInitException, FileNotFoundException {
+	   IProject project = ProjectCorePlugin.createProject(projectName, getProjectPath(bldInfFilePath, rootLevel));
+	   String projectRelativeBldInfPath = getProjectRelativeBldInfPath(bldInfFilePath, rootLevel);
+	   
+	   ISDKManager manager = SDKCorePlugin.getSDKManager();
+	   ISymbianSDK sdk = manager.getSDK(sdkID, true);//get currently used SDK	   
+	   	   
+	   //Get all build configurations of used SDK
+	   List<ISymbianBuildContext> buildConfigs = sdk.getUnfilteredBuildConfigurations();
+	   List<String> infComponentsList = new ArrayList<String>();
+	   
+	   ICProject cProject = ProjectCorePlugin.postProjectCreatedActions(
+			   project, projectRelativeBldInfPath, buildConfigs, infComponentsList, null, null, monitor);
+
+	   return cProject;
+
+	}		
+	
+	/**
+	 * Check if project exist or not
+	 * @param projectName Name of the project
+	 * @return <code>true</code> if project exists
+	 */
+	public boolean isProjectExisting(String projectName){
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		return project.exists();
+	}
+	
+	/**
+	 * Checks if project already exists in workspace. Returns project name that doesn't exist.
+	 * Modifies name if needed by adding number number to the end of project name.
+	 * @param projectName Existence of project with this name is checked.
+	 * @return Project name that doesn't exist in workspace.
+	 */
+	private String checkProjectName(String projectName) {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		String tmpProjectName = projectName;
+		int projectPostfix = 1;
+		
+		// Checking if project exists and as a result tmpProjectName doesn't exist in workspace.
+		while(project.exists()){
+			projectPostfix++;
+			tmpProjectName = projectName + projectPostfix;
+			project = ResourcesPlugin.getWorkspace().getRoot().getProject(tmpProjectName);
+		}
+
+		return tmpProjectName;
+	}
+	
+	/**
+	 * Returns .mmp file path for source file.
+	 * @param location Location of source file.
+	 * @param monitor  Job progress monitor.
+	 * @return Path to mmp file that uses source file.
+	 * @throws CannotFoundFileException
+	 */
+	private String getMMPFilePath(SourceFileLocation location, IProgressMonitor monitor) throws CannotFoundFileException {
+		IProjectFinder finder = ProjectFinderFactory.createProjectFinder(printUtility, monitor);
+		String path = finder.findMMPFile(location.getSourceFileLocation());
+		return path;
+	}
+
+	/**
+	 * Returns bld.inf file path for mmp file.
+	 * @param location Locatation of source file.
+	 * @param mmpFilePath Path of mmp file which bld.inf file is searched.
+	 * @param monitor Job progress monitor.
+	 * @return Path of bld.inf file.
+	 * @throws CannotFoundFileException
+	 */
+	private String getBldInfFilePath(SourceFileLocation location, String mmpFilePath, IProgressMonitor monitor)throws CannotFoundFileException {
+		IProjectFinder finder = ProjectFinderFactory.createProjectFinder(printUtility, monitor);
+		String path = finder.findBLDINFFile(mmpFilePath);
+		return path;
+	}
+	
+	/**
+	 * Returns project name from the given absolute path to bld.inf file.
+	 * @param bldInfFilePath Absolute path to bld.inf file
+	 * @param rootLevel How many directories upwards is the root level 
+	 *                  that defined name for the project. 
+	 * @return project name for the bld.inf file
+	 */
+	private String getProjectName(String bldInfFilePath, int rootLevel){
+		File file = new File(bldInfFilePath);
+		// Removing file name.
+		file = file.getParentFile();
+
+		// Getting correct directory by removing folder correct amount of folders names.
+		for(int i = 0;i < rootLevel;i++){
+			file = file.getParentFile();
+		}
+
+		return file.getName();
+	}
+	/**
+	 * Returns project name.
+	 * @param bldInfFilePath Absolute path to bld.inf file
+	 * @param monitor Job progress monitor.
+	 * @return name for the project
+	 * @throws IOException 
+	 */
+	public String getProjectName(String bldInfFilePath, IProgressMonitor monitor) throws IOException{
+		
+		IProjectFinder finder = ProjectFinderFactory.createProjectFinder(printUtility, monitor);
+		int rootLevel = finder.getRootLevelFromBldInf(bldInfFilePath);		
+
+		return getProjectName(bldInfFilePath, rootLevel);
+	}	
+	
+	/**
+	 * Gets project path for the new project based in the bld.inf file.
+	 * @param bldInfFilePath Absolute path to bld.inf file
+	 * @param rootLevel How many directories upwards is the root level 
+	 *                  that defined name for the project. 
+	 * @return project path 
+	 */
+	private String getProjectPath(String bldInfFilePath, int rootLevel){
+		File file = new File(bldInfFilePath);
+		// Removing file name.
+		file = file.getParentFile();
+		
+		// Getting correct directory by removing folder correct amount of folders names.
+		for(int i = 0;i < rootLevel;i++){
+			file = file.getParentFile();
+		}
+		
+		return file.getAbsolutePath();
+	}	
+	
+	/**
+	 * Returns relative path to bld.inf file.
+	 * @param bldInfFilePath Absolute path to bld.inf file.
+	 * @param rootLevel How many directories upwards is the root level 
+	 *                  for the workspace compared to bld.inf file absolute path. 
+	 * @return relative path to bld.inf file
+	 */
+	private String getProjectRelativeBldInfPath(String bldInfFilePath, int rootLevel) {
+		File file = new File(bldInfFilePath);
+		String relativePath = File.separator + file.getName();
+		// Removing file name.
+		file = file.getParentFile();
+		
+		// Getting correct directory by removing folder correct amount of folders names.
+		for(int i = 0;i < rootLevel;i++){
+			relativePath = File.separator + file.getName() + relativePath;
+			file = file.getParentFile();
+		}
+		
+		return relativePath;
+	}		
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/SourceFileLocation.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode;
+
+/**
+ * Class for holding source file information.
+ */
+public class SourceFileLocation {
+	
+	/**
+	 * Folder name constant for release directory
+	 */
+	public static final String RELEASE_FOLDER_NAME = "RELEASE"; //$NON-NLS-1$
+	
+	/**
+	 * Folder name constant for epoc32
+	 */
+	public static final String EPOC32_FOLDER_NAME = "epoc32"; //$NON-NLS-1$
+	
+	/**
+	 * Value for method offset in source file if offset was not found or is not set.
+	 */
+	public static final int OFFSET_NOT_FOUND = -1;
+
+	/**
+	 * Ordinal
+	 */
+	private String ordinal = null;
+	
+	/**
+	 * Name of the method
+	 */
+	private String methodName = null;
+	
+	/**
+	 * Source file location
+	 */
+	private String sourceFileLocation = null;
+	
+	/**
+	 * Name of the DLL where method is exported
+	 */
+	private String dllName = null;
+	
+	/**
+	 * Name of the object file, where method is exported
+	 */
+	private String objectName = null;
+	
+	/**
+	 * Method address
+	 */
+	private String methodAddress = null;
+	
+	/**
+	 * Method line offset. 
+	 */
+	private int methodLineOffset = OFFSET_NOT_FOUND;
+
+
+	/**
+	 * Gets method ordinal
+	 * @return the ordinal
+	 */
+	public String getOrdinal() {
+		return ordinal;
+	}
+
+	/**
+	 * Sets method ordinal
+	 * @param ordinal the ordinal to set
+	 */
+	public void setOrdinal(String ordinal) {
+		this.ordinal = ordinal;
+	}
+
+	/**
+	 * Gets method name
+	 * @return the methodName
+	 */
+	public String getMethodName() {
+		return methodName;
+	}
+
+	/**
+	 * Sets method name
+	 * @param methodName the methodName to set
+	 */
+	public void setMethodName(String methodName) {
+		this.methodName = methodName;
+	}
+
+	/**
+	 * Gets source file location
+	 * @return the sourceFileLocation in absolute path.
+	 */
+	public String getSourceFileLocation() {
+		return sourceFileLocation;
+	}
+
+	/**
+	 * Sets source file location
+	 * @param sourceFileLocation in absolute format.
+	 */
+	public void setSourceFileLocation(String sourceFileLocation) {
+		this.sourceFileLocation = sourceFileLocation;
+	}
+
+	/**
+	 * Gets DLL name
+	 * @return the dllName
+	 */
+	public String getDllName() {
+		return dllName;
+	}
+
+	/**
+	 * Sets DLL name
+	 * @param dllName the dllName to set
+	 */
+	public void setDllName(String dllName) {
+		this.dllName = dllName;
+	}
+
+	/**
+	 * Gets object name
+	 * @return the objectName
+	 */
+	public String getObjectName() {
+		return objectName;
+	}
+
+	/**
+	 * Sets object name
+	 * @param objectName the objectName to set
+	 */
+	public void setObjectName(String objectName) {
+		this.objectName = objectName;
+	}
+
+	/**
+	 * Sets the address of the method
+	 * @param methodAddress
+	 */
+	public void setMethodAddress(String methodAddress) {
+		this.methodAddress  = methodAddress;
+	}
+	/**
+	 * Get method address
+	 * @return the address of the method
+	 */
+	public String getMethodAddress() {
+		return methodAddress;
+	}
+
+	/**
+	 * Gets method offset
+	 * @return the methodLineOffset or 0 if not known or set.
+	 */
+	public int getMethodOffset() {
+		return methodLineOffset;
+	}
+
+	/**
+	 * Sets method offset
+	 * @param methodLineOffset the methodLineOffset to set
+	 */
+	public void setMethodOffset(int methodLineOffset) {
+		this.methodLineOffset = methodLineOffset;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/SourceFinderFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.sourcecode.internal.MapSourceFinder;
+
+/**
+ * Factory class for creating {@link ISourceFinder} class implementations.
+ * Real implementations is not allowed to use directly, 
+ * but only through {@link ISourceFinder} interface created with this Factory.
+ */
+public class SourceFinderFactory {
+	
+	/**
+	 * Creates an default implementation for {@link ISourceFinder}
+	 * @return {@link ISourceFinder}
+	 */
+	public static ISourceFinder createSourceFinder(IConsolePrintUtility printUtility){
+		// Current only one source file available and therefore using it as default.		
+		return createMapSourceFinder(printUtility);
+	}
+
+	/**
+	 * Creates an implementation for {@link ISourceFinder} using .map files.
+	 * @return {@link ISourceFinder}
+	 */
+	public static ISourceFinder createMapSourceFinder(IConsolePrintUtility printUtility){		
+		return new MapSourceFinder(printUtility);
+	}
+
+	/**
+	 * Creates an default implementation for {@link ISourcesFinder}
+	 * @return {@link ISourceFinder}
+	 */
+	public static ISourcesFinder createSourcesFinder(IConsolePrintUtility printUtility){			
+		return new MapSourceFinder(printUtility);
+	}	
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/MapSourceFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1581 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode.internal;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Stack;
+import java.util.regex.Pattern;
+import com.nokia.s60tools.util.cmdline.CmdLineExeption;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+import com.nokia.s60tools.util.resource.FileUtils;
+import com.nokia.s60tools.util.sourcecode.CannotFoundFileException;
+import com.nokia.s60tools.util.sourcecode.ISourceFinder;
+import com.nokia.s60tools.util.sourcecode.ISourcesFinder;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+
+/**
+ * Class for founding source file location from .map files.
+ */
+public class MapSourceFinder implements ISourceFinder, ISourcesFinder {
+
+	//
+	// Private constants used in map file seeking and parsing
+	//
+	private static final String CLASS_SEPARATOR = "::";//$NON-NLS-1$
+	private static final String SEMI_COLON = ";";//$NON-NLS-1$
+	private static final String COMMENT_START = "/*";//$NON-NLS-1$
+	private static final String COMMENT_END = "*/";//$NON-NLS-1$
+	private static final String CODE_COMMENT_PREFIX = "//";//$NON-NLS-1$
+	private static final String DLL_SUFFIX= ".dll";//$NON-NLS-1$
+	private static final String BACKSLASH = "\\"; //$NON-NLS-1$
+	private static final String S60_PATH_PREFIX = BACKSLASH + "s60" + BACKSLASH; //$NON-NLS-1$
+	private static final String SRC_PATH_PREFIX = BACKSLASH + "src" + BACKSLASH; //$NON-NLS-1$
+	private static final String S60_PATH_PREFIX_DOUBLE_SLASHS = BACKSLASH + BACKSLASH + "s60" + BACKSLASH + BACKSLASH; //$NON-NLS-1$
+	private static final String SRC_PATH_PREFIX_DOUBLE_SLASHS = BACKSLASH + BACKSLASH + "src" + BACKSLASH + BACKSLASH; //$NON-NLS-1$
+	private static final String C_SUFFIX = ".c"; //$NON-NLS-1$
+	private static final String CPP_SUFFIX = ".cpp"; //$NON-NLS-1$
+	private static final String METHOD_CLOSING_CHAR = ")"; //$NON-NLS-1$
+	private static final String METHOD_OPENING_CHAR = "("; //$NON-NLS-1$
+	private static final String METHOD_DEFINITION_CLOSING_CHAR = "}";
+	private static final String MAP_FILE_SUFFIX = ".map"; //$NON-NLS-1$
+	private static final String NULL_ADDRESS = "0x00000000"; //$NON-NLS-1$
+	private static final String ABSOLUTE  = "ABSOLUTE"; //$NON-NLS-1$
+	private static final String EPOC32_BUILD  = "EPOC32\\BUILD"; //$NON-NLS-1$
+	private static final String EPOC32_BUILD_DOUBLE_SLASHES  = "EPOC32\\\\BUILD"; //$NON-NLS-1$
+	private static final String EXPORT ="EXPORT_C"; //$NON-NLS-1$
+	private static final String IMPORT = "IMPORT_C"; //$NON-NLS-1$
+
+	
+	/**
+	 * Print utility used to report error, warnings, and info messages.
+	 */
+	private IConsolePrintUtility printUtility = null;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Print utility used to report error, warnings, and info messages.
+	 */
+	public MapSourceFinder(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourceFinder#findSourceFile(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String methodName, String compoentName,
+			String variant, String build, String epocRootPath) throws CannotFoundFileException {
+		SourceFileLocation sourceLocation = null;
+		try {
+			String address = getAddress(ordinal, compoentName, variant, build,
+					epocRootPath);
+			String mapFilePath = getMapFilePath(compoentName, variant, build, epocRootPath);
+			File mapFile = getMapFile(mapFilePath);
+
+			String lineWhereAddressIs = getAddressLineFromFile(address, mapFile, methodName);
+
+			if(methodName == null){
+				methodName = getMethodNameFromMapFileLine(lineWhereAddressIs);				
+			}
+			
+			String objectFileName = getObjectFileName(lineWhereAddressIs, address);
+			sourceLocation = getSourceFileLocation(objectFileName, mapFile, methodName, epocRootPath, isDll(compoentName));			
+			
+			sourceLocation.setDllName(compoentName);
+			sourceLocation.setMethodName(methodName);
+			sourceLocation.setObjectName(objectFileName);
+			sourceLocation.setOrdinal(ordinal);
+			sourceLocation.setMethodAddress(address);
+			
+		} catch (Exception e) {			
+			e.printStackTrace(); 
+			// Mapping all possible exceptions into single exception type. 
+			throw new CannotFoundFileException(e.getMessage(), e);
+		}		
+		return sourceLocation;
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourceFinder#findSourceFile(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Collection)
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String methodName, String componentName, String epocRootPath, Collection<String> pathsToSeekMapFile) throws CannotFoundFileException {
+		SourceFileLocation sourceLocation = null;
+		try {
+	
+			String mapFileName = componentName + MAP_FILE_SUFFIX;
+			
+			File mapFile = getMapFile(pathsToSeekMapFile, componentName, mapFileName);
+			
+			if(mapFile == null){
+				String msg = "'" + mapFileName  //$NON-NLS-1$
+					+"' " //$NON-NLS-1$
+					+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part1")   //$NON-NLS-1$
+					+methodName 
+					+"' "  //$NON-NLS-1$
+					+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part2");  //$NON-NLS-1$
+				String consoleMsg = msg + " "  //$NON-NLS-1$
+					+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part3");  //$NON-NLS-1$
+
+				String pathSeparator= ", "; //$NON-NLS-1$
+				for (Iterator<String> iterator = pathsToSeekMapFile.iterator(); iterator
+						.hasNext();) {
+					String path = (String) iterator.next();
+					consoleMsg += path + pathSeparator;
+				}
+				consoleMsg = consoleMsg.substring(0, consoleMsg.length() - pathSeparator.length());
+				printUtility.println(consoleMsg, IConsolePrintUtility.MSG_ERROR);
+				throw new CannotFoundFileException(msg);
+			}
+			File parentDir = mapFile.getParentFile();
+			
+			String componentPath = parentDir.getAbsolutePath() + File.separatorChar + componentName;
+			
+			String address = getAddress(ordinal, componentPath, epocRootPath);
+			String lineWhereAddressIs = getAddressLineFromFile(address, mapFile, methodName);
+
+			if(methodName == null){
+				methodName = getMethodNameFromMapFileLine(lineWhereAddressIs);				
+			}
+			
+			String objectFileName = getObjectFileName(lineWhereAddressIs, address);
+			sourceLocation = getSourceFileLocation(objectFileName, mapFile, methodName, epocRootPath, isDll(componentName));			
+			
+			sourceLocation.setDllName(componentName);
+			sourceLocation.setMethodName(methodName);
+			sourceLocation.setObjectName(objectFileName);
+			sourceLocation.setOrdinal(ordinal);
+			sourceLocation.setMethodAddress(address);
+			
+		} catch (Exception e) {			
+			e.printStackTrace(); 
+			// Mapping all possible exceptions into single exception type. 
+			throw new CannotFoundFileException(e.getMessage(), e);
+		}		
+		return sourceLocation;
+	}
+	
+	/**
+	 * Check if component is DLL or not.
+	 * @param componentName Component name.
+	 * @return <code>true</code> if component is DLL, otherwise <code>false</code>.
+	 */
+	private boolean isDll(String componentName) {		
+		return componentName.trim().endsWith(DLL_SUFFIX) ? true : false;
+	}
+	/**
+	 * Gets map file object based on path name if file exists.
+	 * @param mapFilePath Path to map file.
+	 * @return File object for map file, if file exists, otherwise throwing exception.
+	 * @throws FileNotFoundException
+	 */
+	private File getMapFile(String mapFilePath) throws CannotFoundFileException {
+		File mapFile = new File(mapFilePath);
+		if(!mapFile.exists()){
+			throw new CannotFoundFileException(
+					Messages.getString("MapSourceFinder.MapDoesntExist_ErrMsg_Part1") //$NON-NLS-1$
+					+mapFilePath
+					+Messages.getString("MapSourceFinder.MapDoesntExist_ErrMsg_Part2")); //$NON-NLS-1$
+		}
+		return mapFile;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourceFinder#findSourceFile(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public SourceFileLocation findSourceFile(String ordinal, String componentName,
+			String variant, String build, String epocRootPath)  throws CannotFoundFileException{
+
+			return findSourceFile(ordinal, null, componentName, variant, build, epocRootPath);
+			
+	}
+	
+	/**
+	 * Tries to find a variant map file for given component. E.g. if component is called MyComponent.exe,
+	 * it might not have a map file called MyComponent.exe.map. It might contain a variant map file e.g.
+	 * MyComponent.11001011.exe.map. This method tries to find this variant map file MyComponent.11001011.exe.map.
+	 * @param epocRootPath EPOCROOT path
+	 * @param variant Build variant
+	 * @param build Build type (udeb/urel)
+	 * @param component Component name.
+	 * @return variant map file, or <code>null</code> if not found.
+	 */
+	private File getVariantMapFile(String epocRootPath, String variant, String build, String component) {
+		File variantMapFile = null;
+		
+		String mapPath = 
+			epocRootPath + File.separatorChar 
+			+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+			+SourceFileLocation.RELEASE_FOLDER_NAME + File.separatorChar
+			+variant + File.separatorChar
+			+build + File.separatorChar;
+		mapPath = makeWindowsPath(mapPath);
+		
+		File path = new File(mapPath);
+		if (path.isDirectory() && path.exists()) {
+			
+			final class VariantFilter implements FilenameFilter {
+				String component;
+				public VariantFilter(String componentName) {
+					component = componentName;
+				}
+		        public boolean accept(File dir, String name) {
+		            if (name.toLowerCase().endsWith(".map")) {
+		            	int index = component.lastIndexOf(".");
+		            	if (name.toLowerCase().startsWith(component.substring(0, index+1).toLowerCase()))
+		            		return true;
+		            }
+	            	return false;
+		        }
+			}
+		    String[] files = path.list(new VariantFilter(component));
+		    if (files != null && files.length == 1)
+		    	variantMapFile = new File(mapPath + files[0]);
+		}
+		
+		return variantMapFile;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourceFinder#findSourceFileByMethodName(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public SourceFileLocation findSourceFileByMethodName(String methodName,
+			String componentName, String variant, String build, String epocRootPath) throws CannotFoundFileException{
+		
+		String mapFilePath = getMapFilePath(componentName, variant, build, epocRootPath);
+		
+		File mapFile = null;
+		try {
+			mapFile = getMapFile(mapFilePath);
+
+		// we could not find map file, try to find variant map file
+		} catch (CannotFoundFileException e) {
+			mapFile = getVariantMapFile(epocRootPath, variant, build, componentName);
+			if (mapFile == null)
+				throw e;
+		}
+		
+		return findSourceFile(methodName, componentName, epocRootPath, mapFile);		
+	
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourceFinder#findSourceFileByMethodName(java.lang.String, java.lang.String, java.lang.String, java.util.Collection)
+	 */
+	public SourceFileLocation findSourceFileByMethodName(String methodName,
+			String componentName, String epocRootPath, Collection<String> pathsToSeekMapFile) throws CannotFoundFileException{
+
+		String mapFileName = componentName + MAP_FILE_SUFFIX;
+		File mapFile = getMapFile(pathsToSeekMapFile, componentName, mapFileName);
+		
+		//If we did not found map file, we cannot proceed to src file seek
+		if(mapFile == null){
+			String msg = "'" + mapFileName  //$NON-NLS-1$
+				+"' " //$NON-NLS-1$
+				+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part1")   //$NON-NLS-1$
+				+methodName 
+				+"' "  //$NON-NLS-1$
+				+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part2");  //$NON-NLS-1$
+			String consoleMsg = msg + " "  //$NON-NLS-1$
+				+Messages.getString("MapSourceFinder.MapFileNotFoundForMethod_ErrMsg_Part3");  //$NON-NLS-1$
+
+			String pathSeparator= ", "; //$NON-NLS-1$
+			for (Iterator<String> iterator = pathsToSeekMapFile.iterator(); iterator
+					.hasNext();) {
+				String path = (String) iterator.next();
+				consoleMsg += path + pathSeparator;
+			}
+			consoleMsg = consoleMsg.substring(0, consoleMsg.length() - pathSeparator.length());
+			printUtility.println(consoleMsg, IConsolePrintUtility.MSG_ERROR);
+			throw new CannotFoundFileException(msg);
+		}
+		
+		return findSourceFile(methodName, componentName, epocRootPath, mapFile);		
+		
+	}
+	
+	
+	/**
+	 * Gets a map file by component name and list of folder where to seek it
+	 * @param pathsToSeekMapFile Path list to seek map files from.
+	 * @param componentName Component name.
+	 * @return file File object pointing to map file and <code>null</code> if not found.
+	 */
+	private File getMapFile(Collection<String> pathsToSeekMapFile,
+			String componentName, String mapFileName) throws CannotFoundFileException {
+		
+		MapFilenameFilter mapFilenameFilter = new MapFilenameFilter(mapFileName);
+		DirFileFilter dirFilter = new DirFileFilter();
+		
+		for (Iterator<String> iterator = pathsToSeekMapFile.iterator(); iterator
+				.hasNext();) {
+			String path = (String) iterator.next();
+			File dir = new File(path);
+			if(!dir.exists() || !dir.isDirectory()){
+				continue;
+			}
+			File mapFile = getFileFromDir(dir, mapFileName, mapFilenameFilter, dirFilter);
+			if(mapFile != null){
+				return mapFile;
+			}
+			
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Get map file from dir and dirs under given dir. Calls recursively it self.
+	 * @param dir Directory to search for.
+	 * @param mapFileName Map file name to search for.
+	 * @param mapFilenameFilter Map file name filter.
+	 * @param dirFilter Directory filter.
+	 * @return mapFile with given name, or null if cannot be found
+	 */
+	private File getFileFromDir(File dir, String mapFileName, MapFilenameFilter mapFilenameFilter, DirFileFilter dirFilter){
+
+		File [] files = dir.listFiles(mapFilenameFilter);
+		if(files != null && files.length > 0){
+			return files[0];
+		}
+
+		File [] dirs = dir.listFiles(dirFilter);
+		for (int i = 0; i < dirs.length; i++) {
+			File mapFile = getFileFromDir(dirs[i], mapFileName, mapFilenameFilter, dirFilter);
+			if(mapFile != null){
+				return mapFile;
+			}
+		}
+		return null;
+		
+	}
+	
+	/**
+	 * Filter accepts only directories, not files
+	 */
+	private class DirFileFilter implements FileFilter {
+
+		public boolean accept(File file) {
+			return file.isDirectory();
+		}		
+	}
+	
+	/**
+	 * Filter accepts only files named by given file (case in sensitive)
+	 */
+	private class MapFilenameFilter implements FilenameFilter{
+		
+		private String mapFileName = null;
+
+		private MapFilenameFilter(){
+		}
+		public MapFilenameFilter(String mapFileName){
+			this();
+			this.mapFileName = mapFileName;			
+		}
+		
+		public boolean accept(File dir, String name) {
+			return name.equalsIgnoreCase(mapFileName) ? true : false;
+		}	
+	}
+	
+	/**
+	 * Finds source file based on the method name.
+	 * @param methodName Method name.
+	 * @param componentName Component name.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param mapFile File object pointing to MMP file.
+	 * @return source file location, or <code>null</code> if not found.
+	 * @throws CannotFoundFileException
+	 */
+	private SourceFileLocation findSourceFile(String methodName,
+			String componentName, String epocRootPath, File mapFile)
+			throws CannotFoundFileException {
+		try {			
+			// Example method name line
+			//20	CRepository::Create(unsigned long, TDesC16 const&)
+
+			String lineWhereAddressIs = getAddressLineFromFile(mapFile, methodName);
+			String address = getAddresFromLine(lineWhereAddressIs, methodName);
+			
+			String objectFileName = getObjectFileName(lineWhereAddressIs, address);
+			String shortMethodNameWithoutParams = getMethodNameWithoutParams(methodName);
+			SourceFileLocation sourceLocation = getSourceFileLocation(objectFileName, mapFile, shortMethodNameWithoutParams, epocRootPath, isDll(componentName));			
+			
+			sourceLocation.setDllName(componentName);
+			sourceLocation.setMethodAddress(address);
+			sourceLocation.setMethodName(methodName);
+			sourceLocation.setObjectName(objectFileName);
+			sourceLocation.setMethodAddress(address);
+			return sourceLocation;
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			// Mapping all possible exceptions into single exception type. 
+			throw new CannotFoundFileException(e.getMessage() , e);
+		}
+	}
+
+	/**
+	 * Get address from map file line based on method name
+	 * @param lineWhereAddressIs Line containing address.
+	 * @param methodName Method name.
+	 * @return Method address.
+	 */
+	private String getAddresFromLine(String lineWhereAddressIs,
+			String methodName) {
+		//e.g. : CRepository::Create(unsigned long, const TDesC16&) 0x000080b9   Thumb Code     8  centralrepository.in(.text)
+		String addString = lineWhereAddressIs.substring(lineWhereAddressIs.indexOf(methodName) + methodName.length()).trim();
+		//e.g. : '0x000080b9   Thumb Code     8  centralrepository.in(.text)'		
+		addString = addString.substring(0, addString.indexOf(" ")).trim(); //$NON-NLS-1$
+		return addString;
+	}
+	
+	
+	/**
+	 * Get Address using petran command-line runner.
+	 * @param ordinal Method ordinal.
+	 * @param componentName Component name.
+	 * @param variant Build variant.
+	 * @param build Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @return Address for the given method ordinal.
+	 * @throws UnsupportedOSException
+	 * @throws InterruptedException
+	 * @throws CmdLineExeption
+	 */
+	private String getAddress(String ordinal, String componentName, String variant,
+			String build, String epocRootPath) throws UnsupportedOSException,
+			InterruptedException, CmdLineExeption {
+		
+		PetranDumpCMDLineRunner runner = new PetranDumpCMDLineRunner(printUtility);		
+		String address =  runner.getAddress(ordinal, componentName, variant, build, epocRootPath);
+		return address;
+	}
+	
+	/**
+	 * Get Address using petran command-line runner.
+	 * @param ordinal Method ordinal
+	 * @param componentPath path of the component
+	 * @param epocRootPath EPOCROOT path
+	 * @return Address for the given method ordinal.
+	 * @throws UnsupportedOSException
+	 * @throws InterruptedException
+	 * @throws CmdLineExeption
+	 */
+	private String getAddress(String ordinal, String componentPath, String epocRootPath) throws UnsupportedOSException,
+			InterruptedException, CmdLineExeption {
+		
+		PetranDumpCMDLineRunner runner = new PetranDumpCMDLineRunner(printUtility);		
+		String address =  runner.getAddress(ordinal, componentPath, epocRootPath);
+		return address;
+	}
+	
+	/**
+	 * Get sourceFile location
+	 * @param objectFileName Object file name.
+	 * @param mapFile File object pointing to map file.
+	 * @param methodName Method name.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param isDll <code>true</code> if component is DLL, otherwise <code>false</code>.
+	 * @return path in Windows format, separators will be "\":s even when they were "/":s originally.
+	 * @throws IOException
+	 * @throws CannotFoundFileException 
+	 */
+	private SourceFileLocation getSourceFileLocation(String objectFileName, File mapFile, String methodName, String epocRootPath, boolean isDll) throws IOException, CannotFoundFileException {
+		FileInputStream in = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		ArrayList<String> lines = new ArrayList<String>();
+		SourceFileLocation sourceLocation = null;
+
+		try {
+			in = new FileInputStream(mapFile);
+			isr = new InputStreamReader(in);
+			br = new BufferedReader(isr);
+
+			String line = null;
+			//seek "0x00000000" and "ABSOLUTE" and object file name from file line by line
+			while ((line = br.readLine()) != null) {
+				if(line.contains(objectFileName) && 
+						line.contains(NULL_ADDRESS) &&
+						line.contains(ABSOLUTE) ){
+
+					//if we found wanted text, checking that it does not contain 
+					//\EPOC32\BUILD or \\EPOC32\\BUILD, because then its not a source, but build file
+					//Returning path in windows format
+					String epocBuildLine = makeWindowsPath(line);
+					//Making sure that souce location does not point to BUILD folder
+					if(epocBuildLine.indexOf(EPOC32_BUILD) == SourceFileLocation.OFFSET_NOT_FOUND){						
+						epocBuildLine = epocBuildLine.substring(0, epocBuildLine.indexOf(NULL_ADDRESS)).trim();
+						lines.add(epocBuildLine);			
+					}
+					
+				}
+			}
+			
+			//If there was only one line
+			if(lines.size() == 1){
+				String filePath = buildAbsoluteFilePath(lines.get(0), epocRootPath);
+				if(sourceFileExist(filePath)){
+					sourceLocation = new SourceFileLocation();
+					sourceLocation.setSourceFileLocation(filePath);
+					String methodNameWithoutParams = getMethodNameWithoutParams(methodName);
+					int offset = getMethodNameLineOfsetFromSourceFile(methodNameWithoutParams, new File(filePath), isDll);
+					if(offset != SourceFileLocation.OFFSET_NOT_FOUND){
+						sourceLocation.setMethodOffset(offset);						
+					}
+				}else{
+					String msg = Messages.getString("MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part1") +objectFileName //$NON-NLS-1$ //$NON-NLS-2$ 
+							+Messages.getString("MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part2") + mapFile.getAbsolutePath() //$NON-NLS-1$ //$NON-NLS-2$ 
+							+Messages.getString("MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part3") + filePath//$NON-NLS-1$ //$NON-NLS-2$ 					
+							+Messages.getString("MapSourceFinder.ObjectFileDoesntExist_ErrMsg_Part4");//$NON-NLS-1$ 
+					printUtility.println(msg); 
+					throwCannotFoundFileException(mapFile, methodName, msg);
+				}
+			}
+			//If there was many occurrences, opening files and seek method name, to get only one result
+			else if(lines.size() > 0){
+				sourceLocation = foundSourceFileWhereMethodIsImplemented(lines, methodName, epocRootPath, isDll);
+				
+				if(sourceLocation == null){
+					String msg = Messages.getString("MapSourceFinder.SourceFileNotFoundForMethod_ErrMsg_Part1") //$NON-NLS-1$
+							+methodName  + Messages.getString("MapSourceFinder.SourceFileNotFoundForMethod_ErrMsg_Part2") +mapFile.getAbsolutePath() +"'."; //$NON-NLS-1$ //$NON-NLS-2$
+					printUtility.println(msg);
+
+					throwCannotFoundFileException(mapFile, methodName, msg);
+				}
+
+			}//No results found
+			else{
+				String msg = Messages.getString("MapSourceFinder.ObjectFileNotFound_ErrMsg_Part1") +objectFileName +Messages.getString("MapSourceFinder.ObjectFileNotFound_ErrMsg_Part2") + mapFile.getAbsolutePath() +"'."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				printUtility.println(msg);
+				throwCannotFoundFileException(mapFile, methodName, msg);
+				
+			}
+						
+		} finally{
+			if(in != null){
+				in.close();
+			}
+			if(isr != null){
+				isr.close();
+			}
+			if(br != null){
+				br.close();
+			}
+		}
+
+		return sourceLocation;		
+	}
+
+	/**
+	 * Throw an exception with message about map file and method name, that a source file cannot be found from those details
+	 * @param mapFile File object pointing to map file.
+	 * @param methodName Method name.
+	 * @throws CannotFoundFileException
+	 */
+	private void throwCannotFoundFileException(File mapFile, String methodName, String msg) throws CannotFoundFileException{
+		throw new CannotFoundFileException(msg);
+	}
+
+	
+	/**
+	 * Converts path into Windows format by 
+	 * replacing extra "\\":s and replace "/" with "\".
+	 * @param path Path name string to convert.
+	 * @return path name string in windows format
+	 */
+	private String makeWindowsPath(String path) {
+		//fixing slashes so we can find epoc32 build folder in any cases.
+		//First replacing "\"'s with "/"'s so regular expression will work
+		String windowsPath = path.replace(BACKSLASH, "/" ); //$NON-NLS-1$ //$NON-NLS-2$
+		//removing multiple backslashes: " +" means more than one white spaces, e.g. "a    b c" -> "a b c"
+		windowsPath = windowsPath.replaceAll("/+", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+		windowsPath = windowsPath.replace("/", BACKSLASH); //$NON-NLS-1$ //$NON-NLS-2$
+		return windowsPath;
+	}		
+	
+	/**
+	 * Checks if file exists.
+	 * @param filePath File path name.
+	 * @return <code>true</code> if exist, otherwise <code>false</code>.
+	 */
+	private boolean sourceFileExist(String filePath) {		
+		File file = new File(filePath);		
+		return file.exists();
+	}
+	/**
+	 * Builds absolute file path name from source file path and EPOCROOT path
+	 * @param srcPath File source path
+	 * @param epocRootPath EPOCROOT path
+	 * @return Absolute file path name.
+	 */
+	private String buildAbsoluteFilePath(String srcPath, String epocRootPath) {
+		String filePath;
+		
+		srcPath = FileUtils.removeDriveLetterPortionFromPathIfExists(srcPath);
+		
+		if(epocRootPath.endsWith(File.separator) && srcPath.startsWith(File.separator)){
+			filePath = epocRootPath + srcPath;
+		}
+		else if(epocRootPath.endsWith(File.separator) || srcPath.startsWith(File.separator) ){
+			filePath = epocRootPath + srcPath;
+		}		
+		else{
+			filePath = epocRootPath + File.separatorChar + srcPath;
+		}
+		
+		//Removing possible double slashes
+		filePath = makeWindowsPath(filePath);
+		
+		return filePath;
+	}
+	
+	/**
+	 * Check if source files contains method name, if contains, returning that file location. 
+	 * Skips parameters, only seeking method name or ClassName::MethodName if given.
+	 * @param lines containing paths to source files found in .map file
+	 * @param methodName Method name.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param isDll <code>true</code> if component is DLL, otherwise <code>false</code>.
+	 * @return Source file path if method name without parameters is found from that file, or <code>null</code> if not found
+	 * @throws IOException 
+	 * @throws FileNotFoundException 
+	 * @throws CannotFoundFileException 
+	 */
+	private SourceFileLocation foundSourceFileWhereMethodIsImplemented(ArrayList<String> lines,
+			String methodName, String epocRootPath, boolean isDll) throws FileNotFoundException, IOException, CannotFoundFileException {			
+
+		File srcFile;
+		//Seeking lines where is source file paths one by one
+		for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
+			String path = (String) iterator.next();
+			srcFile = buildSourceFileObject(path, epocRootPath, methodName);
+			
+			if(srcFile.exists()){
+				String methodNameWithOutParams = getMethodNameWithoutParams(methodName);
+				
+				int methodLineOfset = getMethodNameLineOfsetFromSourceFile(methodNameWithOutParams, srcFile, isDll);
+				//If we found a file where is classname::methodname, stop searching and return that one.
+				if(methodLineOfset != SourceFileLocation.OFFSET_NOT_FOUND){
+					SourceFileLocation sourceLocation = new SourceFileLocation();
+					sourceLocation.setSourceFileLocation(srcFile.getAbsolutePath());
+					sourceLocation.setMethodOffset(methodLineOfset);
+					return sourceLocation;
+				}
+			}else{
+				//Caller will throw an exception if null returned
+				printUtility.println(Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part1") +srcFile.getAbsolutePath()  //$NON-NLS-1$
+						+ Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part2") +methodName +Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part3")); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Builds alternate source path from the parameters in case the default behavior has failed.
+	 * @param path Source file path found from *.map-file.
+	 * @param epocRootPath EPOCROOT defined in SDK properties.
+	 * @param methodName Name of the method we were about to search.
+	 * @return Alternate file path, if found.
+	 */
+	private File buildSourceFileObject(String path, String epocRootPath, String methodName) {
+		
+		// Default behavior is to add 'source path' to EPOCROOT. (format used in platform built map-files)	
+		String srcFileUri = buildAbsoluteFilePath(path, epocRootPath);
+		File srcFile = new File(srcFileUri);
+		
+		// Checking if the default behavior resulted correct file name
+		if(!srcFile.exists()){
+			// Printing info to console about the operation
+			printUtility.println(Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part1") +srcFile.getAbsolutePath()  //$NON-NLS-1$
+					+ Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part2") +methodName +Messages.getString("MapSourceFinder.FileDoesntExist_ErrMsg_Part3")); //$NON-NLS-1$ //$NON-NLS-2$
+			// Checking if the source path already contained EPOCROOT, and stripping it.
+			srcFile = stripEpocRootFromPath(path, epocRootPath, srcFile);
+		}
+		
+		return srcFile;
+	}
+	/**
+	 * Checks if given path already contains EPOCROOT without logical drive letter.
+	 * If contains, then stripping it away and returning file object containing correct path.
+	 * @param path Original source path in map-file
+	 * @param epocRootPath Currently used EPOCROOT
+	 * @param srcFile Currently used source file absolute path (possibly containing already EPOCROOT).
+	 * @return File object containing correct path without duplicate EPOCROOT, or current file object
+	 *         as result if there was no overlapping.
+	 */
+	private File stripEpocRootFromPath(String path, String epocRootPath, File srcFile) {
+		// For components that user has build in Carbide has different kind of source path used.
+		// The source path in map-file may already include EPOCROOT e.g. in the following example:
+		//
+		// EPOCROOT=C:\foo\bar\MySDK\
+		// Source file path found from *.map-file=\foo\bar\MySDK\MyExamples\MyExample\ENGINE\src\enginedll.cpp
+		//
+		String epocRootWithoutDrive = epocRootPath.substring(2); // Skipping drive letter and colon: "C:" 
+
+		if(path.startsWith(epocRootWithoutDrive)){
+			// Stripping EPOCROOT
+			String altSrcFileUri = path.substring(epocRootWithoutDrive.length());
+			srcFile = new File(epocRootPath + altSrcFileUri);
+			// Printing info to console about the operation
+			printUtility.println(Messages.getString("MapSourceFinder.StrippingEpocrootFromPath_InfoMsg")); //$NON-NLS-1$
+		}
+		return srcFile;
+	}
+	
+	/**
+	 * Parses out params from method name
+	 * @param methodName Name of the method to parse.
+	 * @return Method name without parameters.
+	 */
+	private String getMethodNameWithoutParams(String methodName) {
+		
+		//ContentAccess::CData::NewL(RFile&, TDesC16 const&, ContentAccess::TIntent)
+		String methodNameWithClassButWithOutParams = methodName.split(Pattern.quote(METHOD_OPENING_CHAR))[0];
+		String methodNameWithOutParams;
+		
+		String classSeparator = CLASS_SEPARATOR;
+		if(methodNameWithClassButWithOutParams.indexOf(classSeparator) != -1){
+			String [] parts = methodNameWithClassButWithOutParams.split(Pattern.quote(classSeparator));
+			methodNameWithOutParams = parts[parts.length - 2] +classSeparator + parts[parts.length -1];
+		}else{
+			methodNameWithOutParams = methodNameWithClassButWithOutParams;
+		}
+		
+		//If that file contains line, where is methodname, e.g. MyClass:MyMethod then that file is what we want
+		//Only Class name and method name is searched, skipping parameters because of possible new lines and so on.
+		return methodNameWithOutParams;
+	}
+	
+	/**
+	 * Get object filename from line where method address was found
+	 * @param lineWhereAddressIs Line containing the address and object file name.
+	 * @param address Method address
+	 * @return object file name
+	 */
+	private String getObjectFileName(String lineWhereAddressIs, String address) {
+
+		//First line should be e.g.:
+		//CRepository::Create(unsigned long, const TDesC16&) 0x000080b9   Thumb Code     8  centralrepository.in(.text)
+		//or/
+		//User::LeaveIfError(int)                  0x00009078   ARM Code       0  euser{000a0000}-593.o(StubCode)
+		
+		//Cut string after address
+		String objFileName = lineWhereAddressIs.substring(lineWhereAddressIs.indexOf(address) +address.length()).trim();
+		//No there should be: "Thumb Code     8  centralrepository.in(.text)"
+		//or: "ARM Code       0  euser{000a0000}-593.o(StubCode)"
+		
+		//Cut string before "("
+		objFileName = objFileName.substring(0, objFileName.lastIndexOf(METHOD_OPENING_CHAR)).trim();
+		//No there should be: "Thumb Code     8  centralrepository.in"
+		//or: "ARM Code       0  euser{000a0000}-593.o"
+		
+		//Cut string from last " "
+		objFileName = objFileName.substring(objFileName.lastIndexOf(" ")).trim(); //$NON-NLS-1$
+
+		//No there should be: "centralrepository.in"
+		//or: "euser{000a0000}-593.o"
+
+		return objFileName;
+	}
+
+	/**
+	 * Get method name from line where method address was found.
+	 * @param lineWhereAddressIs Line containing the address and object file name.
+	 * @return method name
+	 */
+	private String getMethodNameFromMapFileLine(String lineWhereAddressIs) {
+		//CRepository::Create(unsigned long, const TDesC16&) 0x000080b9   Thumb Code     8  centralrepository.in(.text)
+		String method = lineWhereAddressIs.substring(0, lineWhereAddressIs.indexOf(METHOD_CLOSING_CHAR));
+		return method != null ? method.trim() : null;
+	}		
+	
+	/**
+	 * Get those lines from file, where is the wanted string.
+	 * @param wantedString wanted string, or <code>null</code> if all lines is wanted
+	 * @param file File object to search for the string.
+	 * @param addAllLinesIfWantedStringExist If set to <code>true</code> and wantedString 
+	 *                                       occurs at least once, all lines from file will be returned, 
+	 *                                       otherwise an empty list will be returned, 
+	 *                                       If set to <code>false</code>, only those lines where 
+	 *                                       wanted string exist will be returned. 
+	 * @return Lines based wanted strings and boolean parameter setting.
+	 * @throws IOException
+	 */
+	private ArrayList<String> getLinesFromFile(String wantedString, File file, boolean addAllLinesIfWantedStringExist) throws IOException{
+		ArrayList<String> lines = new ArrayList<String>();
+		FileInputStream in = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		boolean fileContainsWantedString = false;
+				
+		try {
+			in = new FileInputStream(file);
+			isr = new InputStreamReader(in);
+			br = new BufferedReader(isr);
+
+			String line = null;
+			
+			//seek wanted text from file line by line
+			while ((line = br.readLine()) != null) {
+				//if we found wanted text, stopping search
+				if(addAllLinesIfWantedStringExist){
+					lines.add(line);
+					//Marking that we found a required line from that file when all lines is gathered
+					if(line.contains(wantedString)){
+						fileContainsWantedString = true;
+					}
+				}
+				else if(!addAllLinesIfWantedStringExist && line.contains(wantedString)){
+					lines.add(line);
+				}//Else line is not wanted and will not be added to lines
+			}		
+		}finally{
+				if(in != null){
+					in.close();
+				}
+				if(isr != null){
+					isr.close();
+				}
+				if(br != null){
+					br.close();
+				}
+		}		
+		
+		//If we want all lines from file and that file does not contain wanted String
+		//we collect already all lines but there was no wanted line, so returning new empty list
+		if(addAllLinesIfWantedStringExist && !fileContainsWantedString){
+			return new ArrayList<String>();
+		}else{		
+			return lines;
+		}
+	}
+	
+	
+	/**
+	 * Seek address line where is method address and braces ().
+	 * @param address Method address.
+	 * @param mapFile File object pointing to map file.
+	 * @param methodName Method name.
+	 * @return Address line.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 * @throws CannotFoundFileException 
+	 */
+	private String getAddressLineFromFile(String address, File mapFile, String methodName)
+			throws FileNotFoundException, IOException, CannotFoundFileException {
+		
+		ArrayList<String> lines = getLinesFromFile(address, mapFile, false);
+		String wantedLine = null;
+			
+			//If there was only one occurrence
+			if(lines.size() == 1){
+				wantedLine = lines.get(0);
+				
+			}
+			//If there was many occurences, selecting wanted one  
+			else if(lines.size() > 1){
+				
+				//Seeking all foundings and select wanted line
+				for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
+					String aLine = (String) iterator.next();
+					
+					//If there is many lines, we want that one where method name is, 
+					//and in method name lines, there will be braces "()" before address e.g. in XnResource.dll.map
+					//StubCode                                 0x000084b8   Section        8  apmime{000a0000}-57.o(StubCode)
+					//TDataType::InternalizeL(RReadStream&)    0x000084b8   ARM Code       0  apmime{000a0000}-57.o(StubCode)
+					
+					//cut string before address
+					aLine = aLine.substring(aLine.indexOf(address));
+					if(aLine.contains(METHOD_CLOSING_CHAR) && aLine.contains(METHOD_OPENING_CHAR)){
+						
+							wantedLine = aLine;
+							break;							
+					}
+									
+				}
+				
+			}//else wantedLine will be null and exception will thrown
+			
+		if(wantedLine == null){
+			throw new CannotFoundFileException(
+					Messages.getString("MapSourceFinder.CannotFoundAddress_ErrMsg_Part1") +methodName +Messages.getString("MapSourceFinder.CannotFoundAddress_ErrMsg_Part2") +mapFile.getName() +"'."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		
+		return wantedLine;
+	}
+	
+	
+	/**
+	 * Seek address line where is method name and braces ().
+	 * @param mapFile File object pointing to map file.
+	 * @param methodName Method name.
+	 * @return Address line.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 * @throws CannotFoundFileException 
+	 */
+	private String getAddressLineFromFile(File mapFile, String methodName)
+			throws FileNotFoundException, IOException, CannotFoundFileException {
+
+		//Line is e.g:
+		//CTerminalControlSession::GetDeviceLockParameterL(TBuf8<(int)21>&, int) 0x000090e1   Thumb Code   188  TerminalControl.in(.text)
+		//When method is: CTerminalControlSession::GetDeviceLockParameterL(TBuf8<(int)21>&, int)
+		
+		ArrayList<String> lines = getLinesFromFile(methodName, mapFile, false);
+		String wantedLine = null;
+			
+			//If there was only one occurrence
+			if(lines.size() == 1){
+				wantedLine = lines.get(0);
+				
+			}
+			//If there was many occurrences, selecting wanted one  
+			else if(lines.size() > 1){
+				
+				//Seeking all findings and select wanted line
+				for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
+					String aLine = (String) iterator.next();
+					//What to do if many lines found? Currently just printing a debug message. 
+					//Really it should not be happening, but if does, logic must be improved if error situation occurs. 
+					 printUtility.println(
+							 Messages.getString("MapSourceFinder.ManyAddressLines_Msg_Part_1")  //$NON-NLS-1$
+							 +methodName  
+							 +Messages.getString("MapSourceFinder.ManyAddressLines_Msg_Part_2")	//$NON-NLS-1$							
+							+mapFile.getName()
+							+Messages.getString("MapSourceFinder.ManyAddressLines_Msg_Part_3")//$NON-NLS-1$
+							+aLine
+							+"'.");	//$NON-NLS-1$					
+					
+				}
+				//Even if there is many lines, just selecting the first one
+				wantedLine = lines.get(0);
+				
+			}//else wantedLine will be null and exception will thrown
+			
+		if(wantedLine == null){
+			throw new CannotFoundFileException(
+					Messages.getString("MapSourceFinder.CannotFoundAddress_ErrMsg_Part1") +methodName +Messages.getString("MapSourceFinder.CannotFoundAddress_ErrMsg_Part2") +mapFile.getName() +"'."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		
+		return wantedLine;
+	}	
+	
+	
+	/**
+	 * Seek offset from method implementation from source file.
+	 * @param methodName Method name
+	 * @param file File to gen method name line offset.
+	 * @param isDll  When set to <code>true</code> tells that implementation must 
+	 *               have prefix IMPORT_C or EXPORT_C and if set to <code>false</code> 
+	 *               we suppose that it is exe file in question and those are not required.
+	 * @return Offset or -1 if not found
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private int getMethodNameLineOfsetFromSourceFile(String methodName, File file, boolean isDll)
+			throws FileNotFoundException, IOException {
+		//getting all lines of that file if it contains methodName at least some where
+		ArrayList<String> lines = getLinesFromFile(methodName, file, true);
+		String wantedLine = null;
+		int offset = SourceFileLocation.OFFSET_NOT_FOUND;//-1 will return if offset cannot be found from file
+			// If there was at least one occurrence of methodName
+			if (lines.size() > 0) {
+
+				//For finding offset of method implementation, we need to collect file contents
+				StringBuffer fileBuffer = new StringBuffer();
+				StringBuffer tmpBuffer = null;
+				boolean isInsideCommentSegment = false;	
+				boolean searchForMethodDefinition = false;
+				String methodStartingLine = null;
+				
+				// Seeking all findings and select wanted line
+				for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
+					String aLine = (String) iterator.next();//Not to be modified
+					fileBuffer.append(aLine);//for founding out offset collecting file to buffer
+					fileBuffer.append("\r\n"); //$NON-NLS-1$
+					String lineWithoutComments = aLine;
+									
+					//If we are inside of comment segment, and this line does not contain comment segment closing
+					//we can just skip the line because its a comment line. 
+					if(isInsideCommentSegment && lineWithoutComments.indexOf(COMMENT_END) == SourceFileLocation.OFFSET_NOT_FOUND){
+						continue;
+					}
+					//if we are inside of comment segment and this line contains comment closing segment
+					//checking out if there is something after that comment segment line
+					else if(isInsideCommentSegment && lineWithoutComments.indexOf(COMMENT_END) != SourceFileLocation.OFFSET_NOT_FOUND){
+						
+						lineWithoutComments = getLineWithOutComments(lineWithoutComments, isInsideCommentSegment);
+						
+						//mark that comment segment is closed if so
+						isInsideCommentSegment = isLineClosingCommentSegment(lineWithoutComments);
+					}										
+					
+					//if that line contains opening sequence to comment segment
+					else if(lineWithoutComments.indexOf(COMMENT_START) != SourceFileLocation.OFFSET_NOT_FOUND ){
+
+						//case 1 / ** <comments>
+						//case 2 ..Text / ** <comments> * /  Text..
+						//case 3 / ** <comments> * / Text..
+						
+						isInsideCommentSegment = isLineOpeningCommentSegment(lineWithoutComments);
+						lineWithoutComments = getLineWithOutComments(lineWithoutComments, isInsideCommentSegment);
+					}
+					//Else in this line there is no comment segment, and status nor line needs no modifications
+
+					//if this line does not contain methodName, just continue
+					if(!searchForMethodDefinition && (isInsideCommentSegment || !lineWithoutComments.contains(methodName)) /*|| isCommentLine*/){
+						continue;
+					}
+					boolean isCommentLine = isCommentLine(lineWithoutComments, methodName);
+					//if this line does not contain methodName, just continue
+					if(!searchForMethodDefinition && (isInsideCommentSegment || !lineWithoutComments.contains(methodName) || isCommentLine)){
+						continue;
+					}
+					
+					//Cut the line, because there can be e.g. MyClass::MyMethod() //;;; When ";" would cause line to drop out
+					if(lineWithoutComments.indexOf(CODE_COMMENT_PREFIX) != SourceFileLocation.OFFSET_NOT_FOUND){
+						lineWithoutComments = lineWithoutComments.split(Pattern.quote(CODE_COMMENT_PREFIX))[0];
+					}
+					
+					/**
+					 * If this (searchForMethodDefinition) is true, the method assumes that
+					 * it has encountered a line with the method name but not sure whether
+					 * its a definition point or invocation point. So, it scans for the text
+					 * after the method name until it encounters certain delimiters, to conclude
+					 * whether its point of definition or point of invocation.
+					 */
+					if(searchForMethodDefinition)
+					{
+						String neededText = fetchContentBeforeDefinition(lineWithoutComments);
+						tmpBuffer.append(neededText);
+						
+						if(hasDelimiter(tmpBuffer.toString()))
+						{
+							tmpBuffer = tmpBuffer.deleteCharAt(tmpBuffer.length()-1);
+							String contentToBeParsed = tmpBuffer.toString();
+							boolean isMethodDefined = parseForMethodDefinition(contentToBeParsed);
+						
+							if(isMethodDefined)
+							{
+								searchForMethodDefinition = false;
+								wantedLine = methodStartingLine;
+								tmpBuffer = null;
+								break;
+							}
+							else{
+								searchForMethodDefinition = false;
+								tmpBuffer = null;
+								continue;
+							}
+						}
+					}
+					//
+					//Now we know that this line where we are, is not inside of "/**/" -comments,
+					//This line is not a comment line with "//":s
+					//And this line is containing method name
+					//					
+
+					//If component is DLL it exports functions, and EXPORT_C (or IMPORT_C just in case) must occur in line
+					//This is not a perfect way to do it, but it works, because EXPORT_C definition is
+					//most likely written to same line as method definition.
+					if (isDll && 
+							( lineWithoutComments.toUpperCase().indexOf(EXPORT) != SourceFileLocation.OFFSET_NOT_FOUND
+							|| lineWithoutComments.toUpperCase().indexOf(IMPORT) != SourceFileLocation.OFFSET_NOT_FOUND)
+							&& lineWithoutComments.indexOf(SEMI_COLON) == SourceFileLocation.OFFSET_NOT_FOUND) {
+						wantedLine = aLine;						
+						break;
+					}
+					//If the line contains function name but does not contain EXPORT_C or IMPORT_C, we will 
+					//scan the text after method name to check if method definition has started.
+					else if(isDll && lineWithoutComments.contains(methodName)) {
+						tmpBuffer = new StringBuffer();
+						tmpBuffer.append(lineWithoutComments.substring(lineWithoutComments.indexOf(methodName) + methodName.length()));
+					
+						methodStartingLine = aLine;
+						searchForMethodDefinition = true;
+					}
+					//If method name is not [ClassName]::[MethodName] but e.g. __my_macro, excluding EXPORT_C check
+					//But then there must be "("
+					else if(methodName.indexOf(CLASS_SEPARATOR) == SourceFileLocation.OFFSET_NOT_FOUND
+							&& lineWithoutComments.indexOf(SEMI_COLON) == SourceFileLocation.OFFSET_NOT_FOUND
+							&& lineWithoutComments.indexOf(METHOD_OPENING_CHAR) != SourceFileLocation.OFFSET_NOT_FOUND){ 
+						wantedLine = aLine;
+						break;
+					}
+					
+					//If its not dll but exe, it does not export functions, then it might be implementation 
+					else if(!isDll && lineWithoutComments.indexOf(SEMI_COLON) == SourceFileLocation.OFFSET_NOT_FOUND){
+						wantedLine = aLine;
+						break;
+					}
+					//Else we are not interested on this line and keep seeking					
+					else{
+						 printUtility.println(
+								 Messages.getString("MapSourceFinder.OffsetSeek_Msg_Part_1")  //$NON-NLS-1$
+								 +methodName  
+								 +Messages.getString("MapSourceFinder.OffsetSeek_Msg_Part_2")	//$NON-NLS-1$							
+								+file.getAbsolutePath()
+								+Messages.getString("MapSourceFinder.OffsetSeek_Msg_Part_3")//$NON-NLS-1$
+								+lineWithoutComments
+								+Messages.getString("MapSourceFinder.OffsetSeek_Msg_Part_4"));	//$NON-NLS-1$					
+					}
+
+				}//for (Iterator<String> iterator = lines.iterator(); iterator.hasNext();) {
+				if(wantedLine != null){
+					offset = fileBuffer.lastIndexOf(wantedLine); //getOfsetForLine(lines, wantedLine);
+				}
+				
+			}//if (lines.size() > 0) {
+
+			//Now wantedLine should be line we want, we can found out offset for that line			
+
+		return offset;
+	}		
+
+	/**
+	 * Get content of this line with out comments.
+	 *  e.g. 'MyClass::Foo(TInt bar /*My comments * /)'
+	 *  returns 'MyClass::Foo(TInt bar )'
+	 *  NOTE: does not handle '//' comments at all
+	 * @param line Line to remove comments from
+	 * @param isInsideCommentSegment  set to <code>true</code>, if we are already are inside of comment segment 
+	 * @return a line without comments
+	 */
+	private String getLineWithOutComments(String line, boolean isInsideCommentSegment) {
+		
+		// /** aa */ BB /** cc */ DD  --> Should return " BB  DD"
+		// aa */ BB /** cc */ DD  --> Should return " BB  DD" if isInsideComment and "aa  BB  DD" if no
+		// AA */ should return "" if inside comments, and "AA */" if not
+		
+		//if we are inside comments, and comment segment is not closing, 
+		//there is no other than comments, so return empty string
+		if(isInsideCommentSegment && line.indexOf(COMMENT_END) == SourceFileLocation.OFFSET_NOT_FOUND){
+			return ""; //$NON-NLS-1$
+		}
+		//if we are not inside comments and not even start a comment just return the line
+		else if(!isInsideCommentSegment && line.indexOf(COMMENT_START) == SourceFileLocation.OFFSET_NOT_FOUND){
+			return line;
+		}		
+		//else we parse out everything else but comments
+
+		StringBuffer b = new StringBuffer();		
+		String [] parts = line.split(Pattern.quote(COMMENT_START));
+				
+		//Splitted string goes like this:
+		// "/** aa */ BB /** cc */ DD" -->
+		// " aa */ BB "
+		// " cc */ DD"
+		for (int i = 0; i < parts.length; i++) {
+			//Skip empty parts
+			if(parts[i].equals("")){ //$NON-NLS-1$
+				continue;
+			}
+			//If we are not inside comments, and line was not started with comments, the first part belongs to text
+			else if(i==0 && !isInsideCommentSegment && parts[i].indexOf(COMMENT_END) == SourceFileLocation.OFFSET_NOT_FOUND){
+				b.append(parts[i]);
+			}
+			//if comment is opened, but not closed, this part belongs to comment and will be skipped			
+			else if(parts[i].indexOf(COMMENT_END) == SourceFileLocation.OFFSET_NOT_FOUND){
+				continue;
+			}else{
+				b.append(parts[i].substring( parts[i].indexOf(COMMENT_END)+COMMENT_END.length() ) );
+			}
+		}			
+	
+		return b.toString();
+	}
+	/**
+	 * Check if this line opens a comment segment, and is not closing it
+	 * @param line Line to be checked.
+	 * @return <code>true</code> if start a comment block without closing it, otherwise <code>false</code>.
+	 */
+	private boolean isLineOpeningCommentSegment(String line) {
+		
+		int commentStartIndex = line.lastIndexOf(COMMENT_START);
+		int commentEndIndex = line.lastIndexOf(COMMENT_END);			
+		
+		if(commentStartIndex > commentEndIndex){
+			return true;
+		}
+		
+		return false;
+	}
+	
+	/**
+	 * Check if this line closes a comment segment
+	 * @param line Line to be checked.
+	 * @return <code>true</code> if line closes comment segment, otherwise <code>false</code>.
+	 */
+	private boolean isLineClosingCommentSegment(String line) {
+		
+		int commentStartIndex = line.lastIndexOf(COMMENT_START);
+		int commentEndIndex = line.lastIndexOf(COMMENT_END);			
+		
+		if(commentEndIndex > commentStartIndex){
+			return true;
+		}
+		
+		return false;
+	}	
+	
+	
+	/**
+	 * Check if this line is comment line starting with //
+	 * @param line Line to be checked.
+	 * @return <code>true</code> if line starts with //, otherwise <code>false</code>.
+	 */
+	private boolean isCommentLine(String line, String methodName) {
+		if(line.trim().startsWith(CODE_COMMENT_PREFIX)){
+			return true;
+		}
+		else if(line.indexOf(CODE_COMMENT_PREFIX) != SourceFileLocation.OFFSET_NOT_FOUND){
+			
+			int commentIndex = line.indexOf(CODE_COMMENT_PREFIX);
+			int methodNameIndex = line.indexOf(methodName);
+			if(commentIndex > methodNameIndex){
+				return false;
+			}else{
+				return true;
+			}
+		}else{
+			return false;
+		}
+	}
+	
+	/**
+	 * Gets *.map file path.
+	 * @param componentName Component name.
+	 * @param variant Build variant.
+	 * @param build Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @return path to .dll file +MAP_FILE_SUFFIX
+	 */
+	private String getMapFilePath(String componentName, String variant, String build,
+			String epocRootPath) {
+		String mapPath = 
+			epocRootPath + File.separatorChar 
+			+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+			+SourceFileLocation.RELEASE_FOLDER_NAME + File.separatorChar
+			+variant + File.separatorChar
+			+build + File.separatorChar
+			+componentName
+			+MAP_FILE_SUFFIX;
+		mapPath = makeWindowsPath(mapPath);
+		return mapPath;
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourcesFinder#findSourceFiles(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public String[] findSourceFiles(String componentName,
+			String variant, String build, String epocRootPath
+			) throws CannotFoundFileException {
+		
+		try {
+			//Projects map file
+			String mapFilePath = getMapFilePath(componentName, variant, build, epocRootPath);
+			File mapFile = getMapFile(mapFilePath);
+		
+			String objectFileName = componentName.split(Pattern.quote("."))[0]; //$NON-NLS-1$
+
+			//Get all source file paths from map file
+			String sourcePaths [] = getAllSourceFilePaths(mapFile, epocRootPath, objectFileName);
+
+			return sourcePaths;
+			
+		}  catch (FileNotFoundException e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		}			
+		
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.ISourcesFinder#findSourceFiles(java.lang.String, java.lang.String, java.util.Collection)
+	 */
+	public String[] findSourceFiles(String componentName,
+			 String epocRootPath, Collection<String> pathsToSeekMapFile
+			) throws CannotFoundFileException {
+		
+		try {
+			//Projects map file
+			String mapFileName = componentName + MAP_FILE_SUFFIX;
+			
+			File mapFile = getMapFile(pathsToSeekMapFile, componentName, mapFileName);
+		
+			//If we did not found map file, we cannot proceed to src file seek
+			if(mapFile == null){
+				String msg = "'" + mapFileName  //$NON-NLS-1$
+					+"' " //$NON-NLS-1$
+					+Messages.getString("MapSourceFinder.MapFileNotFoundForSource_ErrMsg_Part1") //$NON-NLS-1$
+					+componentName; 
+				String consoleMsg = msg + " "  //$NON-NLS-1$
+					+Messages.getString("MapSourceFinder.MapFileNotFoundForSource_ErrMsg_Part2"); //$NON-NLS-1$
+
+				String pathSeparator= ", "; //$NON-NLS-1$
+				for (Iterator<String> iterator = pathsToSeekMapFile.iterator(); iterator
+						.hasNext();) {
+					String path = (String) iterator.next();
+					consoleMsg += path + pathSeparator;
+				}
+				consoleMsg = consoleMsg.substring(0, consoleMsg.length() - pathSeparator.length());
+				printUtility.println(consoleMsg, IConsolePrintUtility.MSG_ERROR);
+				throw new CannotFoundFileException(msg);
+			}
+			String objectFileName = componentName.split(Pattern.quote("."))[0]; //$NON-NLS-1$
+
+			//Get all source file paths from map file
+			String sourcePaths [] = getAllSourceFilePaths(mapFile, epocRootPath, objectFileName);
+
+			return sourcePaths;
+			
+		}  catch (FileNotFoundException e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new CannotFoundFileException(e.getMessage() , e);
+		}			
+		
+	}
+	/**
+	 * Get all source file lines from given file.
+	 * @param file File object to be checked for.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param objectFileName Object file name used to filter results.
+	 * @return all source file lines from given file.
+	 * @throws IOException
+	 */
+	private String[] getAllSourceFilePaths(File file, String epocRootPath, String objectFileName) throws IOException {
+
+	FileInputStream in = null;
+	InputStreamReader isr = null;
+	BufferedReader br = null;
+	//HashSet does not allow duplicates
+	HashSet<String> sourceFilePaths = new HashSet<String>();
+
+	try {
+		in = new FileInputStream(file);
+		isr = new InputStreamReader(in);
+		br = new BufferedReader(isr);
+
+		String line = null;
+
+		// seek wanted text from file line by line
+		while ((line = br.readLine()) != null) {
+			// if we found wanted text, stopping search
+			String srcLine = isSourceFilePathLine(line, epocRootPath, objectFileName); 
+			if (srcLine != null) {
+				sourceFilePaths.add(srcLine);
+			}
+		}
+ 
+	} finally {
+		if (in != null) {
+			in.close();
+		}
+		if (isr != null) {
+			isr.close();
+		}
+		if (br != null) {
+			br.close();
+		}
+	}
+
+		return (String []) sourceFilePaths.toArray(new String [0]);
+	}
+	
+	/**
+	 * Check if line from file is a source file line or not.
+	 * @param line Line to be checked.
+	 * @param epocRootPath EPOCROOT path.
+	 * @param objectFileName Object file name used to filter results.
+	 * @return Path to src file or <code>null</code> if it was not src line.
+	 */
+	private String isSourceFilePathLine(String line, String epocRootPath, String objectFileName) {
+		
+//		 * Source file lines are e.g. lines:
+//	 *  \s60\mw\web\WebEngine\OssWebengine\WebCore\kwq\kwqvariant.cpp 0x00000000   Number         0  KWQVariant.o ABSOLUTE
+//	 *  \src\cedar\generic\base\e32\EUSER\EPOC\ up_dll_file.cpp 0x00000000   Number         0  up_dll_file.o ABSOLUTE
+//	 *  \\src\\cedar\\generic\\BASE\\E32\\compsupp\\RVCT2_2\\ucppinit_aeabi.cpp 0x00000000   Number         0  ucppinit_aeabi.o ABSOLUTE
+
+//	 * but not lines:
+//	 *  \EPOC32\BUILD\src\COMMON\GENERIC\comms-infras\esock\group\ESOCK\ARMV5\VtblExports.s 0x00000000   Number         0  VtblExports.o ABSOLUTE
+//	 *  \EPOC32\BUILD\src\cedar\generic\base\e32\EDLL\ARMV5\ urel\ uc_dll_.cpp 0x00000000   Number         0  uc_dll_.o ABSOLUTE
+//	 *  \\EPOC32\\BUILD\\src\\cedar\\generic\\base\\e32\\EDLL\\ARMV5\\urel\\uc_dll_.cpp 0x00000000   Number         0  uc_dll_.o ABSOLUTE
+
+		//   Also source codes can be from users own source projects, e.g.
+//		\Projects\Trombi\Carbide\creator\src\creatormailboxelement.cpp 0x00000000   Number         0  creator.in ABSOLUTE
+		
+		if(line == null || line.trim().length() < 1){
+			return null;
+		}
+		
+		if( (line.contains(CPP_SUFFIX) || line.contains(C_SUFFIX) )&& 
+				line.contains(NULL_ADDRESS) &&
+				line.contains(ABSOLUTE) &&
+				line.toLowerCase().contains(objectFileName.toLowerCase())){
+			
+			//if we found wanted text, checking that it does not contain 
+			//\EPOC32\BUILD or \\EPOC32\\BUILD, because then its not a source, but build file
+			//fixing slashes so we can find epoc32 build folder in any cases.
+			String srcPath = line.replace("/", BACKSLASH).trim(); //$NON-NLS-1$ //$NON-NLS-2$
+			//removing multiple spaces: " +" means more than one white spaces, e.g. "a    b c" -> "a b c"
+
+			//Making sure that souce location does not point to BUILD folder
+			if(srcPath.indexOf(EPOC32_BUILD) == SourceFileLocation.OFFSET_NOT_FOUND 
+					&& srcPath.indexOf(EPOC32_BUILD_DOUBLE_SLASHES) == SourceFileLocation.OFFSET_NOT_FOUND){
+				
+				if(!srcPath.startsWith(BACKSLASH)){
+					srcPath = BACKSLASH + srcPath;
+				}
+				
+				//if path starts with src\... or s60\... its a symbian or S60 src path
+				if(srcPath.startsWith( SRC_PATH_PREFIX) || srcPath.startsWith( S60_PATH_PREFIX) 
+						|| srcPath.startsWith( SRC_PATH_PREFIX_DOUBLE_SLASHS) || srcPath.startsWith( S60_PATH_PREFIX_DOUBLE_SLASHS)
+						)
+				{
+					
+					String srcPathOrig = srcPath.substring(0, srcPath.indexOf(NULL_ADDRESS)).trim();
+					srcPath = epocRootPath + srcPathOrig;
+					srcPath = makeWindowsPath(srcPath);
+					// Making sure that path does not have duplicate EPOCROOT.
+					File file = stripEpocRootFromPath(srcPathOrig, epocRootPath, new File(srcPath));
+					return file.getAbsolutePath();
+				}
+				//otherwise it can be users own source codes from own projects, and path can be anything
+				//then cheking that found source file path is actually real path to existing file
+				else{
+					String srcPathOrig = srcPath.substring(0, srcPath.indexOf(NULL_ADDRESS)).trim();
+					srcPath = epocRootPath + srcPathOrig;
+					srcPath = makeWindowsPath(srcPath);
+					// Making sure that path does not have duplicate EPOCROOT.
+					File file = stripEpocRootFromPath(srcPathOrig, epocRootPath, new File(srcPath));
+					if(file.exists()){
+						return file.getAbsolutePath();		
+					}
+				}
+			}
+			
+		}
+				
+		return null;
+	}
+	
+	/**
+	 * The method parses the given content for certain characters in a specific order
+	 * to determine whether method definition has started or not.
+	 * @param lineContent content to be parsed.
+	 * @return true if the method definition is started else false.
+	 */
+	private boolean parseForMethodDefinition(String lineContent)
+	{
+		Stack<Character> chars_stack = new Stack<Character>();
+		char [] line_chars = lineContent.toCharArray();
+		
+		final char METHOD_OPENING_CHAR = '(';
+		final char METHOD_CLOSING_CHAR = ')';
+		final char METHOD_DEFINITION_OPENING_CHAR = '{';
+		
+		for(char c: line_chars)
+		{
+			switch(c){
+				case METHOD_OPENING_CHAR:
+				case METHOD_CLOSING_CHAR:
+				case METHOD_DEFINITION_OPENING_CHAR:
+					chars_stack.push(c);
+					break;
+			}
+		}
+		
+		while(!chars_stack.isEmpty())
+		{
+			Character lastChar = chars_stack.pop();
+			
+			if(lastChar == METHOD_DEFINITION_OPENING_CHAR)
+			{
+				char prevChar_1 = chars_stack.pop();
+				char prevChar_2 = chars_stack.pop();
+				
+				if((prevChar_1 == METHOD_CLOSING_CHAR) && (prevChar_2 == METHOD_OPENING_CHAR))
+					return true;
+			}
+		}
+		return false;
+		
+	}
+	
+	/**
+	 * The method checks for some predefined delimiter characters and 
+	 * returns the content before those characters.
+	 * @param input 
+	 * @return
+	 */
+	private String fetchContentBeforeDefinition(String input)
+	{
+		if(input.contains(SEMI_COLON))
+		{
+			if(input.contains(METHOD_DEFINITION_CLOSING_CHAR)
+					&& input.indexOf(METHOD_DEFINITION_CLOSING_CHAR) < input.indexOf(SEMI_COLON))
+				return input.substring(0, input.indexOf(METHOD_DEFINITION_CLOSING_CHAR) +1);
+			else	
+				return input.substring(0, input.indexOf(SEMI_COLON) +1);
+		}
+		else if(input.contains(METHOD_DEFINITION_CLOSING_CHAR)){
+			return input.substring(0, input.indexOf(METHOD_DEFINITION_CLOSING_CHAR) +1);
+		}
+		else{
+			return input.toString();
+		}
+	}
+	
+	private boolean hasDelimiter(String line)
+	{
+		if(line.contains(METHOD_DEFINITION_CLOSING_CHAR) ||
+				line.contains(SEMI_COLON))
+			return true;
+		else
+			return false;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranCMDLinePrintUtility.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.sourcecode.internal;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Custom CMD line print utility, that is not printing normal messages at all,
+ * only prints warnings and errors by using given application specific print utility.
+ */
+public class PetranCMDLinePrintUtility implements IConsolePrintUtility {
+
+	/**
+	 * Application specific print utility.
+	 */
+	private IConsolePrintUtility printUtility = null;
+
+	/**
+	 * Creates a Petran CMD line runner specific print utility, what is not printing normal messages, 
+	 * only warnings and errors using given print utility.
+	 * @param printUtility Print utility used to report error, warnings, and info messages.
+	 */
+	public PetranCMDLinePrintUtility(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;		
+	}
+
+
+	/** Not printing anything
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String)
+	 */
+	public void println(String message) {
+		
+	}
+
+	/** 
+	 * Prints only warnings and errors
+	 * 
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String, int)
+	 */
+	public void println(String message, int messageType) {
+
+		if(messageType == MSG_NORMAL){
+			//Not printing normal messages
+		}
+		else{
+			printUtility.println(message, messageType);
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranDumpCMDLineRunner.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.util.sourcecode.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Vector;
+
+import com.nokia.s60tools.util.cmdline.CmdLineCommandExecutorFactory;
+import com.nokia.s60tools.util.cmdline.CmdLineExeption;
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor;
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+
+/**
+ * Helper Class for running <code>\epoc32\release\[variant]\[build]\petran.exe -dump</code> for founding 
+ * method address by ordinal
+ */
+public class PetranDumpCMDLineRunner implements ICmdLineCommandExecutorObserver {
+
+	/**
+	 * Constants for executing command-line commands
+	 */	
+	private static final String C_PARAM = "/C"; //$NON-NLS-1$
+	private static final String CMD_PARAM = "cmd"; //$NON-NLS-1$
+	private static final String HEXA_ADDRESS_PREFIX = "0x"; //$NON-NLS-1$
+	private static final String TOOLS = "tools"; //$NON-NLS-1$
+	private static final String ORDINAL_AND_WHITE_SPACE = "ordinal "; //$NON-NLS-1$
+	private static final String PETRAN_EXE_DUMP_PARAM = "-dump"; //$NON-NLS-1$
+	private static final String PETRAN_EXE_E_PARAM = "e"; //$NON-NLS-1$
+	/**
+	 * Executable name for petran.exe
+	 */
+	public static final String PETRAN_EXE_NAME = "petran.exe"; //$NON-NLS-1$
+	/**
+	 * Executable name for elftran.exe
+	 */
+	public static final String ELFTRAN_EXE_NAME = "elftran.exe"; //$NON-NLS-1$
+
+    private ICmdLineCommandExecutor cmdLineExecutor = null;
+	private PetranDumpLineReader stdOutReader;
+	private String ordinalIndex;
+	private PetranDumpLineReader stdErrReader;
+	private IConsolePrintUtility printUtility = null;
+
+	/**
+	 * Creates CMD line runner for running <code>petran.exe</code> to seek method address by ordinal
+	 * @param printUtility Print utility used to report error, warnings, and info messages.
+	 * @throws UnsupportedOSException if currently used OS is not supported
+	 */
+    public PetranDumpCMDLineRunner( IConsolePrintUtility printUtility ) throws UnsupportedOSException{
+		this.printUtility = printUtility;
+		cmdLineExecutor = CmdLineCommandExecutorFactory.
+			CreateOsDependentCommandLineExecutor(this, new PetranCMDLinePrintUtility( printUtility ));    	
+    }
+    
+	/**
+	 * Get address for function by ordinal
+	 * @param ordinal Function ordinal.
+	 * @param dllName DLL name.
+	 * @param variant Build variant.
+	 * @param build Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @return Address for method
+	 * @throws InterruptedException if the current thread is interrupted by another thread while it is waiting.
+	 * @throws CmdLineExeption if there was errors in command line run.
+	 * @throws NumberFormatException if found address is not valid address.
+	 */
+	public String getAddress(String ordinal, String dllName, String variant, String build, String epocRootPath)  
+	throws InterruptedException, CmdLineExeption, NumberFormatException{
+		
+		if(ordinal == null || ordinal.trim().length() == 0){
+			return null;
+		}
+		
+		this.ordinalIndex = ordinal.trim() + ":";		 //$NON-NLS-1$
+		
+		String[] cmdLineArray = buildCommandLine(ordinal, dllName, variant, build, epocRootPath);
+		stdOutReader = new PetranDumpLineReader( new ArrayList<String>());
+		stdErrReader = new PetranDumpLineReader( new ArrayList<String>());
+		//Running synchronous command
+		int res = cmdLineExecutor.runSyncCommand(cmdLineArray, stdOutReader, stdErrReader);
+
+		//get address from result, throws exeption if there was some errors
+		String addr = seekAddressFromResult();
+		
+		if(addr == null){
+			//Throw exception if there is errors or prints warning if there is no errors in stdErrReader
+			handleError(res);		
+		}		
+				
+		return addr;
+	}
+
+	/**
+	 * Get address for function by given ordinal
+	 * @param ordinal Function ordinal
+	 * @param dllPath DLL path
+	 * @param epocRootPath EPOCROOT path
+	 * @return Address for the method
+	 * @throws InterruptedException
+	 * @throws CmdLineExeption
+	 * @throws NumberFormatException
+	 */
+	public String getAddress(String ordinal, String dllPath, String epocRootPath)  
+	throws InterruptedException, CmdLineExeption, NumberFormatException{
+		
+		if(ordinal == null || ordinal.trim().length() == 0){
+			return null;
+		}
+		
+		this.ordinalIndex = ordinal.trim() + ":";		 //$NON-NLS-1$
+		
+		String[] cmdLineArray = buildCommandLine(ordinal, dllPath, epocRootPath);
+		stdOutReader = new PetranDumpLineReader( new ArrayList<String>());
+		stdErrReader = new PetranDumpLineReader( new ArrayList<String>());
+		//Running synchronous command
+		int res = cmdLineExecutor.runSyncCommand(cmdLineArray, stdOutReader, stdErrReader);
+
+		//get address from result, throws exeption if there was some errors
+		String addr = seekAddressFromResult();
+		
+		if(addr == null){
+			//Throw exception if there is errors or prints warning if there is no errors in stdErrReader
+			handleError(res);		
+		}		
+				
+		return addr;
+	}
+	/**
+	 * Handles error situations, when results was not found.
+	 * @param retCode Return code from command-line execution.
+	 * @throws CmdLineExeption
+	 */
+	private void handleError(int retCode) throws CmdLineExeption {
+		//if there was no errors with running command, and we did not found result, just returning null
+		//error situation is, if there is errors in reader or return code was not expected
+		
+		//Check if there was some errors
+		ArrayList<String> errs = stdErrReader.getResultLinesArrayList();
+		if(!errs.isEmpty()){
+			StringBuffer b = new StringBuffer();
+			for (Iterator<String> iterator = errs.iterator(); iterator.hasNext();) {
+				String err = (String) iterator.next();
+				b.append(err);
+			}
+			throw new CmdLineExeption(b.toString());
+		}
+		//error handler for cases that there was no errors on running, but return code was not 0, and we did not found result
+		else if(retCode != 0){			
+			//if there was some errors with running command, and seekAddressFromResult was not sending Exception, writing message to console
+			printUtility.println(Messages.getString("PetranDumpCMDLineRunner.Unexpected_Return_Value_Warning") +retCode, IConsolePrintUtility.MSG_WARNING);//$NON-NLS-1$				
+		}		
+		
+	}
+
+	/**
+	 * Create a command line to execute command.
+	 * @param ordinal Function ordinal.
+	 * @param dllName DLL name.
+	 * @param variant Build variant.
+	 * @param build Build type (urel/udeb).
+	 * @param epocRootPath EPOCROOT path.
+	 * @return Command-line string array.
+	 * @throws IOException
+	 */
+	private String[] buildCommandLine(String ordinal, String dllName, String variant, String build, String epocRootPath){
+		Vector<String> cmdLineVector = new Vector<String>();
+		String epocRootPathWithSlash = epocRootPath.endsWith(File.separator) ? epocRootPath : epocRootPath + File.separatorChar; 
+		String dllPath = 
+			epocRootPathWithSlash
+			+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+			+SourceFileLocation.RELEASE_FOLDER_NAME + File.separatorChar
+			+variant + File.separatorChar
+			+build + File.separatorChar
+			+dllName;
+
+		// By default using elftran.exe for dumping function data
+		String exePath = 
+			epocRootPath + File.separatorChar 
+			+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+			+TOOLS + File.separatorChar
+			+ELFTRAN_EXE_NAME;
+		
+		if(!new File(exePath).exists()){
+			// If elftran.exe is not found using petran.exe instead as fallback mechanism
+			exePath = 
+				epocRootPath + File.separatorChar 
+				+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+				+TOOLS + File.separatorChar
+				+PETRAN_EXE_NAME;
+		}
+		
+		//Adding quotes (") to paths <command> --> "<command>"
+		//prevent problems with folder/file -names with white spaces.
+		
+		//running external command, cmd /C is needed
+		cmdLineVector.add("\"" + CMD_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		cmdLineVector.add("\"" + C_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Executable
+		cmdLineVector.add("\"" + exePath +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Parameters, excel if sheet to convert
+		cmdLineVector.add("\"" + PETRAN_EXE_DUMP_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		cmdLineVector.add("\"" + PETRAN_EXE_E_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Options, location to store converted xml file. 
+		cmdLineVector.add("\"" + dllPath +"\"");   //$NON-NLS-1$   //$NON-NLS-2$
+		
+		return cmdLineVector.toArray(new String[0]);
+	}
+
+	/**
+	 * Create a command line to execute command, based on given parameters.
+	 * @param ordinal Function ordinal.
+	 * @param dllPath DLL path
+	 * @param epocRootPath EPOCROOT path
+	 * @return Command-line string array.
+	 */
+	private String[] buildCommandLine(String ordinal, String dllPath, String epocRootPath){
+		Vector<String> cmdLineVector = new Vector<String>();
+		
+		// By default using elftran.exe for dumping function data
+		String exePath = 
+			epocRootPath + File.separatorChar 
+			+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+			+TOOLS + File.separatorChar
+			+ELFTRAN_EXE_NAME;
+		
+		if(!new File(exePath).exists()){
+			// If elftran.exe is not found using petran.exe instead as fallback mechanism
+			exePath = 
+				epocRootPath + File.separatorChar 
+				+SourceFileLocation.EPOC32_FOLDER_NAME + File.separatorChar
+				+TOOLS + File.separatorChar
+				+PETRAN_EXE_NAME;
+		}
+		
+		//Adding quotes (") to paths <command> --> "<command>"
+		//prevent problems with folder/file -names with white spaces.
+		
+		//running external command, cmd /C is needed
+		cmdLineVector.add("\"" + CMD_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		cmdLineVector.add("\"" + C_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Executable
+		cmdLineVector.add("\"" + exePath +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Parameters, excel if sheet to convert
+		cmdLineVector.add("\"" + PETRAN_EXE_DUMP_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		cmdLineVector.add("\"" + PETRAN_EXE_E_PARAM +"\"");//$NON-NLS-1$   //$NON-NLS-2$
+		// Options, location to store converted xml file. 
+		cmdLineVector.add("\"" + dllPath +"\"");   //$NON-NLS-1$   //$NON-NLS-2$
+		
+		return cmdLineVector.toArray(new String[0]);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#interrupted(java.lang.String)
+	 */
+	public void interrupted(String reasonMsg) {
+		//needed only because of CmdLineCommandExecutorFactory need ICmdLineCommandExecutorObserver implementation, 
+		//because this class using only synchronous method from CMD line running, observer not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#processCreated(java.lang.Process)
+	 */
+	public void processCreated(Process proc) {
+		//needed only because of CmdLineCommandExecutorFactory need ICmdLineCommandExecutorObserver implementation, 
+		//because this class using only synchronous method from CMD line running, observer not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#progress(int)
+	 */
+	public void progress(int percentage) {
+		//needed only because of CmdLineCommandExecutorFactory need ICmdLineCommandExecutorObserver implementation, 
+		//because this class using only synchronous method from CMD line running, observer not needed
+	}		
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed(int)
+	 */
+	public void completed(int exitValue) {
+		//needed only because of CmdLineCommandExecutorFactory need ICmdLineCommandExecutorObserver implementation, 
+		//because this class using only synchronous method from CMD line running, observer not needed
+	}
+
+	/**
+	 * Get address from result by ordinal.
+	 * @return address as hexa, e.g. 0x00001234 or null if can't found
+	 * @throws Exception if can't found result and there is some error messages in reader
+	 */
+	private String seekAddressFromResult() {
+		
+		ArrayList<String> results = stdOutReader.getResultLinesArrayList();		
+		String addr  = null;//address to return
+		
+		//seek lines and get wanted address
+		for (Iterator<String> iterator = results.iterator(); iterator.hasNext();) {
+			
+			String line = (String) iterator.next();
+
+			//Making sure that there is no tabs, only spaces
+			line = line.replaceAll("\t", " "); //$NON-NLS-1$ //$NON-NLS-2$
+			//removing multiple spaces: " +" means more than one white spaces, e.g. "a    b c" -> "a b c"
+			line = line.replaceAll(" +", " ");			 //$NON-NLS-1$ //$NON-NLS-2$
+			//remove extra spaces in the start and end of line
+			line = line.trim();
+
+			//Lines should be first like: "Ordinal    75:  00008129"
+			//So now it should be like: "Ordinal 75: 00008129"
+
+			//if current line is one of the ordinal lines
+			if(line.trim().toLowerCase().startsWith(ORDINAL_AND_WHITE_SPACE)){
+
+				//removing "ordinal " from line, so it will start with the number
+				line = line.substring(ORDINAL_AND_WHITE_SPACE.length());
+
+				//if line starts number what we are intressed of, e.g. "75:"
+				if(line.startsWith(ordinalIndex)){
+					//rest of the string is address
+					addr = line.substring(ordinalIndex.length()).trim();
+					checkAddressNumberFormat(addr);
+					if(!addr.toLowerCase().startsWith(HEXA_ADDRESS_PREFIX)){
+						addr = HEXA_ADDRESS_PREFIX + addr;						
+					}					
+					break;
+				}
+			}
+		}		
+		
+		//If not found, just returning null
+		return addr;
+	}
+
+	/**
+	 * Check that address is in number format.
+	 * @throws NumberFormatException if address is not in number format
+	 * @param addr Address string.
+	 */
+	private void checkAddressNumberFormat(String addr) throws NumberFormatException {
+		String number = addr;
+		if(number.toLowerCase().startsWith(HEXA_ADDRESS_PREFIX)){
+			number = number.substring(number.indexOf(HEXA_ADDRESS_PREFIX) +HEXA_ADDRESS_PREFIX.length() ) ;						
+		}
+		Integer.parseInt(number, 16);		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/PetranDumpLineReader.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.sourcecode.internal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver;
+import com.nokia.s60tools.util.cmdline.ICustomLineReader;
+
+/**
+ * Custom line reader for <code>petran.exe</code> command line executions.
+ */
+public class PetranDumpLineReader implements ICustomLineReader {
+
+	private final ArrayList<String> resultLinesArrayList;
+
+	public PetranDumpLineReader(ArrayList<String> resultLinesArrayList) {
+		this.resultLinesArrayList = resultLinesArrayList;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICustomLineReader#readLine(java.io.BufferedReader, com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver)
+	 */
+	public String readLine(BufferedReader br, 
+			   ICmdLineCommandExecutorObserver observer) throws IOException {		
+		String line = br.readLine();
+		if(line != null){
+			resultLinesArrayList.add(line);			
+		}
+		return line;
+	}
+
+	/**
+	 * Gets result line array.
+	 * @return the resultLinesArrayList
+	 */
+	public ArrayList<String> getResultLinesArrayList() {
+		return resultLinesArrayList;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/internal/ProjectFinder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,574 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.util.sourcecode.internal;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.internal.Messages;
+import com.nokia.s60tools.util.sourcecode.CannotFoundFileException;
+import com.nokia.s60tools.util.sourcecode.IProjectFinder;
+
+/**
+ * Utility for finding mmp file for given source path, and
+ * bld.inf file for given mmp file.
+ */
+public class ProjectFinder implements IProjectFinder {
+
+	//
+	// Constants for file searching
+	//
+	private final String MMP_FILE_PATTERN = ".mmp"; //$NON-NLS-1$
+	private final String MMH_FILE_PATTERN = ".mmh"; //$NON-NLS-1$
+	private final String INF_FILE_PATTERN = "bld.inf"; //$NON-NLS-1$
+	private final String SOURCE_SEARCH_STRING = "source"; //$NON-NLS-1$
+	private final String INCLUDE_SEARCH_STRING = "#include"; //$NON-NLS-1$
+	private final String GROUP_FOLDER_NAME = "group"; //$NON-NLS-1$
+	private final String PRJ_MMPFILES_STR = "PRJ_MMPFILES"; //$NON-NLS-1$
+	private final String COMMENT_STR = "//"; //$NON-NLS-1$
+	private final String SEARCH_LEVEL1_STR = "../"; //$NON-NLS-1$
+	private final String SEARCH_LEVEL2_STR = "..\\"; //$NON-NLS-1$
+	//
+	// Constants for search level dephts
+	//	
+	private final int BLD_FILE_SEARCH_LEVEL = 2;
+	private final int MMP_FILE_SEARCH_LEVEL = 4;
+
+	/**
+	 * Console utility used to report error, warnings, and info message. 
+	 */
+	private IConsolePrintUtility printUtility;
+	/**
+	 * Progress monitor used to check cancel status of the calling job.
+	 */
+	private IProgressMonitor monitor = null;
+	
+	/**
+	 * Constructor.
+	 * @param printUtility Print utility used to report error, warnings, and info messages.
+	 *                     If set to <code>null</code> no reporting is done.
+	 * @param monitor Progress monitor used to check cancel status of the calling job.
+	 *                Cannot be <code>null</code>.
+	 */
+	public ProjectFinder(IConsolePrintUtility printUtility, IProgressMonitor monitor){
+		this.printUtility = printUtility;
+		this.monitor = monitor;
+	}	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.IProjectFinder#findBLDINFFile(java.lang.String)
+	 */
+	public String findBLDINFFile(String MMPFilePath) throws CannotFoundFileException {
+		File file = new File(MMPFilePath);
+		File parentDir = file.getParentFile();
+		String searchString = fileNameWithoutExtension(file.getName());
+		
+		String result = searchStringFromDirectory(parentDir, searchString,
+						null, false, true, BLD_FILE_SEARCH_LEVEL, null);
+		if(result == null) {
+			if(isCanceled()){
+				return null;
+			}
+			else{
+				String errMsg = Messages.getString("ProjectFinder.BldInfNotFound_Exception_Msg"); //$NON-NLS-1$
+				if(printUtility != null){
+					printUtility.println(errMsg, IConsolePrintUtility.MSG_ERROR);					
+				}
+				throw new CannotFoundFileException(errMsg + MMPFilePath); 
+			}
+		}
+		return result;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.IProjectFinder#findMMPFile(java.lang.String)
+	 */
+	public String findMMPFile(String sourceFilePath) throws CannotFoundFileException {
+		String checkedSourceFilePath = checkSourceFilePath(sourceFilePath);
+		if(checkedSourceFilePath == null) {
+			String errMsg = Messages.getString("ProjectFinder.SourceFileNotFound_Exception_Msg"); //$NON-NLS-1$
+			if(printUtility != null){
+				printUtility.println(errMsg, IConsolePrintUtility.MSG_ERROR);				
+			}
+			throw new CannotFoundFileException(errMsg + sourceFilePath); 
+		}
+		
+		File file = new File(checkedSourceFilePath);
+		File parentDir = file.getParentFile();
+		String searchString = file.getName();
+		
+		String result = searchStringFromDirectory(parentDir, searchString,
+						SOURCE_SEARCH_STRING, true, true, MMP_FILE_SEARCH_LEVEL, null);
+		if(result == null) {
+			if(isCanceled()){
+				return null;
+			}
+			else{
+				String errMsg = Messages.getString("ProjectFinder.MmpFileNotFound_Exception_Msg"); //$NON-NLS-1$
+				if(printUtility != null){
+					printUtility.println(errMsg, IConsolePrintUtility.MSG_ERROR);					
+				}
+				throw new CannotFoundFileException(errMsg + checkedSourceFilePath); 
+			}
+		}
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see com.nokia.s60tools.util.sourcecode.IProjectFinder#getRootLevelFromBldInf(java.lang.String)
+	 */
+	public int getRootLevelFromBldInf(String bldInfFilePath) throws IOException {
+		// Getting variables.
+		FileInputStream in = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		int rootLevelCount = 0;
+
+		try {
+			in = new FileInputStream(bldInfFilePath);
+			isr = new InputStreamReader(in);
+			br = new BufferedReader(isr);
+
+			// Getting root level count.
+			rootLevelCount = getRootLevelFromBufferedReader(br, bldInfFilePath);
+			
+			// Adding one to root level count if root is group folder.
+			if(isRootLevelGroupFolder(bldInfFilePath, rootLevelCount)){
+				rootLevelCount++;
+			}
+			// Closing resources.
+		} finally {
+			if (in != null) {
+				in.close();
+			}
+			if (isr != null) {
+				isr.close();
+			}
+			if (br != null) {
+				br.close();
+			}
+		}
+		return rootLevelCount;
+	}
+
+	/**
+	 * Reads lines from reader, parses lines for references to upper directories
+	 * and returns how many levels bld.inf file is from root.
+	 * @param reader BufferedReader from which data is used to get root level.
+	 * @param bldInfFilePath Path to bld.inf file.
+	 * @return How far project root is from bld.inf.
+	 * @throws IOException if exception occurs when handling the bld.inf file.
+	 */
+	private int getRootLevelFromBufferedReader(BufferedReader reader, String bldInfFilePath) throws IOException{
+		int rootLevelCount = 0;
+		String searchString1 = SEARCH_LEVEL1_STR;
+		String searchString2 = SEARCH_LEVEL2_STR;
+		String line = null;
+
+		// Going through file line by line.
+		while ((line = reader.readLine()) != null) {
+			line = line.trim();
+			// Excluding comment lines.
+			if(line.startsWith(COMMENT_STR)){
+				continue;
+			}
+
+			// Checking if line contains reference to upper directory level.
+			while (line.startsWith(searchString1)) {
+				// "../" or its multiple was found from beginning of line. Creating value for next comparison.
+				rootLevelCount++;
+				searchString1 += SEARCH_LEVEL1_STR;
+				searchString2 += SEARCH_LEVEL2_STR;
+			}
+			while (line.startsWith(searchString2)) {
+				// "..\" or its multiple was found from beginning of line. Creating value for next comparison.
+				rootLevelCount++;
+				searchString1 += SEARCH_LEVEL1_STR;
+				searchString2 += SEARCH_LEVEL2_STR;
+			}
+			
+			// Checking if include line contains reference to upper directory level.
+			if(line.startsWith(INCLUDE_SEARCH_STRING)){
+				while (line.contains(searchString1)) {
+					// "../" or its multiple was found. Creating value for next comparison.
+					rootLevelCount++;
+					searchString1 += SEARCH_LEVEL1_STR;
+					searchString2 += SEARCH_LEVEL2_STR;
+				}
+				while (line.contains(searchString2)) {
+					// "..\" or its multiple was found. Creating value for next comparison.
+					rootLevelCount++;
+					searchString1 += SEARCH_LEVEL1_STR;
+					searchString2 += SEARCH_LEVEL2_STR;
+				}
+			}
+		}
+		
+		return rootLevelCount;
+	}
+	
+	/**
+	 * Checks if current root level folder is named as "group".
+	 * @param bldInfFilePath Bld.inf file path that is checked.
+	 * @param rootLevelCount How far project root is from bld.inf.
+	 * @return True if root folder name is group. False otherwise. 
+	 */
+	private boolean isRootLevelGroupFolder(String bldInfFilePath, int rootLevelCount) {
+		File file = new File(bldInfFilePath);
+		
+		// Removing file name.
+		file = file.getParentFile();
+
+		// Getting to correct directory by removing correct amount of folders names.
+		for(int i = 0;i < rootLevelCount;i++){
+			file = file.getParentFile();
+		}
+		
+		String dirName = file.getName();
+		
+		// Adding one to rootLevelCount if directory name is group.
+		if(dirName.equalsIgnoreCase(GROUP_FOLDER_NAME)) {
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * Checks that file really exists and that file name is correct.
+	 * It returns correct file when case of file name doesn't match.
+	 * @param sourceFilePath Source file to check.
+	 * @return Checked source file or null if file was not found.
+	 */
+	private String checkSourceFilePath(String sourceFilePath) {
+		File file = new File(sourceFilePath);
+		
+		String fileName = file.getName();
+		
+		// Checking that directory exists.
+		File directory = file.getParentFile();
+		if(!directory.exists()){
+			return null;
+		}
+		
+		// Go though files in directory. Checks and returns file with correct case.
+		File[] files = directory.listFiles();
+		for(File tmpFile : files){
+			if(tmpFile.getName().equalsIgnoreCase(fileName)){
+				return tmpFile.getAbsolutePath();
+			}
+		}
+		
+		return null;
+	}
+	/**
+	 * Returns file name without file extension.
+	 * @param fileName File name which is modified.
+	 * @return File name without extension or same string.
+	 */
+	private String fileNameWithoutExtension(String fileName) {
+		if(fileName.indexOf('.') > 0) {
+			return fileName.substring(0, fileName.lastIndexOf('.'));
+		}
+		return fileName;
+	}
+
+	/**
+	 * Searches specific directory when searching searchString.
+	 * First step is to search string from files.
+	 * Then subdirectories are search starting from group folder.
+	 * Finally upper directories are searched.
+	 * @param directoryName Directory to be searched.
+	 * @param searchString String that is searched for.
+	 * @param searchBySource True if source string is searched from mmp file.
+	 * @param filesToSearch From which files string is searched.
+	 * @param searchSubFolders <code>True</code> if subfolders are to be searched.
+	 * @param searchLevel Defines how many levels upwards search will be extended.
+	 * @param excludedFolder Excludes folder from search. Used to prevent searching same folder.
+	 * @return First file that contains searchString and has fileExtension or <code>null</code>.
+	 */
+	private String searchStringFromDirectory(File directoryName, String searchString, String secondarySearchString,
+				boolean searchMmpFile, boolean searchSubFolders, int searchLevel, File excludedFolder) {
+		// Returning null if search is canceled.
+		if(isCanceled()){
+			return null;
+		}
+		
+		File[] files = directoryName.listFiles();
+		if(files == null){
+			// Returning null if file isn't correct directory.
+			return null;
+		}
+		ArrayList<File> directories = new ArrayList<File>();
+		File groupDirectory = null;
+		
+		// First going through files.
+		for(File file : files) {
+			// Adding directory to separate list for later use.
+			if(file.isDirectory()){
+				// Saving group directory name so that in can be checked first.
+				if(file.getName().equalsIgnoreCase(GROUP_FOLDER_NAME)){
+					groupDirectory = file;
+				}
+				else {
+					directories.add(file);
+				}
+			}
+			else {
+				String fileName = checkFile(searchString, file, secondarySearchString, searchMmpFile);
+				if(fileName != null) {
+					// File was found. Returning it.
+					return fileName;
+				}
+			}
+		}
+		
+		// Checking for group directory.
+		if(groupDirectory != null && groupDirectory != excludedFolder){
+			// Searching recursively sub directories.
+			String fileName = searchStringFromDirectory(groupDirectory, searchString,
+					secondarySearchString, searchMmpFile, searchSubFolders, 0, null);
+			if(fileName != null) {
+				// File was found. Returning it.
+				return fileName;
+			}			
+		}
+		
+		// Then going through other sub directories.
+		for(File file : directories){
+			// Handling directories
+			if(file.isDirectory() && searchSubFolders) {
+				// Checking if folder is excluded from search. 
+				if(excludedFolder == null || !excludedFolder.equals(file)) {
+					// Searching recursively sub directories.
+					String fileName = searchStringFromDirectory(file, searchString,
+							secondarySearchString, searchMmpFile, searchSubFolders, 0, null);
+					if(fileName != null) {
+						// File was found. Returning it.
+						return fileName;
+					}
+				}
+			}
+		}
+		
+		// Searching upper directories.
+		if(searchLevel > 0) {
+			return searchStringFromDirectory(directoryName.getParentFile(), searchString,
+					secondarySearchString, searchMmpFile, searchSubFolders, searchLevel - 1, directoryName);
+		}
+		// File was not found. Returning null.
+		return null;
+	}
+
+	/**
+	 * Checks file based on file name and returns path to file if search 
+	 * string was found from the file.
+	 * @param searchString Search string.
+	 * @param file         File object to check for.
+	 * @param searchBySource Searching based on mmp file if set to <code>true</code>.
+	 * @param searchMmpFile Search based on source  file if set to <code>true</code>.
+	 * @return Path if correct file was found. Otherwise null.
+	 */
+	private String checkFile(String searchString, File file,
+			String secondarySearchString, boolean searchMmpFile) {
+		// Getting variables.
+		String fileName = file.getName();
+		
+		try {
+			if(searchMmpFile){
+				// Checking .mmp file.
+				if(fileNameMatches(fileName, MMP_FILE_PATTERN)) {
+					// File name matches with pattern.
+					if(searchFile(file, searchString, secondarySearchString, null)) {
+						// String was found from file. Returning file name.
+						return file.getPath();
+					}
+				}
+				// Checking .mmh file.
+				if(fileNameMatches(fileName, MMH_FILE_PATTERN)) {
+					// File name matches with pattern.
+					if(searchFile(file, searchString, secondarySearchString, null)) {
+						// String was found from mmh file. Searching mmp file for this file.
+						return searchMmpForMmhFile(file);
+					}
+				}		
+			}
+			else{
+				// Checking bld.inf file.
+				if(fileNameMatches(fileName, INF_FILE_PATTERN)) {
+					// File name matches with pattern.
+					if(searchFile(file, searchString, secondarySearchString, PRJ_MMPFILES_STR)) {
+						// String was found from file. Returning file name.
+						return file.getPath();
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			if(printUtility != null){
+				String errMsg = Messages.getString("ProjectFinder.UnexpectedException_ErrMsg"); //$NON-NLS-1$
+				printUtility.println(errMsg + ": " + e.getMessage(), IConsolePrintUtility.MSG_ERROR);					 //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	
+	/**
+	 * Searching .mmp file that has included .mmh file.
+	 * @param file Searching mmp file for this file.
+	 * @return Full file path or null if file was not found.
+	 */
+	private String searchMmpForMmhFile(File file) {
+		File parentDir = file.getParentFile();
+		String searchString = file.getName();
+		// Using include search string as mmh files are included in mmp files.
+		return searchStringFromDirectory(parentDir, searchString, INCLUDE_SEARCH_STRING,
+				true, true, MMP_FILE_SEARCH_LEVEL, null);
+	}
+
+	/**
+	 * Checks if filePattern matches to the end of fileName.
+	 * @param fileName File name to be checked.
+	 * @param filePattern Pattern to which file name is checked.
+	 * @return True if end of the file name matches to pattern.
+	 */
+	private boolean fileNameMatches(String fileName, String filePattern) {
+		if(fileName.length() < filePattern.length()) {
+			return false;
+		}
+		String reducedFileName = fileName.substring(fileName.length() - filePattern.length());
+		return reducedFileName.equalsIgnoreCase(filePattern);
+	}
+	
+	/**
+	 * Searches specific file when searching searchString
+	 * @param file File to be searched.
+	 * @param searchString String that is searched for.
+	 * @param secondarySearchString This String must be in same line as searchString.
+	 * @param searchStartString Comparison is started after this string.
+	 * @return <code>True</code> if stringString is found.
+	 * @throws FileNotFoundException File was not found.
+	 * @throws IOException 
+	 */
+	private boolean searchFile(File file, String searchString, String secondarySearchString,
+				String searchStartString) throws FileNotFoundException, IOException{
+		FileInputStream in = null;
+		InputStreamReader isr = null;
+		BufferedReader br = null;
+		
+		boolean returnValue = false;
+
+		try {
+			in = new FileInputStream(file);
+			isr = new InputStreamReader(in);
+			br = new BufferedReader(isr);
+
+			String line = null;
+
+			// Starting search when searchStartString is found from stream.
+			if(searchStartString != null){
+				// Reading lines until searchStartString is found. 
+				while ((line = br.readLine()) != null) {
+					if(checkLine(line, searchStartString, false)){
+						break;
+					}
+				}				
+			}
+			// seek wanted text from file line by line
+			while ((line = br.readLine()) != null) {
+				// Checking if searchString is found from line.
+				if (secondarySearchString != null){
+					// Checking if secondary search string is found.
+					if(checkLine(line, secondarySearchString, false)){
+						returnValue = checkLine(line, searchString, false);
+					}
+				}
+				else {
+					returnValue = checkLine(line, searchString, false);
+				}
+				// Stopping search if value was found.
+				if(returnValue){
+					break;
+				}
+			}
+		} finally {
+			if (in != null) {
+				in.close();
+			}
+			if (isr != null) {
+				isr.close();
+			}
+			if (br != null) {
+				br.close();
+			}
+		}
+		return returnValue;
+	}
+	
+	/**
+	 * Checking if string is found from line.
+	 * @param line String from which searchString is searched.
+	 * @param searchString This is searched for.
+	 * @param isCaseSensitive True is search is case sensitive.
+	 * @return True if searchString was found from line.
+	 */
+	private boolean checkLine(String line, String searchString, boolean isCaseSensitive){
+		// Removing possible white space.
+		line = line.trim();
+		
+		// Excluding comment lines.
+		if(line.startsWith(COMMENT_STR)){
+			return false;
+		}
+		
+		// Getting pattern that is searched.
+		Pattern pattern;
+		if(isCaseSensitive){
+			pattern = Pattern.compile(searchString);
+		}
+		else{
+			pattern = Pattern.compile(searchString, Pattern.CASE_INSENSITIVE);
+		}
+		Matcher matcher = pattern.matcher(line);
+		
+		return matcher.find();
+	}
+
+	/**
+	 * Checks if search is canceled.
+	 * @return True if monitor is not null and search is canceled. Otherwise false.
+	 */
+	private boolean isCanceled() {
+		if(monitor != null){
+			return monitor.isCanceled();
+		}
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/sourcecode/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides source code searching and parsing utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/xml/XMLIndentor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.util.xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * Class for adding indents to XML file.  
+ */
+public class XMLIndentor {
+	
+	
+	/**
+	 * Default construction. Can be instantiated
+	 * only by using public static methods.
+	 */
+	private XMLIndentor(){
+		
+	}
+	
+	/**
+	 * How deep the indents will be. Current value 2.
+	 */
+	public static final int DEFAULT_INDENT_NUMBER = 2;
+
+	/**
+	 * Adding indents to XML String.
+	 * 
+     * <p>
+     * 
+     * NOTE: There must not be newlines (\n or \r\n) in String between elements, if so, that line is not going to be indented. 
+	 * 
+	 * @param in XML String to be indent
+	 * @param encodingType valid encoding type to character set, e.g. 
+	 * {@link FileUtils#ENCODING_TYPE_UTF_8}
+	 * @param indentNumber how many white spaces will one indent be, 
+	 *                     must be at least 1, if not  {@link XMLIndentor#DEFAULT_INDENT_NUMBER} is used.
+	 * @return Indented result. 
+	 * @throws UnsupportedEncodingException 
+	 * @throws TransformerException 
+	 */
+	public static String indentXML(String in, String encodingType, int indentNumber) throws UnsupportedEncodingException, TransformerException {
+		
+		/*
+		 * e.g. XML:
+		 * <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+		 * <atom><type>helium</type></atom>
+		 * 
+		 * is converted to:
+		 * 
+		 * <?xml version="1.0" encoding="UTF-8"?>
+		 * <atom>
+	     *   <type>helium</type>
+	     * </atom>
+	     * 
+		 */
+		
+		//Check that 0 or -n is not used
+		if(indentNumber < 1){
+			indentNumber =  DEFAULT_INDENT_NUMBER;
+		}
+		
+		TransformerFactory factory = TransformerFactory.newInstance();
+		//Setting number of indents
+		factory.setAttribute("indent-number", new Integer(indentNumber));
+		Transformer transformer = factory.newTransformer();
+		//Setting property, that indents will be made when transform is done
+		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+		String result;		
+		if(encodingType != null){
+			//Setting encoding			
+			transformer.setOutputProperty(OutputKeys.ENCODING, encodingType);
+			result = transform(in, encodingType, transformer);
+		}else{
+			result = transform(in, transformer);
+		}
+
+		return result;
+	}
+
+	/**
+	 * Transform with given encoding type.
+	 * @param in 			XML String to be indent
+	 * @param encodingType Valid encoding type to character set, e.g. 
+	 *                     {@link FileUtils#ENCODING_TYPE_UTF_8}
+	 * @param transformer  Transformer object.
+	 * @return Indented result. 
+	 * @throws UnsupportedEncodingException
+	 * @throws TransformerException
+	 */
+	private static String transform(String in, String encodingType,
+			Transformer transformer) throws UnsupportedEncodingException,
+			TransformerException {
+		InputStream inSource = new ByteArrayInputStream(in
+				.getBytes(encodingType));
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		StreamResult res = new StreamResult(new OutputStreamWriter(out,
+				encodingType));
+		// Making indents to XML by doing transform for it
+		transformer.transform(new StreamSource(inSource), res);
+		String result = out.toString(encodingType);
+		return result;
+	}	
+	/**
+	 * Transform without encoding type
+	 * @param in 			XML String to be indent
+	 * @param transformer  Transformer object.
+	 * @return Indented result. 
+	 * @throws UnsupportedEncodingException
+	 * @throws TransformerException
+	 */
+	private static String transform(String in,
+			Transformer transformer) throws UnsupportedEncodingException,
+			TransformerException {
+		InputStream inSource = new ByteArrayInputStream(in
+				.getBytes());
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		StreamResult res = new StreamResult(new OutputStreamWriter(out));
+		// Making indents to XML by doing transform for it
+		transformer.transform(new StreamSource(inSource), res);
+		String result = out.toString();
+		return result;
+	}	
+	
+	/**
+	 * Adding indents to XML String. No specific encoding type is used,
+	 * indent number is {@link XMLIndentor#DEFAULT_INDENT_NUMBER}
+	 * <p> 
+     * NOTE: There must not be newlines (\n or \r\n) in String between elements, 
+     * if so, that line is not going to be indented. 
+	 * 
+	 * @param in 	XML String to be indent
+	 * @return Indented result. 
+	 * @throws UnsupportedEncodingException 
+	 * @throws TransformerException 
+	 */
+	public static String indentXML(String in) throws UnsupportedEncodingException, TransformerException {
+		/*
+		 * e.g. XML:
+		 * <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+		 * <atom><type>helium</type></atom>
+		 * 
+		 * is converted to:
+		 * 
+		 * <?xml version="1.0" encoding="UTF-8"?>
+		 * <atom>
+	     *   <type>helium</type>
+	     * </atom>
+	     * 
+		 */		
+		return indentXML(in, null, DEFAULT_INDENT_NUMBER);
+	}	
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/com/nokia/s60tools/util/xml/package.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for package short description text-->
+Provides XML utilities.
+
+<p>
+<!-- Place for package long description text-->
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frameworkplugins/com.nokia.s60tools.util/src/overview.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+
+<!-- Place for plug-in long description text-->
+Carbide.c++ Extensions Utilities plug-in API reference.
+
+<p>
+<!-- Place for plug-in long description text-->
+This plug-in provides miscellaneous utility classes for
+console output, debugging, and command line tool interaction.
+<p/>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.carbide.extensions.hticonnection/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.carbide.extensions.hticonnection/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.hticonnection"
+      label="Carbide.c++ Extensions - HTI Connection"
+      version="1.3.0"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.hticonnection">
+
+   <description>
+      The HTI Connection service provides a communication interface between Carbide.c++ and an emulator/device.
+   </description>
+
+   <copyright>
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: "http://www.eclipse.org/legal/epl-v10.html".
+   </copyright>
+
+   <license url="license.txt">   
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+
+Part of the graphics of the program are from Eclipse 3.4 platform
+and CDT project in Eclipse community, which are made available under
+the terms of the Eclipse Public License v1.0.
+A copy of the EPL is provided at
+http://www.eclipse.org/legal/epl-v10.html
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.core.runtime" version="3.4.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.ui" version="3.4.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.jface.text" version="3.4.0" match="greaterOrEqual"/>
+      <import plugin="com.nokia.s60tools.ui" version="1.1.9" match="greaterOrEqual"/>
+      <import plugin="com.nokia.s60tools.util" version="1.1.11" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.core.resources" version="3.4.0" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.hticonnection"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.hticonnection.help"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.carbide.extensions.hticonnection/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Part of the graphics of the program are from Eclipse 3.4 platform
+and CDT project in Eclipse community, which are made available under
+the terms of the Eclipse Public License v1.0.
+A copy of the EPL is provided at
+http://www.eclipse.org/legal/epl-v10.html
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Wed Dec 10 09:47:19 EET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name:  Carbide.c++ Extensions - HTI Connection Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.hticonnection.help;singleton:=true
+Bundle-Version: 1.3.0
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.help
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: com.nokia.s60tools.hticonnection.help.HelpPlugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+</head>
+<body>
+
+<h2>About This Content</h2>
+<p>June 25, 2009</p>
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.	
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+/* 	20070523-Removed top margin size to close gap between location breadcrumbs and page title	*/
+html {
+	margin: 0px 10px 10px 10px;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(html/images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               about.html,\
+               book.css
+		.project,\
+jars.compile.order = .
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/concepts/concepts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Concepts</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Concepts</h2>
+<p>The following concepts provide information on common Carbide.c++ terminology, technologies, and processes:</p>
+<ul>
+<li><a href="hti.htm">Harmonized Test Interface (HTI)</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/concepts/hti.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Harmonized Test Interface (HTI)</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Harmonized Test Interface (HTI)</h2>
+<p>HTI is a software component that enables remote controlling of Symbian OS. The purpose of HTI is to help and enable automated testing of devices running on Symbian OS.</p>
+<p>On a high-level, the HTI on Symbian OS side consists of HTI Framework and plug-in Test Services. The HTI Framework handles the messaging and communication between the device doing the remote controlling (usually PC) and the Symbian OS device being controlled. The Test Services are components that are plugged in to the HTI Framework and they execute different functionalities. Examples of Test Services are key press emulation, screen shot capture, file transfer, process starting/stopping, etc.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+ <context id="HTI_CONNECTION_MAIN_VIEW">
+  <description>HTI Connection's Main View</description>
+  <topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+  <topic label="Setting HTI Connection preferences" href="html/tasks/set_preferences.htm" />    	
+  <topic label="Setting up USB serial connection" href="html/tasks/comm_usb.htm" />
+  <topic label="Setting up Bluetooth connection" href="html/tasks/comm_bt.htm" />
+  <topic label="Toolbar" href="html/reference/toolbar.htm" />
+  <topic label="Troubleshooting" href="html/reference/troubleshooting.htm" />
+ </context>
+ 
+ <context id="HTI_CONNECTION_PREFERENCES">
+  <description>HTI Connection's preferences</description>
+  <topic label="Setting HTI Connection preferences" href="html/tasks/set_preferences.htm" />
+  <topic label="Setting up USB serial connection" href="html/tasks/comm_usb.htm" />
+  <topic label="Setting up Bluetooth connection" href="html/tasks/comm_bt.htm" />
+  <topic label="Troubleshooting" href="html/reference/troubleshooting.htm" /> 	
+ </context>
+ 
+ <context id="HTI_CONNECTION_ERROR_MESSAGE">
+  <description>Connection problems</description>
+  <topic label="Troubleshooting" href="html/reference/troubleshooting.htm" /> 	
+  <topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+  <topic label="Setting HTI Connection preferences" href="html/tasks/set_preferences.htm" />
+  <topic label="Setting up USB serial connection" href="html/tasks/comm_usb.htm" />
+  <topic label="Setting up Bluetooth connection" href="html/tasks/comm_bt.htm" />
+ </context>
+ 
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/GS_index.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting started</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Getting started</h2>
+<p>The information in this section will help you get started quickly using the basic features of the HTI Connection.</p>
+<p>Topics in this section include:</p>
+<ul>
+	<li><a href="overview.htm">Overview</a></li>
+	<li><a href="walk_through.htm">Basic walk-through</a></li>
+	<li><a href="prerequisites.htm">Prerequisites for use</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/overview.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Overview</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Overview</h2>
+<p>The HTI Connection service provides a communication interface between Carbide.c++ and <!--an emulator or -->an S60 target device. The HTI Connection manages the connection between Carbide.c++ and <!--the emulator or -->the device by starting the HTI Datagateway and shows a generated log in the <b>HTI Connection</b> view. The HTI Connection view shows information of events and errors from Datagateway.exe. The connection parameters can be modified from HTI Preferences.</p>
+<ul>
+	<li><a href="../concepts/hti.htm">Harmonized Test Interface (HTI)</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/prerequisites.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Prerequisites for use</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Prerequisites for use</h2>
+<p>Before you start using the HTI Connection, check the following items:</p>
+<ul>
+<li><!--When using HTI Connection with an S60 device, --> You have a serial or Bluetooth network connection between your PC and device.</li>
+<!--<li>When using HTI Connection with an emulator, a virtual COM port connected to the emulator is needed.</li>-->
+<li>HTIAdmin is installed into the device<!-- or emulator-->.</li>
+<li>HTIAdmin is started in the device<!-- or emulator-->.</li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/gettingstarted/walk_through.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Basic walk-through</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>Basic walk-through</h3>
+<p>The <b>HTI Connection</b> view opens when a plug-in is started, that is, when another plug-in starts using the Harmonized Test Interface (HTI) service. You can open the HTI Connection also by selecting <b>Carbide</b> > <b>HTI Connection.</b></p>
+<p>You can start using the HTI Connection by taking the following steps:</p>
+<ol>
+<li>In the device<!-- or emulator-->, start the HTI Framework by selecting <b>Menu</b> > <b>RnD Tools </b> > <b>HTI Admin</b> > <b>Options</b> > <b>Start</b>.</li>
+<li>In Carbide.c++, start the HTI Connection by selecting <b>Carbide</b> > <b>HTI Connection</b>.</li>
+<li>(When starting HTI connection for the first time) Set up a connection to the device (via <a href="../tasks/comm_usb.htm">USB serial cable</a> or <a href="../tasks/comm_bt.htm">Bluetooth</a>).</li>
+<li>Start the Datagateway by clicking <img src="../images/run_exc.gif"> in the <b>HTI Connection</b> toolbar.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../gettingstarted/prerequisites.htm">Prerequisites for use</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/Thumbs.db has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_01.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_02.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_03.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_04.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/add_hw_05.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/clear_co.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/com.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/connection_type.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/context_menu.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/delete_connection.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/environment_co.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/environment_co.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/green_fade_left_68_165_28.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/hti_preferences.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/lock_co.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/new_connection_1.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/new_connection_2.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/remote_connections_view.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/run_exc.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/run_exc_arrow.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/stop.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/tcpip.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection.help/html/images/toolbar.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/index.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.index"?>
+
+	<!-- INDEX INSTRUCTIONS
+	
+	Use the index.xml file to define the index entries for the plugin's 
+	help contents. In Eclipse 3.2 and beyond an Index tab appears in the Help
+	viewer making it possible for user to more easily locate subjects of
+	interest to them.
+		
+	In brief, every file used in the help documentation should have at least one
+	associated index entry for it. Ideally, it's simple to make two entries per
+	page by simply re-wording the subject slightly. For example, a view could
+	be indexed twice like this, 1) Breakpoint view, and 2) Views/Breakpoint.
+	
+	See ??? for details on creating indexes.
+	
+	-->
+
+<index>
+
+	<!-- AAAAAAAA -->
+
+	<!-- BBBBBBBB -->	
+
+	<!-- CCCCCCCC -->	
+
+	<!-- DDDDDDDD -->		
+
+	<!-- EEEEEEEE -->	
+
+	<!-- FFFFFFFF -->
+
+	<!-- GGGGGGGG -->	
+	
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+									<entry keyword="Legal" >
+		<topic href="html/legal.htm" />
+	</entry>
+	
+	<!-- MMMMMMMM -->
+	
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+			<entry keyword="Overview" >
+		<topic href="html/Getting_Started/overview.htm" />
+	</entry>
+	
+	<!-- PPPPPPPP -->
+	
+	<!-- QQQQQQQQ -->
+	
+	<!-- RRRRRRRR -->
+			<entry keyword="Release Notes" >
+		<topic href="html/release_notes.htm" />
+	</entry>
+	
+	<!-- SSSSSSSS -->
+	
+	<!-- TTTTTTTT -->
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+			<entry keyword="Basic walk-through" >
+		<topic href="html/Getting_Started/walk_through.htm" />
+	</entry>
+	
+	<!-- XXXXXXXX -->
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/legal.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>License Information</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>License Information</h3>
+<h5>COPYRIGHTS</h5>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0" which accompanies this distribution and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+<p>Initial Contributors:<br>
+Nokia Corporation - initial contribution</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/reference/references.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>References</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>References</h2>
+<p>The following references are available for this tool:</p>
+<ul>
+	<li><a href="toolbar.htm">Toolbar</a></li>
+	<li><a href="troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/reference/toolbar.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Toolbar</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Toolbar</h2>
+<p>The toolbar in the HTI Connection view contains the following icons:</p>
+
+<h5>Toolbar</h5>
+<img src="../images/toolbar.png">
+<p></p>
+
+<h5>Context menu</h5>
+<img src="../images/context_menu.png ">
+<p></p>
+<table width="492" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="130*">
+<col width="472*"></colgroup>
+<tbody>
+	<tr>
+		<th align="center">Button</th>
+		<th align="center">When to use?</th>
+	</tr>
+	<tr>
+		<td><img src="../images/environment_co.png"></td>
+		<td>To open the HTI Connection preferences page.</td>
+	</tr>
+	<tr>
+		<td><img src="../images/clear_co.gif"></td>
+		<td>To clear the text in HTI Connection view.</td>
+	</tr>
+	<tr>
+		<td><img src="../images/lock_co.gif"></td>
+		<td>To stop automatic screen scrolling.</td>
+	</tr>
+	<tr>
+		<td><img src="../images/run_exc.gif"></td>
+	<td>To start the Datagateway.</td>
+	</tr>
+	<tr>
+		<td><img src="../images/stop.gif"></td>
+		<td>To stop the Datagateway.</td>
+	</tr>
+</tbody>
+</table>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/reference/troubleshooting.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Troubleshooting</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Troubleshooting</h2>
+<p>The following table lists the messages that may be displayed when using the HTI Connection.</p>
+
+<table width="709" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="94*">
+<col width="95*"></colgroup>
+<thead>
+	<tr>
+		<td><b>Message</b></td>
+		<td><b>Action</b></td>
+	</tr>
+</thead>
+<tbody>
+	<tr>
+		<td>HTI agent in the device is not responding.</td>
+		<td><ul>
+			<li>Ensure that you have started the HTI framework in the device.</li>
+			<li>Ensure that your device is connected to a computer.</li>
+			<li>From computer settings, check which COM port is used.</li>
+			<li>Check the port and host fields (if using TCP/IP connection type).</li>
+			</ul>
+		</td>
+	</tr>
+	<tr>
+		<td>Connection failed.</td>
+		<td><ul>
+			<li>Select the correct COM port (if using serial connection type).</li>
+			<li>Check the port and host fields (if using TCP/IP connection type).</li>
+			</ul>
+		</td>
+	</tr>
+	<tr>
+		<td>Warning: Testing of a connection will close the existing connection.</td>
+		<td>You can resume the connection after the testing by clicking <b>Cancel.</b></td>
+	</tr>	
+	<tr>
+		<td>Datagateway has been shutdown unexpectedly. Do you want to manage connections?
+		<ul>
+			<li><b>Yes</b>: Opens the HTI Connection preferences dialog.</li>
+			<li><b>No</b>: Continues as before.</li>
+		</ul>
+		</td>
+		<td>Datagateway has been stopped by an unknown reason. It can be restarted either by clicking the <b>Start Datagateway</b> button in toolbar or by changing/testing settings in HTI Connection preferences.</td>
+	</tr>
+</tbody>
+</table>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/comm_usb.htm">Setting up USB serial connection</a></li>
+	<li><a href="../tasks/comm_bt.htm">Setting up Bluetooth connection</a></li>
+	<li><a href="../tasks/set_preferences.htm">Editing HTI connection settings</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/release_notes.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release Notes</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Release Notes</h2>
+<h4>HTI Connection &ndash; Version 1.3.0</h4>
+<p>Released 25th June 2009</p>
+<ul>
+	<li><a href="#description">Product description</a></li>
+	<li><a href="#features">Main features</a></li>
+	<li><a href="#newfeatures">What's new</a></li>
+	<li><a href="#installation">Installation notes</a></li>
+	<li><a href="#requirements">System requirements</a></li>
+	<li><a href="#compissues">Compatibility issues</a></li>
+	<li><a href="#issues">Known issues</a></li>
+</ul>
+
+<h3><a name="description"></a>Product description</h3>
+<p>The <b>HTI Connection</b> service provides a communication interface between Carbide.c++ and an emulator/device. HTI Connection manages the connection between Carbide.c++ and an emulator/decive by starting the HTI Datagateway and shows generated log in the <b>HTI Connection</b> view. The HTI Connection view shows information of events and errors from Datagateway.exe. The connection parameters can be modified from HTI Preferences.</p><p> HTI Connection opens when a plug-in is started, that is, when another plug-in starts using Harmonized Test Interface (HTI) service. You can open the HTI Connection also by selecting <b>Carbide</b> > <b>HTI Connection.</b></p>
+
+<h3><a name="features"></a>Main features</h3>
+<ul>
+	<li>Console for Datagateway logging</li>
+	<li>Starting and stopping Datagateway</li>
+	<li>HTI connection to device using serial port or TCP/IP connection</li>
+	<li>Connection test API</li>
+	<li>File transfer API</li>
+	<li>Screen capture API</li>
+	<li>Application control API</li>
+	<li>Key event API</li>
+</ul>
+
+<h3><a name="newfeatures"></a>What's new</h3>
+<ul>
+	<li>Change: Connections are handled via Carbide.c++ Remote Connections.</li>
+	<li>Change: API updates.</li>
+</ul>  
+
+<h3><a name="installation"></a>Installation notes</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic requirements:</p>
+<ul>
+	<li>Windows 2000 or Windows XP</li>
+	<li>Minimum Platform/SDK build PC.</li>
+	<li>Normal Platform/SDK build PC.</li>
+</ul>
+<p>Additional requirements:</p>
+<ul>
+	<li> Nokia Connectivity Drivers (part of PC Suite)</li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>
+<ul>
+	<li>If Carbide crashes when HTI Connection is active, it is possible that the datagateway.exe continues running in background. In this case, the datagateway.exe process needs to be ended from Task Manager.</li>
+	<li>There is a known issue with serial connection in the emulator environment. Virtual com ports are transferring data too fast, and as a result some data is lost. In most cases this can be fixed by increasing the <code>SendDelay</code> value in <b>HtiSerialComm.cfg</b> (<i>{EPOCROOT}\epoc32\winscw\c\</i>). It has been tested with <code>SendDelay=5</code>.</li>
+</ul>
+
+<h3>Version history</h3>
+<h5>Version 1.2.0 &ndash; 8th April 2009</h5>
+<ul>
+	<li>Change: Improved handling of connection errors.</li>
+	<li>Change: Connection status is displayed in the console.</li>
+	<li>Change: API updates.</li>
+</ul>
+
+<h5>Version 1.1.0 &ndash; 17th February 2009</h5>
+<ul>
+	<li>Feature: Application control API.</li>
+	<li>Feature: Key event API.</li>
+</ul>
+
+<h5>Version 1.0.0 &ndash; 19th December 2008</h5>
+<p>The first version.</p>
+
+<div id="footer">
+Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies).<br>
+All rights reserved. <br>
+This component and the accompanying materials are made available <br>
+under the terms of "Eclipse Public License v1.0" <br>
+which accompanies this distribution and is available <br>
+at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+<br><br>
+Initial Contributors:<br>
+Nokia Corporation - initial contribution
+<br><br>
+Contributors:<br>
+Description:
+
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_bt.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Setting up Bluetooth connection</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Setting up Bluetooth connection</h2>
+<ol>
+<li>In the S60 device, start <b>HtiAdmin</b> by selecting <b>Menu</b>> <b>RnD Tools</b> > <b>HtiAdmin</b>.</li>
+<li>Stop the HTI Framework if it is running by selecting <b>Options</b> > <b>Stop</b>.</li>
+<li>Enable Bluetooth connection by selecting <b>Options</b> > <b>Comms</b> > <b>Enable BT comm</b>, and then one of the following:
+<ul>
+<li><b>By BT address</b> to connect to a specified Bluetooth address.</li>
+<li><b>By BT name</b> to connect to a specified Bluetooth name.</li>
+<li><b>Search when starting</b> to select a Bluetooth connection when you start the HTI connection.</li>
+</ul>
+</li>
+<li>Start the HTI Framework by selecting <b>Options</b> > <b>Start</b>.</li>
+<li>On the PC, configure and start a Bluetooth serial port service. For instructions on setting up a serial port service on a PC, see the manual of your Bluetooth driver.</li>
+<li>Before starting the HTI connection, configure the PC’s Bluetooth serial port service not to use Secure Connection. This means that no pairing or authorization is needed when the phone connects to the PC.</li>
+<li>On the PC, open the <b>HTI Connection Carbide.c++ Extension</b> by selecting <b>Carbide</b> > <b>HTI Connection</b>.</li>
+<li>Click <img src="../images/run_exc_arrow.png"> and select <b>New Connection</b> to create a new connection, or select an existing connection.</li>
+<li>Configure the HTI connection to use <b>Serial</b> communication. Click <b>Next</b> and check that the HTI settings correspond to the Bluetooth serial port service configured and started earlier.</li>
+<li>(Optional) To test the connection, click <b>Initiate service testing</b>. The test status is shown in the <b>Status</b> pane:
+		<ul>
+			<li><i>Status not tested</i></li>
+			<li><i>Connection to HTI agent OK, HTI version x.xx</i></li>
+			<li><i>HTI agent in the device is not responding</i></li>
+			<li><i>Connection failed</i></li>
+		</ul>
+</li>
+<li>Click <b>Finish</b> to close the wizard. HTI Connection now starts the Datagateway with the connection you configured. If the Datagateway does not start automatically, start it by clicking <img src="../images/run_exc.gif">. The connection status will be displayed in the status line above the console screen:
+	<ul>
+		<li><i>Not connected</i></li>
+		<li><i>Testing connection</i></li>
+		<li><i>Trying to connect to &lt;connection name&gt;</i></li>
+		<li><i>Connected to &lt;connection name&gt;</i></li>
+	</ul>
+
+</li>
+</ol>
+
+<p>In addition to configuring and starting HTI connections, you can do the following:</p>
+<ul>
+<li>To stop the Datagateway, click <img src="../images/stop.gif">.</li>
+<li>To edit the connection settings, click <img src="../images/environment_co.png">.</li>
+<li>To start a connection after the initial setup, click <img src="../images/run_exc_arrow.png"> and select a connection.</li>
+<li>To delete a connection, open the <b>Remote Connections</b> view and use the dynamic menu. For details, see <a href="viewing_remote_connections.htm">Viewing remote connections</a>.</li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="tasks/viewing_remote_connections.htm">Viewing remote connections</li>
+	<li><a href="set_preferences.htm">Editing HTI connection settings</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_emulator.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Setting up virtual port for emulator connection</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Setting up virtual port for emulator connection</h2>
+<p>If you want to use HTI connection with an emulator, do the following:</p>
+<ol>
+<li><a href="#installport">Install a virtual COM port driver.</a></li>
+<li><a href="#confport">Configure the serial port settings and add a pair of emulated ports.</a></li>
+<li><a href="#confemul">Configure the emulator to use the defined emulated ports.</a></li>
+<li><a href="#testcomm">Test the communication between the emulator and the Datagateway.</a></li>
+</ol>
+
+<h3><a name="installport"></a>Installing a virtual COM port driver</h3>
+<ol>
+<li>Search the internet for a virtual COM port driver or a serial port bridge, and download a driver to a temporary folder.</li>
+<li>Open the Add Hardware Wizard by opening the <b>Control Panel</b>, selecting <b>Add Hardware</b>, and clicking <b>Next</b>. The Add Hardware Wizard first scans your system for new hardware.</li>
+<li>Select <b>Yes, I have already connected the hardware</b>, and click <b>Next</b>.</li>
+<li>In the <b>Installed hardware</b> list, select <b>Add a new hardware device</b>, and click <b>Next</b>.<p><img src="../images/add_hw_01.png "></p></li>
+<li>Select the option <b>Install the hardware that I manually select from a list (Advanced)</b>, and click <b>Next</b>.<p><img src="../images/add_hw_02.png "></p></li>
+<li>In <b>Common hardware types</b>, select <b>Multi-port serial adapters</b>, and click <b>Next</b>.<p><img src="../images/add_hw_03.png "></p></li>
+<li>Click <b>Have Disk</b> and browse to the driver file that you saved in a temporary folder. Select the file and click <b>Open</b>.</li>
+<li>Confirm the installation by clicking <b>OK</b>.</li>
+<li>If prompted, ignore the warning that the driver is not digitally signed, and click <b>Next</b>. This will install the virtual COM port driver.</li>
+</ol>
+
+<h3><a name="confport"></a>Configuring the serial port settings</h3>
+<ol>
+<li>In Control Panel, open <b>System</b> > <b>Hardware</b> > <b>Device Manager</b>.</li>
+<li>Open <b>Multi-port serial adapters</b> and right-click the driver that you installed, and select <b>Properties</b>.</li>
+<li>In the driver <b>Properties</b>, define at least one pair of emulated ports. Use COM ports that are not in use (COM7 and COM8). When you are done, click <b>OK</b>.<p><img src="../images/add_hw_04.png "></p><p><b>Note:</b> Adding a new pair of emulated ports requires a restart.</p><p><b>Note:</b> Do not use any existing COM ports. These are listed in the <b>Ports (COM & LPT)</b> section of <b>Device Manager</b>.</p></li>
+<li>Restart the computer.</li>
+</ol>
+
+<h3><a name="confemul"></a>Configuring the emulator</h3>
+<ol>
+<li>Open the S60 platfrom folder <b>\epoc32\winscw\c</b>, and set the following parameters in <b>hti.cfg</b> and <b>HtiSerialComm.cfg</b>:
+<p><b>hti.cfg</b>:</p>
+<ul>
+<li><b>EnableHtiAutoStart=1</b>: start the HTI framework during emulator startup.</li>
+<li><b>CommPlugin=SERIAL</b>: use serial communication.</li>
+<li><b>ShowConsole=1</b>: open console at startup.</li>
+</ul>
+
+<p><b>HtiSerialComm.cfg</b>:</p>
+<ul>
+<li><b>CommPort=7</b>: use COM port 8 (the port numbers run from 0 onwards, i.e. 0=COM1 etc.).</li>
+<li><b>SendDelay=5</b>: prevent data communication problems caused by virtual com ports.</li>
+</ul>
+</li>
+<li>Start the emulator <b>epoc.exe</b> in <b>\epoc32\RELEASE\WINSCW\urel</b>.</li>
+<li>In the emulator, start <b>HtiAdmin</b> by selecting <b>Menu</b> > <b>RnD Tools</b> > <b>HtiAdmin</b>.</li>
+<li>Check from the HtiAdmin that <b>Communication=SERIAL</b> and <b>Port=7</b>.</li>
+<li>If not started, start the HTI Framework by selecting <b>Options</b> > <b>Start</b>.</li>
+</ol>
+
+<h3><a name="testcomm"></a>Testing the communication between emulator and Datagateway</h3>
+<ol>
+<li>Start the emulator and HtiAdmin as instructed above.<p><b>Note:</b> Make sure that you start <b>urel</b> version of the emulator: <b>\Epoc32\Release\winscw\urel\epoc.exe</b></p></li>
+<li>Start the HTI Connection Carbide.c++ Extension by selecting <b>Carbide > HTI Connection</b>.</li>
+<li>Open the HTI Connection Preferences by clicking <img src="../images/environment_co.png">.</li>
+<li>Set the <b>Connection Type</b> to <b>Serial</b>, and select the serial port that you configured for the virtual COM port (COM7). Click <b>OK</b> to close the Preferences dialog.<p><img src="../images/add_hw_05.png "></p></li>
+<li>Start the Datagateway by clicking <img src="../images/run_exc.gif">. The connection status will be displayed in the status line above the console screen.</li>
+</ol>
+
+<p>To stop the Datagateway, click <img src="../images/stop.gif">.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/comm_usb.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Setting up USB serial connection</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Setting up USB serial connection</h2>
+<ol>
+<li>Make sure you have USB cable drivers (such as Nokia Connectivity Cable Drivers for Nokia devices) installed on your PC (either with PC Suite or separately for Nokia devices). The latest version of the drivers is always recommended.</li>
+<li>In the S60 device, start HtiAdmin by selecting <b>Menu</b> > <b>RnD Tools</b> > <b>HtiAdmin</b>.</li>
+<li>Stop the HTI Framework if it is running by selecting <b>Options</b> > <b>Stop</b>.</li>
+<li>Enable USB connection by selecting <b>Options</b> > <b>Comms</b> > <b>Enable USB serial comm</b>.</li>
+<li>Start the HTI Framework by selecting <b>Options</b> > <b>Start</b>.</li>
+<li>Connect the device to the PC with a USB cable and select the <b>PC Suite</b> mode. If Windows starts to install drivers, wait for all installations to complete.</li>
+<li>In the HTI Connection Carbide.c++ Extension, click <img src="../images/run_exc_arrow.png"> and select <b>New Connection</b> to create a new connection, or select an existing connection.</li>
+<li>In <b>Connection name</b>, enter a name for the connection, and in <b>Connection type</b>, select <b>Serial</b>. To edit the serial port settings, click <b>Next</b>.<br><br><img src="../images/new_connection_1.png"></li>
+<li>In <b>Serial Port</b>, select the serial port that is used for USB connection. You can also select a baud rate.<br><br><img src="../images/new_connection_2.png"></li>
+<li>(Optional) To test the connection, click <b>Initiate service testing</b>. The test status is shown in the <b>Status</b> pane:
+		<ul>
+			<li><i>Status not tested</i></li>
+			<li><i>Connection to HTI agent OK, HTI version x.xx</i></li>
+			<li><i>HTI agent in the device is not responding</i></li>
+			<li><i>Connection failed</i></li>
+		</ul>
+</li>
+<li>Click <b>Finish</b> to close the wizard. HTI Connection now starts the Datagateway with the connection you configured. If the Datagateway does not start automatically, start it by clicking <img src="../images/run_exc.gif">. The connection status will be displayed in the status line above the console screen:
+	<ul>
+		<li><i>Not connected</i></li>
+		<li><i>Testing connection</i></li>
+		<li><i>Trying to connect to &lt;connection name&gt;</i></li>
+		<li><i>Connected to &lt;connection name&gt;</i></li>
+	</ul>
+</li>
+</ol>
+
+<p>In addition to configuring and starting HTI connections, you can do the following:</p>
+<ul>
+<li>To stop the Datagateway, click <img src="../images/stop.gif">.</li>
+<li>To edit the connection settings, click <img src="../images/environment_co.png">.</li>
+<li>To start a connection after the initial setup, click <img src="../images/run_exc_arrow.png"> and select a connection.</li>
+<li>To delete a connection, open the <b>Remote Connections</b> view and use the dynamic menu. For details, see <a href="viewing_remote_connections.htm">Viewing remote connections</a>.</li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="tasks/viewing_remote_connections.htm">Viewing remote connections</a></li>
+	<li><a href="set_preferences.htm">Editing HTI connection settings</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/set_preferences.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Editing HTI connection settings</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Editing HTI connection settings</h2>
+<p>To edit the HTI connection settings:</p>
+<ol>
+<li>Select <b>Window</b> > <b>Preferences</b> > <b>Carbide Extensions</b> > <b>HTI Preferences</b>.</li>
+<li>In <b>Use connection</b>, do one of the following:
+	<ul>
+	<li>To edit an existing HTI connection, select a connection and click <b>Edit</b>.</li>
+	<li>To create a new HTI connection, click <b>New</b>.</li>
+	</ul>
+<p>Follow the instructions in <a href="comm_usb.htm">Setting up USB serial connection</a> or <a href="comm_bt.htm">Setting up Bluetooth connection</a>.</p>
+<p>If you have problems with the connection, see <a href="../reference/troubleshooting.htm">Troubleshooting</a>.</p>
+</li>
+<li>Click <b>Apply</b>/<b>OK</b>.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="comm_usb.htm">Setting up USB serial connection</a></li>
+	<li><a href="comm_bt.htm">Setting up Bluetooth connection</a></li>
+	<li><a href="../reference/troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/tasks.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>Tasks</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Tasks</h2>
+<p>The following tasks are available for this tool:</p>
+<ul>
+	<li><a href="comm_usb.htm">Setting up USB serial connection</a></li>
+	<li><a href="comm_bt.htm">Setting up Bluetooth connection</a></li>
+	<li><a href="viewing_remote_connections.htm">Viewing remote connections</li>
+	<li><a href="set_preferences.htm">Editing HTI connection settings</a></li>	
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tasks/viewing_remote_connections.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Viewing remote connections</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Viewing remote connections</h2>
+<p>You can view active remote connections in the <b>Remote Connections</b> view. To open the Remote Connections view, select <b>Window</b> > <b>Show view</b> > <b>Other...</b> > <b>Carbide.c++</b> > <b>Remote Connections</b>.</p>
+<p>Note that the Remote Connections view shows all connections in Carbide.c++, including connections configured for and used by other services. The <b>HTI Connection</b> Carbide.c++ Extension uses the generic <b>Serial</b> and <b>TCP/IP</b> connection types. HTI Connections use the following statuses:</p>
+<ul>
+	<li><i>Not connected</i></li>
+	<li><i>Trying to connect</i></li>
+	<li><i>Connected</i></li>
+</ul>
+<img src="../images/remote_connections_view.png">
+
+<p>In addition to viewing the connections status, you can do the following:</p>
+<ul>
+<li>To edit an existing connection, doubleclick it in the Remote Connections view. For details, see <a href="comm_usb.htm">Setting up USB serial connection</a> and <a href="comm_bt.htm">Setting up Bluetooth connection</a>.</li>
+<li>To delete a connection, rightclick it in the Remote Connections view and select <b>Delete Connection</b>.<br><br><img src="../images/delete_connection.png"></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="comm_usb.htm">Setting up USB serial connection</a></li>
+	<li><a href="comm_bt.htm">Setting up Bluetooth connection</a></li>
+	<li><a href="set_preferences.htm">Editing HTI connection settings</a></li>
+	<li><a href="../reference/troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/toc.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h1>HTI Connection Online Help</h1>
+
+<p><a href="release_notes.htm">Release notes</a></p>
+<p><a href="gettingstarted/GS_index.htm">Getting started</a></p>
+<ul>
+	<li><a href="gettingstarted/overview.htm">Overview</a></li>
+	<li><a href="gettingstarted/prerequisites.htm">Prerequisites for use</a></li>
+	<li><a href="gettingstarted/walk_through.htm">Basic walk-through</a></li>
+</ul>
+<p></p>
+<p><a href="concepts/concepts.htm">Concepts</a></p>
+<ul>
+	<li><a href="concepts/hti.htm">Harmonized Test Interface (HTI)</a></li>
+</ul>
+<p></p>
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/comm_usb.htm">Setting up USB serial connection</a></li>
+	<li><a href="tasks/comm_bt.htm">Setting up Bluetooth connection</a></li>
+	<li><a href="tasks/viewing_remote_connections.htm">Viewing remote connections</li>
+	<li><a href="tasks/set_preferences.htm">Editing HTI connection settings</a></li>
+</ul>
+<p></p>
+<p><a href="reference/references.htm">References</a></p>
+<ul>
+	<li><a href="reference/toolbar.htm">Toolbar</a></li>
+	<li><a href="reference/troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+<p></p>
+<p><a href="legal.htm">Legal</a></p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tocConcepts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts">
+	
+	<!-- Enter topic entries here for Concepts section of help -->
+	
+	<topic label="Harmonized Test Interface (HTI)" href="html/concepts/hti.htm" />
+
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tocGettingStarted.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Getting started"> 
+	
+	<topic label="Overview" href="html/gettingstarted/overview.htm" />
+	<topic label="Prerequisites for use" href="html/gettingstarted/prerequisites.htm" />
+	<topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+	
+
+		
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tocReference.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Reference">
+	
+	<!-- Enter topic entries here for References section of help -->
+	
+	<topic label="Toolbar" href="html/reference/toolbar.htm" />
+	<topic label="Troubleshooting" href="html/reference/troubleshooting.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/tocTasks.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks">
+	
+	<topic label="Setting up USB serial connection" href="html/tasks/comm_usb.htm" />
+	<topic label="Setting up Bluetooth connection" href="html/tasks/comm_bt.htm" />
+	<topic label="Viewing remote connections" href="html/tasks/viewing_remote_connections.htm" />	
+	<topic label="Editing HTI connection settings" href="html/tasks/set_preferences.htm" />
+
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/html/toolTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="HTI Connection" 
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+	
+	<topic label="HTI Connection" href="html/toc.htm" >
+		
+	   <topic label="Release Notes" href="html/release_notes.htm" />
+		
+	   <topic label="Getting started" href="html/gettingstarted/GS_index.htm">
+     		   <link toc="html/tocGettingStarted.xml" />
+	   </topic>
+   
+	   <topic label="Concepts" href="html/concepts/concepts.htm" >
+     		   <link toc="html/tocConcepts.xml" />
+	   </topic>
+			  
+	   <topic label="Tasks" href="html/tasks/tasks.htm" >
+     		   <link toc="html/tocTasks.xml" />
+	   </topic>
+	   
+	   <topic label="Reference" href="html/reference/references.htm" >
+     		   <link toc="html/tocReference.xml" />
+	   </topic>
+		   
+       <topic label="Legal" href="html/legal.htm" />
+   		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension point="org.eclipse.help.toc">
+      <toc
+            file="html/toolTOC.xml"
+            primary="true">
+      </toc>
+      <toc
+            file="html/tocConcepts.xml"
+	primary="false"/>  
+     
+      <toc
+            file="html/tocGettingStarted.xml"
+	primary="false"/>  
+    
+      <toc
+            file="html/tocTasks.xml"
+	primary="false"/>
+
+      <toc
+            file="html/tocReference.xml"
+      primary="false"/>
+
+   </extension>
+
+	<extension point="org.eclipse.help.index" >
+        <index file="html/index.xml"/>
+    </extension>
+
+	<extension point="org.eclipse.help.contexts">
+      <contexts file="html/contexts.xml"
+            plugin="com.nokia.s60tools.hticonnection.help"/>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/src/com/nokia/s60tools/hticonnection/help/HelpPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.hticonnection.help;
+
+import org.eclipse.ui.plugin.*;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HelpPlugin extends AbstractUIPlugin {
+
+	//The shared instance.
+	private static HelpPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public HelpPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HelpPlugin getDefault() {
+		return plugin;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection.help/src/com/nokia/s60tools/hticonnection/help/HelpPlugin.java.orig	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.hticonnection.help;
+
+import org.eclipse.ui.plugin.*;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HelpPlugin extends AbstractUIPlugin {
+
+	//The shared instance.
+	private static HelpPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public HelpPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HelpPlugin getDefault() {
+		return plugin;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry exported="true" kind="lib" path="htiapi.jar" sourcepath="/com.nokia.s60tools.hti"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Tue Oct 28 15:58:12 EET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - HTI Connection
+Bundle-SymbolicName: com.nokia.s60tools.hticonnection;singleton:=true
+Bundle-Version: 1.3.0
+Bundle-ClassPath: .,
+ htiapi.jar
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.jface.text,
+ org.eclipse.core.resources,
+ com.nokia.s60tools.ui;bundle-version="1.5.0",
+ com.nokia.s60tools.util;bundle-version="1.1.11",
+ com.nokia.carbide.remoteConnections;bundle-version="1.4.0",
+ com.nokia.carbide.trk.support;bundle-version="1.4.0",
+ com.freescale.cdt.debug.cw.core;bundle-version="1.4.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Activator: com.nokia.s60tools.hticonnection.HtiApiActivator
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.HTI;x-friends:="com.nokia.s60tools.hticonnection.tests",
+ com.nokia.s60tools.hticonnection;x-friends:="com.nokia.s60tools.hticonnection.tests,com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.hticonnection.connection;x-friends:="com.nokia.s60tools.hticonnection.tests,com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.hticonnection.core;x-friends:="com.nokia.s60tools.hticonnection.tests,com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.hticonnection.exceptions,
+ com.nokia.s60tools.hticonnection.gateway;x-friends:="com.nokia.s60tools.hticonnection.tests,com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.hticonnection.listener,
+ com.nokia.s60tools.hticonnection.preferences;x-friends:="com.nokia.s60tools.hticonnection.tests,com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.hticonnection.services,
+ com.nokia.s60tools.hticonnection.services.connectiontestservice;x-friends:="com.nokia.s60tools.hticonnection.tests"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About This Content</title>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"></head>
+<body lang="en-us">
+<h2>About This Content</h2>
+<p>February 16, 2009</p>	
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+<h3>Legal Notices</h3>
+<p>This Product includes Open Source Software. </p>
+<p>Part of the graphics of the program are from Eclipse 3.4 platform and CDT
+project in Eclipse community, which are made available under the terms of
+the Eclipse Public License v1.0. A copy of the EPL is provided at <a href="http://www.eclipse.org/legal/epl-v10.html">
+http://www.eclipse.org/legal/epl-v10.html</a>.<br></p>
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,46 @@
+################################################################################
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+################################################################################
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+################################################################################
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+################################################################################
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+################################################################################
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+################################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - HTI Connection \n\
+\n\
+Version: 1.3\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.\n\
+License: "http://www.eclipse.org/legal/epl-v10.html".\n\
+\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               conf/,\
+               .,\
+               htiapi.jar,\
+               icons/,\
+               about.html,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               os/
+javacSource=1.5
+javacTarget=1.5
+               
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/conf/htiapilogging.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+############################################################
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+############################################################
+#  	HTI API Logging Configuration File
+############################################################
+
+############################################################
+#  	Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes.  These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+handlers= java.util.logging.ConsoleHandler
+#handlers= java.util.logging.FileHandler
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers.  For any given facility this global level
+# can be overriden by a facility specific level
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# FileHandler
+java.util.logging.FileHandler.level = ALL
+java.util.logging.FileHandler.pattern = ./htiapi%u.%g.log
+java.util.logging.FileHandler.limit = 1048576
+java.util.logging.FileHandler.count = 10
+java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
+
+# ConsoleHandler
+java.util.logging.ConsoleHandler.level = ALL
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+############################################################
+# Detailed logger levels.
+# Describes specific level info for loggers.
+############################################################
+
+com.nokia.HTI.BaseService.level = ALL
+com.nokia.HTI.ApplicationControlService.ApplicationControlService.level = ALL
+com.nokia.HTI.FTPService.FTPService.level = ALL
+com.nokia.HTI.KeyEventService.KeyEventService.level = ALL
+com.nokia.HTI.ScreenCapturingService.ScreenCapturingService.level = ALL
+com.nokia.HTI.STIFTestFrameworkService.STIFTestFrameworkService.level = ALL
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/docs/logging_readme.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+Configuring logging:
+
+- Copy release\htiapi.jar to the lib directory of your application.
+- Modify conf\htiapilogging.properties, OR if your app is already using java logging, copy the htiapi detailed
+  logging levels (com.nokia.HTI.*) to the existing logging properties file from conf\htiapilogging.properties
+  file and adjust them as you like.
+- Add to your application's start script following java system property (only for applications NOT using java
+  logging at the moment, otherwise the following should already be included):
+  
+   -Djava.util.logging.config.file=some_directory_path_under_your_app/conf/htiapilogging.properties
+   
\ No newline at end of file
Binary file htiextension/com.nokia.s60tools.hticonnection/htiapi.jar has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/clear_co.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/hti_console.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/htiapi_tsk.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/lock_co.gif has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/preferences.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/s60tools_action_icon.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/start_datagateway.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/icons/stop_datagateway.png has changed
Binary file htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/DataGateway.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/datagateway.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+### DataGateway parameters
+# TCP/IP port number
+TCPIP_PORT = 3000
+
+# TCP/IP receive buffer size in bytes (dec)
+TCPIP_RECV_BUFFER_SIZE = 8192
+
+# Default communication channel plugin
+#DEFAULT_COMM_CHANNEL_PLUGIN = SERIAL
+DEFAULT_COMM_CHANNEL_PLUGIN = IPCOMM
+
+# Maximum time in milliseconds to wait shutdown
+# NOTE: 0 means no waiting. This may cause
+#       undefined behaviour.
+MAXIMUM_SHUTDOWN_WAITTIME = 3000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/ipcommplugin.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+### IPCOMM plugin parameters
+
+
+# Local TCP/IP port where to listen for incoming HTI connection.
+# If defined remote host & port parameters will be ignored.
+#
+# NOTE: Do not use the same port as HtiGateway!
+#
+#LOCAL_PORT=4000
+
+
+# Remote TCP/IP host & port where HTI is listening.
+#
+REMOTE_HOST=localhost
+REMOTE_PORT=4000
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/os/win32/x86/serialplugin.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+### Parameters for serial connection
+#init string
+#INIT_STRING = 115200,n,8,1
+#INIT_STRING = 9600,n,8,1
+
+#comm port
+COMPORT = COM7
+
+#timeout for communication operations, in ms
+#default value is 40000
+#TIMEOUT=60000
+
+#enable hw flow control
+#should be "1" to enable
+#disabled by default
+#HW_FLOWCONTROL=1
+
+#make pause after sending over serial, in ms
+#can be used to avoid overflow problem
+# default value is 0
+#SEND_PAUSE=1000
+
+#set the size for output buffer
+# can be set smaller to avoid overrun
+#SEND_SIZE=1000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="HTI Console Tool&apos;s Actions"
+            id="com.nokia.s60tools.hticonnection.actionSet"
+            label="HTI Connection"
+            visible="true">
+         <menu
+       			id="com.nokia.carbide.cpp.ui.CarbideMenu"
+       			label="&amp;Carbide"
+       			path="additions">
+       			<groupMarker name="additions"/>
+     	 </menu>
+         <action
+               class="com.nokia.s60tools.hticonnection.actions.MainViewOpenAction"
+               icon="icons/hti_console.png"
+               id="com.nokia.s60tools.hticonnection.screen.actions.MainViewOpenAction"
+               label="HTI Connection"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               style="push"
+               tooltip="HTI Connection"/>
+      </actionSet>
+   </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage"
+            class="com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage"
+            id="com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage"
+            name="HTI Connection Preferences">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <category
+            id="com.nokia.s60tools"
+            name="Carbide Extensions"/>
+      <view
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.hticonnection.ui.views.main.MainView"
+            icon="icons/hti_console.png"
+            id="com.nokia.s60tools.hticonnection.ui.views.main.MainView"
+            name="HTI Connection"/>
+   </extension>
+   <extension
+         point="com.nokia.carbide.remoteConnections.service">
+      <service
+            class="com.nokia.s60tools.hticonnection.connection.HTIService">
+      </service>
+   </extension>
+   <extension
+         point="com.nokia.carbide.remoteConnections.connectedServiceFactory">
+      <connectedServiceFactory
+            class="com.nokia.s60tools.hticonnection.connection.HTIConnectedServiceFactory">
+      </connectedServiceFactory>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/HtiApiActivator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,270 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferences;
+import com.nokia.s60tools.hticonnection.preferences.IHtiApiPreferences;
+import com.nokia.s60tools.hticonnection.resources.ImageResourceManager;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class HtiApiActivator extends AbstractUIPlugin {
+	
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.hticonnection"; //$NON-NLS-1$
+
+	// The shared instance
+	private static HtiApiActivator plugin;
+	
+	/**
+	 * Shared singleton preferences instance available for whole plug-in lifetime
+	 */
+	private static IHtiApiPreferences preferences;
+	
+	/**
+	 * Keeps HTI requests in queue and runs them.
+	 */
+	private RequestQueueManager queueManager;
+	/**
+	 * Manages connection status and tests connection when necessary.
+	 */
+	private HtiConnection connectionManager;
+	
+	/**
+	 * Storing preferences
+	 */
+	private static IPreferenceStore prefsStore;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;
+	
+	/**
+	 * This member variable is only used internally for JUnit testing purposes.
+	 */
+	private String alternatePluginInstallPath = null;
+	
+	/**
+	 * The constructor
+	 */
+	public HtiApiActivator() {
+		plugin = this;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		
+		pluginInstallLocation = getPluginInstallPath();
+		
+		//This startup debug println has been left into the code in purpose
+		System.out.println("pluginInstallLocation: " +  pluginInstallLocation); //$NON-NLS-1$
+		
+		// Call to getImagesPath requires that getPluginInstallPath() is
+		// called beforehand.
+		String imagesPath = getImagesPath();
+		
+		//This startup debug println has been left into the code in purpose
+		System.out.println("imagesPath: " +  imagesPath); //$NON-NLS-1$
+		
+		// Loading images required by this plug-in
+		ImageResourceManager.loadImages(imagesPath);
+		
+		//This startup debug println has been left into the code in purpose
+		System.out.println("HTI-API Plugin STARTUP..."); //$NON-NLS-1$
+
+		initializeSettings();
+	}
+	
+	/**
+	 * This method is the correct place for initializing plugin-wide settings during start-up.
+	 */
+	private void initializeSettings() {
+		queueManager = RequestQueueManager.getInstance();
+		connectionManager = HtiConnection.getInstance();
+		// Initialization is not needed before starting activator and tests don't require initialization.
+		connectionManager.init();
+
+		// Initialize default values for preferences
+		getPreferences().initDefaultValues();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		//This shutdown debug println has been left into the code in purpose
+		System.out.println("HTI-API Plugin SHUTDOWN..."); //$NON-NLS-1$
+
+		// Stopping and clearing the request queue.
+		queueManager.stop();
+		connectionManager.stop();
+
+		plugin = null;
+		super.stop(context);
+	}
+	
+	/**
+	 * Returns the shared instance.
+	 * @return the shared instance
+	 */
+	public static HtiApiActivator getDefault() {
+		return plugin;
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return Currently active workbench page.
+	 */
+	public static IWorkbenchPage getCurrentlyActivePage(){
+		return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return The shell of the currently active workbench window..
+	 */
+	public static Shell getCurrentlyActiveWbWindowShell(){
+		IWorkbenchPage page = getCurrentlyActivePage();
+		if(page != null){
+			return page.getWorkbenchWindow().getShell();
+		}
+		return null;
+	}
+	
+	/**
+	 * Gets plug-in's installation path.
+	 * @return plug-in's installation path.
+	 * @throws IOException
+	 */
+	public String getPluginInstallPath() throws IOException{
+		// Returning alternate install path, if set for JUnit testing purposes.
+		if(alternatePluginInstallPath != null){
+			return alternatePluginInstallPath;
+		}
+		 // URL to the plugin's root ("/")
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		//	Converting into local path
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		//	Getting install location in correct form
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+				
+		return pluginInstallLocation;
+	}
+	
+	/**
+	 * Gets images path relative to given plugin install path.
+	 * @return Path were image resources are located.
+	 */
+	private String getImagesPath(){
+		return pluginInstallLocation
+				+ File.separatorChar
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}
+	
+	/**
+	 * Returns the PreferenceStore where plugin preferences are stored
+	 * @return the PreferenceStore where plugin preferences are stored
+	 */
+	public static IPreferenceStore getPrefsStore(){
+		if (prefsStore == null){
+			prefsStore = getDefault().getPreferenceStore();
+		}
+		
+		return prefsStore;
+	}
+	
+	/**
+	 * Gets if preference store is initialized.
+	 * @return True if preference store is initialized.
+	 */
+	public static boolean isPrefStoreinitialized() {
+		if (prefsStore != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * Gets reference to plug-in's preference store.
+	 * @return Reference to plug-in's preference store.
+	 */
+	public static IHtiApiPreferences getPreferences(){
+		if(preferences == null){
+			preferences = new HtiApiPreferences();
+		}
+		return preferences;
+	}
+	
+	//
+	// Internally used methods.
+	//
+	
+	/**
+	 * This constructor is only used for setting alternate
+	 * preference store just used for JUnit tests.
+	 * @param alternatePreferences Alternate preference store implementation.
+	 * @param alternateInstallPath Alternate plug-in install path.
+	 */
+	private HtiApiActivator(IHtiApiPreferences alternatePreferences, String alternateInstallPath){
+		preferences = alternatePreferences;
+		alternatePluginInstallPath = alternateInstallPath;		
+	}
+
+	/**
+	 * Creates activator instance if not already created, with reference 
+	 * to alternate preference store, and with different plugin install path. 
+	 * This creates always a new instance of the activator, and need to be called 
+	 * only when needed.
+	 * 
+	 * This methods to be used only from JUnit tests
+	 * and can be used to set alternate preference store 
+	 * that is just used for JUnit tests.
+	 * 
+	 * @param alternatePreferences Alternate preference store implementation.
+	 * @param alternateInstallPath Alternate plugin install path used for testing.
+	 * @return Reference to activator instance
+	 */ 
+	public static HtiApiActivator createWithAlternateSettings(IHtiApiPreferences alternatePreferences, String alternateInstallPath){
+		plugin = new HtiApiActivator(alternatePreferences, alternateInstallPath);			
+		return plugin;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/HtiConnectionHelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection;
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class HtiConnectionHelpContextIDs {
+	/**
+     * The plug-in ID.
+     */	 
+    private static final String HTI_CONNECTION_HELP_PROJECT_PLUGIN_ID = 
+                                        "com.nokia.s60tools.hticonnection.help"; //$NON-NLS-1$
+	/**
+	 * Main view help ID.
+	 */
+    public static final String HTI_CONNECTION_MAIN_VIEW = 
+    	HTI_CONNECTION_HELP_PROJECT_PLUGIN_ID +".HTI_CONNECTION_MAIN_VIEW"; //$NON-NLS-1$
+    /**
+     * Preferences page help ID.
+     */
+    public static final String HTI_CONNECTION_PREFERENCES = 
+    	HTI_CONNECTION_HELP_PROJECT_PLUGIN_ID +".HTI_CONNECTION_PREFERENCES"; //$NON-NLS-1$
+    /**
+     * Error message page help ID.
+     */
+    public static final String HTI_CONNECTION_ERROR_MESSAGE = 
+    	HTI_CONNECTION_HELP_PROJECT_PLUGIN_ID +".HTI_CONNECTION_ERROR_MESSAGE"; //$NON-NLS-1$
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/ClearScreenAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.hticonnection.resources.ImageKeys;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+
+/**
+ * Action for opening clearing console
+ */
+public class ClearScreenAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Viewer that is target for action.
+	 */
+	private final MainView mainView;
+
+	/**
+	 * Constructor
+	 * @param mainView Viewer that is target for action.
+	 */
+	public ClearScreenAction(MainView mainView) {
+		super(Messages.getString("ClearScreenAction.ClearScreen_Action_Text"), //$NON-NLS-1$
+				Messages.getString("ClearScreenAction.ClearScreen_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageKeys.IMG_CLEAR_SCREEN);
+		this.mainView = mainView;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		mainView.getMainTextViewer().clearScreen();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/MainViewOpenAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+import com.nokia.s60tools.hticonnection.util.HtiApiConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Activates/creates main View.
+ */
+public class MainViewOpenAction implements IWorkbenchWindowActionDelegate {
+	
+	/**
+	 * Constructor.
+	 */
+	public MainViewOpenAction(){			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			// We only want to activate/create the view and 
+			// do not need to use the instance after it is returned.
+			MainView.getViewInstance(true);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			HtiApiConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		// Not needed now, but must be implemented anyway	
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+		// Not needed now, but must be implemented anyway		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		// Not needed now, but must be implemented anyway
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/NewConnectionAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.Window;
+
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.settings.ui.SettingsWizard;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.connection.HTIService;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Action for creating new connection or selecting currently used connection.
+ */
+@SuppressWarnings("restriction")
+public class NewConnectionAction extends S60ToolsBaseAction {
+
+	/**
+	 * Constructor.
+	 */
+	public NewConnectionAction() {
+		super(Messages.getString("NewConnectionAction.NewConnection_Action_Text"), //$NON-NLS-1$
+				Messages.getString("NewConnectionAction.NewConnection_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				null);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.actions.S60ToolsBaseAction#run()
+	 */
+	public void run() {
+		// Creating new settings wizard for HTI Connection.
+		SettingsWizard wizard = new SettingsWizard(null, new HTIService());
+		int result = wizard.open(HtiApiActivator.getCurrentlyActiveWbWindowShell());
+		if(result == Window.OK) {
+			// Wizard was completed successfully. Starting connection with new connection.
+			IConnection connection = wizard.getConnectionToEdit();
+			HtiConnection htiConnection = HtiConnection.getInstance();
+			if(htiConnection.getConnectionStatus() != ConnectionStatus.SHUTDOWN) {
+				htiConnection.stopConnection();
+			}
+			// Starting new connection.
+			htiConnection.setCurrentConnection(connection, false);
+			htiConnection.startConnection(false);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/OpenPreferencePageAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage;
+import com.nokia.s60tools.hticonnection.resources.ImageKeys;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+
+/**
+ * Action for opening HTI API  preferences page
+ */
+public class OpenPreferencePageAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Constructor
+	 */
+	public OpenPreferencePageAction() {
+		super(Messages.getString("OpenPreferencePageAction.OpenPreferences_Action_Text"), //$NON-NLS-1$
+				Messages.getString("OpenPreferencePageAction.OpenPreferences_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageKeys.IMG_PREFERENCES);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		openPreferencePage();
+	}
+
+	/**
+	 * Open HTI API preferences page preference page
+	 */
+	private void openPreferencePage(){
+		IPreferencePage page = new HtiApiPreferencePage();
+		PreferenceManager mgr = new PreferenceManager();
+		IPreferenceNode node = new PreferenceNode("1", page);//$NON-NLS-1$
+		mgr.addToRoot(node);
+		PreferenceDialog dialog = new PreferenceDialog(HtiApiActivator.getCurrentlyActiveWbWindowShell(), mgr);
+		dialog.create();
+		dialog.setMessage(page.getTitle());
+		dialog.open();	
+	}	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/S60ToolsBaseAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.hticonnection.resources.ImageKeys;
+import com.nokia.s60tools.hticonnection.resources.ImageResourceManager;
+
+/**
+ * A base action that can be used by inheriting
+ * it and by overriding default run()-method.
+ * 
+ * The action itself can be used for prototyping
+ * during the development start-up phases.
+ */
+public class S60ToolsBaseAction extends Action {
+
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 */
+	public S60ToolsBaseAction(String text, String tooltip){
+		// Creates action by using default push button style.
+		this(text, tooltip, IAction.AS_PUSH_BUTTON);
+	}
+
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param buttonStyle Style supported
+	 */
+	public S60ToolsBaseAction(String text, String tooltip, int buttonStyle){
+		this(text, tooltip, IAction.AS_PUSH_BUTTON, ImageKeys.S60TOOLS_ACTION_ICON);
+	}
+	
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param buttonStyle Style supported
+	 * @param imageKey Image of the image used for the action. 
+	 *                 Can be set to <code>null</code>, if no image is needed.
+	 */
+	public S60ToolsBaseAction(String text, String tooltip, int buttonStyle, String imageKey){
+		super(text, buttonStyle);
+		setToolTipText(tooltip);
+		if(imageKey != null){
+			setImageDescriptor(ImageResourceManager.
+					getImageDescriptor(imageKey));						
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		// Extending classes implement run.
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/ScrollLockAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.hticonnection.resources.ImageKeys;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+
+/**
+ * Action for setting scroll lock for console.
+ */
+public class ScrollLockAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Viewer that is target for action.
+	 */
+	private final MainView mainView;
+
+	/**
+	 * Constructor
+	 * @param mainView Viewer that is target for action.
+	 */
+	public ScrollLockAction(MainView mainView) {
+		super(Messages.getString("ScrollLockAction.ScrollLock_Action_Text"), //$NON-NLS-1$
+				Messages.getString("ScrollLockAction.ScrollLock_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_CHECK_BOX,
+				ImageKeys.IMG_SCROLL_LOCK);
+		this.mainView = mainView;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		// Setting scroll lock on if action is checked.
+		mainView.getMainTextViewer().setScrollLock(isChecked());
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/SelectAllAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+
+/**
+ * Action for selecting all in text viewer.
+ */
+public class SelectAllAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Viewer that is target for action.
+	 */
+	private final MainView mainView;
+
+	/**
+	 * Constructor
+	 * @param mainView Viewer that is target for action.
+	 */
+	public SelectAllAction(MainView mainView) {
+		super(Messages.getString("SelectAllAction.SelectAll_Action_Text"), //$NON-NLS-1$
+				Messages.getString("SelectAllAction.SelectAll_Action_Tooltip"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, null);
+		this.mainView = mainView;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		mainView.getMainTextViewer().selectAllText();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/SelectConnectionAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Action used to select connection from menu.
+ */
+public class SelectConnectionAction extends S60ToolsBaseAction {
+
+	/**
+	 * Connection for this action.
+	 */
+	private final IConnection connection;
+
+	/**
+	 * Constructor.
+	 * @param connection Connection to be selected.
+	 */
+	public SelectConnectionAction(IConnection connection) {
+		super(connection.getDisplayName(), Messages.getString("SelectConnectionAction.Tooltip_Text"), IAction.AS_RADIO_BUTTON, null); //$NON-NLS-1$
+		this.connection = connection;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.actions.S60ToolsBaseAction#run()
+	 */
+	public void run() {
+		// Starting the connection in own thread to prevent button staying down for a while.
+		if(this.isChecked()) {
+			Thread startConnection = new StartConnectionThread();
+			startConnection.start();
+		}
+	}
+	
+	/**
+	 * Thread that can be used to start new connection.
+	 */
+	private class StartConnectionThread extends Thread {
+
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run() {
+			HtiConnection.getInstance().stopConnection();
+			HtiConnection.getInstance().setCurrentConnection(connection, false);
+			HtiConnection.getInstance().startConnection(false);
+		}
+	};
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/actions/StartStopGatewayAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,123 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.hticonnection.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.ImageKeys;
+import com.nokia.s60tools.hticonnection.resources.ImageResourceManager;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Action for handling start and stopping datagateway.exe.
+ */
+public class StartStopGatewayAction extends S60ToolsBaseAction {
+
+	private static final String startGatewayMsg = Messages.getString("StartStopGatewayAction.Start_Datagateway_Msg"); //$NON-NLS-1$
+	private static final String stopGatewayMsg = Messages.getString("StartStopGatewayAction.Stop_Datagateway_Msg"); //$NON-NLS-1$
+	
+	/**
+	 * Is datagateway running
+	 */
+	boolean running = false;
+	
+	/**
+	 * Constructor
+	 */
+	public StartStopGatewayAction() {
+		super(startGatewayMsg,
+				startGatewayMsg,
+				IAction.AS_DROP_DOWN_MENU,
+				ImageKeys.IMG_START_GATEWAY);
+		
+		setRunning(HtiConnection.getInstance().getConnectionStatus()
+					 != ConnectionStatus.SHUTDOWN);
+	}
+
+	/**
+	 * Set datagateway running status
+	 * @param running True if datagateway is running
+	 */
+	public void setRunning(boolean running) {
+		this.running = running;
+		updateImage();
+	}
+
+	/**
+	 * Updates correct image to action depending on status.
+	 */
+	private void updateImage(){
+		if(running){
+			// Stopping the gateway.
+			setImageDescriptor(ImageResourceManager.
+					getImageDescriptor(ImageKeys.IMG_STOP_GATEWAY));
+			setText(stopGatewayMsg);
+			setToolTipText(stopGatewayMsg);
+		} else {
+			// Starting the gateway.
+			setImageDescriptor(ImageResourceManager.
+					getImageDescriptor(ImageKeys.IMG_START_GATEWAY));
+			setText(startGatewayMsg);
+			setToolTipText(startGatewayMsg);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		
+		if(!running){
+			updateImage();
+
+			// Starting the connection in own thread to prevent button staying down for a while.
+			Thread startConnection = new Thread() {
+				/* (non-Javadoc)
+				 * @see java.lang.Thread#run()
+				 */
+				public void run() {
+					checkConnection();
+					HtiConnection.getInstance().startConnection(false);
+				}
+			};
+			startConnection.start();
+
+		} else {
+			updateImage();
+			// Stopping the gateway.
+			HtiConnection.getInstance().stopConnection();
+		}
+	}
+	
+	/**
+	 * Checks if there is valid connection set. If there isn't, then tries to find valid
+	 * connection that can be used instead.
+	 */
+	private void checkConnection() {
+		IConnection conn = HtiConnection.getInstance().getCurrentConnection();
+		if(conn == null) {
+			// Checking if there is valid connection, that hasn't been set yet.
+			HtiConnection.getInstance().setCurrentConnection(HtiApiActivator.getPreferences().getCurrentConnection(), false);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/Product.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.common;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * This class is used to get String resource from Product.properties file.
+ */
+public class Product {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.hticonnection.common.Product"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Returns String resource with specified key.
+	 * @param key Key for the resource.
+	 * @return String resource with specified key.
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/Product.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+ProductInfoRegistry.Console=Console
+ProductInfoRegistry.IconsDirectory=icons
+ProductInfoRegistry.ProductName=HTI Connection
+ProductInfoRegistry.BinariesRelativePath=os\\win32\\x86
+ProductInfoRegistry.DatagatewayExeName=datagateway.exe
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/common/ProductInfoRegistry.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.common;
+
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information in one place.
+ */
+public class ProductInfoRegistry {
+
+	private static final String PRODUCT_NAME = Product.getString("ProductInfoRegistry.ProductName"); //$NON-NLS-1$
+	private static final String CONSOLE_WINDOW_NAME = PRODUCT_NAME + " " + Product.getString("ProductInfoRegistry.Console");	 //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.IconsDirectory");	 //$NON-NLS-1$
+	private static final String BINARIES_RELATIVE_PATH = Product.getString("ProductInfoRegistry.BinariesRelativePath");	 //$NON-NLS-1$
+	private static final String DATAGATEWAY_EXE_NAME = Product.getString("ProductInfoRegistry.DatagatewayExeName");	 //$NON-NLS-1$
+	
+	/**
+	 * Returns name that is used in console window.
+	 * @return Returns the CONSOLE_WINDOW_NAME.
+	 */
+	public static String getConsoleWindowName() {
+		return CONSOLE_WINDOW_NAME;
+	}
+	/**
+	 * Returns name of the product.
+	 * @return Returns the PRODUCT_NAME.
+	 */
+	public static String getProductName() {
+		return PRODUCT_NAME;
+	}
+	/**
+	 * Returns image directory name.
+	 * @return Returns the IMAGES_DIRECTORY.
+	 */
+	public static String getImagesDirectoryName() {
+		return IMAGES_DIRECTORY;
+	}
+	
+	/**
+	 * Returns path to binaries.
+	 * @return Returns the BINARIES_RELATIVE_PATH.
+	 */
+	public static String getWin32BinariesRelativePath() {
+		return BINARIES_RELATIVE_PATH;
+	}
+	
+	/**
+	 * Returns name of datagateway executable.
+	 * @return Returns the DATAGATEWAY_EXE_NAME.
+	 */
+	public static String getDatagatewayExeName() {
+		return DATAGATEWAY_EXE_NAME;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectedService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.connection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.osgi.framework.Version;
+
+import com.nokia.carbide.remoteconnections.interfaces.AbstractConnectedService;
+import com.nokia.carbide.remoteconnections.interfaces.AbstractSynchronizedConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IService;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus.EStatus;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+
+/**
+ * Connected service for HTI to contain connection information.
+ */
+public class HTIConnectedService extends AbstractConnectedService {
+	
+	/**
+	 * Constructor.
+	 * @param service Service that is connected.
+	 * @param connection Connection that is connected.
+	 */
+	public HTIConnectedService(IService service,
+			AbstractSynchronizedConnection connection) {
+		super(service, connection);
+		currentStatus = new Status();
+		
+		currentStatus.setEStatus(EStatus.DOWN, Messages.getString("HTIConnectedService.NotConnected_ShortMsg"), ""); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.AbstractConnectedService#runTestStatus(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected TestResult runTestStatus(IProgressMonitor monitor) {
+		if(!manualTesting) {
+			// Not using automatic testing as it would take too much resources. Returning currently known status.
+			IStatus status = getStatusFromHtiConnection();
+			return new TestResult(status.getEStatus(), status.getShortDescription(), status.getLongDescription());
+		}
+		
+		// Testing connection when user has ordered testing command from the settings wizard.
+		monitor.beginTask("Testing HTI Service", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+		IStatus status = HtiConnection.getInstance().testConnection(connection);
+		
+		monitor.done();
+		
+		return new TestResult(status.getEStatus(), status.getShortDescription(), status.getLongDescription());
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService#getStatus()
+	 */
+	public IStatus getStatus() {
+		return currentStatus;
+	}
+	
+	/**
+	 * Returns status of this connection.
+	 * @return Status of this connection.
+	 */
+	public IStatus getStatusFromHtiConnection() {
+		HtiConnection htiConnection = HtiConnection.getInstance();
+		
+		HTIConnectionStatus status = null;
+		if(connection.equals(htiConnection.getCurrentConnection())) {
+			// This connection is active, getting status.
+			ConnectionStatus connStatus = htiConnection.getConnectionStatus();
+			switch (connStatus) {
+			case CONNECTED:
+				HTIVersion version = HtiConnection.getInstance().getHTIVersion();
+				status = new HTIConnectionStatus(this,
+						EStatus.UP,
+						Messages.getString("HTIConnectedService.Connected_ShortMsg"), //$NON-NLS-1$
+						Messages.getString("HTIConnectedService.ConnectedToHti_LongMsg") + version.toString()); //$NON-NLS-1$
+				break;
+			case CONNECTING:
+				status = new HTIConnectionStatus(this,
+						EStatus.UP,
+						Messages.getString("HTIConnectedService.TryingToConnect_ShortMsg"), //$NON-NLS-1$
+						""); //$NON-NLS-1$
+				break;
+			case SHUTDOWN:
+				status = new HTIConnectionStatus(this,
+						EStatus.DOWN,
+						Messages.getString("HTIConnectedService.NotConnected_ShortMsg"), //$NON-NLS-1$
+						""); //$NON-NLS-1$
+				break;
+			case TESTING:
+				status = new HTIConnectionStatus(this, EStatus.UP, Messages.getString("HTIConnectedService.Testing_ShortMsg"), ""); //$NON-NLS-1$ //$NON-NLS-2$
+				break;
+			}
+		} 
+		if(status == null) {
+			// This connection is not active.
+			status = new HTIConnectionStatus(this, EStatus.DOWN, Messages.getString("HTIConnectedService.NotConnected_ShortMsg"), "");	 //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		
+		return status;
+	}
+	
+	/**
+	 * Refreshes current status.
+	 */
+	public void refreshStatus() {
+		IStatus status = getStatusFromHtiConnection();
+		
+		currentStatus.setEStatus(status.getEStatus(), status.getShortDescription(), status.getLongDescription());
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService#setDeviceOS(java.lang.String, org.osgi.framework.Version)
+	 */
+	public void setDeviceOS(String familyName, Version version) {
+		// Not implemented.
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectedServiceFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.connection;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import com.nokia.carbide.remoteconnections.interfaces.AbstractSynchronizedConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedServiceFactory;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IService;
+
+/**
+ * Factory for Connected HTI Services.
+ */
+public class HTIConnectedServiceFactory implements IConnectedServiceFactory {
+	
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedServiceFactory#createConnectedService(com.nokia.carbide.remoteconnections.interfaces.IService, com.nokia.carbide.remoteconnections.interfaces.IConnection)
+	 */
+	public IConnectedService createConnectedService(IService service,
+			IConnection connection) {
+		
+		if(getCompatibleConnectionTypeIds(service).contains(connection.getConnectionType().getIdentifier())) {
+			return new HTIConnectedService(service, (AbstractSynchronizedConnection)connection);
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedServiceFactory#getCompatibleConnectionTypeIds(com.nokia.carbide.remoteconnections.interfaces.IService)
+	 */
+	public Collection<String> getCompatibleConnectionTypeIds(IService service) {
+		if (service instanceof HTIService) {
+			return HTIService.getCompatibleConnectionTypeIds();
+		}
+		return Collections.emptyList();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIConnectionStatus.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.connection;
+
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus;
+
+/**
+ * Contains status for connected service.
+ */
+public class HTIConnectionStatus implements IStatus {
+
+	/**
+	 * Status for connected service.
+	 */
+	private final EStatus status;
+	/**
+	 * Short status description.
+	 */
+	private final String shortDesc;
+	/**
+	 * Long status description.
+	 */
+	private final String longDesc;
+	/**
+	 * Connected service.
+	 */
+	private final IConnectedService connectedService;
+
+	/**
+	 * Constructor.
+	 * @param connectedService Connected service.
+	 * @param status Status for connected service.
+	 * @param shortDesc Short status description.
+	 * @param longDesc Long status description.
+	 */
+	public HTIConnectionStatus(IConnectedService connectedService, EStatus status, String shortDesc, String longDesc) {
+		this.connectedService = connectedService;
+		this.status = status;
+		this.shortDesc = shortDesc;
+		this.longDesc = longDesc;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus#getConnectedService()
+	 */
+	public IConnectedService getConnectedService() {
+		return connectedService;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus#getEStatus()
+	 */
+	public EStatus getEStatus() {
+		return status;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus#getLongDescription()
+	 */
+	public String getLongDescription() {
+		return longDesc;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus#getShortDescription()
+	 */
+	public String getShortDescription() {
+		return shortDesc;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/connection/HTIService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.connection;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.nokia.carbide.remoteconnections.interfaces.IRemoteAgentInstallerProvider;
+import com.nokia.carbide.remoteconnections.interfaces.IService2;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Service class for HTI Connections.
+ */
+public class HTIService implements IService2 {
+
+	/**
+	 * Identification for HTI Service.
+	 */
+	public static final String ID = HTIService.class.getName();
+	
+	// Compatible connection types.
+	public static final String SERIAL_TYPE = "com.nokia.carbide.trk.support.connection.SerialConnectionType"; //$NON-NLS-1$
+	public static final String SERIAL_BT_TYPE = "com.nokia.carbide.trk.support.connection.SerialBTConnectionType"; //$NON-NLS-1$
+	public static final String USB_TYPE = "com.nokia.carbide.trk.support.connection.USBConnectionType"; //$NON-NLS-1$
+	public static final String TCPIP_TYPE = "com.nokia.carbide.connection.TCPIPConnectionType"; //$NON-NLS-1$
+	
+	/**
+	 * Default TCP/IP port
+	 */
+	public static final String DEFAULT_TCPIP_PORT = "4000"; //$NON-NLS-1$
+	/**
+	 * Resource string for TCP/IP port. 
+	 */
+	public static final String IP_PORT = "port"; //$NON-NLS-1$
+	
+	/**
+	 * Gets compatible connection type ids.
+	 * @return Compatible connection type ids.
+	 */
+	public static Collection<String> getCompatibleConnectionTypeIds() {
+		List<String> typeIDs = Arrays.asList(new String[] {
+				SERIAL_TYPE,
+				SERIAL_BT_TYPE,
+				USB_TYPE,
+				TCPIP_TYPE
+				});
+		return typeIDs;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService#getAdditionalServiceInfo()
+	 */
+	public String getAdditionalServiceInfo() {
+		if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.SHUTDOWN) {
+			return Messages.getString("HTIService.TestingInfo_Msg"); //$NON-NLS-1$
+		}
+		return Messages.getString("HTIService.EnsureConnectionInfo_Msg"); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService#getDisplayName()
+	 */
+	public String getDisplayName() {
+		return "HTI"; //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService#getIdentifier()
+	 */
+	public String getIdentifier() {
+		return ID;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService#getInstallerProvider()
+	 */
+	public IRemoteAgentInstallerProvider getInstallerProvider() {
+		// No installers.
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService#isTestable()
+	 */
+	public boolean isTestable() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService2#getDefaults()
+	 */
+	public Map<String, String> getDefaults() {
+		// Returning default port.
+		Map<String, String> settings = new HashMap<String, String>();
+		settings.put(IP_PORT, DEFAULT_TCPIP_PORT);
+		return settings;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IService2#wantsDeviceOS()
+	 */
+	public boolean wantsDeviceOS() {
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	@SuppressWarnings("unchecked")
+	public Object getAdapter(Class adapter) {
+		// Not needed to implement adapter.
+		return null;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/AbstractRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.core;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.gateway.DataGatewayConstants;
+
+/**
+ * Abstract request class which is used as base for HTI requests.
+ */
+public abstract class AbstractRequest implements Callable<RequestResult>{
+
+	/**
+	 * Name of the request.
+	 */
+	protected final String name;
+	/**
+	 * Future task that has been created from this request. It is needed so that this request can
+	 * be canceled properly.
+	 */
+	protected FutureTask<RequestResult> resultFutureTask = null;
+	/**
+	 * This holds information whether request has been canceled.
+	 */
+	protected boolean requestCanceled = false;
+	
+	/**
+	 * Constructor.
+	 * @param name Name of the request.
+	 */
+	protected AbstractRequest(String name){
+		this.name = name;
+	}
+
+	/**
+	 * Getter for name.
+	 * @return Name of the request.
+	 */
+	public String getRequestName(){
+		return name;
+	}
+	
+	/**
+	 * Sets future task so that file transfer can be canceled by using it.
+	 * @param resultFutureTask Task created from this request.
+	 */
+	public void setFutureTask(FutureTask<RequestResult> resultFutureTask) {
+		this.resultFutureTask = resultFutureTask;
+		if(requestCanceled) {
+			// Cancel has already been ordered.
+			resultFutureTask.cancel(false);
+		}
+	}
+	
+	/**
+	 * Cancels this request by canceling future task.
+	 */
+	public void cancel() {
+		requestCanceled = true;
+		// Checking that future task has been created and then canceling it.
+		if(resultFutureTask != null) {
+			resultFutureTask.cancel(false);
+		}
+	}
+	
+	/**
+	 * Actual method that contains code to send the request and return the response.
+	 * @return Result for call inside a RequesResult class.
+	 * @throws Exception Thrown if screen capture fails.
+	 */
+	public RequestResult call() throws Exception {
+		// Initializing service.
+		BaseService service = createService();
+		// Getting settings and connecting.
+		String host = DataGatewayConstants.HOST;
+		int port = DataGatewayConstants.PORT;
+		service.connect(host, port);
+		
+		// Sending upload request to HTI API.
+		try{
+			// Invoking request
+			RequestResult requestResult = invokeService(service);
+			return requestResult;
+			
+		} catch(Exception e){
+			// Connection needs to be restarted in case of communication errors
+			// to make sure that HTI works correctly. 
+			service.detach();
+			throw e;
+		}
+	}
+	
+	//
+	// Abstract methods to be implemented by sub classes.	
+	//
+	
+	/**
+	 * Create service that is used for this request.
+	 * @return Service that has been inherited from BaseService.
+	 */
+	public abstract BaseService createService(); 	
+	
+	/**
+	 * Invoke necessary actions for getting result and return result.
+	 * @param service Service that has been created in createService method.
+	 * @return Result from request.
+	 * @throws Exception Exception 
+	 */
+	public abstract RequestResult invokeService(IService service) throws Exception;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/HtiConnection.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,685 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus.EStatus;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionsManagerListener;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.hticonnection.connection.HTIConnectedService;
+import com.nokia.s60tools.hticonnection.connection.HTIConnectionStatus;
+import com.nokia.s60tools.hticonnection.connection.HTIService;
+import com.nokia.s60tools.hticonnection.gateway.DataGatewayManager;
+import com.nokia.s60tools.hticonnection.listener.HtiConnectionManager;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferenceConstants;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+import com.nokia.s60tools.hticonnection.ui.dialogs.ErrorDialogWithHelp;
+import com.nokia.s60tools.hticonnection.ui.dialogs.HtiApiMessageBox;
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+
+/**
+ * This class manages current connection and holds it status information.
+ */
+public class HtiConnection implements IConnectionsManagerListener {
+
+	/**
+	 * Status of current connection. Used to device if new requests should
+	 * be accepted. Connection is in shutdown status when plug-in is started.
+	 */
+	private ConnectionStatus currentStatus = ConnectionStatus.SHUTDOWN;
+	
+	/**
+	 * Thread is used to test connection when connection has been started.
+	 */
+	private ConnectionCheckerThread connectionChecker = null;
+	
+	/**
+	 * Instance of this singleton class.
+	 */
+	private static HtiConnection instance = null;
+
+	/**
+	 * HTI version to which HTI Connection is currently connected.
+	 */
+	private HTIVersion version = null;
+	
+	/**
+	 * Currently used connection.
+	 */
+	private IConnection currentConnection = null;
+	
+	/**
+	 * Stores instance of data gateway, that is used for communication between HTI API and device.
+	 */
+	private DataGatewayManager gatewayManager = null;
+	
+	/**
+	 * Enumeration for status of the current connection.
+	 */
+	public enum ConnectionStatus {
+		SHUTDOWN, // Connection has been shut down.
+		TESTING,  // Testing connection. Used when testing connection from preferences.
+		CONNECTING, //  Connection is just started or there have been problems in connection.
+		CONNECTED // Connection is working.
+	};
+	
+	/**
+	 * Private constructor to prevent creating new instances.
+	 */
+	private HtiConnection(){
+		gatewayManager = new DataGatewayManager();
+	}
+	
+	/**
+	 * Only one instance can exist at one time.
+	 * @return Current instance.
+	 */
+	public static synchronized HtiConnection getInstance(){
+		if( instance == null ){
+			instance = new HtiConnection();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Initializes listeners and settings.
+	 */
+	public void init() {
+		RemoteConnectionsActivator.getConnectionsManager().addConnectionStoreChangedListener(this);
+		currentConnection = HtiApiActivator.getPreferences().getCurrentConnection();
+	}
+	
+	/**
+	 * Stops thread that checks if connection is up.
+	 */
+	public void stop() {
+		setConnectionStatus(ConnectionStatus.SHUTDOWN);
+		RemoteConnectionsActivator.getConnectionsManager().removeConnectionStoreChangedListener(this);
+		connectionChecker = null;
+		
+		if(gatewayManager != null){
+			stopConnection();
+		}
+	}
+	
+	/**
+	 * Starts connection with current settings.
+	 * @param isTesting True if connection is started only to test connection settings.
+	 * @return True if connection was started successfully. False otherwise.
+	 */
+	public boolean startConnection(boolean isTesting) {
+		IConnection connection = getCurrentConnection(); 
+		if(gatewayManager.isReady()) {
+			// Old gateway needs to be stopped before starting new.
+			stopConnection();
+		}
+		
+		if(connection == null) {
+			String msg;
+			List<IConnection> htiConns = getHTIConnections();
+			if(htiConns.size() > 0) {
+				msg = new String(Messages.getString("HtiConnection.ConnectionNotSelected_ErrMsg")); //$NON-NLS-1$
+			} else {
+				msg = new String(Messages.getString("HtiConnection.NoConnections_ErrMsg")); //$NON-NLS-1$
+			}
+			
+			ErrorDialogRunnable runnable = new ErrorDialogRunnable(msg);
+			Display.getDefault().asyncExec(runnable);
+			return false;
+		}
+		
+		// Connection status needs to be set before starting gateway, so that connection is set to use.
+		ConnectionStatus status = (isTesting) ? ConnectionStatus.TESTING : ConnectionStatus.CONNECTING;
+		setConnectionStatus(status);
+		
+		return startGateway(connection, isTesting);
+	}
+	
+	/**
+	 * Starts datagateway with current settings.
+	 * @param isTesting True if datagateway is started only to test connection settings.
+	 * @return True if datagateway was started successfully. False otherwise.
+	 */
+	private boolean startGateway(IConnection connection, boolean isTesting) {
+		try {
+			boolean started = false;
+			// Connection status needs to be checked here, because setting connection status can take a while,
+			// when connection is set in to use. User could have stopped the connection during that time.
+			if(getConnectionStatus() != ConnectionStatus.SHUTDOWN) {
+				// Connection string needs to be updated, before starting connection.
+				// Otherwise old information might be shown.
+				started = gatewayManager.startGateway(connection, isTesting);
+			}
+			
+			if(started && !isTesting) {
+				// Connection needs to be tested after datagateway has been started.
+				connectionChecker = new ConnectionCheckerThread();
+				connectionChecker.start();
+			}
+			else if(!started) {
+				setConnectionStatus(ConnectionStatus.SHUTDOWN);
+			}
+			
+			return started;
+		
+		} catch (UnsupportedOSException e) {
+			Runnable runnable = new Runnable() {
+				public void run() {
+					// Only Windows operating system is supported.
+					String errMsg = Messages.getString("HtiConnection.FailedToStartGateway_ErrMsg"); //$NON-NLS-1$
+					HtiApiMessageBox msgBox = new HtiApiMessageBox(errMsg, SWT.ICON_ERROR | SWT.OK);
+					msgBox.open();
+				}
+				
+			};
+			// Messagebox needs to be opened from UI thread.
+			Display.getDefault().asyncExec(runnable);
+			
+			return false;
+		}
+	}
+	
+	/**
+	 * Stops datagateway.
+	 */
+	public void stopConnection() {
+		setConnectionStatus(ConnectionStatus.SHUTDOWN);
+		gatewayManager.stopGateway();
+	}
+	
+	/**
+	 * Tests given connection. Shuts down existing connection.
+	 * This method is synchronized, because there can come multiple test
+	 * request at the same time from Remote Connections.
+	 */
+	public synchronized IStatus testConnection(IConnection testConnection) {
+		
+		IConnection origConn = getCurrentConnection();
+		
+		EStatus testStatus = EStatus.UNKNOWN;
+		String shortDesc = Messages.getString("HtiConnection.NotConnected_StatusMsg"); //$NON-NLS-1$
+		String longDesc = Messages.getString("HtiConnection.ConnectionFailed_StatusMsg"); //$NON-NLS-1$
+		
+		try {
+			// Existing gateway needs to be stopped.
+			stopConnection();
+			
+			// New connection should be defined.
+			setCurrentConnection(testConnection, true);
+			
+			// Gateway can be started now.
+			if(startConnection(true)) {
+				if(RequestQueueManager.getInstance().testConnection()) {
+					HTIVersion version = getHTIVersion();
+					testStatus = EStatus.UP;
+					shortDesc = Messages.getString("HtiConnection.Connected_StatusMsg"); //$NON-NLS-1$
+					longDesc = Messages.getString("HtiConnection.Connected_LongStatusMsg") + version.toString(); //$NON-NLS-1$
+				} else {
+					testStatus = EStatus.DOWN;
+					shortDesc = Messages.getString("HtiConnection.NotConnected_StatusMsg"); //$NON-NLS-1$
+					longDesc = Messages.getString("HtiConnection.ConnectionFailed_StatusMsg"); //$NON-NLS-1$
+				}
+			} else {
+				testStatus = EStatus.DOWN;
+				shortDesc = Messages.getString("HtiConnection.NotConnected_StatusMsg"); //$NON-NLS-1$
+				longDesc = Messages.getString("HtiConnection.FailedToStartGateway_StatusMsg"); //$NON-NLS-1$
+			}
+			
+		} catch (Exception e) {
+			if (e.getMessage().equals("com.nokia.HTI.HTIException: HTI NOT INITIALIZED")) { //$NON-NLS-1$
+				// HTI agent is not responding
+				testStatus = EStatus.DOWN;
+				shortDesc = Messages.getString("HtiConnection.NotConnected_StatusMsg"); //$NON-NLS-1$
+				longDesc = Messages.getString("HtiConnection.HtiNotResponding_StatusMsg"); //$NON-NLS-1$
+			} else {
+				// Connection could not be created
+				testStatus = EStatus.DOWN;
+				shortDesc = Messages.getString("HtiConnection.NotConnected_StatusMsg"); //$NON-NLS-1$
+				longDesc = Messages.getString("HtiConnection.ConnectionFailed_StatusMsg"); //$NON-NLS-1$
+			}
+		} finally {
+			stopConnection();
+			setCurrentConnection(origConn, false);
+		}
+		
+		return new HTIConnectionStatus(null, testStatus, shortDesc, longDesc);
+	}
+	
+	/**
+	 * Set HTI version to which HTI Connection is currently connected.
+	 * @param version HTI version to which HTI Connection is currently connected.
+	 */
+	public void setHTIVersion(HTIVersion version) {
+		this.version = version;
+	}
+	
+	/**
+	 * Get HTI version to which HTI Connection is currently connected.
+	 * @return HTI version to which HTI Connection is currently connected,
+	 * or null if connection is down.
+	 */
+	public HTIVersion getHTIVersion() {
+		return version;
+	}
+	
+	/**
+	 * Returns all connections which support connection types that HTI Connection can use. 
+	 * @return List of connections that support connection types that HTI Connection can use.
+	 */
+	public List<IConnection> getHTIConnections() {
+		
+		// Getting needed variables.
+		Collection<IConnection> connections = RemoteConnectionsActivator.getConnectionsManager().getConnections();
+		Collection<String> connectionTypes = HTIService.getCompatibleConnectionTypeIds();
+		List<IConnection> htiConnections = new ArrayList<IConnection>();
+		
+		// Going through all connection.
+		for(IConnection conn : connections) {	
+			if(connectionTypes.contains(conn.getConnectionType().getIdentifier())) {
+				htiConnections.add(conn);
+			}
+		}
+		
+		return htiConnections;
+	}
+	
+	/**
+	 * Returns current status of connection.
+	 * @return Current status of connection.
+	 */
+	public ConnectionStatus getConnectionStatus() {
+		synchronized(currentStatus) {
+			return currentStatus;
+		}
+	}
+
+	/**
+	 * Updates connection status in views description.
+	 */
+	public void updateConnectionStatus() {
+		Runnable updater = new ConnectionStatusUpdater(getCurrentConnection());
+		// Updating connection status asynchronously in default UI thread.
+		Display.getDefault().asyncExec(updater);
+	}
+	
+	/**
+	 * Sets current status of connection.
+	 * @param currentStatus The currentStatus to set.
+	 */
+	public void setConnectionStatus(ConnectionStatus newStatus) {
+		// Flagging status change information.
+		boolean connectionStarted = false;
+		boolean connectionTerminated = false;
+		boolean connectionUp = false;
+		boolean connectionDown = false;
+		boolean needsUpdate = false;
+		
+		// Checking new status and updating current status.
+		synchronized(currentStatus) {
+			if (newStatus == ConnectionStatus.SHUTDOWN
+					&& currentStatus != ConnectionStatus.SHUTDOWN) {
+				// Shutting down the connection and connection tester.
+				connectionChecker = null;
+				connectionDown = true;
+			}
+			else if (newStatus == ConnectionStatus.CONNECTED
+					&& currentStatus != ConnectionStatus.CONNECTED) {
+				connectionUp = true;
+			}
+			else if (newStatus != ConnectionStatus.CONNECTED
+					&& currentStatus == ConnectionStatus.CONNECTED) {
+				connectionDown = true;
+			}
+			
+			// Checking if it is needed to start/stop using current connection.
+			if (newStatus != ConnectionStatus.SHUTDOWN
+					&& currentStatus == ConnectionStatus.SHUTDOWN) {
+				connectionStarted = true;
+			}
+			else if (newStatus == ConnectionStatus.SHUTDOWN
+					&& currentStatus != ConnectionStatus.SHUTDOWN) {
+				connectionTerminated = true;
+			}
+			
+			needsUpdate = (currentStatus != newStatus);
+			currentStatus = newStatus;
+		} // End synchronized
+		
+		// Updating and informing outside of the synchronized block to prevent
+		// synchronization slowing down connection status queries.
+		
+		if(needsUpdate) {
+			updateConnectionStatus();
+		}
+		
+		if(connectionUp) {
+			// Inform listeners of starting the connection
+			HtiConnectionManager.getInstance().informConnectionStarted();
+		}
+		else if(connectionDown) {
+			// Inform listeners of connection termination
+			HtiConnectionManager.getInstance().informConnectionTerminated();
+			setHTIVersion(null);
+			RequestQueueManager.getInstance().cancelRequestsInQueue();
+		}
+		
+		if(connectionStarted) {
+			// Connection needs to be set as used, before starting datagateway.
+			// This must be done as last operation, because useConnection can take some time and
+			// it is good to update other components first to prevent information lagging behind.
+			IConnection conn = getCurrentConnection();
+			if(conn != null) {
+				conn.useConnection(true);
+			}
+		}
+		else if(connectionTerminated) {
+			// Connection is not needed anymore.
+			IConnection conn = getCurrentConnection();
+			if(conn != null) {
+				conn.useConnection(false);
+			}
+		}
+	}
+	
+	/**
+	 * Shows message to user if exception is caused by communication problems.
+	 * This method also changes connection state to CONNECTNG, so service won't accept further requests.
+	 * @param exception Exception to be checked and reported.
+	 * @return Returns true if error was reported and connection is set to CONNECTING state, false otherwise.
+	 */
+	public boolean reportConnectionError(ExecutionException exception) {
+		
+		String msg;
+		
+		// Checking if there are problems with connection and handling problems.
+		if (exception.getMessage().equals("com.nokia.HTI.HTIException: HTI NOT INITIALIZED")) { //$NON-NLS-1$
+			msg = Messages.getString("HtiConnection.HtiNotResponding_MsgBoxMsg"); //$NON-NLS-1$
+		}
+		else if( exception.getMessage().equals("java.net.ConnectException: Connection refused: connect")) { //$NON-NLS-1$
+			msg = Messages.getString("HtiConnection.ConnectionFailed_MsgBoxMsg"); //$NON-NLS-1$
+		}
+		else {
+			// HTI was initialized correctly and connection was established.
+			// So this shouldn't be connection issue and no need to change to CONNECTING state.
+			return false;
+		}
+		
+		if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.SHUTDOWN) {
+			// Setting connection status to testing state here to prevent extra error messages.
+			HtiConnection.getInstance().setConnectionStatus(ConnectionStatus.CONNECTING);
+		}
+		
+		ErrorDialogRunnable runnable = new ErrorDialogRunnable(msg);
+		Display.getDefault().asyncExec(runnable);
+		return true;
+	}
+	
+	/**
+	 * Sets currently used connection. Saves connection to preferences, if it isn't a test connection.
+	 * @param currentConnection Connection to be set.
+	 * @param isTestConnection True if connection is set for test purposes. False otherwise.
+	 */
+	public synchronized void setCurrentConnection(IConnection connection, boolean isTestConnection) {
+		if(currentConnection != null && currentConnection != connection) {
+			// Connection can be set as not used, because HTI Connection uses only currentConnection.
+			currentConnection.useConnection(false);
+		}
+		this.currentConnection = connection;
+		
+		if(!isTestConnection) {
+			// ID of normal connection need to be saved to preferences so that it will be used later as default.
+			String connectionID = (currentConnection == null) ? HtiApiPreferenceConstants.DEFAULT_CONNECTION_ID 
+					: currentConnection.getIdentifier();
+			if (!connectionID.equals(HtiApiActivator.getPreferences().getConnectionID())) {
+				HtiApiActivator.getPreferences().setConnectionID(connectionID);
+			}
+		}
+	}
+	
+	/**
+	 * Gets currently used connection.
+	 * @return Currently used connection, or <code>null</code> if connection has not been set.
+	 */
+	public synchronized IConnection getCurrentConnection() {
+		return currentConnection;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionsManagerListener#connectionStoreChanged()
+	 */
+	public void connectionStoreChanged() {
+		// Initializing needed variables.
+		IConnection currConn = getCurrentConnection();
+		if(currConn == null) {
+			// Nothing to do, if no connection is selected.
+			return;
+		}
+		String connID = currConn.getIdentifier();
+		Collection<IConnection> connections = RemoteConnectionsActivator.getConnectionsManager().getConnections();
+		
+		// Checking if current connection still exists.
+		boolean isFound = false;
+		for(IConnection conn : connections) {	
+			if(conn.getIdentifier().equals(connID)) {
+				isFound = true;
+				break;
+			}
+		}
+		
+		if(!isFound) {
+			// Connection doesn't exist anymore. Setting current connection as null.
+			setCurrentConnection(null, false);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionsManagerListener#displayChanged()
+	 */
+	public void displayChanged() {
+		// Not implemented.
+	}
+	
+	//
+	// Private classes.
+	//
+	
+	/**
+	 * Thread that tests connection.
+	 * Connection needs to be tested when new connection has been started
+	 * or there has been problems with current connection.
+	 */
+	private class ConnectionCheckerThread extends Thread {
+		
+		/**
+		 * Time in ms that is waited between testing the connection.
+		 */
+		private static final long TEST_DELAY = 1000;
+		
+		/**
+		 * Keeps track for first connection try. This is needed if there
+		 * happens connection error when testing connection first time.
+		 * On other times connection failure information comes from outside
+		 * of this class.
+		 */
+		private boolean firstConnection = true;
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run() {
+			Thread thisThread = Thread.currentThread();
+			while(thisThread == connectionChecker) {
+				
+				if(getConnectionStatus() == ConnectionStatus.CONNECTING) {
+					testConnection();
+				}
+				
+				try {
+					Thread.sleep(TEST_DELAY);
+				} catch (InterruptedException e) {
+					// Not needed to handle. Just continuing polling in this case.
+				}
+			}
+		}
+		
+		/**
+		 * Tests if current connection works and modifies connection status
+		 * in HtiApiActivator class if needed.
+		 */
+		private void testConnection() {
+			try {
+				boolean connectionUp = RequestQueueManager.getInstance().testConnection();
+				
+				if(connectionUp) {
+					setConnectionStatus(ConnectionStatus.CONNECTED);
+				}
+				
+			} catch (ExecutionException e) {
+				if(firstConnection && getConnectionStatus() != ConnectionStatus.SHUTDOWN) {
+					// Other than first connection errors are reported from RequestQueueManager.
+					// This handles only first connection problem when trying to connect to the device.
+					reportConnectionError(e);
+				}
+			} catch (Exception e) {
+				// Catching other errors that doesn't need any specific actions.
+			}
+			
+			firstConnection = false;
+		}
+	}
+	
+	/**
+	 * Updates connection status and buttons in UI.
+	 */
+	private class ConnectionStatusUpdater implements Runnable {
+
+		/**
+		 * Connection that needs status update.
+		 */
+		private final IConnection onnectionToUpdate;
+
+		/**
+		 * Constructor.
+		 * @param onnectionToUpdate Connection that needs status update.
+		 */
+		public ConnectionStatusUpdater(IConnection onnectionToUpdate) {
+			this.onnectionToUpdate = onnectionToUpdate;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			
+			// Connection status needs to be updated in connected service.
+			if(onnectionToUpdate != null) {
+				Collection<IConnectedService> services = RemoteConnectionsActivator.getConnectionsManager().getConnectedServices(onnectionToUpdate);
+				// Collection can be null if getting services for test connection.
+				if(services != null) {
+					for(IConnectedService service : services) {
+						if(service instanceof HTIConnectedService) {
+							((HTIConnectedService)service).refreshStatus();
+						}
+					}
+				}
+			}
+			
+			try {
+				MainView view = MainView.getViewInstance(false);
+				view.updateActionButtonStates();
+				
+				// Updating connection description.
+				switch (getConnectionStatus()) {
+				case CONNECTED:
+					view.updateDescription(Messages.getString("HtiConnection.Connected_ToolBar_Msg") + onnectionToUpdate.getDisplayName()); //$NON-NLS-1$
+					break;
+				case CONNECTING:
+					view.updateDescription(Messages.getString("HtiConnection.Connecting_ToolBar_Msg") + onnectionToUpdate.getDisplayName()); //$NON-NLS-1$
+					break;
+				case SHUTDOWN:
+					view.updateDescription(Messages.getString("HtiConnection.NotConnected_ToolBar_Msg")); //$NON-NLS-1$
+					break;
+				case TESTING:
+					view.updateDescription(Messages.getString("HtiConnection.Testing_ToolBar_Msg")); //$NON-NLS-1$
+					break;
+				}
+			} catch (PartInitException e) {
+				// No need to handle. Description doesn't need update if part is not visible.
+			}
+		}
+	}
+	
+	/**
+	 * Runnable that opens error message box.
+	 */
+	private class ErrorDialogRunnable implements Runnable {
+
+		/**
+		 * Error message.
+		 */
+		private final String errorMessage;
+
+		/**
+		 * Constructor.
+		 * @param errorMessage Message to be shown in dialog.
+		 */
+		public ErrorDialogRunnable(String errorMessage) {
+			this.errorMessage = errorMessage;
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			
+			// No need to show error message if preferences page is already created.
+			if(HtiApiPreferencePage.isCreated()) {
+				// Showing plain error message if preferences page is open.
+				ErrorDialogWithHelp msgBox = new ErrorDialogWithHelp(errorMessage, SWT.OK);
+				msgBox.open();
+			} else {
+				// Asking if user wants to manage preferences.
+				String msgWithQuestionStr = errorMessage + Messages.getString("HtiConnection.ManageConnections_ErrMsg"); //$NON-NLS-1$
+				
+				ErrorDialogWithHelp msgBox = new ErrorDialogWithHelp(msgWithQuestionStr, SWT.YES | SWT.NO);
+				int result = msgBox.open();
+				if(result == SWT.YES && !HtiApiPreferencePage.isCreated()){
+					// Opening preferences if Yes is selected.
+					OpenPreferencePageAction openPreferencesAction = new OpenPreferencePageAction();
+					openPreferencesAction.run();
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/RequestQueueManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.core;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+import com.nokia.s60tools.hticonnection.services.connectiontestservice.GetVersionRequest;
+import com.nokia.s60tools.hticonnection.services.ftpservice.AbstractFileTransferRequest;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Singleton class that handles messages one at the time.
+ */
+public class RequestQueueManager {
+
+	/**
+	 * Service that holds requests in line and handles them.
+	 */
+	private ExecutorService executorService;
+	/**
+	 * Instance of this singleton class.
+	 */
+	private static RequestQueueManager instance = null;
+
+	/**
+	 * List of requests that are currently in queue or executing.
+	 */
+	private static List<AbstractRequest> requests;
+	
+	/**
+	 * Private constructor to prevent creating new instances.
+	 */
+	private RequestQueueManager(){
+		executorService = Executors.newSingleThreadExecutor();
+	}
+	
+	/**
+	 * Only one instance can exist at one time.
+	 * @return Current instance.
+	 */
+	public static synchronized RequestQueueManager getInstance(){
+		if( instance == null ){
+			instance = new RequestQueueManager();
+			requests = Collections.synchronizedList(new ArrayList<AbstractRequest>());
+		}
+		return instance;
+	}
+	
+	/**
+	 * Resets manager so that it can be used again after stop if needed.
+	 */
+	public void reset(){
+		instance = null;
+	}
+	
+	/**
+	 * ExecutorService needs to be shutdown, so that it won't stay active.
+	 * This should be run after there won't be new tasks coming.
+	 */
+	@SuppressWarnings("unchecked")
+	public void stop(){
+		// Shutting down all
+		List<Runnable> requests = executorService.shutdownNow();
+		
+		for(Runnable runnable : requests) {
+			if(runnable instanceof FutureTask) {
+				// Warning from this unchecked cast is suppressed as it doesn't
+				// matter what type of FutureTask it is. Just canceling it.
+				FutureTask request = (FutureTask)runnable;
+				request.cancel(false);
+			}
+		}
+		
+		try {
+			// Waiting for commands to complete for one second and then shutting down..
+			executorService.awaitTermination(100, TimeUnit.MILLISECONDS);
+		} catch (InterruptedException e) {
+			// Service is being shutdown. Exception doesn't matter anymore.
+		}
+	}
+	
+	/**
+	 * Submits request to ExecutorService and returns result for request.
+	 * @param requestCallable Request that will be added to queue.
+	 * @param printUtility Used for printing messages.
+	 * @return RequestResult contains request.
+	 * @throws ConnectionException Connection failed.
+	 * @throws HTIException Thrown when connection HTI agent could not be initialized.
+	 * @throws ServiceShutdownException Thrown if services have been shut down
+	 */
+	public RequestResult submit(AbstractRequest requestCallable, IConsolePrintUtility printUtility)
+						throws HTIException, ConnectionException, ServiceShutdownException {
+		// Checking if services are shutdown.
+		ConnectionStatus status = HtiConnection.getInstance().getConnectionStatus();
+		if(executorService.isShutdown() || status != ConnectionStatus.CONNECTED){
+			throw new ServiceShutdownException(Messages.getString("RequestQueueManager.ServiceShutdown_Exception_Msg")); //$NON-NLS-1$
+		}
+		
+		// Creating future task that holds request.
+		FutureTask<RequestResult> resultFutureTask = new FutureTask<RequestResult>(requestCallable);
+		requestCallable.setFutureTask(resultFutureTask);
+		
+		// Handling FTP Request before putting them in to queue.
+		if(requestCallable instanceof AbstractFileTransferRequest) {
+			AbstractFileTransferRequest ftpRequest = (AbstractFileTransferRequest) requestCallable;
+			ftpRequest.informInQueue();
+		}
+			
+		// Submitting the task to executor service.
+		executorService.submit(resultFutureTask);
+		return getResult(requestCallable, resultFutureTask, printUtility);
+		
+	}
+	
+	/**
+	 * Returns result from resultFutureTasks.
+	 * @param requestCallable Request that will be added to queue.
+	 * @param resultFutureTask Future task that is created from requestCallable.
+	 * @param printUtility printUtility Used for printing messages.
+	 * @return RequestResult contains request.
+	 * @throws ConnectionException Connection failed.
+	 * @throws HTIException Thrown when connection HTI agent could not be initialized.
+	 * @throws ServiceShutdownException Thrown if services have been shut down
+	 */
+	private RequestResult getResult(AbstractRequest requestCallable,
+									FutureTask<RequestResult> resultFutureTask,
+									IConsolePrintUtility printUtility)
+											throws HTIException, ConnectionException, ServiceShutdownException {
+
+		// Keeping requests in list, so that they can be canceled if necessary.
+		synchronized(requests) {
+			requests.add(requestCallable);
+		}
+		
+		RequestResult result = null;
+		try {
+			// Get method blocks the call, until computation of the result is finished or exception has arisen.
+			result = resultFutureTask.get();
+		} catch (CancellationException e) {
+			if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.CONNECTED) {
+				// Not connected to service.
+				throw new ServiceShutdownException(Messages.getString("RequestQueueManager.Datagateway_Shutdown_Exception_Msg")); //$NON-NLS-1$
+			}
+			
+			// Request was canceled. Informing caller.
+			throw new HTIException(requestCallable.getRequestName()
+					 + Messages.getString("RequestQueueManager.RequestCanceled_Exception_Msg0"), true, true); //$NON-NLS-1$
+		} catch (InterruptedException e) {
+			handleInterrupedException(requestCallable, e, printUtility);
+		} catch (ExecutionException e) {
+			handleExecutionException(requestCallable, e, printUtility);
+		} finally {
+			// Removing requests that have been already executed.
+			synchronized(requests) {
+				requests.remove(requestCallable);
+			}
+			
+			if(requestCallable instanceof AbstractFileTransferRequest) {
+				// Handling informing about the end of the FTP Request.
+				((AbstractFileTransferRequest) requestCallable).informEnded();
+			}
+		} 
+		
+		return result;
+	}
+	
+	/**
+	 * Tests connection by sending get version request to the device.
+	 * This method is used to test connection when it is in testing state.
+	 * Throws exceptions which have occurred when getting the response. 
+	 * @return True if connection is up and running. False if request failed to
+	 * get data or connection is down.
+	 * @throws InterruptedException if the request was interrupted while waiting. 
+	 * @throws ExecutionException if the request threw an exception.
+	 */
+	public boolean testConnection() throws InterruptedException, ExecutionException {
+		
+		ConnectionStatus status = HtiConnection.getInstance().getConnectionStatus();
+		
+		// Checking if service is shutdown.
+		if(status == ConnectionStatus.SHUTDOWN || executorService.isShutdown() ){
+			return false;
+		}
+		
+		GetVersionRequest request = new GetVersionRequest();
+		
+		// Creating future task that holds request.
+		FutureTask<RequestResult> resultFutureTask = new FutureTask<RequestResult>(request);
+		
+		// Submitting the task to executor service.
+		executorService.submit(resultFutureTask);
+
+		// Get method blocks the call, until computation of the result is finished or exception has arisen.
+		RequestResult result = resultFutureTask.get();
+		HTIVersion version = result.getHTIVersionData();
+		
+		if (version != null) {
+			// Request succeeded
+			HtiConnection.getInstance().setHTIVersion(version);
+			return true;
+		}
+		
+		// Request didn't return value.
+		return false;
+	}
+	
+	/**
+	 * Cancels all requests that are currently in queue.
+	 */
+	public void cancelRequestsInQueue() {
+		synchronized(requests) {
+			Iterator<AbstractRequest> iter = requests.iterator();
+			while(iter.hasNext()) {
+				iter.next().cancel();
+			}
+		}
+	}
+	
+	/**
+	 * Handling executionExceptions. Logging errors and throwing correct exception.
+	 * @param requestCallable Request that caused the exception.
+	 * @param exception Exception to be handled.
+	 * @param printUtility Used for printing messages.
+	 * @throws ConnectionException Thrown if connection failed.
+	 * @throws HTIException Thrown if couldn't connect to HTI agent.
+	 * @throws ServiceShutdownException Thrown if services have been shut down.
+	 */
+	private void handleExecutionException(AbstractRequest requestCallable, ExecutionException exception,
+			IConsolePrintUtility printUtility)
+				throws ConnectionException, HTIException, ServiceShutdownException {
+		// Testing if service has been shutdown.
+		if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.CONNECTED){
+			throw new ServiceShutdownException(Messages.getString("RequestQueueManager.Datagateway_Shutdown_Exception_Msg")); //$NON-NLS-1$
+		}
+		
+		// Handling exceptions arisen when running call.
+		printUtility.println(requestCallable.getRequestName() +
+				Messages.getString("RequestQueueManager.RequestFailed_Exception_Msg") + //$NON-NLS-1$
+				exception.getCause().getMessage(),
+				IConsolePrintUtility.MSG_ERROR);
+		
+		handleConnectionFailure(requestCallable, exception, printUtility);
+
+		// Checking if problem was that HTI agent couldn't be initialized.
+		if (exception.getMessage().equals("com.nokia.HTI.HTIException: HTI NOT INITIALIZED")) { //$NON-NLS-1$
+			throw new HTIException(exception.getMessage(), false);
+		}
+		
+		throw new ConnectionException(exception.getMessage());
+	}
+
+	/**
+	 * Handling executionExceptions. Logging errors and throwing correct exception.
+	 * @param requestCallable Request that caused the exception.
+	 * @param exception exception Exception to be handled.
+	 * @param printUtility Used for printing messages.
+	 * @throws ConnectionException Thrown if connection failed.
+	 * @throws ServiceShutdownException Thrown if services have been shut down.
+	 */
+	private void handleInterrupedException(AbstractRequest requestCallable,
+			InterruptedException exception, IConsolePrintUtility printUtility)
+					throws ConnectionException, ServiceShutdownException {
+		// Testing if service has been shutdown.
+		if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.CONNECTED){
+			throw new ServiceShutdownException(Messages.getString("RequestQueueManager.Datagateway_Shutdown_Exception_Msg")); //$NON-NLS-1$
+		}
+		
+		// Handling interrupts in thread handling.
+		printUtility.println(requestCallable.getRequestName() +
+				Messages.getString("RequestQueueManager.RequestInterrupted_Exception_Msg") + //$NON-NLS-1$
+				exception.getCause().getMessage(),
+				IConsolePrintUtility.MSG_ERROR);
+		throw new ConnectionException(exception.getMessage());
+	}
+	
+	/**
+	 * Doing necessary actions when connection failure happens.
+	 * Informs user when connection/request fails because of connection problems
+	 * and offers possibility to change/test connection settings.
+	 * @param requestCallable Request that caused the exception.
+	 * @param exception Exception to be handled.
+	 * @param printUtility Used for printing messages.
+	 */
+	private synchronized void handleConnectionFailure(final AbstractRequest requestCallable,
+			ExecutionException exception, IConsolePrintUtility printUtility)
+				throws ServiceShutdownException{
+		// Showing error message only if connection is up and preferences page is not open.
+		if(HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.CONNECTED
+				&& HtiApiPreferencePage.isCreated()){
+			return;
+		}
+		
+		boolean isReported = HtiConnection.getInstance().reportConnectionError(exception);
+		
+		if(isReported) {
+			// Error reported and service is now in CONNECTING state because of connection problem.
+			throw new ServiceShutdownException(Messages.getString("RequestQueueManager.Datagateway_Shutdown_Exception_Msg")); //$NON-NLS-1$
+		}
+
+		// It is now checked that HTI was initialized correctly and connection was established.
+		// Leaving handling of other problems to the client.
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/core/RequestResult.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,230 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.core;
+
+import java.util.List;
+
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.ApplicationControlService.AppStatus;
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+import com.nokia.s60tools.hticonnection.services.FileInfo;
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+
+/**
+ * Class to contain result of request. 
+ */
+public class RequestResult {
+
+	// Data for the request result.
+	private byte[] byteData = null;
+	private boolean booleanData;
+	private String[] stringArrayData = null;
+	private String stringData = null;
+	private HTIMessage htiMessage = null;
+	private List<String> listData = null;
+	private AppStatus appStatus = null;
+	private HTIScreenMode screenMode = null;
+	private DriveInfo[] driveInfoData = null;
+	private HTIVersion versionData = null;
+	private FileInfo[] fileInfoData = null;
+	
+	//
+	// Constructors.
+	//
+
+	/**
+	 * Constructor for byte data.
+	 * @param byteData Data as bytes.
+	 */
+	public RequestResult(byte[] byteData){
+		this.byteData = byteData;
+	}
+
+	/**
+	 * Constructor for boolean data.
+	 * @param booleanData Boolean value..
+	 */
+	public RequestResult(boolean booleanData){
+		this.booleanData = booleanData;
+	}
+	
+	/**
+	 * Constructor for String array data.
+	 * @param stringData Data as String array.
+	 */
+	public RequestResult(String[] stringData){
+		this.stringArrayData = stringData;
+	}
+	
+	/**
+	 * Constructor for String data.
+	 * @param stringData Data as String.
+	 */
+	public RequestResult(String stringData){
+		this.stringData = stringData;
+	}
+	
+	/**
+	 * Constructor for HTIMessage.
+	 * @param htiMessage Result as HTIMessage.
+	 */
+	public RequestResult(HTIMessage htiMessage){
+		this.htiMessage = htiMessage;
+	}
+	
+	/**
+	 * Constructor for List.
+	 * @param listData Result as List.
+	 */
+	public RequestResult(List<String> listData){
+		this.listData = listData;
+	}
+	
+	/**
+	 * Constructor for AppStatus.
+	 * @param appStatus Application status.
+	 */
+	public RequestResult(AppStatus appStatus){
+		this.appStatus = appStatus;
+	}
+
+	/**
+	 * Constructor for screen mode.
+	 * @param screen mode Result as HTIScreenMode.
+	 */
+	public RequestResult(HTIScreenMode screenMode){
+		this.screenMode = screenMode;
+	}
+	
+	/**
+	 * Constructor for DriveInfo array data.
+	 * @param driveInfoData Data as DriveInfo array.
+	 */
+	public RequestResult(DriveInfo[] driveInfoData){
+		this.driveInfoData = driveInfoData;
+	}
+	
+	/**
+	 * Constructor for version data.
+	 * @param versionData Data as HTIVersion.
+	 */
+	public RequestResult(HTIVersion versionData){
+		this.versionData = versionData;
+	}
+
+	/**
+	 * Constructor for FileInfo array data.
+	 * @param versionData Data as FileInfo array.
+	 */
+	public RequestResult(FileInfo[] fileInfoData){
+		this.fileInfoData = fileInfoData;
+	}
+	
+	//
+	// Getters.
+	//
+	
+	/**
+	 * Method to get byte data result.
+	 * @return Data as bytes or null, if there is no byte data.
+	 */
+	public byte[] getByteData(){
+		return byteData ;
+	}
+	
+	/**
+	 * Method to get boolean data result.
+	 * @return Datavalue.
+	 */
+	public boolean getBooleanData(){
+		return booleanData ;
+	}
+	
+	/**
+	 * Method to get String array data result.
+	 * @return Data as String array or null, if there is no String array data.
+	 */
+	public String[] getStringArrayData(){
+		return stringArrayData ;
+	}
+	
+	/**
+	 * Method to get String data result.
+	 * @return Data as String or null, if there is no String data.
+	 */
+	public String getStringData(){
+		return stringData ;
+	}
+	
+	/**
+	 * Method to get HTIMessage result.
+	 * @return Data as HTIMessage or null, if there is no result.
+	 */
+	public HTIMessage getHTIMessage(){
+		return htiMessage ;
+	}
+	
+	/**
+	 * Method to get List result.
+	 * @return Data as List or null, if there is no result.
+	 */
+	public List<String> getListData(){
+		return listData ;
+	}
+	
+	/**
+	 * Method to get AppStatus result.
+	 * @return Data as AppStatus or null, if there is no result.
+	 */
+	public AppStatus getAppStatus(){
+		return appStatus ;
+	}
+
+	/**
+	 * Method to get screen mode result.
+	 * @return Data as HTIScreenMode or null, if there is no result.
+	 */
+	public HTIScreenMode getScreenMode() {
+		return screenMode;
+	}
+	
+	/**
+	 * Method to get DriveInfo array data result.
+	 * @return Data as DriveInfo array or null, if there is no DriveInfo array data.
+	 */
+	public DriveInfo[] getDriveInfoArrayData(){
+		return driveInfoData ;
+	}
+	
+	/**
+	 * Method to get HTIVersion data result.
+	 * @return Data as HTIVersion or null, if there is no HTIVersion data.
+	 */
+	public HTIVersion getHTIVersionData(){
+		return versionData ;
+	}
+	
+	/**
+	 * Method to get FileInfo array data result.
+	 * @return Data as FileInfo array or null, if there is no FileInfo array data.
+	 */
+	public FileInfo[] getFileInfoArrayData() {
+		return fileInfoData;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/ConnectionException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.exceptions;
+
+/**
+ * Thrown when opening connection is failed 
+ */
+public class ConnectionException extends Exception{
+
+	/**
+	 * Serial version ID.
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 */
+	public ConnectionException(String message){
+		super(message);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/HTIErrorDetails.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,73 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.exceptions;
+
+/**
+ * More detailed information about error.
+ */
+public class HTIErrorDetails {
+	
+	/**
+	 * Error code from HTI.
+	 */
+	private int HTIErrorCode;
+	/**
+	 * Error code from HTI service.
+	 */
+	private int HTIServiceErrorCode;
+	/**
+	 * Error description.
+	 */
+	private String errorDescription;
+
+	/**
+	 * Constructor.
+	 * @param HTIErrorCode Error code from HTI.
+	 * @param HTIServiceErrorCode Error code from HTI service.
+	 * @param errorDescription Error description.
+	 */
+	public HTIErrorDetails(int HTIErrorCode, int HTIServiceErrorCode, String errorDescription){
+		this.HTIErrorCode = HTIErrorCode;
+		this.errorDescription = errorDescription;
+		HTIErrorCode = HTIServiceErrorCode;
+	}
+	
+	/**
+	 * Getter for HTI error code.
+	 * @return Error code from HTI.
+	 */
+	public int getHTIErrorCode() {
+		return HTIErrorCode;
+	}
+	
+	/**
+	 * Getter for Error code from HTI service.
+	 * @return Error code from HTI service.
+	 */
+	public int getHTIServiceErrorCode() {
+		return HTIServiceErrorCode;
+	}
+	
+	/**
+	 * Getter for error description.
+	 * @return Error description.
+	 */
+	public String getErrorDescription() {
+		return errorDescription;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/HTIException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,108 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.exceptions;
+
+/**
+ * Thrown when there are problems with HTI agent.
+ */
+public class HTIException extends Exception{
+
+	/**
+	 * Serial version ID.
+	 */
+	private static final long serialVersionUID = 1L;
+	/**
+	 * More details about error.
+	 */
+	private HTIErrorDetails errorDetails = null;
+	/**
+	 * Boolean about is HTI initialized successfully. False means problems with HTI.
+	 */
+	private boolean isHtiInitialized = true;
+	/**
+	 * Boolean about was HTI request canceled. True if request was canceled. False otherwise.
+	 */
+	private boolean isHtiRequestCanceled = false;
+	
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 * @param isHtiInitialized False if error arises because HTI is not initialized.
+	 * True otherwise.
+	 */
+	public HTIException(String message, boolean isHtiInitialized){
+		super(message);
+		this.isHtiInitialized = isHtiInitialized;
+	}
+	
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 * @param isHtiInitialized False if error arises because HTI is not initialized.
+	 * True otherwise.
+	 * @param isHtiRequestCanceled True if request was canceled. false otherwise.
+	 */
+	public HTIException(String message, boolean isHtiInitialized, boolean isHtiRequestCanceled){
+		super(message);
+		this.isHtiInitialized = isHtiInitialized;
+		this.isHtiRequestCanceled = isHtiRequestCanceled;
+	}
+	
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 * @param errorDetails Contains more details about error.
+	 */
+	public HTIException(String message, HTIErrorDetails errorDetails){
+		super(message);
+		this.errorDetails = errorDetails;
+	}
+	
+	/**
+	 * Gets if exception contains more detailed information about error.
+	 * @return True if exception contains more details about error.
+	 */
+	public boolean hasErrorDetails(){
+		return (errorDetails != null);
+	}
+	
+	/**
+	 * Gets more details about error.
+	 * @return More details about error.
+	 */
+	public HTIErrorDetails getErrorDetails(){
+		return errorDetails;
+	}
+	
+	/**
+	 * Gets if HTI has been initialized successfully. 
+	 * @return True if HTI has been initialized successfully. False if couldn't connect to HTI agent.
+	 */
+	public boolean isHtiInitialized(){
+		return isHtiInitialized;
+	}
+
+	/**
+	 * Gets if HTI request was canceled.
+	 * @return True if request was canceled. False otherwise.
+	 */
+	public boolean isHtiRequestCanceled() {
+		return isHtiRequestCanceled;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/RequestFailedException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.exceptions;
+
+/**
+ * Thrown when request fails.
+ */
+public class RequestFailedException extends Exception{
+
+	/**
+	 * Serial version ID.
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 */
+	public RequestFailedException(String message){
+		super(message);
+	}
+	
+	/**
+	 * Constructor.
+	 * @param cause Original exception.
+	 */
+	public RequestFailedException(Exception cause){
+		super(cause);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/exceptions/ServiceShutdownException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.exceptions;
+
+/**
+ * Thrown when trying to submit new request after shutdown is initiated.
+ */
+public class ServiceShutdownException extends Exception{
+
+	/**
+	 * Serial version ID.
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 */
+	public ServiceShutdownException(String message){
+		super(message);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/DataGatewayConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.gateway;
+
+
+/**
+ * This class stores DataGateway specific constants, like host and port
+ */
+public class DataGatewayConstants {
+	
+	/**
+	 * DataGateway host
+	 */
+	public static final String HOST = "localhost"; //$NON-NLS-1$
+	
+	/**
+	 * DataGateway port
+	 */
+	public static final int PORT = 40387; 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/DataGatewayManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.gateway;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.freescale.cdt.debug.cw.core.SerialConnectionSettings;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+import com.nokia.s60tools.hticonnection.connection.HTIService;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.util.HtiApiConsole;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+
+/**
+ * This class controls gateway.
+ */
+public class DataGatewayManager {
+
+	// Datagateway parameters.
+	private static final String COM_PORT_PARAMETER_NAME = "-COMPORT="; //$NON-NLS-1$
+	private static final String REMOTE_HOST_PARAMETER_NAME = "-REMOTE_HOST="; //$NON-NLS-1$
+	private static final String REMOTE_PORT_PARAMETER_NAME = "-REMOTE_PORT="; //$NON-NLS-1$
+	private static final String PORT_PARAMETER_NAME = "-port="; //$NON-NLS-1$
+	private static final String COMM_CHANNEL_PARAMETER = "-commchannel="; //$NON-NLS-1$
+	private static final String COMM_CHANNEL_SERIAL = "SERIAL"; //$NON-NLS-1$
+	private static final String COMM_CHANNEL_IP = "IPCOMM"; //$NON-NLS-1$
+	
+	/**
+	 * Class that holdes Datagateway.exe process that is running.
+	 */
+	private ProcessHolder holder = null;
+	/**
+	 * This object is used to synchronize process holder.
+	 * Separate synchronizer object is needed because holder object changes and can be null.
+	 */
+	private Object holderSynchronizer = new Object();
+	
+	/**
+	 * Constructor.
+	 */
+	public DataGatewayManager() {
+	}
+
+	/**
+	 * Starts gateway with specified connection.
+	 * @param connection Connection that is used to start gateway.
+	 * @param isTesting True if datagateway is started only to test connection settings.
+	 * @return True if succeeded to start datagateway. False otherwise.
+	 * @throws UnsupportedOSException 
+	 */
+	public boolean startGateway(IConnection connection, boolean isTesting) throws UnsupportedOSException {
+		try {
+			// Getting general parameters.
+			String path = HtiApiActivator.getDefault().getPluginInstallPath() +
+					File.separator + ProductInfoRegistry.getWin32BinariesRelativePath();
+			
+			String[] cmd = getDatagatewayCommand(connection, path);
+			
+			// Making sure that old gateway is stopped.
+			stopGateway();
+			
+			// Starting datagateway. Each gateway has own class that keeps track of the process.
+			
+			boolean started = false;
+			synchronized (holderSynchronizer) {
+				holder = new ProcessHolder();
+				started = holder.runAsyncCommand(cmd, path);
+			}
+			
+			if(!started){
+				// Running command failed. Possible errors are reported in processCreated callback.
+				HtiConnection.getInstance().setConnectionStatus(ConnectionStatus.SHUTDOWN);
+				return false;
+			}
+			
+			// Started successfully.
+			return true;
+		} catch (IOException e) {
+			HtiApiConsole.getInstance().println(
+					Messages.getString("DataGatewayManager.Start_Datagateway_Failed_ConsoleMsg"), //$NON-NLS-1$
+					HtiApiConsole.MSG_ERROR);
+		} catch (Exception e) {
+			HtiApiConsole.getInstance().println(Messages.getString("DataGatewayManager.Start_Datagateway_Failed_Reason_ConsoleMsg") //$NON-NLS-1$
+					+ e.getMessage(), HtiApiConsole.MSG_ERROR);
+		}
+		
+		// Exception was thrown. Failed to start gateway.
+		return false;
+	}
+	
+	/**
+	 * Returns command that is used to run datagateway.
+	 * @param connection Connection that is used to start gateway.
+	 * @param path Path where datagateway is located.
+	 * @return Command that is used to run datagateway.
+	 */
+	private String[] getDatagatewayCommand(IConnection connection, String path) {
+		
+		// Getting general parameters.
+		String type = connection.getConnectionType().getIdentifier();
+		
+		if(type.equals(HTIService.SERIAL_TYPE) ||
+				type.equals(HTIService.SERIAL_BT_TYPE) ||
+				type.equals(HTIService.USB_TYPE)) {
+			// Handling serial connections
+			
+			String comPort = "COM" + connection.getSettings().get(SerialConnectionSettings.PORT); //$NON-NLS-1$
+
+			String[] cmd = new String[] {
+					path + File.separator + ProductInfoRegistry.getDatagatewayExeName(), 
+					PORT_PARAMETER_NAME + DataGatewayConstants.PORT,
+					COMM_CHANNEL_PARAMETER + COMM_CHANNEL_SERIAL,
+					COM_PORT_PARAMETER_NAME+comPort};
+			
+			return cmd;
+			
+		}
+		else if(type.equals(HTIService.TCPIP_TYPE)) {
+			// Handling IP connections.
+			String remoteHost = connection.getSettings().get("ipAddress"); //$NON-NLS-1$
+			String remotePort = connection.getSettings().get(HTIService.ID);
+			
+			String[] cmd = new String[] {
+					path + File.separator + ProductInfoRegistry.getDatagatewayExeName(), 
+					PORT_PARAMETER_NAME + DataGatewayConstants.PORT,
+					COMM_CHANNEL_PARAMETER + COMM_CHANNEL_IP,
+					REMOTE_HOST_PARAMETER_NAME + remoteHost,
+					REMOTE_PORT_PARAMETER_NAME + remotePort };
+			
+			return cmd;
+			
+		}
+		else {
+			throw new RuntimeException(Messages.getString("DataGatewayManager.IncomptibleConnection_ExceptionMsg")); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Stops currently running gateway, or does nothing if gateway is not running.
+	 */
+	public void stopGateway(){
+		synchronized (holderSynchronizer) {
+			if(holder != null) {
+				holder.stopProcess();
+				// This process holder is not needed anymore.
+				holder = null;
+			}
+		}
+	}
+	
+	/**
+	 * Checks if gateway is ready for use.
+	 * @return Returns true if gateway is ready for use.
+	 */
+	public boolean isReady() {
+		synchronized (holderSynchronizer) {
+			if(holder == null) {
+				return false;
+			}
+			return holder.isReady();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/gateway/ProcessHolder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.gateway;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.preferences.HtiApiPreferencePage;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.ui.dialogs.ErrorDialogWithHelp;
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+import com.nokia.s60tools.hticonnection.util.HtiApiConsole;
+import com.nokia.s60tools.util.cmdline.CmdLineCommandExecutorFactory;
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutor;
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * contains and controls datagateway process.
+ */
+public class ProcessHolder implements ICmdLineCommandExecutorObserver {
+	
+	/**
+	 * Datagateway.exe process that is running.
+	 */
+	private Process process;
+	/**
+	 * Executor that is used to launch external programs.
+	 */
+	private ICmdLineCommandExecutor cmdLineExecutor;
+	/**
+	 * True if datagateway is currently shutting down.
+	 * Used to keep track of short period when process is alive,
+	 * but can not get more commands.
+	 */
+	private boolean isShutdowning = false;
+
+	/**
+	 * Constructor.
+	 * @throws UnsupportedOSException Thrown if Operating system is not supported.
+	 */
+	public ProcessHolder() throws UnsupportedOSException {
+		cmdLineExecutor = CmdLineCommandExecutorFactory.CreateOsDependentCommandLineExecutor(
+				this, HtiApiConsole.getInstance());
+	}
+	
+	/**
+	 * Class that can be used to notify user about unexpected datagateway shutdown.
+	 */
+	private class DataGatewayShutdownRunnable implements Runnable{
+
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			// Creating a dialog to notify user about problem.
+			ErrorDialogWithHelp msgBox = new ErrorDialogWithHelp(
+					Messages.getString("ProcessHolder.Datagateway_Unexcept_Shutdown_Change_Settings_ConsoleMsg"),  //$NON-NLS-1$
+					SWT.YES | SWT.NO);
+			int result = msgBox.open();
+
+			// Opening preferences if Yes is selected.
+			if(result == SWT.YES){
+				OpenPreferencePageAction openPreferencesAction = new OpenPreferencePageAction();
+				openPreferencesAction.run();
+			}
+		}
+	}
+
+	/**
+	 * Runs asynchronous command.
+	 * @param cmd Command to be run.
+	 * @param path Path where command is run.
+	 * @return True if command was started successfully. False otherwise.
+	 */
+	public boolean runAsyncCommand(String[] cmd, String path) {
+		process = cmdLineExecutor.runAsyncCommand(cmd, path);
+		return (process == null) ? false : true;
+	}
+
+	/**
+	 * Stops this process.
+	 */
+	public void stopProcess() {
+		if(process != null){
+			isShutdowning = true;
+			process.destroy();
+			try {
+				process.waitFor();
+				process = null;
+			} catch (InterruptedException e) {
+				HtiApiConsole.getInstance().println(
+						Messages.getString("ProcessHolder.Stop_Datagateway_Failed_ConsoleMsg"), //$NON-NLS-1$
+						HtiApiConsole.MSG_ERROR);
+			}
+		}
+	}
+
+	/**
+	 * Checks if gateway is ready for use.
+	 * @return Returns true if gateway is ready for use.
+	 */
+	public boolean isReady() {
+		if (process != null && !isShutdowning) {
+			try {
+				// Throws IllegalThreadStateException if process is running
+				process.exitValue();
+				// Process is terminated
+				return false;
+			} catch (IllegalThreadStateException e) {
+				// Process is running
+				return true;
+			}
+		} else {
+			// Process has not been created
+			return false;
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#progress(int)
+	 */
+	public void progress(int percentage) {
+		// not implemented
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#interrupted(java.lang.String)
+	 */
+	public void interrupted(String reasonMsg) {
+		this.process = null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#processCreated(java.lang.Process)
+	 */
+	public void processCreated(Process proc) {
+		// No need to implement. Process is got from runAsyncCommand.
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed(int)
+	 */
+	public void completed(int exitValue) {
+		if(!isShutdowning) {
+			// Service wasn't shutdown intentionally from HTI Connection. Handling unexpected situation.
+			
+			// Process has been crashed and is not running anymore.
+			this.process = null;
+			
+			// Setting service as shutdown, until gateway is started again.
+			HtiConnection.getInstance().setConnectionStatus(ConnectionStatus.SHUTDOWN);
+			// Opening the mainview instance.
+			MainView.openMainViewAsync(true);
+
+			// Creating and showing dialog for user.
+			if(!HtiApiPreferencePage.isCreated()){
+				Runnable dialogRunnable = new DataGatewayShutdownRunnable();
+				Display.getDefault().asyncExec(dialogRunnable);
+			}
+
+			// Datagateway was shutdown.
+			String msg = Messages.getString("ProcessHolder.Datagateway_Unexcept_Shutdown_ConsoleMsg"); //$NON-NLS-1$
+			HtiApiConsole.getInstance().println(msg, IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/listener/HtiConnectionManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.listener;
+
+import org.eclipse.core.runtime.ListenerList;
+
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+
+/**
+* Singleton class for managing HTI Connection listeners
+*/
+public class HtiConnectionManager {
+	
+	/**
+	 * Singleton instance.
+	 */
+	static private HtiConnectionManager instance = null;
+	
+	/**
+	 * Listeners interested in job completions operations.
+	 */
+	private ListenerList listeners = null;
+	
+	/**
+	 * Private default constructor.
+	 */
+	private HtiConnectionManager() {
+		listeners = new ListenerList();
+	}
+	
+	/**
+	 * Only one instance can exist at one time
+	 * @return Current instance
+	 */
+	public static HtiConnectionManager getInstance(){
+		if( instance == null ){
+			instance = new HtiConnectionManager();
+		}
+		return instance;		
+	}
+	
+	/**
+	 * Add listener.
+	 * Listener will be informed that connection has been started, if
+	 * connection is has been started before.
+	 * @param obj Listener
+	 */
+	public void addListener(IHtiConnectionListener obj){
+		listeners.add(obj);
+		if(HtiConnection.getInstance().getConnectionStatus() == ConnectionStatus.CONNECTED) {
+			// Listener is informed that connection has already been started.
+			obj.connectionStarted();			
+		}
+
+	}
+	
+	/**
+	 * Remove listener
+	 * @param obj Listener
+	 */
+	public void removeListener(IHtiConnectionListener obj){
+		listeners.remove(obj);
+	}
+	
+	/**
+	 * Inform all listeners of connection termination
+	 */
+	public void informConnectionTerminated() {
+		Object[] listenerArray = listeners.getListeners();
+		for (int i = 0; i < listenerArray.length; i++) {
+			IHtiConnectionListener listenerObj = (IHtiConnectionListener) listenerArray[i];
+			listenerObj.connectionTerminated();
+		}
+	}
+
+	/**
+	 * Inform all listeners of connection termination
+	 */
+	public void informConnectionStarted() {
+		Object[] listenerArray = listeners.getListeners();
+		for (int i = 0; i < listenerArray.length; i++) {
+			IHtiConnectionListener listenerObj = (IHtiConnectionListener) listenerArray[i];
+			listenerObj.connectionStarted();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/listener/IHtiConnectionListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.listener;
+
+/**
+ * Interface for informing HTI connection status changes
+ */
+public interface IHtiConnectionListener {
+	
+	/**
+	 * Called when connection to terminal is terminated
+	 */
+	public void connectionTerminated();
+
+	/**
+	 * Called when connection to terminal is tested as operational and started.
+	 */
+	public void connectionStarted();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferenceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.hticonnection.preferences;
+
+/**
+ * Class for storing keys to preferences.
+ */
+public class HtiApiPreferenceConstants {
+
+	/**
+	 * Default empty connection ID.
+	 */
+	public static final String DEFAULT_CONNECTION_ID = ""; //$NON-NLS-1$
+
+	/**
+	 * Constant for connection ID
+	 */
+	public static final String CONNECTION_ID = "connectionID"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferencePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IClientServiceSiteUI;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IService;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.HtiConnectionHelpContextIDs;
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+import com.nokia.s60tools.hticonnection.connection.HTIService;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Reference page for HTI API
+ */
+public class HtiApiPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage {
+	/**
+	 * Contains preference page components.
+	 */
+	private Composite container;
+
+	/**
+	 * UI component for configuring connection.
+	 */
+	private IClientServiceSiteUI clientSiteUI;
+	
+	/**
+	 * Keeps information about if preferences page is created and open currently.
+	 */
+	private static boolean isCreated = false;
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		isCreated = false;
+	}
+
+	/**
+	 * Constructor
+	 */
+	public HtiApiPreferencePage() {
+		super(ProductInfoRegistry.getProductName() + Messages.getString("HtiApiPreferencePage.Preferences_Postfix")); //$NON-NLS-1$
+		isCreated = true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		
+		container = new Composite(parent, SWT.SIMPLE);
+		container.setLayout(new GridLayout(1, false));
+		container.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		// Client Site UI for creating and selecting connection.
+		IService service = RemoteConnectionsActivator.getConnectionTypeProvider().findServiceByID(HTIService.ID);
+		clientSiteUI = RemoteConnectionsActivator.getConnectionsManager().getClientSiteUI(service);
+		clientSiteUI.createComposite(container);
+		
+		// Current connection needs to be selected or first in the list is selected.
+		IConnection currentConnection = HtiApiActivator.getPreferences().getCurrentConnection();
+		if(currentConnection != null) {
+			clientSiteUI.selectConnection(currentConnection);
+		}
+
+		setHelps(parent);
+		
+		return container;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+		// Not needed
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		doApply();
+		return super.performOk();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performApply()
+	 */
+	public void performApply() {
+		doApply();
+	}
+	
+	/**
+	 * Apply settings
+	 */
+	private void doApply(){
+		savePrefStoreValues();
+		
+		// Getting needed variables.
+		HtiConnection htiConnection = HtiConnection.getInstance();
+		IConnection currentConnection = clientSiteUI.getSelectedConnection();
+
+		// Restart datagateway if connection has been changed
+		
+		boolean isConnected = htiConnection.getConnectionStatus() != ConnectionStatus.SHUTDOWN;
+		boolean isNewConnection = (currentConnection != null) && !(currentConnection.equals(htiConnection.getCurrentConnection())); 
+
+		if (isConnected && isNewConnection) {
+			// Connection has been changed when connection is started.
+			restartDataGateway(currentConnection, false);
+		}
+		else if(!isConnected || currentConnection == null) {
+			// Connection isn't active or connections have been deleted. New connection can be set. 
+			HtiConnection.getInstance().setCurrentConnection(currentConnection, false);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		super.performDefaults();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performCancel()
+	 */
+	public boolean performCancel() {
+		return super.performCancel();
+	}
+	
+	/**
+	 * Saves values to prefstore
+	 * @return True if saved successfully, else false
+	 */
+	private void savePrefStoreValues() {
+		IConnection currentConnection = clientSiteUI.getSelectedConnection();
+		String connectionID = (currentConnection == null) ? HtiApiPreferenceConstants.DEFAULT_CONNECTION_ID 
+														: currentConnection.getIdentifier();
+		if (!connectionID.equals(HtiApiActivator.getPreferences().getConnectionID())) {
+			HtiApiActivator.getPreferences().setConnectionID(connectionID);
+		}
+	}
+
+	/**
+	 * Restarts Datagateway with settings from preference store.
+	 * @param isTesting True if testing connection and not trying to establish permanent connection.
+	 */
+	private boolean restartDataGateway(IConnection conn, boolean isTesting) {
+		HtiConnection htiConn = HtiConnection.getInstance();
+		htiConn.stopConnection();
+		htiConn.setCurrentConnection(conn, false);
+		return htiConn.startConnection(isTesting);
+	}
+
+	/**
+	 * Returns true if preferences page is created and open.
+	 * @return True if page is created.
+	 */
+	public static boolean isCreated() {
+		return isCreated;
+	}
+	
+	/**
+	 * Sets this page's context sensitive helps.
+	 * @param helpContainer Container for which help is set.
+	 */
+	private void setHelps(Composite helpContainer) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(helpContainer,
+										HtiConnectionHelpContextIDs.HTI_CONNECTION_PREFERENCES);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/HtiApiPreferences.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.preferences;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+
+/**
+ * Helper class to use HTI API preferences. Use this class for accessing
+ * HTI API preferences instead of accessing directly through
+ * {@link org.eclipse.jface.util.IPropertyChangeListener.IPreferenceStore}.
+ * 
+ * However this class should be used via <code>IHtiApiPreferences</code>
+ * class, that could be queried from <code>HtiApiActivator</code> with
+ * the following method <code>HtiApiActivator.getPreferences()</code>.
+ * @see
+ */
+public class HtiApiPreferences implements IHtiApiPreferences {
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.preferences.IHtiApiPreferences#initDefaultValues()
+	 */
+	public void initDefaultValues() {
+		// COM port
+		if(!HtiApiActivator.getPrefsStore().getDefaultString(HtiApiPreferenceConstants.CONNECTION_ID).
+				equals(HtiApiPreferenceConstants.DEFAULT_CONNECTION_ID)){
+			
+			HtiApiActivator.getPrefsStore().setDefault(HtiApiPreferenceConstants.CONNECTION_ID, 
+					HtiApiPreferenceConstants.DEFAULT_CONNECTION_ID);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.preferences.IHtiApiPreferences#getConnectionID()
+	 */
+	public String getConnectionID() {
+		return HtiApiActivator.getPrefsStore().getString(
+				HtiApiPreferenceConstants.CONNECTION_ID);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.preferences.IHtiApiPreferences#setConnectionID(java.lang.String)
+	 */
+	public void setConnectionID(String connectionID) {
+		HtiApiActivator.getPrefsStore().setValue(
+				HtiApiPreferenceConstants.CONNECTION_ID, connectionID);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.preferences.IHtiApiPreferences#getCurrentConnection()
+	 */
+	public IConnection getCurrentConnection() {
+		// Initializing needed variables.
+		String connID = getConnectionID();
+		Collection<IConnection> connections = RemoteConnectionsActivator.getConnectionsManager().getConnections();
+		
+		// Checking for correct connection.
+		for(IConnection conn : connections) {	
+			if(conn.getIdentifier().equals(connID)) {
+				return conn;
+			}
+		}
+		
+		// Connection set in preferences was not found. Checking if there is only one connection.
+
+		List<IConnection> htiConnections = HtiConnection.getInstance().getHTIConnections();
+		
+		if(htiConnections.size() == 1) {
+			// Only one compatible connection was found. Using it as default.
+			IConnection conn = htiConnections.get(0);
+			HtiApiActivator.getPreferences().setConnectionID(conn.getIdentifier());
+			return conn;
+		}
+		
+		// Valid connection was not found.
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/preferences/IHtiApiPreferences.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.preferences;
+
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+
+/**
+ * Interface for handling HTI Connection preferences.
+ */
+public interface IHtiApiPreferences {
+
+	/**
+	 * Initializes default values for preferences if not initialized before.
+	 */
+	public void initDefaultValues();
+
+	/**
+	 * Sets connection ID.
+	 * 
+	 * @param connectionID Unique identification for connection.
+	 */
+	public void setConnectionID(String connectionID);
+
+	/**
+	 * Gets connection ID.
+	 * 
+	 * @return Unique identification for connection.
+	 */
+	public String getConnectionID();
+
+	/**
+	 * Gets connection that matches the connection ID in preferences,
+	 * or if there is only one HTI connection, then it is returned,
+	 * or <code>null</code> if there is no matching connection.
+	 * 
+	 * @return connection that matches the connection ID in preferences, or null
+	 * if connection was not found.
+	 */
+	public IConnection getCurrentConnection();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/ImageKeys.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.resources;
+
+public class ImageKeys {
+	// Image key for base action.
+	public final static String S60TOOLS_ACTION_ICON = "S60TOOLS_ACTION_ICON"; //$NON-NLS-1$	
+
+	// HTI API image keys
+	public final static String IMG_APP_ICON = "HTIAPI_IMG_APP_ICON"; //$NON-NLS-1$	
+	public final static String IMG_PREFERENCES = "HTIAPI_IMG_PREFERENCES"; //$NON-NLS-1$
+	public final static String IMG_CLEAR_SCREEN = "HTIAPI_IMG_CLEAR_SCREEN"; //$NON-NLS-1$
+	public final static String IMG_SCROLL_LOCK = "HTIAPI_IMG_SCROLL_LOCK"; //$NON-NLS-1$
+	public final static String IMG_STOP_GATEWAY = "HTIAPI_IMG_STOP_GATEWAY"; //$NON-NLS-1$
+	public final static String IMG_START_GATEWAY = "HTIAPI_IMG_START_GATEWAY"; //$NON-NLS-1$
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/ImageResourceManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,104 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.resources;
+
+import java.io.File;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+
+/**
+ * This class manages images that are used in HTI Connection project.
+ */
+public class ImageResourceManager {
+	
+	/**
+	 * Loads images to image registry.
+	 * @param imagesPath Path of image directory.
+	 */
+	public static void loadImages(String imagesPath){
+
+    	Display disp = Display.getCurrent();
+    	ImageRegistry imgReg = HtiApiActivator.getDefault().getImageRegistry();
+
+    	//
+    	// Storing images to image registry.
+    	//
+    	// There are images that are under EPL license.
+    	//
+    	
+    	// Image for base action.
+    	Image img = new Image( disp, imagesPath + File.separator + "s60tools_action_icon.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.S60TOOLS_ACTION_ICON, img );
+
+    	// HTI API specific images
+    	img = new Image( disp, imagesPath + File.separator + "hti_console.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_APP_ICON, img );
+    	
+    	img = new Image( disp, imagesPath + File.separator + "preferences.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_PREFERENCES, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "start_datagateway.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_START_GATEWAY, img);
+        
+        img = new Image( disp, imagesPath + File.separator + "stop_datagateway.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_STOP_GATEWAY, img);
+        
+        /*******************************************************************************
+         * The following pieces of the graphic are taken from from Eclipse 3.4 platform 
+         * and CDT project in Eclipse community, which are made available under 
+         * the terms of the Eclipse Public License v1.0.
+         * A copy of the EPL is provided at http://www.eclipse.org/legal/epl-v10.html
+         *******************************************************************************/
+
+        // Original location of the graphic:
+        // eclipse-3.4\plugins\org.eclipse.ui.console\icons\full\clcl16\clear_co.gif
+        img = new Image( disp, imagesPath + File.separator + "clear_co.gif" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_CLEAR_SCREEN, img);
+        
+        // Original location of the graphic:
+        // eclipse-3.4\plugins\org.eclipse.ui.console\icons\full\clcl16\lock_co.gif
+        img = new Image( disp, imagesPath + File.separator + "lock_co.gif" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_SCROLL_LOCK, img);
+
+	}
+	
+	/**
+	 * Gets image descriptor for given key from plugin's image registry.
+	 * @param key Key for image.
+	 * @return ImageDescriptor for given image key.
+	 */
+	public static ImageDescriptor getImageDescriptor( String key ){
+    	ImageRegistry imgReg = HtiApiActivator.getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}	
+
+	/**
+	 * Gets image for given key from plugin's image registry.
+	 * @param key Key for image.
+	 * @return Image for given key.
+	 */
+	public static Image getImage( String key ){
+    	ImageRegistry imgReg = HtiApiActivator.getDefault().getImageRegistry();
+    	return  imgReg.get(key);		
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * This class is used to get String resource from messages.properties file.
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.hticonnection.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Returns String resource with specified key.
+	 * @param key Key for the resource.
+	 * @return String resource with specified key.
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/resources/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+ClearScreenAction.ClearScreen_Action_Text=Clear Screen
+ClearScreenAction.ClearScreen_Action_Tooltip=Clear Screen
+ConnectionMenuCreator.NoConnection_Action_Text=No available connections
+ConnectionTestRequest.WrongResultReturned_Exception_Msg=\ didn't return correct result.
+DataGatewayManager.IncomptibleConnection_ExceptionMsg=Connection type is not compatible with HTI Connection. Check current connection settings or create a new connection.
+DataGatewayManager.Start_Datagateway_Failed_ConsoleMsg=Starting datagateway.exe failed.
+DataGatewayManager.Start_Datagateway_Failed_Reason_ConsoleMsg=Starting datagateway.exe failed. Reason - 
+DownloadFileRequest.RequestCanceled.Exception.Msg0=\ was canceled.
+FTPService.FailedToCopyFile_ExceptionMsg1=Failed to copy 
+FTPService.FailedToCopyFile_ExceptionMsg2=\ to 
+FTPService.FailedToDeleteFile_ExceptionMsg=Failed to delete file: 
+FTPService.FailedToUploadFile_ExceptionMsg=Failed to upload file: 
+FTPService.FailedToDeleteDir_ExceptionMsg=Failed to delete directory: 
+FTPService.FailedToMakeDir_ExceptionMsg=Failed to make directory:   
+FTPService.FailedToMoveFile_ExceptionMsg1=Failed to move 
+FTPService.FailedToMoveFile_ExceptionMsg2=\ to 
+FTPService.FailedToRename_ExceptionMsg1=Failed to rename 
+FTPService.FailedToRename_ExceptionMsg2=\ to 
+AppControlServiceService.FailedToStartApp_ExceptionMsg=Failed to start application:
+AppControlServiceService.FailedToStartProgram_ExceptionMsg_Part1=Failed to start command:
+AppControlServiceService.FailedToStartProgram_ExceptionMsg_Part2=with parameters:
+AppControlServiceService.FailedToStopApp_ExceptionMsg=Failed to stop application:
+ApplicationControlService.FailedToStartAppByUid_AppNotFoundExceptionMsg_Suffix=). Application not found.
+ApplicationControlService.FailedToStartAppByUidAlreaydyRunningExceptionMsg_Suffix=). Application already running.
+ApplicationControlService.FailedToStartAppByUidExceptionMsg_Part1=Failed to start application (UID 
+HtiApiPreferencePage.Preferences_Postfix=\ Preferences
+HtiConnection.Connected_LongStatusMsg=Connection to HTI agent OK, HTI version 
+HtiConnection.Connected_StatusMsg=Connected
+HtiConnection.Connected_ToolBar_Msg=Connected to 
+HtiConnection.Connecting_ToolBar_Msg=Trying to connect to 
+HtiConnection.ConnectionFailed_MsgBoxMsg=Connection failed.
+HtiConnection.ConnectionFailed_StatusMsg=Connection failed
+HtiConnection.ConnectionNotSelected_ErrMsg=Connection is not selected.
+HtiConnection.FailedToStartGateway_ErrMsg=Failed to start gateway.\nOperating system is not supported.
+HtiConnection.FailedToStartGateway_StatusMsg=Failed to start datagateway
+HtiConnection.HtiNotResponding_MsgBoxMsg=HTI agent in the device is not responding.
+HtiConnection.HtiNotResponding_StatusMsg=HTI agent in the device is not responding
+HtiConnection.ManageConnections_ErrMsg=\nDo you want to manage connections?
+HtiConnection.NoConnections_ErrMsg=There are no connections defined.
+HtiConnection.NotConnected_StatusMsg=Not connected
+HtiConnection.NotConnected_ToolBar_Msg=Not connected
+HtiConnection.Testing_ToolBar_Msg=Testing connection
+HTIConnectedService.Connected_ShortMsg=Connected
+HTIConnectedService.ConnectedToHti_LongMsg=Connection to HTI agent OK, HTI version = 
+HTIConnectedService.NotConnected_ShortMsg=Not connected
+HTIConnectedService.Testing_ShortMsg=Testing connection
+HTIConnectedService.TryingToConnect_ShortMsg=Trying to connect
+HTIService.EnsureConnectionInfo_Msg=Ensure HTI is running on the device
+HTIService.TestingInfo_Msg=Warning: Testing will close the existing connection
+OpenPreferencePageAction.OpenPreferences_Action_Text=Preferences
+OpenPreferencePageAction.OpenPreferences_Action_Tooltip=Open Preferences page dialog
+ProcessHolder.Datagateway_Unexcept_Shutdown_Change_Settings_ConsoleMsg=Datagateway has been shutdown unexpectedly.\nDo you want to manage connections?
+ProcessHolder.Datagateway_Unexcept_Shutdown_ConsoleMsg=Datagateway has been shutdown unexpectedly. Change settings and test connection from HTI preferences page.
+ProcessHolder.Stop_Datagateway_Failed_ConsoleMsg=Stopping datagateway.exe failed.
+RequestQueueManager.Datagateway_Shutdown_Exception_Msg=Datagateway has been shutdown intentionally.
+RequestQueueManager.RequestCanceled_Exception_Msg0=\ was canceled.
+RequestQueueManager.RequestFailed_Exception_Msg=\ failed - 
+RequestQueueManager.RequestInterrupted_Exception_Msg=\ was interrupted - 
+RequestQueueManager.ServiceShutdown_Exception_Msg=Service has been shutdown, new requests are not accepted.
+ScreenCaptureRequest.InvalidImage_Exception_Msg=Captured image is not valid. Connection resetted.
+ScrollLockAction.ScrollLock_Action_Text=Scroll Lock
+ScrollLockAction.ScrollLock_Action_Tooltip=Scroll Lock
+SelectAllAction.SelectAll_Action_Text=Select All
+SelectAllAction.SelectAll_Action_Tooltip=Select All
+SelectConnectionAction.Tooltip_Text=Selects and starts this connection
+KeyEventService.FailedTapAndDrag_Exception_Msg=Failed to send tap and drag event to device.
+KeyEventService.FailedTapScreen_Exception_Msg=Failed to send tap screen event to device.
+KeyEventService.FailedToSendHoldKeyEvent_ExceptionMsg=Failed to send hold key event.
+KeyEventService.FailedToSendPressAndHoldKeyEvent_ExceptionMsg=Failed to send press and hold key event.
+KeyEventService.FailedToSendPressKeyEvent_ExceptionMsg=Failed to send press key event.
+KeyEventService.FailedToSendReleaseKeyEvent_ExceptionMsg=Failed to send release key event.
+KeyEventService.FailedToSendTypeTextEvent_ExceptionMsg=Failed to type text key event.
+NewConnectionAction.NewConnection_Action_Text=New Connection...
+NewConnectionAction.NewConnection_Action_Tooltip=Create new connection
+StartStopGatewayAction.Start_Datagateway_Msg=Start Datagateway
+StartStopGatewayAction.Stop_Datagateway_Msg=Stop Datagateway
+
+UploadFileRequest.RequestCanceled.Exception.Msg0=\ was canceled.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/AppStatus.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * AppStatus
+ */
+public class AppStatus
+{
+	/**
+	 * Application was not found.
+	 * Original HTI return code is unsigned byte 0xf1.
+	 */
+    public static final byte NOT_FOUND = -15;
+    /**
+     * Application was found and it is currently running.
+     * Original HTI return code is unsigned byte 0xf4.
+     */
+    public static final byte RUNNING = -12;
+
+    /**
+     * Status of application.
+     */
+    private final byte status;
+
+    /**
+     * Constructor.
+     * @param status Status of application.
+     */
+    public AppStatus(byte status)
+    {
+        this.status = status;
+    }
+
+    /**
+     * This method returns status of application.
+     * @return Status of application.
+     */
+    public byte getStatus()
+    {
+        return status;
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/DriveInfo.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,195 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * Contains information of disk drive
+ */
+public class DriveInfo {
+	
+	
+	/**
+	 * The root path of the drive
+	 */
+	private String rootPath;
+	
+	/**
+	 * The name of the drive
+	 */
+	private String name;
+	
+	/**
+	 * The type of media
+	 */
+	private MediaType type;
+	
+	/**
+	 * Unique identifier number of the drive
+	 */
+	private long uid;
+	
+	/**
+	 * The total size of the drive in bytes
+	 */
+	private long size;
+	
+	/**
+	 * Free space on the drive in bytes
+	 */
+	private long freeSpace;
+	
+	/**
+	 * Media type of drive
+	 */
+	public enum MediaType {
+		NOT_PRESET,
+		UNKNOWN,
+		FLOPPY,
+		HARD_DISK,
+		CDROM,
+		RAM,
+		FLASH,
+		ROM,
+		REMOTE,
+		NAND_FLASH,
+		ROTATING_MEDIA
+	};
+	
+	/**
+	 * Constructor
+	 */
+	public DriveInfo() {
+		
+	}
+	
+	
+	/**
+	 * Constructor
+	 * @param rootPath The root path of the drive
+	 * @param name The name of the drive
+	 * @param type The type of media
+	 * @param uid Unique identifier number of the drive
+	 * @param size The total size of the drive in bytes
+	 * @param freeSpace Free space on the drive in bytes
+	 */
+	public DriveInfo(String rootPath, String name, MediaType type, long uid, long size, long freeSpace) {
+		this.rootPath = rootPath; 
+		this.name = name; 
+		this.type = type; 
+		this.uid = uid; 
+		this.size = size; 
+		this.freeSpace = freeSpace;
+	}
+	
+	/**
+	 * Get root path of the drive
+	 * @return The root path of the drive
+	 */
+	public String getRootPath() {
+		return rootPath;
+	}
+
+	/**
+	 * Set root path of the drive
+	 * @param rootPath The root path of the drive
+	 */
+	public void setRootPath(String rootPath) {
+		this.rootPath = rootPath;
+	}
+
+	/**
+	 * Get the name of the drive
+	 * @return The name of the drive
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Set the name of the drive
+	 * @param name The name of the drive
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * Get the type of media
+	 * @return The type of media
+	 */
+	public MediaType getType() {
+		return type;
+	}
+
+	/**
+	 * Set the type of media
+	 * @param type The type of media
+	 */
+	public void setType(MediaType type) {
+		this.type = type;
+	}
+
+	/**
+	 * Get unique identifier number of the drive
+	 * @return Unique identifier number of the drive
+	 */
+	public long getUid() {
+		return uid;
+	}
+
+	/**
+	 * Set unique identifier number of the drive
+	 * @param uid Unique identifier number of the drive
+	 */
+	public void setUid(long uid) {
+		this.uid = uid;
+	}
+
+	/**
+	 * Get the total size of the drive in bytes
+	 * @return The total size of the drive in bytes
+	 */
+	public long getSize() {
+		return size;
+	}
+
+	/**
+	 * Set the total size of the drive in bytes
+	 * @param size The total size of the drive in bytes
+	 */
+	public void setSize(long size) {
+		this.size = size;
+	}
+
+	/**
+	 * Get free space on the drive in bytes
+	 * @return Free space on the drive in bytes
+	 */
+	public long getFreeSpace() {
+		return freeSpace;
+	}
+
+	/**
+	 * Set free space on the drive in bytes
+	 * @param freeSpace Free space on the drive in bytes
+	 */
+	public void setFreeSpace(long freeSpace) {
+		this.freeSpace = freeSpace;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/FileInfo.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * Contains information of file
+ */
+public class FileInfo {
+	
+	/**
+	 * The name of the file.
+	 */
+	private String name;
+	
+	/**
+	 * The size of the file.
+	 */
+	private long size;
+
+	/**
+	 * Constructor.
+	 * @param name Name of the file.
+	 * @param size Size of the file.
+	 */
+	public FileInfo(String name, long size) {
+		this.setName(name);
+		this.setSize(size);
+	}
+	
+	/**
+	 * Constructor.
+	 */
+	public FileInfo() {
+	}
+
+	/**
+	 * Getter for name.
+	 * @return The name of the file.
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Setter for name.
+	 * @param name The name of the file.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	/**
+	 * Getter for size.
+	 * @return The size of the file.
+	 */
+	public long getSize() {
+		return size;
+	}
+
+	/**
+	 * Setter for size.
+	 * @param size The size of the file.
+	 */
+	public void setSize(long size) {
+		this.size = size;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIScreenMode.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,229 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * This class contains information screen.
+ * This includes screen rotation, color mode, focus index, and size.
+ */
+public class HTIScreenMode {
+	
+	// Rotation
+	
+	/**
+	 * Screen is rotation 0 degrees.
+	 */
+	public static final int ROTATION_NONE = 0;
+	/**
+	 * Screen is rotation 90 degrees.
+	 */
+	public static final int ROTATION_90 = 1;
+	/**
+	 * Screen is rotation 180 degrees.
+	 */
+	public static final int ROTATION_180 = 2;
+	/**
+	 * Screen is rotation 270 degrees.
+	 */
+	public static final int ROTATION_270 = 3;
+	
+	// Color mode
+	
+	/**
+	 * Color mode no colors.
+	 */
+	public static final int MODE_ENONE = 0;
+	/**
+	 * Color mode grey, 2 colors.
+	 */
+	public static final int MODE_EGRAY2 = 1;
+	/**
+	 * Color mode grey, 4 colors.
+	 */
+	public static final int MODE_EGRAY4 = 2;
+	/**
+	 * Color mode grey 16 colors.
+	 */
+	public static final int MODE_EGRAY16 = 3;
+	/**
+	 * Color mode grey, 256 colors.
+	 */
+	public static final int MODE_EGRAY256 = 4;
+	/**
+	 * Color mode 16 colors.
+	 */
+	public static final int MODE_ECOLOR16 = 5;
+	/**
+	 * Color mode 256 colors.
+	 */
+	public static final int MODE_ECOLOR256 = 6;
+	/**
+	 * Color mode 64K colors.
+	 */
+	public static final int MODE_ECOLOR64K = 7;
+	/**
+	 * Color mode 16M colors.
+	 */
+	public static final int MODE_ECOLOR16M = 8;
+	/**
+	 * Color mode RGB colors.
+	 */
+	public static final int MODE_ERGB = 9;
+	/**
+	 * Color mode 4k colors.
+	 */
+	public static final int MODE_ECOLOR4K = 0xa;
+	/**
+	 * Color mode 16M colors.
+	 */
+	public static final int MODE_ECOLOR16MU = 0xb;
+	/**
+	 * Color mode 16M colors.
+	 */
+	public static final int MODE_ECOLOR16MA = 0xc;
+
+	/**
+	 * Screen is rotation values.
+	 */
+	public static final String ROTATION[] = new String[] {
+			"0°",  //$NON-NLS-1$
+			"90°",  //$NON-NLS-1$
+			"180°",  //$NON-NLS-1$
+			"270°"  //$NON-NLS-1$
+		};
+		
+	/**
+	 * Color mode values.
+	 */
+	public static final String MODE[] = new String[] {
+			"ENone", //$NON-NLS-1$
+			"EGray2", //$NON-NLS-1$
+			"EGray4", //$NON-NLS-1$
+			"EGray16", //$NON-NLS-1$
+			"EGray256", //$NON-NLS-1$
+			"EColor16", //$NON-NLS-1$
+			"EColor256", //$NON-NLS-1$
+			"EColor64K", //$NON-NLS-1$
+			"EColor16M", //$NON-NLS-1$
+			"ERgb", //$NON-NLS-1$
+			"EColor4K", //$NON-NLS-1$
+			"EColor16MU", //$NON-NLS-1$
+			"EColor16MA", //$NON-NLS-1$
+		};
+
+	
+	/**
+	 * The index number of the screen whose attributes are returned.
+	 */
+	private int index;
+	/**
+	 * The width of the screen in pixels.
+	 */
+	private int width;
+	/**
+	 * The height of the screen in pixels.
+	 */
+	private int height;
+	/**
+	 * The rotation of the screen. 0 = normal, 1 = 90, 2 = 180, 3 = 270.
+	 */
+	private int rotation;
+	/**
+	 * The display mode of the screen. 
+	 */
+	private int mode;
+	/**
+	 * The index number of the screen that currently has focus.
+	 * Note that this can be different than the currently selected screen.
+	 */
+	private int focusIndex;
+	
+	/**
+	 * Constructor.
+	 * @param index The index number of the screen whose attributes are returned.
+	 * @param width The width of the screen in pixels.
+	 * @param height The height of the screen in pixels.
+	 * @param rotation The rotation of the screen. 0 = normal, 1 = 90, 2 = 180, 3 = 270.
+	 * @param mode The display mode of the screen. 
+	 * @param focusIndex The index number of the screen that currently has focus.
+	 */
+	public HTIScreenMode(int index, int width, int height, int rotation, int mode, int focusIndex) {
+		this.index = index;
+		this.width = width;
+		this.height = height;
+		this.rotation = rotation;
+		this.mode = mode;
+		this.focusIndex = focusIndex;
+	}
+	
+	/**
+	 * Gets the index number of the screen whose attributes are returned.
+	 * @return index number of the screen whose attributes are returned.
+	 */
+	public int getIndex() {
+		return index;
+	}
+	
+	/**
+	 * Gets the width of the screen in pixels.
+	 * @return the width of the screen in pixels.
+	 */
+	public int getWidth() {
+		return width;
+	}
+	
+	/**
+	 * Gets the height of the screen in pixels.
+	 * @return the height of the screen in pixels.
+	 */
+	public int getHeight() {
+		return height;
+	}
+	
+	/**
+	 * Gets the rotation of the screen in degrees. 0 = normal, 1 = 90, 2 = 180, 3 = 270.
+	 * @return the rotation of the screen.
+	 */
+	public int getRotation() {
+		return rotation;
+	}
+	
+	/**
+	 * Gets the display mode of the screen. 
+	 * @return the display mode of the screen. 
+	 */
+	public int getMode() {
+		return mode;
+	}
+	
+	/**
+	 * Gets the index number of the screen that currently has focus.
+	 * Note that this can be different than the currently selected screen.
+	 * @return the index number of the screen that currently has focus.
+	 */
+	public int getFocusIndex() {
+		return focusIndex;
+	}
+	
+	/**
+	 * Returns a string representation of the screen mode.
+	 */
+	public String toString() {
+		return "[screen " + index + ": " + width + "x" + height + " @ " + MODE[mode] + ROTATION[rotation] + ", focus: " + focusIndex + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServiceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * This class contains constants that are needed for using services.
+ */
+public class HTIServiceConstants {
+
+	/**
+	 *  No color mode.
+	 */
+	public static final int COLOR_DEPTH_ENONE = 0;
+	/**
+	 * Gray two colors.
+	 */
+	public static final int COLOR_DEPTH_EGRAY2 = 1;
+	/**
+	 * Gray 4 colors.
+	 */
+	public static final int COLOR_DEPTH_EGRAY4 = 2;
+	/**
+	 * Gray 16 colors.
+	 */
+	public static final int COLOR_DEPTH_EGRAY16 = 3;
+	/**
+	 * Gray 256 color.
+	 */
+	public static final int COLOR_DEPTH_EGRAY256 = 4;
+	/**
+	 * 16 colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR16 = 5;
+	/**
+	 * 256 colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR256 = 6;
+	/**
+	 * 64k colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR64K = 7;
+	/**
+	 * 16M colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR16M = 8;
+	/**
+	 * RGB
+	 */
+	public static final int COLOR_DEPTH_ERGB = 9;
+	/**
+	 * 4k colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR4K = 0xa;
+	/**
+	 * 16M colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR16MU = 0xb;
+	/**
+	 * 16M colors.
+	 */
+	public static final int COLOR_DEPTH_ECOLOR16MA = 0xc;
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServiceFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.listener.HtiConnectionManager;
+import com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener;
+import com.nokia.s60tools.hticonnection.services.applicationcontrolservice.ApplicationControlService;
+import com.nokia.s60tools.hticonnection.services.connectiontestservice.ConnectionTestService;
+import com.nokia.s60tools.hticonnection.services.ftpservice.FTPService;
+import com.nokia.s60tools.hticonnection.services.keyeventservice.KeyEventService;
+import com.nokia.s60tools.hticonnection.services.screencaptureservice.ScreenCaptureService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Factory class for creating HTI services.
+ */
+public class HTIServiceFactory {
+	
+	/**
+	 * Gets HTI version to which HTI Connection is currently connected. Or null if connection
+	 * is down. Value for this query is got when connection is established and it is
+	 * up to date when connection started message comes by {@link IHtiConnectionListener}. 
+	 * See {@link HtiConnectionManager} for more information.
+	 * @return HTI Version queried from HTI agent or null if connection is down.
+	 */
+	public static HTIVersion getCurrentHTIVersion() {
+		return HtiConnection.getInstance().getHTIVersion();
+	}
+	
+	/**
+	 * Creates an default implementation for {@link IScreenCaptureService}.
+	 * ConnectionTestService is used for capturing screens from device.
+	 * @param printUtility Used for printing messages.
+	 * @return {@link IScreenCaptureService}
+	 */
+	public static IScreenCaptureService createScreenCaptureService(IConsolePrintUtility printUtility){
+		return new ScreenCaptureService(printUtility);
+	}
+	
+	/**
+	 * Creates an default implementation for {@link IConnectionTestService}.
+	 * ConnectionTestService can be used for testing if connection is ready for requests.
+	 * @param printUtility Used for printing messages.
+	 * @return {@link IConnectionTestService}
+	 */
+	public static IConnectionTestService createConnectionTestService(IConsolePrintUtility printUtility){
+		return new ConnectionTestService(printUtility);
+	}
+	
+	/**
+	 * Creates an default implementation for {@link IFTPService}.
+	 * FTPService is used for performing file operations on device
+	 * @param printUtility Used for printing messages.
+	 * @return {@link IFTPService}
+	 */
+	public static IFTPService createFTPService(IConsolePrintUtility printUtility){
+		return new FTPService(printUtility);
+	}
+	
+	/**
+	 * Creates an default implementation for {@link IApplicationControlService}.
+	 * ApplicationControlService is used for controlling applications on device
+	 * @param printUtility Used for printing messages.
+	 * @return {@link IApplicationControlService}
+	 */
+	public static IApplicationControlService createApplicationControlService(IConsolePrintUtility printUtility){
+		return new ApplicationControlService(printUtility);
+	}
+	
+	/**
+	 * Creates an default implementation for {@link IKeyEventService}.
+	 * Key event service is used for sending key and touch screen events to device.
+	 * @param printUtility Used for printing messages.
+	 * @return {@link IKeyEventService}
+	 */
+	public static IKeyEventService createKeyEventService(IConsolePrintUtility printUtility){
+		return new KeyEventService(printUtility);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIServices.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.ui.views.main.MainView;
+
+/**
+ * API for public operations in HTI Connection.
+ */
+public class HTIServices {
+	
+	/**
+	 * Opens HTI Connection view.
+	 */
+	public static void openHtiConnectionView() {
+		MainView.openMainViewAsync(false);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/HTIVersion.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * Contains version number for HTI.
+ */
+public class HTIVersion {
+	
+	/**
+	 * Major version number
+	 */
+	private int major;
+	
+	/**
+	 * Minor version number
+	 */
+	private int minor;
+	
+	/**
+	 * Constructor
+	 * @param major Major version number
+	 * @param minor Minor version number
+	 */
+	public HTIVersion(int major, int minor) {
+		this.major = major;
+		this.minor = minor;
+	}
+
+	/**
+	 * Get major version number
+	 * @return the major version number
+	 */
+	public int getMajor() {
+		return major;
+	}
+
+	/**
+	 * Get minor version number
+	 * @return the minor version number
+	 */
+	public int getMinor() {
+		return minor;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		return major + "." + minor; //$NON-NLS-1$
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IApplicationControlService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+
+/**
+ * Service that contains interface for controlling applications on device.
+ */
+public interface IApplicationControlService {
+	
+	/**
+	 * Start an application defined by its name. Optional DocumentName parameter 
+	 * can be specified to pass it to the application started.
+     * @param programName name of the executable (with full path if necessary)
+     * @param docName name of the document passed to started application
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void startApplicationByName(String programName, String docName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+
+	/**
+	 * Starting a process with parameters.
+	 * @param programName name of the executable (with full path if necessary)
+	 * @param parameters must not be <code>null</code>
+	 * @param timeout  Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ConnectionException Connection failed
+	 */
+	public void startProcess(String programName, String parameters, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	
+	/**
+	 * Start an application defined by its Uid. Optional DocumentName parameter 
+	 * can be specified to pass it to the application started.
+     * @param uid Uid of the executable
+     * @param docName name of the document passed to started application
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void startApplicationByUid(int uid, String docName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Get a status of an application defined by name.
+	 * If status is AppStatus.RUNNING, then application is running.
+	 * If status is AppStatus.NOT_FOUND, then application is not running.
+	 * @param programName name of the executable (with full path if necessary)
+     * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+     * @return Information of application status
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public AppStatus getApplicationStatusByName(String programName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+
+	/**
+	 * Get a status of an application defined by UID.
+	 * If status is AppStatus.RUNNING, then application is running.
+	 * If status is AppStatus.NOT_FOUND, then application is not running.
+	 * @param uid UID of the executable
+     * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return Information of application status
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public AppStatus getApplicationStatusByUid(int uid, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Stop an application defined by its name.
+	 * @param programName name of the executable (with full path if necessary)
+     * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void stopApplicationByName(String programName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Stop an application defined by its UID.
+	 * @param uid UID of the executable
+     * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void stopApplicationByUid(int uid, long timeout) throws ServiceShutdownException, HTIException, ConnectionException;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IConnectionTestService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import java.util.List;
+
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+
+/**
+ * Service that contains interface for testing if connection is ready for use.
+ */
+public interface IConnectionTestService {
+	
+	/**
+	 * Tests if connection is ready for use.
+	 * @return <code>True</code> if connection can be used. 
+	 *         <code>False</code> if connection doesn't work as expected.
+	 */
+	public boolean isReady();
+	
+	/**
+	 * List available services
+	 * @return List of available services
+	 * @throws ServiceShutdownException 
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI.
+	 */
+	public List<String> listServices() throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Get HTI version
+	 * @return HTIVersion instance containing version information
+	 * @throws ServiceShutdownException 
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI.
+	 */
+	public HTIVersion getVersion() throws HTIException, ConnectionException, ServiceShutdownException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * Interface for getting status from file transfer operation.
+ */
+public interface IFTPListener {
+
+	/**
+	 * Called when request has been registered and is waiting for start.
+	 * @param manager Can be used to cancel the request.
+	 * and contains information of the request.
+	 */
+	public void requestInQueue(IFTPRequestManager manager);
+	
+	/**
+	 * Called when request has been started.
+	 * @param manager Can be used to cancel the request.
+	 * and contains information of the request.
+	 */
+	public void requestStarted(IFTPRequestManager manager);
+	
+	/**
+	 * Called when request has been completed or canceled.
+	 * @param manager Can be used to cancel the request
+	 * and contains information of the request.
+	 */
+	public void requestEnded(IFTPRequestManager manager);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPRequestManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+/**
+ * Interface for canceling file transfer operation;
+ */
+public interface IFTPRequestManager {
+	
+	/**
+	 * Returns file name which is handled by this operation.
+	 * @return File name that is transfered.
+	 */
+	public String getFileName();
+	
+	/**
+	 * Cancels this request.
+	 */
+	public void cancel();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IFTPService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+
+/**
+ * Service that contains interface for performing file operations on device.
+ */
+public interface IFTPService {
+
+	/**
+	 * Returns the list of directories located inside a specified directory.
+     * @param remoteDir Directory
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return List of directories in given directory
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public String[] listDirs(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Returns the list of files located inside a specified directory.
+     * @param remoteDir Directory
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return List of files in given directory
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public String[] listFiles(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+
+	/**
+	 * Returns the list of files and details located inside a specified directory.
+     * @param remoteDir Directory
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return List of file information in given directory
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public FileInfo[] listFilesAndDetails(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Returns the list of drives on device.
+	 * Supported in HTI 1.88.0 -> and 2.1.0 ->
+     * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return DriveInfo array containing information of drives on device
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public DriveInfo[] listDrives(long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Uploads given file to a specified directory.
+     * @param fileData File data in byte array
+	 * @param remoteFile File in target where to write data
+	 * @param listener Listener for upload status information. Or null if information is not needed.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void uploadFile(byte[] fileData, String remoteFile, IFTPListener listener, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Downloads given file.
+     * @param remoteDir File in target to download
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @param listener Listener for download status information. Or null if information is not needed.
+	 * @return File data in byte array
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public byte[] downloadFile(String remoteDir, IFTPListener listener, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Deletes given file.
+	 * @param remoteFile File in target where to write data
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void deleteFile(String remoteFile, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Creates specified directory.
+	 * @param remoteDir Directory to be created to target
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void makeDir(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Deletes specified directory.
+	 * @param remoteDir Directory to be deleted from target
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void deleteDir(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Renames the specified file or folder. The command operates recursively.
+	 * Note that the names must be absolute paths and if the new path is different
+	 * than the old, this command can also move the file to that new path.
+	 * The old and new path must be on the same drive.
+	 * Supported in HTI 1.91.0 -> and 2.5.0 ->
+	 * @param oldName Full path to the file or folder to be renamed.
+	 * @param newName Full path indicating the new name (and possibly new location) of the file or folder. 
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void renameFileDir(String oldName, String newName, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Makes a copy of the specified file or folder to selected location.
+	 * The command operates recursively. If the OriginalPath is a folder the contents
+	 * of that folder will be copied to CopyPath. For example if OriginalPath is
+	 * c:\temp and CopyPath is e:\copy_of_temp then the files and folders under
+	 * c:\temp will be copied under e:\copy_of_temp 
+	 * Supported in HTI 1.91.0 -> and 2.5.0 ->
+	 * @param originalPath Full path to file or folder.
+	 * @param copyPath Full path for copy file or folder.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void copyFileDir(String originalPath, String copyPath, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Moves the specified file or folder to selected location. The command operates recursively.
+	 * Supported in HTI 1.91.0 -> and 2.5.0 ->
+	 * @param oldPath Full path to the file or folder to be moved. 
+	 * @param newLocation Target folder where file or folder is to be moved.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void moveFileDir(String oldPath, String newLocation, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IKeyEventService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+
+/**
+ * Service that contains interface for sending key events to device.
+ */
+public interface IKeyEventService {
+
+	// Navigation related
+
+	/** EStdKeyUpArrow=0x10 */
+    public final static int SCANCODE_NAVI_NORTH = 0x10;
+    /** EStdKeyRightArrow=0x0f */
+    public final static int SCANCODE_NAVI_EAST = 0x0f;
+    /** EStdKeyDownArrow=0x11 */
+    public final static int SCANCODE_NAVI_SOUTH = 0x11;
+    /** EStdKeyDownArrow=0x11 */
+    public final static int SCANCODE_NAVI_WEST = 0x0e;
+    /** EStdKeyDevice3=0xa7 */
+    public final static int SCANCODE_NAVI_CENTERPUSH = 0xa7;
+    
+    // Numeric keypad keys in simple keyboard layout
+    
+    /** EStdKeyNkp0=0x92, Scan code for the 0 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_0 = 0x30;
+    /** EStdKeyNkp1=0x89, Scan code for the 1 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_1 = 0x31;
+    /** EStdKeyNkp2=0x8a, Scan code for the 2 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_2 = 0x32;
+    /** EStdKeyNkp3=0x8b, Scan code for the 3 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_3 = 0x33;
+    /** EStdKeyNkp4=0x8c, Scan code for the 4 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_4 = 0x34;
+    /** EStdKeyNkp5=0x8d, Scan code for the 5 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_5 = 0x35;
+    /** EStdKeyNkp6=0x8e, Scan code for the 6 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_6 = 0x36;
+    /** EStdKeyNkp7=0x8f, Scan code for the 7 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_7 = 0x37;
+    /** EStdKeyNkp8=0x90, Scan code for the 8 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_8 = 0x38;
+    /** EStdKeyNkp9=0x91, Scan code for the 9 key on the Numeric keypad. */
+	public final static int SCANCODE_NUMPAD_9 = 0x39;
+    /** EStdKeyHash=0x7f, Scan code for Hash key (#) key. */
+	public final static int SCANCODE_NUMPAD_HASH = 0x7f;
+    /** EStdKeyNkpAsterisk=0x85, Scan code for Asterisk (*) key on the Numeric keypad. */
+    public final static int SCANCODE_NUMPAD_ASTERISK = 0x85;
+    /** EStdKeyNkpEnter=0x88, Scan code for Enter key on the Numeric keypad. */
+    public final static int SCANCODE_NUMPAD_ENTER = 0x88;
+
+    // Softkeys
+    
+    /** EStdKeyDevice0=0xa4 */
+    public final static int SCANCODE_SOFTLEFT = 0xa4;
+    /** EStdKeyDevice1=0xa5 */
+    public final static int SCANCODE_SOFTRIGHT = 0xa5;
+
+    // Other
+    
+    /** EStdKeyApplication0=0xb4 */
+    public final static int SCANCODE_APP = 0xb4;
+    /** EStdKeyNo=0xc5 */
+    public final static int SCANCODE_END = 0xc5;
+    /** EStdKeyYes=0xc4 */
+    public final static int SCANCODE_SEND = 0xc4;
+    /** EStdKeyRightShift=0x13 */
+    public final static int SCANCODE_EDIT = 0x13;
+    /** EStdKeyBackspace=0x01 */
+    public final static int SCANCODE_CLEAR = 0x01;
+    /** EStdKeyEnter=0x03 */
+    public final static int SCANCODE_ENTER = 0x03;
+    /** EStdKeyRightCtrl=0x17 */
+    public final static int SCANCODE_RIGHT_CTRL = 0x17;
+    /** EStdKeySpace=0x05 */
+    public final static int SCANCODE_SPACE = 0x05;
+    /** EStdKeyDevice2=0xa6 */
+    public final static int SCANCODE_POWER =0xa6;
+    /** EStdKeyRightShift=0x13 */
+    public final static int SCANCODE_NAVI_EDIT = 0x13;
+    /** EStdKeyDevice6=0xaa */
+    public final static int SCANCODE_NAVI_VOICE = 0xaa;
+    /** EStdKeyDevice6=0xab */
+    public final static int SCANCODE_NAVI_CAMERA = 0xab;
+    /** EStdKeyLeftFunc=0x18 */
+    public final static int SCANCODE_CHR = 0x18;
+    /** EStdKeyDevice4=0xa8 */
+    public final static int SCANCODE_GRIP_OPEN = 0xa8;
+    /** EStdKeyDevice5=0xa9 */
+    public final static int SCANCODE_GRIP_CLOSED = 0xa9;
+    
+    
+	/**
+	 * Sends tap screen event to the device.
+	 * Total time used to tap should be shorted than timeout, or request will fail on timeout.
+	 * @param x Horizontal screen location of tap screen event in pixels.
+	 * @param y Vertical screen location of tap screen event in pixels.
+	 * @param tapCount Count of taps within this event.
+	 * @param timeToHold How long one tap lasts in milliseconds.
+	 * @param pauseBetweenTaps How much time there is between taps in milliseconds.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void tapScreen(int x, int y, int tapCount, int timeToHold, int pauseBetweenTaps, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Sends tap and drag event to the device.
+	 * Total time used to tap should be shorted than timeout, or request will fail on timeout.
+	 * @param startX Horizontal screen location from where dragging starts.
+	 * @param startY Vertical screen location from where dragging starts.
+	 * @param endX Horizontal screen location where dragging ends.
+	 * @param endY Vertical screen location where dragging ends.
+	 * @param dragTime Time that it takes from starting point to the end point.
+	 * This value should be shorted than timeout, or request will fail because timeout.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public void tapAndDrag(int startX, int startY, int endX, int endY, int dragTime, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Sends press key event. 
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * Pure ASCII text is sent using <code>typeText</code>.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * 			and new requests are not accepted.
+	 * @see IKeyEventService#typeText
+	 */
+	public void pressKey(int scanCode, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+
+	/**
+	 * Sends press key event where key stays down for the holdTime.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * Pure ASCII text is sent using <code>typeText</code>.
+	 * @param scanCode Scan code for the key.
+	 * @param holdTime Time that key is kept down in milliseconds. This should be shorter
+	 * time than timeout, or this request will fail because timeout.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * 			and new requests are not accepted.
+	 * @see IKeyEventService#typeText
+	 */
+	public void pressKeyLong(int scanCode, int holdTime, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Sends release key event.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * Pure ASCII text is sent using <code>typeText</code>.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * 			and new requests are not accepted.
+	 * @see IKeyEventService#typeText
+	 */
+	public void releaseKey(int scanCode, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+
+	/**
+	 * Sends a sequence of ASCII text.
+	 * @param typeStr ASCII text string.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * 			and new requests are not accepted.
+	 */
+	public void typeText(String typeStr, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Sends hold key event.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * Pure ASCII text is sent using <code>typeText</code>.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * 			and new requests are not accepted.
+	 * @see IKeyEventService#typeText
+	 */
+	public void holdKey(int scanCode, long timeout)
+					throws ServiceShutdownException, HTIException, ConnectionException;
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/IScreenCaptureService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services;
+
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+
+/**
+ * Service that contains interface for capturing images from device.
+ */
+public interface IScreenCaptureService {
+
+	/**
+	 * Captures a full screen with specified type and color amount.
+	 * @param imgMimeType Image MIME type, e.g. "image/png", "image/gif", "image/jpeg"
+	 * @param colorDepth Color depth e.g. ConnectionTestService.COLOR_DEPTH_ECOLOR64K.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return Full screen image with specified type as byte array.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public byte[] captureFullScreen(String imgMimeType, int colorDepth, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+	
+	/**
+	 * Gets information about the screen. This information includes width, height, rotation, and display mode
+	 * of the screen. Also screen index and currently focused screen index is returned.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 * @return HTIScreenMode object that contains information about the screen.
+	 * @throws ConnectionException Connection failed
+	 * @throws HTIException Thrown when there are problems with HTI
+	 * @throws ServiceShutdownException Thrown after services have been shut down
+	 * and new requests are not accepted.
+	 */
+	public HTIScreenMode getScreenMode(long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/ApplicationControlService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,170 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.HTIMessage;
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIErrorDetails;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.AppStatus;
+import com.nokia.s60tools.hticonnection.services.IApplicationControlService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Service that contains interface for controlling applications on device.
+ */
+public class ApplicationControlService implements IApplicationControlService{
+	
+	/**
+	 * Print utility used to report errors, warnings, and info messages.
+	 */
+	private final IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Used for printing messages.
+	 */
+	public ApplicationControlService(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#startApplicationByName(java.lang.String, java.lang.String, long)
+	 */
+	public void startApplicationByName(String programName, String docName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		StartApplicationByNameRequest request = new StartApplicationByNameRequest(programName, docName, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("AppControlServiceService.FailedToStartApp_ExceptionMsg") + programName; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#startProcess(java.lang.String, java.lang.String, long)
+	 */
+	public void startProcess(String programName, String parameters, long timeout)
+			throws ServiceShutdownException, HTIException, ConnectionException {
+		StartCommandByNameRequest request = new StartCommandByNameRequest(programName, parameters, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = 
+				Messages.getString("AppControlServiceService.FailedToStartProgram_ExceptionMsg_Part1")//$NON-NLS-1$
+					+ " "//$NON-NLS-1$
+					+ programName 
+					+ " "//$NON-NLS-1$
+					+ Messages.getString("AppControlServiceService.FailedToStartProgram_ExceptionMsg_Part2")//$NON-NLS-1$
+					+ " "//$NON-NLS-1$
+					+parameters;
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#startApplicationByUid(int, java.lang.String, long)
+	 */
+	public void startApplicationByUid(int uid, String docName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		StartApplicationByUidRequest request = new StartApplicationByUidRequest(uid, docName, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		com.nokia.HTI.ApplicationControlService.AppStatus status = result.getAppStatus();
+		if (status.getStatus() == AppStatus.NOT_FOUND) {
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("ApplicationControlService.FailedToStartAppByUidExceptionMsg_Part1")  //$NON-NLS-1$
+					+uid +Messages.getString("ApplicationControlService.FailedToStartAppByUid_AppNotFoundExceptionMsg_Suffix");  //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			throw new HTIException(errorMsg, null);
+		}
+		else if (status.getStatus() == com.nokia.HTI.ApplicationControlService.AppStatus.ALREADY_RUNNING) {
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("ApplicationControlService.FailedToStartAppByUidExceptionMsg_Part1")  //$NON-NLS-1$
+					+uid +Messages.getString("ApplicationControlService.FailedToStartAppByUidAlreaydyRunningExceptionMsg_Suffix"); //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			throw new HTIException(errorMsg, null);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#getApplicationStatusByName(java.lang.String, long)
+	 */
+	public AppStatus getApplicationStatusByName(String programName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		GetApplicationStatusByNameRequest request = new GetApplicationStatusByNameRequest(programName, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		return new AppStatus(result.getAppStatus().getStatus());
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#getApplicationStatusByUid(int, long)
+	 */
+	public AppStatus getApplicationStatusByUid(int uid, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		GetApplicationStatusByUidRequest request = new GetApplicationStatusByUidRequest(uid, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		return new AppStatus(result.getAppStatus().getStatus());
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#stopApplicationByName(java.lang.String, long)
+	 */
+	public void stopApplicationByName(String programName, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		StopApplicationByNameRequest request = new StopApplicationByNameRequest(programName, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("AppControlServiceService.FailedToStopApp_ExceptionMsg") + programName; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IApplicationControlService#stopApplicationByUid(int, long)
+	 */
+	public void stopApplicationByUid(int uid, long timeout) throws ServiceShutdownException, HTIException, ConnectionException {
+		StopApplicationByUidRequest request = new StopApplicationByUidRequest(uid, timeout);
+		RequestQueueManager.getInstance().submit(request, printUtility);
+		// No need to check result. Returned AppStatus is Ok or NotFound.
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/GetApplicationStatusByNameRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.HTI.ApplicationControlService.AppStatus;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class GetApplicationStatusByNameRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Get application status with name"; //$NON-NLS-1$
+	
+	// Settings for request
+	private final String appName;
+	private final long timeout;
+	
+	/**
+	 * Get application status
+	 * @param appName Application name (with full path if necessary)
+	 * @param timeout Timeout for request
+	 */
+	public GetApplicationStatusByNameRequest(String appName, long timeout){
+		super(REQUEST_NAME);
+		this.appName = appName;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		AppStatus result = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.getApplicationStatus(appName, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/GetApplicationStatusByUidRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.HTI.ApplicationControlService.AppStatus;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class GetApplicationStatusByUidRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Get application status with UID"; //$NON-NLS-1$
+	
+	// Settings for request
+	private final int uid;
+	private final long timeout;
+	
+	/**
+	 * Get application status
+	 * @param uid Application UID
+	 * @param timeout Timeout for request
+	 */
+	public GetApplicationStatusByUidRequest(int uid, long timeout){
+		super(REQUEST_NAME);
+		this.uid = uid;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		AppStatus result = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.getApplicationStatusByUID(uid, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartApplicationByNameRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class StartApplicationByNameRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Start application with name"; //$NON-NLS-1$
+	
+	// Settings for start application request
+	private final String appName;
+	private final String docName;
+	private final long timeout;
+	
+	/**
+	 * Start application
+	 * @param appName Application name (with full path if necessary)
+	 * @param docName name of the document passed to started application
+	 * @param timeout Timeout for request
+	 */
+	public StartApplicationByNameRequest(String appName, String docName, long timeout){
+		super(REQUEST_NAME);
+		this.appName = appName;
+		this.docName = docName;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.startApplication(appName, docName, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartApplicationByUidRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.HTI.ApplicationControlService.AppStatus;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class StartApplicationByUidRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Start application with UID"; //$NON-NLS-1$
+	
+	// Settings for start application request
+	private final int uid;
+	private final String docName;
+	private final long timeout;
+	
+	/**
+	 * Start application
+	 * @param uid Application Uid
+	 * @param docName name of the document passed to started application
+	 * @param timeout Timeout for request
+	 */
+	public StartApplicationByUidRequest(int uid, String docName, long timeout){
+		super(REQUEST_NAME);
+		this.uid = uid;
+		this.docName = docName;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		AppStatus status = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.startApplicationByUID(uid, docName, timeout);
+		return new RequestResult(status);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StartCommandByNameRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class StartCommandByNameRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Start command with name"; //$NON-NLS-1$
+	
+	// Settings for start application request
+	private final String programName;
+	private final String parameters;
+	private final long timeout;
+	
+	/**
+	 * Start application
+	 * @param programName Application name (with full path if necessary)
+	 * @param parameters passed to the started application
+	 * @param timeout Timeout for request
+	 */
+	public StartCommandByNameRequest(String programName, String parameters, long timeout){
+		super(REQUEST_NAME);
+		this.programName = programName;
+		this.parameters = parameters;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.startProcess(programName, parameters, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StopApplicationByNameRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class StopApplicationByNameRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Stop application with name"; //$NON-NLS-1$
+	
+	// Settings for stop application request
+	private final String appName;
+	private final long timeout;
+	
+	/**
+	 * Stop application
+	 * @param appName Application name (with full path if necessary)
+	 * @param timeout Timeout for request
+	 */
+	public StopApplicationByNameRequest(String appName, long timeout){
+		super(REQUEST_NAME);
+		this.appName = appName;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.stopApplication(appName, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/applicationcontrolservice/StopApplicationByUidRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.applicationcontrolservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.HTI.ApplicationControlService.AppStatus;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class StopApplicationByUidRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Stop application with UID"; //$NON-NLS-1$
+	
+	// Settings for stop application request
+	private final int uid;
+	private final long timeout;
+	
+	/**
+	 * Stop application
+	 * @param uid Application UID
+	 * @param timeout Timeout for request
+	 */
+	public StopApplicationByUidRequest(int uid, long timeout){
+		super(REQUEST_NAME);
+		this.uid = uid;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ApplicationControlService.ApplicationControlService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		AppStatus status = ((com.nokia.HTI.ApplicationControlService.ApplicationControlService)service)
+						.stopApplicationByUID(uid, timeout);
+		return new RequestResult(status);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ConnectionTestRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.connectiontestservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.RequestFailedException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ConnectionTestRequest extends AbstractRequest{
+
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Connection test"; //$NON-NLS-1$
+
+	// Values that are used to test service.
+	private final int WAIT_TIME = 1000;
+	private final String ECHO_STR = "Test"; //$NON-NLS-1$
+	
+	/**
+	 * Capture a full screen.
+	 */
+	public ConnectionTestRequest(){
+		super(REQUEST_NAME);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.BaseService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		String echo = ((com.nokia.HTI.BaseService)service)
+						.echo(ECHO_STR, WAIT_TIME);
+		
+		// Testing that correct string is returned.
+		if(!echo.equals(ECHO_STR)){
+			throw new RequestFailedException(REQUEST_NAME + 
+					Messages.getString("ConnectionTestRequest.WrongResultReturned_Exception_Msg")); //$NON-NLS-1$
+		}
+		
+		// Returning result that request was successful.
+		RequestResult requestResult = new RequestResult(true);
+		return requestResult;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ConnectionTestService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.connectiontestservice;
+
+import java.util.List;
+
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+import com.nokia.s60tools.hticonnection.services.IConnectionTestService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Service that contains interface for testing if connection is ready for use.
+ */
+public class ConnectionTestService implements IConnectionTestService{
+	
+	/**
+	 * Print utility used to report errors, warnings, and info messages.
+	 */
+	private final IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor. 
+	 * @param printUtility Used for printing messages.
+	 */
+	public ConnectionTestService(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IConnectionTestService#isReady()
+	 */
+	public boolean isReady(){
+		ConnectionTestRequest request = new ConnectionTestRequest();
+		
+		try {
+			// Getting result for connection test.
+			RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+			return result.getBooleanData();
+		} catch (Exception e) {
+			// Request failed.
+			return false;
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IConnectionTestService#listServices()
+	 */
+	public List<String> listServices() throws HTIException, ConnectionException, ServiceShutdownException{
+		ListServiceRequest request = new ListServiceRequest();
+		
+		// Getting result for connection test.
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getListData();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IConnectionTestService#getVersion()
+	 */
+	public HTIVersion getVersion() throws HTIException, ConnectionException, ServiceShutdownException{
+		GetVersionRequest request = new GetVersionRequest();
+		
+		// Getting result for connection test.
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getHTIVersionData();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/GetVersionRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.connectiontestservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class GetVersionRequest extends AbstractRequest{
+
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Get version"; //$NON-NLS-1$
+
+	// Values that are used to test service.
+	private final int WAIT_TIME = 1500;
+	
+	/**
+	 * Constructor.
+	 */
+	public GetVersionRequest(){
+		super(REQUEST_NAME);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.BaseService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Copy data from com.nokia.HTI.HTIVersion 
+		// to com.nokia.s60tools.hticonnection.services.HTIVersion 
+		com.nokia.HTI.HTIVersion version = ((com.nokia.HTI.BaseService)service).getVersion(WAIT_TIME);
+		return new RequestResult(new HTIVersion(version.getMajor(), version.getMinor()));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/connectiontestservice/ListServiceRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.connectiontestservice;
+
+import java.util.List;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ListServiceRequest extends AbstractRequest{
+
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "List services"; //$NON-NLS-1$
+
+	// Values that are used to test service.
+	private final int WAIT_TIME = 1000;
+	
+	/**
+	 * Constructor.
+	 */
+	public ListServiceRequest(){
+		super(REQUEST_NAME);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.BaseService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	// Supressing warning from unchecked cast from listServices operation.
+	@SuppressWarnings("unchecked")
+	public RequestResult invokeService(IService service) throws Exception{
+		List<String> services = (List<String>)((com.nokia.HTI.BaseService)service)
+						.listServices(WAIT_TIME);
+		return new RequestResult(services);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/AbstractFileTransferRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import java.util.concurrent.FutureTask;
+
+import com.nokia.HTI.FTPService.FTPService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+import com.nokia.s60tools.hticonnection.services.IFTPRequestManager;
+
+/**
+ * Abstract file transfer class that hold implementation for canceling
+ * file transfer operation.
+ */
+public abstract class AbstractFileTransferRequest extends AbstractRequest implements IFTPRequestManager {
+	
+	/**
+	 * Listener for this operation.
+	 */
+	private final IFTPListener listener;
+	/**
+	 * File that is transfered.
+	 */
+	protected final String remoteFile;
+	/**
+	 * This service is set when file transfer has started.
+	 * This instance can be canceled then if needed. 
+	 */
+	private FTPService startedService = null;
+	
+	/**
+	 * Constructor.
+	 * @param remoteFile File in target to be transfered.
+	 * @param listener Listener for this request. Or null if information is not needed.
+	 * @param requestName Name of this request.
+	 */
+	public AbstractFileTransferRequest(String remoteFile, IFTPListener listener, String requestName){
+		super(requestName);
+		this.remoteFile = remoteFile;
+		this.listener = listener;
+	}
+
+	/**
+	 * Getter for remote file name.
+	 * @return Remote file name.
+	 */
+	public String getRemoteFileName() {
+		return remoteFile;
+	}
+
+	/**
+	 * Sets future task so that file transfer can be canceled by using it.
+	 * @param resultFutureTask
+	 */
+	public void setFutureTask(FutureTask<RequestResult> resultFutureTask) {
+		this.resultFutureTask = resultFutureTask;
+		if(requestCanceled) {
+			// Cancel has already been ordered.
+			resultFutureTask.cancel(false);
+		}
+	}
+
+	/**
+	 * Informs listener that request has been put into the queue.
+	 */
+	public void informInQueue() {
+		if(listener != null) {
+			listener.requestInQueue(this);
+		}
+	}
+
+	/**
+	 * Informs listener that request has been started.
+	 */
+	public void informStarted() {
+		if(listener != null) {
+			listener.requestStarted(this);
+		}
+	}
+
+	/**
+	 * Informs listener that request has been ended
+	 */
+	public void informEnded() {
+		if(listener != null) {
+			listener.requestEnded(this);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPRequestManager#getFileName()
+	 */
+	public String getFileName() {
+		return remoteFile;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPRequestManager#cancel()
+	 */
+	@Override
+	public void cancel() {
+		requestCanceled = true;
+		FTPService service = getStartedService();
+		
+		if(service != null) {
+			service.cancelCurrentTransfer();
+		}
+		// Checking that future task has been created and request is not transferring the data.
+		// It future task is canceled when transfer is ongoing, then transfer would continue in background.
+		if(resultFutureTask != null && service == null) {
+			resultFutureTask.cancel(false);
+		}
+	}
+	
+	/**
+	 * Getter for service that is used in this request.
+	 * @param startedService Service that is used in this request.
+	 */
+	public synchronized void setStartedService(FTPService startedService) {
+		this.startedService = startedService;
+	}
+	
+	/**
+	 * Setter for service that is used in this request.
+	 * @return Service that is used in this request.
+	 */
+	public synchronized FTPService getStartedService() {
+		return startedService;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/CopyFileDirRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class CopyFileDirRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Copy file or dir"; //$NON-NLS-1$
+	
+	// Settings for copy request
+	private final String originalPath;
+	private final String copyPath;
+	private final long timeout;
+	
+	/**
+	 * Copies file or directory.
+	 * @param originalPath File/folder to be copied.
+	 * @param copyPath File/folder where original file/folder is copied.
+	 * @param timeout Timeout for request.
+	 */
+	public CopyFileDirRequest(String originalPath, String copyPath, long timeout){
+		super(REQUEST_NAME);
+		this.originalPath = originalPath;
+		this.copyPath = copyPath;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.copyFileFolder(originalPath, copyPath, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DeleteDirRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class DeleteDirRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Delete dir"; //$NON-NLS-1$
+	
+	// Settings for delete dir request
+	private final String remoteDir;
+	private final long timeout;
+	
+	/**
+	 * Deletes directory
+	 * @param remoteDir Directory to be deleted
+	 * @param timeout Timeout for request
+	 */
+	public DeleteDirRequest(String remoteDir, long timeout){
+		super(REQUEST_NAME);
+		this.remoteDir = remoteDir;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.deleteDirectory(remoteDir, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DeleteFileRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class DeleteFileRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Delete file"; //$NON-NLS-1$
+	
+	// Settings for list dirs request
+	private final String remoteFile;
+	private final long timeout;
+	
+	/**
+	 * Deletes file from device
+	 * @param remoteFile File in target to be deleted
+	 * @param timeout Timeout for request
+	 */
+	public DeleteFileRequest(String remoteFile, long timeout){
+		super(REQUEST_NAME);
+		this.remoteFile = remoteFile;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.deleteFile(remoteFile, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/DownloadFileRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class DownloadFileRequest extends AbstractFileTransferRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Download file"; //$NON-NLS-1$
+	
+	// Settings for download file request
+	private final long timeout;
+	
+	/**
+	 * Download file from device
+	 * @param remoteFile File in target to be downloaded
+	 * @param listener Listener for this request. Or null if information is not needed.
+	 * @param timeout Timeout for request
+	 */
+	public DownloadFileRequest(String remoteFile, IFTPListener listener, long timeout){
+		super(remoteFile, listener, REQUEST_NAME);
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		informStarted();
+		// Checking if request has been canceled.
+		if(requestCanceled) {
+			throw new HTIException(REQUEST_NAME + Messages.getString("DownloadFileRequest.RequestCanceled.Exception.Msg0"), true, true); //$NON-NLS-1$
+		}
+		setStartedService((com.nokia.HTI.FTPService.FTPService)service);
+		
+		// Sending download file request.
+		byte[] result;
+		try {
+			result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.downloadFile(remoteFile, timeout);
+		} finally {
+			setStartedService(null);
+			// Checking if request was canceled while downloading file.
+			if(requestCanceled) {
+				resultFutureTask.cancel(false);
+			}
+		}
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/FTPService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.HTIMessage;
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIErrorDetails;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+import com.nokia.s60tools.hticonnection.services.FileInfo;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Service that contains interface for performing file operations on device.
+ */
+public class FTPService implements IFTPService{
+	
+	/**
+	 * Print utility used to report errors, warnings, and info messages.
+	 */
+	private final IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Used for printing messages.
+	 */
+	public FTPService(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#listDirs(java.lang.String, long)
+	 */
+	public String[] listDirs(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		ListDirsRequest request = new ListDirsRequest(remoteDir, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getStringArrayData();	
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#listFiles(java.lang.String, long)
+	 */
+	public String[] listFiles(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		ListFilesRequest request = new ListFilesRequest(remoteDir, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getStringArrayData();	
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#listFilesAndDetails(java.lang.String, long)
+	 */
+	public FileInfo[] listFilesAndDetails(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		ListFilesAndDetailsRequest request = new ListFilesAndDetailsRequest(remoteDir, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getFileInfoArrayData();	
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#listDirs(long)
+	 */
+	public DriveInfo[] listDrives(long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		ListDrivesRequest request = new ListDrivesRequest(timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getDriveInfoArrayData();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#uploadFile(byte[], java.lang.String, com.nokia.s60tools.hticonnection.services.ftpservice.IFTPListener, long)
+	 */
+	public void uploadFile(byte[] fileData, String remoteFile, IFTPListener listener, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		UploadFileRequest request = new UploadFileRequest(fileData, remoteFile, listener, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("FTPService.FailedToUploadFile_ExceptionMsg") + remoteFile; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#downloadFile(java.lang.String, com.nokia.s60tools.hticonnection.services.ftpservice.IFTPListener, long)
+	 */
+	public byte[] downloadFile(String remoteDir, IFTPListener listener, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		DownloadFileRequest request = new DownloadFileRequest(remoteDir, listener, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getByteData();	
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#deleteFile(java.lang.String, long)
+	 */
+	public void deleteFile(String remoteFile, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		DeleteFileRequest request = new DeleteFileRequest(remoteFile, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = (Messages.getString("FTPService.FailedToDeleteFile_ExceptionMsg") + remoteFile); //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+		
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#makeDir(java.lang.String, long)
+	 */
+	public void makeDir(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		MakeDirRequest request = new MakeDirRequest(remoteDir, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = (Messages.getString("FTPService.FailedToMakeDir_ExceptionMsg") + remoteDir); //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#deleteDir(java.lang.String, long)
+	 */
+	public void deleteDir(String remoteDir, long timeout)
+						throws ServiceShutdownException, HTIException, ConnectionException {
+		DeleteDirRequest request = new DeleteDirRequest(remoteDir, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = (Messages.getString("FTPService.FailedToDeleteDir_ExceptionMsg") + remoteDir); //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#copyFileDir(java.lang.String, java.lang.String, long)
+	 */
+	public void copyFileDir(String originalPath, String copyPath, long timeout)
+			throws ServiceShutdownException, HTIException, ConnectionException {
+		CopyFileDirRequest request = new CopyFileDirRequest(originalPath, copyPath, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("FTPService.FailedToCopyFile_ExceptionMsg1")  //$NON-NLS-1$
+					+ originalPath + Messages.getString("FTPService.FailedToCopyFile_ExceptionMsg2") + copyPath; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#moveFileDir(java.lang.String, java.lang.String, long)
+	 */
+	public void moveFileDir(String oldPath, String newLocation, long timeout)
+			throws ServiceShutdownException, HTIException, ConnectionException {
+		MoveFileDirRequest request = new MoveFileDirRequest(oldPath, newLocation, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("FTPService.FailedToMoveFile_ExceptionMsg1")  //$NON-NLS-1$
+					+ oldPath + Messages.getString("FTPService.FailedToMoveFile_ExceptionMsg2") + newLocation; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPService#renameFileDir(java.lang.String, java.lang.String, long)
+	 */
+	public void renameFileDir(String oldName, String newName, long timeout)
+			throws ServiceShutdownException, HTIException, ConnectionException {
+		RenameFileDirRequest request = new RenameFileDirRequest(oldName, newName, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error.
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			String errorMsg = Messages.getString("FTPService.FailedToRename_ExceptionMsg1")  //$NON-NLS-1$
+					+ oldName + Messages.getString("FTPService.FailedToRename_ExceptionMsg2") + newName; //$NON-NLS-1$
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListDirsRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ListDirsRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "List dirs"; //$NON-NLS-1$
+	
+	// Settings for list dirs request
+	private final String remoteDir;
+	private final long timeout;
+	
+	/**
+	 * List directories in given directory
+	 * @param remoteDir Directory
+	 * @param timeout Timeout for request
+	 */
+	public ListDirsRequest(String remoteDir, long timeout){
+		super(REQUEST_NAME);
+		this.remoteDir = remoteDir;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		String[] result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.listDirs(remoteDir, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListDrivesRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import java.util.Vector;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ListDrivesRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "List drives"; //$NON-NLS-1$
+	
+	// Settings for list drive request
+	private final long timeout;
+	
+	/**
+	 * List drives on device
+	 * @param timeout Timeout for request
+	 */
+	public ListDrivesRequest(long timeout){
+		super(REQUEST_NAME);
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		com.nokia.HTI.FTPService.DriveInfo[] result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.listDrives(timeout);
+		
+		Vector<DriveInfo> driveInfos = new Vector<DriveInfo>();
+		
+		for (int i = 0; i < result.length; i++) {
+			// Copy data from com.nokia.HTI.FTPService.DriveInfo
+			// to com.nokia.s60tools.hticonnection.services.DriveInfo
+			DriveInfo info = new DriveInfo(
+					result[i].getRootPath(),
+					result[i].getName(),
+					DriveInfo.MediaType.valueOf(result[i].getType().toString()),
+					result[i].getUid(),
+					result[i].getSize(),
+					result[i].getFreeSpace());
+			
+			driveInfos.add(info);
+		}
+		
+		return new RequestResult(driveInfos.toArray(new DriveInfo[0]));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListFilesAndDetailsRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.services.FileInfo;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ListFilesAndDetailsRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "List files"; //$NON-NLS-1$
+	
+	// Settings for list files request
+	private final String remoteDir;
+	private final long timeout;
+	
+	/**
+	 * List files in given directory
+	 * @param remoteDir Directory
+	 * @param timeout Timeout for request
+	 */
+	public ListFilesAndDetailsRequest(String remoteDir, long timeout){
+		super(REQUEST_NAME);
+		this.remoteDir = remoteDir;
+		this.timeout = timeout;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		com.nokia.HTI.FTPService.FileInfo[] result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.listFilesWithSize(remoteDir, timeout);
+		
+		FileInfo[] files = new FileInfo[result.length];
+		// Copy data from com.nokia.HTI.FTPService.FileInfo
+		// to com.nokia.s60tools.hticonnection.services.FileInfo
+		for(int i = 0;i < result.length;i++) {
+			files[i] = new FileInfo(result[i].getName(), result[i].getSize());
+		}
+		
+		return new RequestResult(files);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/ListFilesRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ListFilesRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "List files"; //$NON-NLS-1$
+	
+	// Settings for list files request
+	private final String remoteDir;
+	private final long timeout;
+	
+	/**
+	 * List files in given directory
+	 * @param remoteDir Directory
+	 * @param timeout Timeout for request
+	 */
+	public ListFilesRequest(String remoteDir, long timeout){
+		super(REQUEST_NAME);
+		this.remoteDir = remoteDir;
+		this.timeout = timeout;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		String[] result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.listFiles(remoteDir, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/MakeDirRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class MakeDirRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Make dir"; //$NON-NLS-1$
+	
+	// Settings for make dir request
+	private final String remoteDir;
+	private final long timeout;
+	
+	/**
+	 * Creates directory
+	 * @param remoteDir Directory to be created
+	 * @param timeout Timeout for request
+	 */
+	public MakeDirRequest(String remoteDir, long timeout){
+		super(REQUEST_NAME);
+		this.remoteDir = remoteDir;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.makeDir(remoteDir, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/MoveFileDirRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class MoveFileDirRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Move file or dir"; //$NON-NLS-1$
+	
+	// Settings for move request
+	private final String oldPath;
+	private final String newLocation;
+	private final long timeout;
+	
+	/**
+	 * Moves file or directory.
+	 * @param oldPath File/folder to be moved.
+	 * @param newLocation File/folder where original file/folder is moved.
+	 * @param timeout Timeout for request.
+	 */
+	public MoveFileDirRequest(String oldPath, String newLocation, long timeout){
+		super(REQUEST_NAME);
+		this.oldPath = oldPath;
+		this.newLocation = newLocation;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.moveFileFolder(oldPath, newLocation, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/RenameFileDirRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class RenameFileDirRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Rename file or dir"; //$NON-NLS-1$
+	
+	// Settings for rename request
+	private final String oldName;
+	private final String newName;
+	private final long timeout;
+	
+	/**
+	 * Renames file or directory.
+	 * @param oldName File/folder to be renamed.
+	 * @param newName Name to which original file/folder is renamed.
+	 * @param timeout Timeout for request.
+	 */
+	public RenameFileDirRequest(String oldName, String newName, long timeout){
+		super(REQUEST_NAME);
+		this.oldName = oldName;
+		this.newName = newName;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.FTPService.FTPService)service)
+						.renameFileFolder(oldName, newName, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/ftpservice/UploadFileRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.ftpservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class UploadFileRequest extends AbstractFileTransferRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Upload file"; //$NON-NLS-1$
+	
+	// Settings for upload file request
+	private final byte[] fileData;
+	private final long timeout;
+	
+	/**
+	 * Uploads file to device
+	 * @param fileData  Bytes read from local file
+	 * @param remoteFile File in target where to write data
+	 * @param listener Listener for this request. Or null if information is not needed.
+	 * @param timeout Timeout for request
+	 */
+	public UploadFileRequest(byte[] fileData, String remoteFile, IFTPListener listener, long timeout){
+		super(remoteFile, listener, REQUEST_NAME);
+		this.fileData = fileData;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.FTPService.FTPService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		informStarted();
+		// Checking if request has been canceled.
+		if(requestCanceled) {
+			throw new HTIException(REQUEST_NAME + Messages.getString("UploadFileRequest.RequestCanceled.Exception.Msg0"), true, true); //$NON-NLS-1$
+		}
+		setStartedService((com.nokia.HTI.FTPService.FTPService)service);
+
+		// Sending upload file request.
+		HTIMessage result;
+		try {
+			result = ((com.nokia.HTI.FTPService.FTPService)service)
+					.uploadFile(fileData, remoteFile, timeout);
+		} finally {
+			setStartedService(null);
+			// Checking if request was canceled while uploading file.
+			if(requestCanceled) {
+				resultFutureTask.cancel(false);
+			}
+		}
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/AbstractKeyRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.common.Util;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+
+/**
+ * Common abstract class for key event requests. 
+ */
+public abstract class AbstractKeyRequest extends AbstractRequest {
+
+	/**
+	 * Timeout for the requested operation
+	 */
+	protected final long timeout;
+
+	/**
+	 * Helper method for converting the key to scan code
+	 * @param scanCode Scan code in integer format.
+	 * @return Scan code as byte array.
+	 */
+	protected static byte[] convertScanCodeToByteArr(int scanCode) {
+	    byte[] scanCodeByteArr = new byte[2]; //Wide character set used
+	    Util.intToLittleEndianBytes(scanCode, scanCodeByteArr, 0, 2);
+	    return scanCodeByteArr;
+	}
+
+	/**
+	 * Constructor.
+	 * @param name Name of the request.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	protected AbstractKeyRequest(String name, long timeout){
+		super(name);
+		this.timeout = timeout;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/HoldKeyRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class HoldKeyRequest extends AbstractKeyRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Hold key"; //$NON-NLS-1$
+	/**
+	 * Scan code for the key.
+	 */
+	private final int scanCode;
+	
+	/**
+	 * Constructor.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public HoldKeyRequest(int scanCode, long timeout) {
+		super(REQUEST_NAME, timeout);
+		this.scanCode = scanCode;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Making byte array from integer scan code		
+		byte[] scanCodeToByteArr = convertScanCodeToByteArr(scanCode);
+		// Sending request
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+																.holdKey(scanCodeToByteArr, timeout);		
+		return new RequestResult(result);
+    }	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/KeyEventService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,162 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.HTIMessage;
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIErrorDetails;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Class contains implementation for sending key events to device.
+ */
+public class KeyEventService implements IKeyEventService {
+	
+	/**
+	 * Print utility used to report errors, warnings, and info messages.
+	 */
+	private final IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Used for printing messages.
+	 */
+	public KeyEventService(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+	}
+	
+	/**
+	 * Checks result message for errors and reports them further via exception handling if needed.
+	 * @param result Result to be checked.
+	 * @param errorMsg Error message to be used if error is encountered.
+	 * @throws HTIException
+	 */
+	private void checkResultForErrors(RequestResult result, String errorMsg)
+			throws HTIException {
+		HTIMessage msg = result.getHTIMessage();
+		if(msg.isErrorResponse()){
+			// Reporting error and throwing appropriate error message.
+			printUtility.println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+			HTIErrorDetails details = new HTIErrorDetails(msg.getHTIErrorCode(),
+					msg.getServiceErrorCode(), msg.getErrorDescription());
+			throw new HTIException(errorMsg, details);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#tapScreen(int, int, int, int, int, long)
+	 */
+	public void tapScreen(int x, int y, int tapCount, int timeToHold, int pauseBetweenTaps, long timeout)
+								throws ServiceShutdownException, HTIException, ConnectionException {
+		
+		TapScreenRequest request = new TapScreenRequest(x, y, tapCount, timeToHold, pauseBetweenTaps, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedTapScreen_Exception_Msg"); //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#tapAndDrag(int, int, int, int, int, long)
+	 */
+	public void tapAndDrag(int startX, int startY, int endX, int endY, int dragTime, long timeout)
+								throws ServiceShutdownException, HTIException, ConnectionException {
+		
+		TapAndDragRequest request = new TapAndDragRequest(startX, startY, endX, endY, dragTime, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedTapAndDrag_Exception_Msg"); //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#pressKey(int)
+	 */
+	public void pressKey(int scanCode, long timeout) throws HTIException, ConnectionException, ServiceShutdownException {
+		
+		PressKeyRequest request = new PressKeyRequest(scanCode, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedToSendPressKeyEvent_ExceptionMsg");  //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#pressKeyLong(int, int, long)
+	 */
+	public void pressKeyLong(int scanCode, int holdTime, long timeout) 
+			throws ServiceShutdownException, HTIException, ConnectionException {
+		
+		PressKeyLongRequest request = new PressKeyLongRequest(scanCode, holdTime, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedToSendPressAndHoldKeyEvent_ExceptionMsg"); //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#releaseKey(int)
+	 */
+	public void releaseKey(int scanCode, long timeout) throws HTIException, ConnectionException, ServiceShutdownException {
+		
+		ReleaseKeyRequest request = new ReleaseKeyRequest(scanCode, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedToSendReleaseKeyEvent_ExceptionMsg");  //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#typeText(java.lang.String)
+	 */
+	public void typeText(String typeStr, long timeout) throws ServiceShutdownException,
+			HTIException, ConnectionException {
+		
+		TypeTextRequest request = new TypeTextRequest(typeStr, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedToSendTypeTextEvent_ExceptionMsg");  //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IKeyEventService#holdKey(int)
+	 */
+	public void holdKey(int scanCode, long timeout) throws ServiceShutdownException,
+			HTIException, ConnectionException {
+		
+		HoldKeyRequest request = new HoldKeyRequest(scanCode, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		
+		// Checking if there has been error and throwing appropriate error message if needed.
+		String errorMsg = Messages.getString("KeyEventService.FailedToSendHoldKeyEvent_ExceptionMsg");  //$NON-NLS-1$
+		checkResultForErrors(result, errorMsg);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/PressKeyLongRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class PressKeyLongRequest extends AbstractKeyRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Press and hold key"; //$NON-NLS-1$
+	/**
+	 * Scan code for the key.
+	 */
+	private final int scanCode;
+	/**
+	 * Time that key is hold down.
+	 */
+	private final int holdTime;
+	
+	/**
+	 * Constructor.
+	 * @param scanCode Scan code for the key.
+	 * @param holdTime Time that key is hold down.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public PressKeyLongRequest(int scanCode, int holdTime, long timeout) {
+		super(REQUEST_NAME, timeout);
+		this.scanCode = scanCode;
+		this.holdTime = holdTime;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Making byte array from integer scan code		
+		byte[] scanCodeToByteArr = convertScanCodeToByteArr(scanCode);
+		// Sending request
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+																.pressKeyLong(scanCodeToByteArr, holdTime, timeout);		
+		return new RequestResult(result);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/PressKeyRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class PressKeyRequest extends AbstractKeyRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Press key"; //$NON-NLS-1$
+	/**
+	 * Scan code for the key.
+	 */
+	private final int scanCode;
+	
+	/**
+	 * Constructor.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public PressKeyRequest(int scanCode, long timeout) {
+		super(REQUEST_NAME, timeout);
+		this.scanCode = scanCode;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Making byte array from integer scan code		
+		byte[] scanCodeToByteArr = convertScanCodeToByteArr(scanCode);
+		// Sending request
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+																.pressKey(scanCodeToByteArr, timeout);		
+		return new RequestResult(result);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/ReleaseKeyRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ReleaseKeyRequest extends AbstractKeyRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Release key"; //$NON-NLS-1$
+	/**
+	 * Scan code for the key.
+	 */
+	private final int scanCode;
+	
+	/**
+	 * Constructor.
+	 * @param scanCode Scan code for the key.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public ReleaseKeyRequest(int scanCode, long timeout) {
+		super(REQUEST_NAME, timeout);
+		this.scanCode = scanCode;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Making byte array from integer scan code		
+		byte[] scanCodeToByteArr = convertScanCodeToByteArr(scanCode);
+		// Sending request
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+																.releaseKey(scanCodeToByteArr, timeout);		
+		return new RequestResult(result);
+    }
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TapAndDragRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class TapAndDragRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Tap and drag"; //$NON-NLS-1$
+	
+	// Settings for tap screen event.
+	private final long timeout;
+	private final int startX;
+	private final int startY;
+	private final int endX;
+	private final int endY;
+	private final int dragTime;
+
+	/**
+	 * Tap and drag constructor.
+	 * @param startX Horizontal screen location from where dragging starts.
+	 * @param startY Vertical screen location from where dragging starts.
+	 * @param endX Horizontal screen location where dragging ends.
+	 * @param endY Vertical screen location where dragging ends.
+	 * @param dragTime Time that it takes from starting point to the end point.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public TapAndDragRequest(int startX, int startY, int endX, int endY,
+			int dragTime, long timeout) {
+		super(REQUEST_NAME);
+		this.startX = startX;
+		this.startY = startY;
+		this.endX = endX;
+		this.endY = endY;
+		this.dragTime = dragTime;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		// Creating parameters.
+		List<Integer> coordinateList = new ArrayList<Integer>();
+		coordinateList.add(startX);
+		coordinateList.add(startY);
+		coordinateList.add(endX);
+		coordinateList.add(endY);
+		
+		// Using multi point tap and drag because tap and drag didn't work.
+		// Dragtime needs to be divided to half because multipoint drag seems to wait
+		// that time at the start and at the end.
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+				.tapAndDragMultipoint(dragTime / 2, 0, coordinateList, timeout);
+		
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TapScreenRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class TapScreenRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Tap screen"; //$NON-NLS-1$
+	
+	// Settings for tap screen event.
+	private final long timeout;
+	private final int x;
+	private final int y;
+	private final int tapCount;
+	private final int timeToHold;
+	private final int pauseBetweenTaps;
+
+	/**
+	 * Tap screen constructor.
+	 * @param x Horizontal screen location of tap screen event in pixels.
+	 * @param y Vertical screen location of tap screen event in pixels.
+	 * @param tapCount Count of taps within this event.
+	 * @param timeToHold How long one tap lasts in milliseconds.
+	 * @param pauseBetweenTaps How much time there is between taps in milliseconds.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public TapScreenRequest(int x, int y, int tapCount, int timeToHold,
+			int pauseBetweenTaps, long timeout) {
+		super(REQUEST_NAME);
+		this.x = x;
+		this.y = y;
+		this.tapCount = tapCount;
+		this.timeToHold = timeToHold;
+		this.pauseBetweenTaps = pauseBetweenTaps;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+						.tapScreen(x, y, tapCount, timeToHold, pauseBetweenTaps, timeout);
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/keyeventservice/TypeTextRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.keyeventservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.HTIMessage;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class TypeTextRequest extends AbstractKeyRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Type text"; //$NON-NLS-1$
+	/**
+	 * Text to be typed.
+	 */
+	private final String typeStr;
+	
+	/**
+	 * Constructor.
+	 * @param typeStr Text to be typed.
+	 * @param timeout Time in milliseconds that is waited for the operation to complete. Use 0 for infinite.
+	 */
+	public TypeTextRequest(String typeStr, long timeout) {
+		super(REQUEST_NAME, timeout);
+		this.typeStr = typeStr;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.KeyEventService.KeyEventService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		HTIMessage result = ((com.nokia.HTI.KeyEventService.KeyEventService)service)
+				.typeText(typeStr, timeout);		
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/GetScreenModeRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.screencaptureservice;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class GetScreenModeRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Get screen mode"; //$NON-NLS-1$
+	
+	// Settings for capture.
+	private final long timeout;
+
+	/**
+	 * Get screen mode constructor.
+	 * @param timeout Time that is waited for operation to complete. Use 0 for infinite wait.
+	 */
+	public GetScreenModeRequest(long timeout) {
+		super(REQUEST_NAME);
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ScreenCapturingService.ScreenCapturingService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		com.nokia.HTI.ScreenCapturingService.HTIScreenMode screenMode = 
+				((com.nokia.HTI.ScreenCapturingService.ScreenCapturingService)service)
+						.getScreenMode(timeout);
+		
+		// Creating a new screen mode object, that can be sent to client.
+		HTIScreenMode result = new HTIScreenMode(screenMode.getIndex(), screenMode.getWidth(),
+												screenMode.getHeight(), screenMode.getRotation(),
+												screenMode.getMode(), screenMode.getFocusIndex());
+		
+		return new RequestResult(result);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/ScreenCaptureRequest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.screencaptureservice;
+
+import java.io.ByteArrayInputStream;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.HTI.BaseService;
+import com.nokia.HTI.IService;
+import com.nokia.s60tools.hticonnection.core.AbstractRequest;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * Callable object that can be used to wait for request to complete.
+ */
+public class ScreenCaptureRequest extends AbstractRequest{
+	
+	/**
+	 * Name used for request.
+	 */
+	private static final String REQUEST_NAME = "Screen capture"; //$NON-NLS-1$
+	
+	// Settings for capture.
+	private final String imgMimeType;
+	private final int colorDepth;
+	private final long timeout;
+
+	/**
+	 * Capture a full screen.
+	 * @param imgMimeType Image MIME type, e.g. "image/png", "image/gif", "image/jpeg"
+	 * @param colorDepth Color depth e.g. ConnectionTestService.COLOR_DEPTH_ECOLOR64K.
+	 * @param timeout Time that is waited for operation to complete. Use 0 for infinite wait.
+	 */
+	public ScreenCaptureRequest(String imgMimeType, int colorDepth, long timeout){
+		super(REQUEST_NAME);
+		this.imgMimeType = imgMimeType;
+		this.colorDepth = colorDepth;
+		this.timeout = timeout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#createService()
+	 */
+	public BaseService createService(){
+		return new com.nokia.HTI.ScreenCapturingService.ScreenCapturingService();
+		}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.core.AbstractRequest#invokeService(com.nokia.HTI.IService)
+	 */
+	public RequestResult invokeService(IService service) throws Exception{
+		byte[] result = ((com.nokia.HTI.ScreenCapturingService.ScreenCapturingService)service)
+						.captureFullScreen(imgMimeType, (byte)colorDepth, timeout);
+		
+		// Testing image to prevent sending invalid data.
+		testImageData(result);
+		
+		return new RequestResult(result);
+    }
+	
+	/**
+	 * Test data by creating image from data.
+	 * @param imageData Image in binary format.
+	 * @throws Exception Thrown if creating the image fails.
+	 */
+	private void testImageData(byte[] imageData) throws Exception {
+		try {
+			// Converting bytes to image to test that image is valid.
+			ByteArrayInputStream is = new ByteArrayInputStream(imageData);
+			Image image = new Image(Display.getDefault(), is);
+			image.dispose();
+		} 
+		catch(Exception e) {
+			// Couldn't create an image from data. Throwing an error.
+			// Connection will be reseted in abstractRequest after error.
+			throw new Exception(Messages.getString("ScreenCaptureRequest.InvalidImage_Exception_Msg")); //$NON-NLS-1$
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/services/screencaptureservice/ScreenCaptureService.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.services.screencaptureservice;
+
+import com.nokia.s60tools.hticonnection.core.RequestQueueManager;
+import com.nokia.s60tools.hticonnection.core.RequestResult;
+import com.nokia.s60tools.hticonnection.exceptions.ConnectionException;
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+import com.nokia.s60tools.hticonnection.services.IScreenCaptureService;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Service that contains interface for capturing images from device.
+ */
+public class ScreenCaptureService implements IScreenCaptureService{
+	
+	/**
+	 * Print utility used to report errors, warnings, and info messages.
+	 */
+	private final IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor.
+	 * @param printUtility Used for printing messages.
+	 */
+	public ScreenCaptureService(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IScreenCaptureService#captureFullScreen(java.lang.String, int, long)
+	 */
+	public byte[] captureFullScreen(String imgMimeType, int colorDepth, long timeout) 
+								throws ServiceShutdownException, HTIException, ConnectionException{
+		ScreenCaptureRequest request = new ScreenCaptureRequest(imgMimeType, colorDepth, timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getByteData();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IScreenCaptureService#getScreenMode(long)
+	 */
+	public HTIScreenMode getScreenMode(long timeout) 
+								throws ServiceShutdownException, HTIException, ConnectionException{
+		GetScreenModeRequest request = new GetScreenModeRequest(timeout);
+		RequestResult result = RequestQueueManager.getInstance().submit(request, printUtility);
+		return result.getScreenMode();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/dialogs/ErrorDialogWithHelp.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,207 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.dialogs;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.HtiConnectionHelpContextIDs;
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+
+/**
+ * Message box that contains help tray button at the left bottom corner of dialog.
+ * Help contains information about different error situations.
+ */
+public class ErrorDialogWithHelp extends TrayDialog implements SelectionListener {
+
+	/**
+	 * Message to be shown in dialog.
+	 */
+	private final String message;
+	/**
+	 * Possible No button, or null stays as null if not used.
+	 */
+	private Button noButton = null;
+	/**
+	 * Possible Yes button, or null stays as null if not used.
+	 */
+	private Button yesButton = null;
+	/**
+	 * Possible Ok button, or null stays as null if not used.
+	 */
+	private Button okButton = null;
+	/**
+	 * Style bits for message box.
+	 */
+	private final int style;
+	/**
+	 * Marginal used in message box between items and at the sides.
+	 */
+	private final int DEFAULT_MARGIN = 12;
+	/**
+	 * Amount of columns in dialog area.
+	 */
+	private int DIALOG_COLUMN_COUNT = 2;
+	/**
+	 * Context sensitive help that is used as default for this dialog.
+	 */
+	private final String DEFAULT_CONTEXT_HELP = HtiConnectionHelpContextIDs.HTI_CONNECTION_ERROR_MESSAGE; 
+	
+	/**
+	 * Constructor. Use SWT.YES, SWT.NO, and SWT.OK to define buttons in dialog.
+	 * Dialog.open() will return code of which button was pressed. 
+	 * @param message User visible message.
+	 * @param style Style bits. Only SWT.YES, SWT.NO, and SWT.OK are supported
+	 * currently.
+	 */
+	public ErrorDialogWithHelp(String message, int style){
+		super(HtiApiActivator.getCurrentlyActiveWbWindowShell());
+		this.message = message;
+		this.style = style;
+	}
+	
+	/**
+	 * Constructor. Use SWT.YES, SWT.NO, and SWT.OK to define buttons in dialog.
+	 * Dialog.open() will return code of which button was pressed. 
+	 * @param message User visible message.
+	 * @param shell Parent shell for the new instance.
+	 * @param style Style bits. Only SWT.YES, SWT.NO, and SWT.OK are supported
+	 * currently.
+	 */
+	public ErrorDialogWithHelp(String message, Shell shell, int style) {
+		super(shell);
+		this.message = message;
+		this.style = style;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		
+		// Creating dialog area composite
+		Composite dialogAreaComposite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout(DIALOG_COLUMN_COUNT, false);
+		layout.marginHeight = DEFAULT_MARGIN ;
+		layout.marginWidth = DEFAULT_MARGIN;
+		layout.horizontalSpacing = DEFAULT_MARGIN;
+		dialogAreaComposite.setLayout(layout);
+		dialogAreaComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		// Creating image.
+		Label messageLabel = new Label(dialogAreaComposite, SWT.HORIZONTAL);
+		messageLabel.setImage(Display.getDefault().getSystemImage(SWT.ICON_ERROR));
+		messageLabel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+
+		// Creating label.
+		messageLabel = new Label(dialogAreaComposite, SWT.HORIZONTAL | SWT.LEFT);
+		messageLabel.setText(message);
+		messageLabel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
+		
+		// Setting context help ID.
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogAreaComposite, HtiConnectionHelpContextIDs.HTI_CONNECTION_ERROR_MESSAGE);
+		
+		return dialogAreaComposite;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+	    // Creating Ok button.
+		if((style & SWT.OK) == SWT.OK) {
+			okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
+			okButton.addSelectionListener(this);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(okButton, DEFAULT_CONTEXT_HELP);
+		}
+		
+        // Creating Yes button
+		if((style & SWT.YES) == SWT.YES) {
+			yesButton = createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
+			yesButton.addSelectionListener(this);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(yesButton, DEFAULT_CONTEXT_HELP);
+		}
+		
+        //Creating No button
+		if((style & SWT.NO) == SWT.NO) {
+			noButton = createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false);
+			noButton.addSelectionListener(this);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(noButton, DEFAULT_CONTEXT_HELP);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void configureShell(Shell shell) {
+		// Not calling super.configureShell to prevent icon showing up.
+		// This is to keep message layout similar to other messages.
+		
+		// Setting default layout.
+		Layout layout = getLayout();
+		if (layout != null) {
+			shell.setLayout(layout);
+		}
+		
+		// Setting title.
+		shell.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		// Handling button selected events.
+		if(yesButton != null && e.getSource() == yesButton) {
+			setReturnCode(SWT.YES);
+			this.close();
+		}
+		else if(noButton != null && e.getSource() == noButton) {
+			setReturnCode(SWT.NO);
+			this.close();
+		}		
+		else if(okButton != null && e.getSource() == okButton) {
+			setReturnCode(SWT.OK);
+			this.close();
+		}		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/dialogs/HtiApiMessageBox.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.dialogs;
+
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+
+/**
+ * This class wraps the MessageBox in order to 
+ * enhance it with product name, and run it in
+ * HTI api plugin's active shell context.
+ * 
+ * @see org.eclipse.swt.widgets.MessageBox
+ */
+public class HtiApiMessageBox {
+
+	MessageBox msgBox;
+
+	/**
+	 * Constructor.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public HtiApiMessageBox(String message, int style){		
+		Shell sh = HtiApiActivator.getCurrentlyActiveWbWindowShell();
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/**
+	 * Constructor.
+	 * @param sh Parent shell for the new instance.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public HtiApiMessageBox(Shell sh, String message, int style){		
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object arg0) {
+		return msgBox.equals(arg0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#getMessage()
+	 */
+	public String getMessage() {
+		return msgBox.getMessage();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getParent()
+	 */
+	public Shell getParent() {
+		return msgBox.getParent();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getStyle()
+	 */
+	public int getStyle() {
+		return msgBox.getStyle();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getText()
+	 */
+	public String getText() {
+		return msgBox.getText();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return msgBox.hashCode();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#setMessage(java.lang.String)
+	 */
+	public void setMessage(String string) {
+		msgBox.setMessage(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#setText(java.lang.String)
+	 */
+	public void setText(String string) {
+		msgBox.setText(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return msgBox.toString();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#open()
+	 */
+	public int open() {
+		return msgBox.open();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/ConnectionMenuCreator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,139 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.views.main;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.actions.NewConnectionAction;
+import com.nokia.s60tools.hticonnection.actions.SelectConnectionAction;
+import com.nokia.s60tools.hticonnection.connection.HTIService;
+import com.nokia.s60tools.hticonnection.resources.Messages;
+
+/**
+ * This class creates menu from currently known HTI connections.
+ */
+public class ConnectionMenuCreator implements IMenuCreator {
+
+	/**
+	 * Manager used to create connection menu.
+	 */
+	MenuManager menuManager;
+
+	/**
+	 * Constructor.
+	 */
+	public ConnectionMenuCreator() {
+		menuManager = new MenuManager();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
+	 */
+	public void dispose() {
+		if(menuManager != null) {
+			menuManager.removeAll();
+			menuManager.dispose();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
+	 */
+	public Menu getMenu(Control parent) {
+		IConnection currentConn = HtiApiActivator.getPreferences().getCurrentConnection();
+		Collection<IConnection> connections = getHtiConnections();
+		
+		// Cleaning old manager and actions.
+		menuManager.removeAll();
+		menuManager.dispose();
+		menuManager = new MenuManager();
+		
+		// Adding new actions.
+		
+		menuManager.add(new NewConnectionAction());
+		menuManager.add(new Separator());
+		
+		if(connections.size() > 0) {
+			// Own action for each connection.
+			for(IConnection connection : connections) {
+				SelectConnectionAction action = new SelectConnectionAction(connection);
+				menuManager.add(action);
+				
+				if(connection.equals(currentConn)) {
+					action.setChecked(true);
+				}
+			}
+		} else {
+			// Action for informing that there are no connections.
+			menuManager.add(new EmptyConnectionAction());
+		}
+		
+		return menuManager.createContextMenu(parent);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
+	 */
+	public Menu getMenu(Menu parent) {
+		// This method is not used. 
+		return null;
+	}
+
+	/**
+	 * Returns all HTI connections.
+	 * @return HTI connections.
+	 */
+	private Collection<IConnection> getHtiConnections() {
+		// Getting needed variables.
+		Collection<IConnection> allConns = RemoteConnectionsActivator.getConnectionsManager().getConnections();
+		ArrayList<IConnection> htiConns = new ArrayList<IConnection>();
+		
+		// Getting HTI connections.
+		for(IConnection conn : allConns) {
+			if(HTIService.getCompatibleConnectionTypeIds().contains(conn.getConnectionType().getIdentifier())) {
+				htiConns.add(conn);
+			}
+		}
+		
+		return htiConns;
+	}
+	
+	/**
+	 * Empty action, that is used when there are know connections.
+	 */
+	private class EmptyConnectionAction extends Action {
+		/**
+		 * Constructor.
+		 */
+		public EmptyConnectionAction() {
+			super(Messages.getString("ConnectionMenuCreator.NoConnection_Action_Text")); //$NON-NLS-1$
+			this.setEnabled(false);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/LogDocument.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.views.main;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+
+/**
+ * Log Document object that contains output of HTI API plug-in.
+ */
+public class LogDocument extends Document{
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	private static LogDocument instance = null;
+	/**
+	 * String that contains latest changes.
+	 */
+	private static String lastChanges = ""; //$NON-NLS-1$
+
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public LogDocument getInstance(){
+		if(instance == null ){
+			instance = new LogDocument();
+		}
+		return instance;
+	}
+
+	/**
+	 * Adding text to wait for next update.
+	 * @param text Text to be added to the end of document.
+	 */
+	public synchronized void addText(String text) {
+		lastChanges += text + "\r\n"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Method for updating document.
+	 */
+	public synchronized void updateDocument(){
+		try {
+			// Appending changes to the end of the document.
+			replace(getLength(), 0, lastChanges);
+		} catch (BadLocationException e) {
+			// Appending text to the end of document. No problems should arise.
+		} finally {
+			// Resetting latest changes.
+			lastChanges = ""; //$NON-NLS-1$
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainTextViewer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.views.main;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Viewer for showing text output.
+ */
+public class MainTextViewer extends TextViewer implements IDocumentListener {
+	
+	/**
+	 * View font
+	 */
+	private String FONT = "Arial"; //$NON-NLS-1$
+	/**
+	 * View font size
+	 */
+	private final int FONT_SIZE = 10;
+	/**
+	 * Scroll lock state.
+	 */
+	private boolean scrollLock = false;
+	
+	/**
+	 * Constructor.
+	 * @param parent Parent composite.
+	 * @param styles Style options.
+	 */
+	public MainTextViewer(Composite parent, int styles){
+		super(parent, styles);		
+		setEditable(false);
+
+		IDocument document = LogDocument.getInstance();
+		document.addDocumentListener(this);
+		
+		// Creating input for viewer.
+		setInput(document);
+	}
+	
+	/**
+	 * Initializing settings for viewer.
+	 */
+	public void initializeSettings(){
+		// Setting correct font.
+		Font font = new Font(getControl().getDisplay(),
+				new FontData(FONT, FONT_SIZE, SWT.NORMAL));
+		getTextWidget().setFont(font);
+		
+		// Setting view to the end of document.
+		setTopIndex(getBottomIndex());
+	}
+	
+	/**
+	 * Sets scroll lock on or off.
+	 * @param scrollLockState True if setting scroll lock on. False if setting it off.
+	 */
+	public void setScrollLock(boolean scrollLockState){
+		scrollLock = scrollLockState;
+	}
+	
+	/**
+	 * Clears text from console.
+	 */
+	public void clearScreen(){
+		// Clearing screen and.
+		getDocument().set(""); //$NON-NLS-1$
+	}
+
+	/**
+	 * Selects all text from console.
+	 */
+	public void selectAllText() {
+		IDocument document = getDocument();
+		setSelectedRange(0, document.getLength());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentAboutToBeChanged(DocumentEvent event) {
+		// Not needed.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
+	 */
+	public void documentChanged(DocumentEvent event) {
+		if(!scrollLock){
+			// Scrolling text down to correct location.
+			setTopIndex(getDocument().getNumberOfLines());
+		}
+	}
+
+	/**
+	 * Returns currently selected text.
+	 * @return Currently selected text or null if getting selection failed.
+	 */
+	public String getSelectedText() {
+		IDocument document = getDocument();
+		Point range = getSelectedRange();
+		try {
+			// Getting text.
+			return document.get(range.x, range.y);
+		} catch (BadLocationException e) {
+			// Returning null to mean empty string if get fails.
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,344 @@
+
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.ui.views.main;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.*;
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.ui.*;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.SWT;
+
+import com.nokia.s60tools.hticonnection.HtiApiActivator;
+import com.nokia.s60tools.hticonnection.HtiConnectionHelpContextIDs;
+import com.nokia.s60tools.hticonnection.actions.ClearScreenAction;
+import com.nokia.s60tools.hticonnection.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.hticonnection.actions.ScrollLockAction;
+import com.nokia.s60tools.hticonnection.actions.SelectAllAction;
+import com.nokia.s60tools.hticonnection.actions.StartStopGatewayAction;
+import com.nokia.s60tools.hticonnection.core.HtiConnection;
+import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
+import com.nokia.s60tools.ui.ICopyActionHandler;
+import com.nokia.s60tools.ui.IStringProvider;
+import com.nokia.s60tools.ui.StringArrayClipboardCopyHandler;
+import com.nokia.s60tools.ui.actions.CopyFromStringProviderToClipboardAction;
+
+/**
+ * This class comprises the Main View of the HTI API 
+ * application.
+ */
+public class MainView extends ViewPart implements IStringProvider {
+	
+	/**
+	 * We can get view ID at runtime once the view is instantiated, but we
+	 * also need static access to ID in order to be able to invoke the view.
+	 */
+	public static final String ID = "com.nokia.s60tools.hticonnection.ui.views.main.MainView"; //$NON-NLS-1$
+	/**
+	 * Viewer for showing text output.
+	 */
+	private MainTextViewer textViewer;
+	
+	//
+	// Actions.
+	//
+	private StartStopGatewayAction startStopGatewayAction;
+	private Action preferencesAction;
+	private Action clearScreenAction;
+	private Action scrollLockAction;
+	private Action copyAction;
+	private Action selectAllAction;
+
+	/**
+	 * The constructor.
+	 */
+	public MainView() {
+	}
+
+	/**
+	 * This is called by framework when the controls for
+	 * the view should be created.
+	 */
+	public void createPartControl(Composite parent) {
+
+		//
+		// Actions invoked by content providers may set enable/disable
+		// states for the actions, therefore all the action has to be
+		// created before creating the controls. This makes sure that
+		// it is safe to refer to all the actions after this point.
+		//
+
+		createMainMenuActions();
+
+		//
+		// Creating controls
+		//
+
+		createViewContents(parent);
+
+		//
+		// Doing other initializations that may refer to the component
+		// that has been created above.
+		//
+
+		hookContextMenu();
+		contributeToActionBars();
+		
+		// Connection status needs to be updated, if view was closed/re-opened.
+		HtiConnection.getInstance().updateConnectionStatus();
+	}
+
+	/**
+	 * Creates text textViewer for viewing output.
+	 * @param parent Parent composite.
+	 */
+	private void createViewContents(Composite parent) {
+		textViewer = new MainTextViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		textViewer.initializeSettings();
+
+		// Creating selection changed listener to enable/disable copy action as needed.
+		ISelectionChangedListener consoleSelectionListener = new ISelectionChangedListener(){
+			public void selectionChanged(SelectionChangedEvent event) {
+				int length = textViewer.getSelectedRange().y;
+				// Action is enabled when length of selection is different than zero;
+				copyAction.setEnabled(length != 0);
+			}};
+		textViewer.addSelectionChangedListener(consoleSelectionListener);
+		
+		// Setting context help IDs	
+		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(textViewer.getControl(), 
+	    		HtiConnectionHelpContextIDs.HTI_CONNECTION_MAIN_VIEW);
+	}
+	
+	/**
+	 * Hooking context menu.
+	 */
+	private void hookContextMenu() {
+		
+		//
+		// Context menu for text viewer
+		//
+		MenuManager menuMgr = new MenuManager("#TextViewerPopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(textViewer.getControl());
+		textViewer.getControl().setMenu(menu);
+		getSite().registerContextMenu(menuMgr, textViewer);
+	}
+
+	/**
+	 * Filling action bars.
+	 */
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillViewPullDownMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * Filling pull down menu.
+	 * @param manager Menu manager. 
+	 */
+	private void fillViewPullDownMenu(IMenuManager manager) {
+		manager.add(preferencesAction);
+	}
+
+	/**
+	 * Filling context menu.
+	 * @param manager Menu manager.
+	 */
+	private void fillContextMenu(IMenuManager manager) {
+		manager.add(copyAction);
+		manager.add(selectAllAction);
+		manager.add(new Separator());
+		manager.add(clearScreenAction);
+		manager.add(new Separator());
+		manager.add(scrollLockAction);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+	
+	/**
+	 * Filling toolbar.
+	 * @param manager Menu manager.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {
+		manager.add(startStopGatewayAction);
+		manager.add(new Separator());
+		manager.add(preferencesAction);
+		manager.add(new Separator());
+		manager.add(clearScreenAction);
+		manager.add(scrollLockAction);
+	}
+
+	/**
+	 * Creating all needed actions.
+	 */
+	private void createMainMenuActions() {
+		preferencesAction = new OpenPreferencePageAction();
+		clearScreenAction = new ClearScreenAction(this);
+		scrollLockAction = new ScrollLockAction(this);
+		selectAllAction = new SelectAllAction(this);
+		startStopGatewayAction = new StartStopGatewayAction();
+		// Creator connection menu.
+		IMenuCreator creator = new ConnectionMenuCreator();
+		startStopGatewayAction.setMenuCreator(creator);
+		
+		StringArrayClipboardCopyHandler copyHandler = new StringArrayClipboardCopyHandler();		
+		copyAction = new CopyFromStringProviderToClipboardAction(this, new ICopyActionHandler[]{ copyHandler });
+		copyAction.setEnabled(false);
+	}
+
+	/**
+	 * Allows other classes to update content description.
+	 * @param newContentDescription New description.
+	 */
+	public void updateDescription(String newContentDescription){
+		setContentDescription(newContentDescription);
+		IToolBarManager tbManager = getViewSite().getActionBars().getToolBarManager();
+		tbManager.update(true);
+	}
+	
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	public void refresh(){
+		textViewer.refresh();
+	}
+		
+	/**
+	 * Sets enabled/disabled states for actions commands
+	 * on this view, based on the current application state.
+	 * This method should be called whenever an operation is
+	 * started or stopped that might have effect on action 
+	 * button states.
+	 */
+	public void updateActionButtonStates(){
+		// Setting state depending on datagateway status.
+		
+		startStopGatewayAction.setRunning(
+				HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.SHUTDOWN);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		LogDocument.getInstance().removeDocumentListener(textViewer);
+		super.dispose();
+	}
+
+	/**
+	 * Enables to open main view from classes that don't have
+	 * reference to the main view instance and are not UI threads.
+	 * This method only opens the view if it was not visible.
+	 * @param setFocus True if focus should be set for view.
+	 */
+	public static void openMainViewAsync(final boolean setFocus){
+		// We want to activate/create the view if it isn't open.
+		// do not need to use the instance after it is returned.
+		Runnable dialogRunnable = new Runnable() {
+			public void run() {
+				try {
+					MainView.getViewInstance(setFocus);
+				} catch (PartInitException e) {
+					e.printStackTrace();
+				}
+			}
+		};
+		// Opening main view in default UI thread.
+		Display.getDefault().asyncExec(dialogRunnable);
+	}
+	
+	/**
+	 * Enables to get reference of the main view
+	 * from the classes that do not actually
+	 * have reference to the main view instance.
+	 * This method opens opens up the view if it
+	 * was not visible.
+	 * @param setFocus True if focus should be set for view.
+	 * @return Instance of main view.
+	 * @throws PartInitException
+	 */
+	public static MainView getViewInstance(boolean setFocus) throws PartInitException{
+		
+		IWorkbenchPage page = HtiApiActivator.getCurrentlyActivePage();
+		
+		boolean viewAlreadyVisible = false;
+		IViewPart viewPart = null;
+		
+		// Checking if view is already open
+		IViewReference[] viewRefs = page.getViewReferences();
+		for (int i = 0; i < viewRefs.length; i++) {
+			IViewReference reference = viewRefs[i];
+			String id = reference.getId();
+			if(id.equalsIgnoreCase(MainView.ID)){
+				viewAlreadyVisible = true;
+				// Found, restoring the view
+				viewPart = reference.getView(true);
+				// Activating the view if wanted.
+				if(setFocus) {
+					page.activate(viewPart);
+				}
+			}
+		}
+		// View was not opened
+		if(! viewAlreadyVisible){
+			if(setFocus){
+				// Opening and setting focus for view.
+				viewPart = page.showView(MainView.ID);
+			} else {
+				// Opening the view, but not setting focus.
+				viewPart = page.showView(MainView.ID, null, IWorkbenchPage.VIEW_VISIBLE);
+			}
+		}	
+		return ((MainView) viewPart);
+	}
+	
+	/**
+	 * Passing the focus request to the textViewer's control.
+	 */
+	public void setFocus() {
+		textViewer.getControl().setFocus();
+	}
+
+	/**
+	 * Returns console viewer.
+	 * @return Viewer used in console.
+	 */
+	public MainTextViewer getMainTextViewer(){
+		return textViewer;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.IStringProvider#getString()
+	 */
+	public String getString() {
+		// Getting current selection and returning it.
+		return textViewer.getSelectedText();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/util/HtiApiConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,108 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.hticonnection.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.common.ProductInfoRegistry;
+import com.nokia.s60tools.hticonnection.ui.views.main.LogDocument;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+
+/**
+ * Singleton class that offers console printing
+ * services for the HTI API product. All text is printed
+ * first to document and then transferred to console.
+ */
+public class HtiApiConsole extends AbstractProductSpecificConsole {
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private HtiApiConsole instance = null;
+	/**
+	 * Storing log document instance here.
+	 */
+	private static LogDocument log = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public HtiApiConsole getInstance(){
+		if(instance == null ){
+			instance = new HtiApiConsole();
+			log = LogDocument.getInstance();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private HtiApiConsole(){		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String)
+	 */
+	public void println(String message){
+		appendText(message);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.IConsolePrintUtility#println(java.lang.String, int)
+	 */
+	public void println(String message, int messageType){
+		appendText(message);
+	}
+	
+	/**
+	 * Appends text to the end of log.
+	 * @param text Appended to the end of log.
+	 */
+	private void appendText(String text){
+
+		// Adding new text to log.
+		log.addText(text);
+		
+		// Updating the changes.
+		Runnable updateView = new Runnable(){
+			public void run() {
+				log.updateDocument();
+			}							
+		};
+		// UI updates from background threads has to be queued
+		// into UI thread in order not to cause invalid thread access
+		Display.getDefault().asyncExec(updateView);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleName()
+	 */
+	protected String getProductConsoleName() {
+		return ProductInfoRegistry.getConsoleWindowName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleImageDescriptor()
+	 */
+	protected ImageDescriptor getProductConsoleImageDescriptor() {
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/Doxyfile.template	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,274 @@
+# Doxyfile 1.5.3
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------
+# Projects specific settings that need to be overriden in the specific project
+#---------------------------------------------------------------------------
+# PROJECT_NAME           = project
+# PROJECT_NUMBER         = 1.0
+# OUTPUT_DIRECTORY       = doc
+#---------------------------------------------------------------------------
+
+
+DOXYFILE_ENCODING      = UTF-8
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 4
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = YES
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = NO
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = NO
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = .
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = */preinstall/*,*/ConfigurationTool/*,*/.svn/*
+EXCLUDE_SYMBOLS        = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+HTML_DYNAMIC_SECTIONS  = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            = 
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 1000
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.imaker.tests.feature" default="all" basedir=".">
+	<property file="common.properties" />
+	<property name="plugin.name"  value="com.nokia.s60tools.imaker.tests"/>
+	<property name="application"  value="org.eclipse.pde.junit.runtime.uitestapplication"/>
+	<property name="product"      value="com.nokia.carbide.cpp.product"/>
+	<property name="class.name"   value="com.nokia.s60tools.imaker.internal.tests.AllTests"/>
+	<property name="plugin.dir"   value="${eclipse.home}/plugins"/>
+	<property name="output.dir"   value="${basedir}/output"/>
+	<property name="output.ws"    value="c:/temp/ws"/>
+		
+	<property name="os"                 value="win32"/>
+	<property name="ws"                 value="win32"/>
+	<property name="arch"               value="x86"/>
+	<property name="version"            value="3"/>
+	<property name="testLoaderClass"    value="org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader"/>
+	<property name="loaderpluginname"   value="org.eclipse.jdt.junit.runtime"/>
+
+	<path id="build.class.path">
+        <fileset dir="${eclipse.home}/plugins">
+            <include name="org.eclipse.core.runtime_*.jar"/>
+            <include name="org.eclipse.equinox.common_*.jar"/>
+            <include name="org.eclipse.ui.workbench_*.jar"/>
+            <include name="org.eclipse.jface_*.jar"/>
+            <include name="org.eclipse.swt_*.jar"/>
+            <include name="org.eclipse.swt.win32.win32.x86_*.jar"/>
+            <include name="org.junit_3.*/**/junit.jar"/>
+        </fileset>
+    </path>
+	
+	<path id="pde.test.port.locator.class.path">
+        <pathelement location="${eclipse.home}/plugins/pde.test.utils_3.3.0.jar"/>
+        <fileset dir="${eclipse.home}/plugins">
+            <include name="org.junit_3.*/**/junit.jar"/>
+        </fileset>
+    </path>
+
+    <path id="pde.test.listener.class.path">
+        <path refid="build.class.path"/>
+        <pathelement location="${eclipse.home}/plugins/pde.test.utils_3.3.0.jar"/>
+        <fileset dir="${eclipse.home}/plugins">
+            <include name="org.apache.ant_*/**/ant.jar"/>
+            <include name="org.apache.ant_*/**/ant-junit.jar"/>
+            <include name="org.eclipse.jdt.junit_*.jar"/>
+            <include name="org.eclipse.debug.core_*.jar"/>
+            <include name="org.eclipse.osgi_*.jar"/>
+            <include name="org.eclipse.core.resources_*.jar"/>
+            <include name="org.eclipse.swt_*.jar"/>
+            <include name="org.eclipse.equinox.preferences_*.jar"/>
+        </fileset>
+    </path>
+
+    <path id="equinox.launcher.class.path">
+        <fileset dir="${plugin.dir}">
+            <include name="org.eclipse.equinox.launcher_*.jar"/>
+        </fileset>
+    </path>
+	
+	<target name="init">
+		<property name="feature.temp.folder" value="${basedir}/feature.temp.folder"/>
+		<delete dir="${plugin.lib}"/>
+		<delete dir="${plugin.dist.dir}"/>
+		<mkdir dir="${plugin.lib}"/>
+		<mkdir dir="${plugin.dist.dir}"/>
+	</target>
+
+	<target name="all.plugins" depends="init">
+		<ant antfile="build.xml" dir="com.nokia.s60tools.imaker" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+		<ant antfile="build.xml" dir="com.nokia.s60tools.imaker.doc.user" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+		<ant antfile="build.xml" dir="com.nokia.s60tools.imaker.tests" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+	</target>
+
+	<target name="all.features">
+		<ant antfile="build.xml" dir="com.nokia.carbide.extensions.imaker" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+	</target>
+
+	<target name="build.jars" depends="init" description="Build all the jars for the feature: com.nokia.s60tools.imaker.tests.feature.">
+		<antcall target="all.children">
+			<param name="target" value="build.jars"/>
+		</antcall>
+	</target>
+
+	<target name="build.update.jar" depends="clean, init" description="Build the feature jar of:  for an update site.">
+		<antcall target="all.plugins">
+			<param name="target" value="build.update.jar"/>
+		</antcall>
+	</target>
+
+	<target name="zip.distribution" depends="init" description="Create a zip containing all the plug-ins and features for the feature: com.nokia.s60tools.imaker.tests.feature.">
+		<antcall target="all.features">
+			<param name="target" value="zip.distribution"/>
+		</antcall>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the feature: com.nokia.s60tools.imaker.tests.feature of all the zips, jars and logs created.">
+		<antcall target="all.plugins">
+			<param name="target" value="clean"/>
+		</antcall>
+        <delete>
+		<!--
+            <fileset dir="${eclipse.home}/configuration" includes="**/*" excludes="config.ini"/>
+		-->
+            <fileset dir="${eclipse.home}/plugins" includes="com.nokia.s60tools.imaker*.jar"/>
+        </delete>
+	</target>
+
+    <target name="run_pde_port_creator">
+        <delete file="pde_test_port.properties"/>
+        <java classname="pde.test.utils.PDETestPortLocator" fork="yes" classpathref="pde.test.port.locator.class.path"/>
+        <waitfor maxwait="10" maxwaitunit="second" checkevery="100" checkeveryunit="millisecond">
+            <available file="pde_test_port.properties"/>
+        </waitfor>
+    </target>
+
+    <target name="run_pde_test_listener">
+        <java classname="pde.test.utils.PDETestResultsCollector" fork="yes" classpathref="pde.test.listener.class.path">
+            <arg line="${plugin.name} ${pde.test.port}"/>
+        </java>
+    </target>
+
+    <target name="run_pde_tests">
+        <property name="test.classes.list" value="${class.name}"/>
+		<delete dir="${output.dir}" quiet="true"/>
+		<delete dir="${output.ws}"  quiet="true"/>
+        <mkdir dir="${output.dir}"/>
+        <mkdir dir="${output.ws}"/>
+        <java dir="${output.ws}" classname="org.eclipse.equinox.launcher.Main" fork="yes" classpathref="equinox.launcher.class.path">
+            <arg line="-application ${application} -data ${output.ws} -dev bin -clean -port ${pde.test.port} -testpluginname ${plugin.name} -classnames ${class.name} -os ${os} -ws ${ws} -arch ${arch} -version ${version} -testLoaderClass ${testLoaderClass} -loaderpluginname ${loaderpluginname} -product ${product}"/>
+        </java>
+    </target>
+	
+	<target name="test" depends="run_pde_port_creator">
+        <property file="pde_test_port.properties"/>
+        <echo message="Using port ${pde.test.port} for listening to PDE Test run"/>	
+
+		<parallel>
+            <daemons>
+                <antcall target="run_pde_test_listener"/>
+            </daemons>
+            <sequential>
+                <sleep seconds="5"/> <!-- Give the listener a few seconds to start up -->
+                <antcall target="run_pde_tests"/>
+            </sequential>
+        </parallel>
+		<copy file="${basedir}/TEST-com.nokia.s60tools.imaker.tests.xml" todir="${eclipse.home}/results"/>
+	</target>
+
+	<target name="all" depends="clean, build.update.jar, zip.distribution, install.jars, test">
+	</target>
+	
+	<target name="install.jars">
+		<copy todir="${eclipse.home}" overwrite="true">
+			<fileset dir="${plugin.dist.dir}">
+				<include name="com.nokia.carbide.extensions.imaker_${plugin.version}.zip"/>
+			</fileset>	
+		</copy>
+		<copy todir="${eclipse.home}/plugins" overwrite="true">
+			<fileset dir="${plugin.lib}">
+				<include name="com.nokia.s60tools.imaker.tests*.jar"/>
+			</fileset>	
+		</copy>
+		<unzip src="${eclipse.home}/com.nokia.carbide.extensions.imaker_${plugin.version}.zip"
+		   dest="${eclipse.home}" overwrite="true">
+		</unzip>
+	</target>
+	
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/build_imaker_plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<!-- Delegating build script, used by cruisecontrol to build MY_PROJECT_1.
+       Note that the basedir is set to the checked out project -->
+<project name="imaker_plugin" default="build" basedir=".">
+	<target name="build">	
+		<ant antfile="build.xml"/>
+	</target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.carbide.extensions.imaker</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.carbide.extensions.imaker" default="build.update.jar" basedir=".">
+	<property file="../common.properties" />
+	<property file="build.properties" />
+	
+	<target name="init">
+		<property name="feature.temp.folder" value="${basedir}/feature.temp.folder"/>
+		<property name="feature.destination" value="../${plugin.dist.dir}"/>
+		<mkdir dir="${feature.destination}"/>
+	</target>
+
+	<target name="all.plugins" depends="init">
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker.doc.user" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+	</target>
+	<target name="all.features" depends="init">
+	</target>
+	<target name="update.feature" depends="init">
+	</target>
+
+	<target name="all.children" depends="init,all.features,all.plugins,update.feature">
+	</target>
+
+	<target name="children" if="include.children">
+		<antcall target="all.children"/>
+	</target>
+
+	<target name="build.jars" depends="init" description="Build all the jars for the feature: com.nokia.carbide.extensions.imaker.">
+		<antcall target="all.children">
+			<param name="target" value="build.jars"/>
+		</antcall>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<antcall target="all.children">
+			<param name="target" value="build.sources"/>
+		</antcall>
+	</target>
+
+	<target name="build.zips" depends="init">
+		<antcall target="all.children">
+			<param name="target" value="build.zips"/>
+		</antcall>
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the feature jar of: com.nokia.carbide.extensions.imaker for an update site.">
+		<antcall target="all.children">
+			<param name="target" value="build.update.jar"/>
+		</antcall>
+		<property name="feature.base" value="${feature.temp.folder}"/>
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}/features/com.nokia.carbide.extensions.imaker_${plugin.version}"/>
+		<antcall target="gather.bin.parts" inheritAll="false">
+			<param name="os" value="*"/>
+			<param name="feature.base" value="${feature.temp.folder}"/>
+			<param name="updateJar.omitRootfiles" value="true"/>
+			<param name="ws" value="*"/>
+			<param name="arch" value="*"/>
+			<param name="nl" value="*"/>
+		</antcall>
+		<mkdir dir="${feature.destination}"/>
+		<jar destfile="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.jar" basedir="${feature.temp.folder}/features/com.nokia.carbide.extensions.imaker_${plugin.version}"/>
+		<!-- <delete dir="${feature.temp.folder}"/> -->
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="feature.base">
+		<mkdir dir="${feature.base}/features/com.nokia.carbide.extensions.imaker_${plugin.version}"/>
+		<antcall target="all.plugins">
+			<param name="target" value="collect.jar"/>
+			<param name="destination.temp.folder" value="${feature.base}/plugins"/>
+		</antcall>
+		<copy todir="${feature.base}/features/com.nokia.carbide.extensions.imaker_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="feature.xml"/>
+				<include name="license.txt"/>
+			</fileset>
+		</copy>
+		<antcall target="rootFiles">
+			<param name="rootTarget" value="rootFiles${os}_${ws}_${arch}"/>
+		</antcall>
+	</target>
+	<target name="rootFiles" unless="updateJar.omitRootfiles">
+		<!-- <antcall target="${rootTarget}"/> -->
+	</target>
+
+	<target name="rootFileswin32_win32_x86">
+	</target>
+	<target name="rootFilesgroup_group_group">
+		<antcall target="rootFileswin32_win32_x86"/>
+	</target>
+
+	<target name="zip.distribution" depends="init" description="Create a zip containing all the plug-ins and features for the feature: com.nokia.carbide.extensions.imaker.">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="gather.bin.parts">
+			<param name="feature.base" value="${feature.temp.folder}"/>
+			<param name="os" value="*"/>
+			<param name="arch" value="*"/>
+			<param name="ws" value="*"/>
+			<param name="nl" value="*"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.zip" basedir="${feature.temp.folder}" filesonly="false" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="zip.sources" depends="init">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children">
+			<param name="target" value="gather.sources"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins/null/src"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.src.zip" basedir="${feature.temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="zip.logs" depends="init">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children" inheritAll="false">
+			<param name="target" value="gather.logs"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.log.zip" basedir="${feature.temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the feature: com.nokia.carbide.extensions.imaker of all the zips, jars and logs created.">
+		<delete file="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.jar"/>
+		<delete file="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.bin.dist.zip"/>
+		<delete file="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.log.zip"/>
+		<delete file="${feature.destination}/com.nokia.carbide.extensions.imaker_${plugin.version}.src.zip"/>
+		<delete dir="${feature.temp.folder}"/>
+		<antcall target="all.children">
+			<param name="target" value="clean"/>
+		</antcall>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="E:/workspaces/imaker/imaker_plugin/com.nokia.carbide.extensions.imaker/" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+		<antcall target="all.children">
+			<param name="target" value="refresh"/>
+		</antcall>
+	</target>
+	<target name="gather.sources">
+		<antcall target="children">
+			<param name="target" value="gather.sources"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins/null/src"/>
+		</antcall>
+	</target>
+
+	<target name="gather.logs" depends="init">
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children" inheritAll="false">
+			<param name="target" value="gather.logs"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins"/>
+		</antcall>
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/compile.com.nokia.carbide.extensions.imaker.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Compile com.nokia.carbide.extensions.imaker" default="main">
+	<target name="main">
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker.help" target="build.jars"/>
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker" target="build.jars"/>
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.imaker"
+      label="Carbide.c++ Extensions - IMaker"
+      version="2.2.4"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.imaker">
+
+   <description>
+      The iMaker extension for Carbide.c++ is a wrapper tool for iMaker Commandline tool for building ROM images.
+   </description>
+
+   <copyright>
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+   </copyright>
+
+   <license url="license.txt">
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide203"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide203"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.emf.ecore.xmi"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.ui.workbench.texteditor"/>
+      <import plugin="org.eclipse.help"/>
+      <import plugin="com.nokia.s60tools.util" version="1.5.0" match="greaterOrEqual"/>
+      <import plugin="com.nokia.carbide.cpp.sdk.core" version="2.0.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.ui.console" version="3.4.0" match="greaterOrEqual"/>
+      <import plugin="com.nokia.carbide.cdt.builder" version="2.0.0" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.imaker"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.imaker.doc.user"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.carbide.extensions.imaker/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.imaker.help</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - iMaker Help
+Bundle-SymbolicName: com.nokia.s60tools.imaker.doc.user;singleton:=true
+Bundle-Version: 2.2.4
+Bundle-Activator: com.nokia.s60tools.imaker.help.internal.HelpPlugin
+Bundle-Vendor: Nokia
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.help
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               html/,\
+               plugin.xml
+src.includes = src/,\
+               html/,\
+               plugin.xml,\
+               META-INF/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.imaker.help" default="build.jars" basedir=".">
+	<property file="../common.properties"/>
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	<property name="bundleId" value="com.nokia.s60tools.imaker.help"/>
+
+	<!-- Compiler settings. -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+
+	<target name="init" depends="properties">
+		<property name="pluginTemp" value="${basedir}"/>
+		<property name="build.result.folder" value="${basedir}/build.result"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the plug-in: com.nokia.s60tools.imaker.doc.user for an update site.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<jar destfile="${plugin.destination}/com.nokia.s60tools.imaker.doc.user_${plugin.version}.jar" basedir="${temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}" filesetmanifest="merge"/>
+		<copy todir="../${plugin.lib}" file="${plugin.destination}/com.nokia.s60tools.imaker.doc.user_${plugin.version}.jar" failonerror="true" overwrite="true" />
+		<delete dir="${temp.folder}"/>
+		<delete dir="${build.result.folder}"/>
+	</target>
+
+	<target name="@dot" depends="init" unless="@dot" description="Create jar: com.nokia.s60tools.imaker.doc.user @dot.">
+		<delete dir="${temp.folder}/@dot.bin"/>
+		<mkdir dir="${temp.folder}/@dot.bin"/>
+		<path id="@dot.classpath">
+			<fileset dir="${eclipse.home}/plugins">
+		    	<include name="**/*.jar"/>
+		   	</fileset>
+		</path>
+		<!-- compile the source code -->
+		<javac destdir="${temp.folder}/@dot.bin" failonerror="${javacFailOnError}" source="${common.javac-source}" target="${common.javac-target}">
+			<classpath refid="@dot.classpath" />
+			<src path="src/"			/>
+		</javac>
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/@dot.bin" failonerror="true" overwrite="false">
+			<fileset dir="src/">
+				<exclude name="**/*.java"/>
+				<exclude name="**/package.htm*"/>
+			</fileset>
+		</copy>
+		<mkdir dir="${build.result.folder}"/>
+		<copy todir="${build.result.folder}/@dot" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/@dot.bin">
+			</fileset>
+		</copy>
+		<delete dir="${temp.folder}/@dot.bin"/>
+	</target>
+
+	<target name="src.zip" depends="init" unless="src.zip">
+		<mkdir dir="${build.result.folder}"/>
+		<antcall target="zip.src.zip"/>
+	</target>
+	<target name="zip.src.zip">
+		<zip destfile="${build.result.folder}/src.zip" filesonly="false" whenempty="skip" update="false">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</zip>
+	</target>
+	<target name="copy.src.zip">
+		<copy todir="${source.destination.folder}/" failonerror="true" overwrite="true">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.jars" depends="init" description="Compile classes and build nested jars for the plug-in: com.nokia.s60tools.imaker.doc.user.">
+		<available property="@dot" file="${build.result.folder}/@dot"/>
+		<antcall target="@dot"/>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<available property="src.zip" file="${build.result.folder}/src.zip"/>
+		<antcall target="src.zip"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${build.result.folder}/@dot">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="META-INF/"/>
+				<include name="html/"/>
+				<include name="plugin.xml"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}"/>
+		<copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}" failonerror="false" overwrite="false"/>
+		<antcall target="copy.src.includes">
+			<param name="source.destination.folder" value="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}"/>
+		</antcall>
+	</target>
+
+	<target name="gather.individual.sources" depends="init">
+		<antcall target="copy.src.zip">
+			<param name="source.destination.folder" value="${destination.temp.folder}"/>
+		</antcall>
+		<antcall target="copy.src.includes">
+			<param name="source.destination.folder" value="${destination.temp.folder}"/>
+		</antcall>
+	</target>
+
+	<target name="copy.src.includes" depends="init">
+		<copy todir="${source.destination.folder}" failonerror="false" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="src/"/>
+				<include name="html/"/>
+				<include name="plugin.xml"/>
+				<include name="META-INF/"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.doc.user_${plugin.version}" failonerror="false" overwrite="false">
+			<fileset dir="${temp.folder}">
+				<include name="@dot.bin${logExtension}"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the plug-in: com.nokia.s60tools.imaker.doc.user of all the zips, jars and logs created.">
+		<delete dir="${build.result.folder}/@dot"/>
+		<delete file="${build.result.folder}/src.zip"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker.doc.user_${plugin.version}.jar"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker.doc.user_${plugin.version}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="E:/workspaces/imaker/imaker_plugin/com.nokia.s60tools.imaker.doc.user" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: com.nokia.s60tools.imaker.doc.user.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}">
+				<include name="**/*.bin${logExtension}"/>
+			</fileset>
+		</delete>
+		<zip destfile="${plugin.destination}/com.nokia.s60tools.imaker.doc.user_${plugin.version}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+	<target name="collect.jar">
+		<copy todir="${destination.temp.folder}" file="com.nokia.s60tools.imaker.doc.user_${plugin.version}.jar" failonerror="true" overwrite="true" />
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,186 @@
+/*	
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
+reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+	
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+/* 	20070523-Removed top margin size to close gap between location breadcrumbs and page title	*/
+html {
+	margin: 0px 10px 10px 10px;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/concepts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<meta name="lastupdated" content="06/17/05 11:09:43">
+<link href="../book.css" type="text/css" rel="StyleSheet">
+<title>Concepts</title>
+</head>
+<body><h2>Concepts</h2> <p>The following concepts provide information on iMaker
+ terminology and processes:</p> <ul>
+<li><a href="configuration.html">Configuration</a></li>
+<li><a href="imaker.html">iMaker build tool</a></li>
+</ul> <div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/configuration.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Configuration</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Configuration</h2> <p>A configuration in iMaker can
+be thought of as a container of product information. It contains such information
+as the product name, hardware id (HWID), platform name, targets, and so on. </p><p>One configuration
+typically corresponds to one <i>makefile</i> on the file system level. This <i>
+makefile</i> may link to multiple other <i>makefiles</i>. iMaker 
+gets its information mostly through configurations.</p> 
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/imaker.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>IMaker build tool</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>iMaker build tool</h2> <p>iMaker is an image creation tool that
+provides a simple, standardized and configurable image creation framework.
+iMaker is based on the standardized Make system, which makes it platform-independent.</p>
+<p>iMaker creates a FlashImage from a set of Symbian OS binary and data files. The tool mainly functions on top of the Symbian OS <i>buildrom</i> utility. The iMaker tool itself runs the Make tool and consists of a thin
+layer of Perl.</p>  <div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/concepts/preferences.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Preferences</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Preferences</h2> <p>In the preferences page of iMaker user can specify the directory
+used for saving preferences files. </p><p>Preferences can be
+managed via <b>Window > Preferences... > Carbide Extensions > iMaker 
+</b>. </p> <div id="footer">Copyright &copy;2008 Nokia Corporation
+</div> </body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+
+	<context id="IMAKERPLUGIN_HELP_PRODUCT">
+      	<description>Product makefiles</description>	   
+		<topic label="Product makefiles" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+	
+	<context id="IMAKERPLUGIN_HELP_TARGETS">
+      	<description>List of available targets</description>	   
+		<topic label="Selecting target" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+	<context id="IMAKERPLUGIN_HELP_SELECTED_TARGETS">
+      	<description>Target(s) for which to build an image</description>	   
+		<topic label="Build targets" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+	<context id="IMAKERPLUGIN_HELP_IMAGE_TYPE">
+      	<description>Type of image to build</description>	   
+		<topic label="Image type" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+	<context id="IMAKERPLUGIN_HELP_FLAGS">
+      	<description>Build flags to specify image characteristics. Symbol files will create symbolic files and verbose will cause iMaker commandline tool to print additional information</description>	   
+		<topic label="Build flags" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+	<context id="IMAKERPLUGIN_HELP_ADDITIONAL_PARAMS">
+      	<description>Additional build parameters to insert for iMaker commandline tool</description>	   
+		<topic label="Additional parameters" href="html/tasks/taskPreferences.html" />
+	</context>
+	
+		
+	<context id="IMAKERPLUGIN_HELP">
+      	<description>Help for iMakerPlugin</description>	   
+		<topic label="Help for iMakerPlugin" href="html/tool.html" />
+	</context>
+     		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/getting_started.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting Started</title>
+<link href="book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Getting Started</h2> <p>The iMaker extension for Carbide.c++
+is a tool for building ROM images. In the future also for flashing images to the end device. The information in this section
+will help you get started quickly using the basic features of iMaker.</p><p>
+Before you can create images with the iMaker, the following conditions
+must be met:</p><ul>
+<li>An active project in the Carbide.c++ workspace must exist. The project must be created
+ on the top of a working build environment (an S60 3rd edition R&amp;D SDK or higher)</li>
+</ul><p>Build ROM images by following these steps:</p><ol>
+<li><a href="tasks/taskPreferences.html">Build image via iMaker Dialog</a>.</li>
+<li><a href="tasks/build_image.html#select_prev">Use previously saved preferences</a>.</li>
+</ol>  <p>While the image is being built, a build log can be seen in an editor
+in Carbide.c++.</p>  <div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body></html>
+
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/images/green_fade_left_68_165_28.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/index.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.index"?>
+
+	<!-- INDEX INSTRUCTIONS
+	
+	Use the index.xml file to define the index entries for the plugin's 
+	help contents. In Eclipse 3.2 and beyond an Inex tab appears in the Help
+	viewer making it possible for user to more easily locate subjects of
+	interest to them.
+		
+	In brief, every file used in the help documentation should have at least one
+	associated index entry for it. Ideally, it's simple to make two entries per
+	page by simply re-wording the subject slightly. For example, a view could
+	be indexed twice like this, 1) Breakpoint view, and 2) Views, Breakpoint.
+	
+	See ??? for details on creating indexes.
+	
+	-->
+
+
+<index>
+
+	<!-- AAAAAAAA -->
+	<!-- BBBBBBBB -->
+	<!-- CCCCCCCC -->	
+
+	<entry keyword="--index topic here--" >
+		<topic href="--url to html file here" />
+	</entry>
+
+	<!-- DDDDDDDD -->	
+	<!-- EEEEEEEE -->	
+	<!-- FFFFFFFF -->
+	<!-- GGGGGGGG -->	
+	<!-- HHHHHHHH -->	
+	<!-- IIIIIIII -->
+	<!-- JJJJJJJJ -->
+	<!-- KKKKKKKK -->
+	<!-- LLLLLLLL -->
+	<!-- MMMMMMMM -->
+	<!-- NNNNNNNN -->
+	<!-- OOOOOOOO -->
+	<!-- PPPPPPPP -->
+	<!-- QQQQQQQQ -->
+	<!-- RRRRRRRR -->
+	<!-- SSSSSSSS -->
+	<!-- TTTTTTTT -->
+	<!-- UUUUUUUU -->
+	<!-- VVVVVVVV -->
+	<!-- WWWWWWWW -->
+	<!-- XXXXXXXX -->
+	<!-- YYYYYYYY -->
+	<!-- ZZZZZZZZ -->
+
+</index>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/legal.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>License Information</title>
+    <link href="book.css" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+<h3>License Information</h3>
+
+<h5>COPYRIGHTS</h5>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/reference/references.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<meta http-equiv="Content-Style-Type" content="text/css" />
+<meta name="LASTUPDATED" content="06/17/05 11:09:43" />
+<title>References</title>
+<link rel="StyleSheet" href="../book.css" type="text/css"/>
+</head>
+<body bgcolor="#FFFFFF">
+<h2>Concepts</h2>
+<p>The following references are available for this tool:</p>
+<ul>
+  <li><a href="placeholder.htm">reference #01</a></li>
+</ul>
+<div class="step">
+  <div id="footer">Copyright &copy;2008 Nokia Corporation</div>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/release_notes.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release Notes</title>
+<link href="book.css" type="text/css" rel="StyleSheet">
+<style type="text/css"><!-- .style2 {font-size: 12px} --></style>
+</head>
+<body><h2>Release Notes</h2> <p>RELEASE NOTES for iMaker 2.2.0 (24.09.2009)
+</p>  <h3>Product Description:</h3> <p>The iMaker extension for Carbide.c++
+is a tool for building ROM images. Its core functionality is implemented in
+a command line executable called <i>imaker.cmd</i>. iMaker extension offers a 
+Carbide.c++ integration that provides a graphical user interface for the <i>imaker.cmd</i> command line tool. iMaker extension referred from here on just iMaker enables you to set and modify
+the build parameters for the imaker.cmd commandline tool, which are used to create flashable images.</p><p>Image building process is started 
+by selecting project and launching iMaker dialog by choosing the <b>Open iMaker Dialog...</b> menu 
+item from iMaker pulldown menu (hammer with 'i') on the Carbide.c++ toolbar.</p><p>The ROM
+image is built using the preferences configured in this dialog. Although not necessary, these preferences
+can be saved to a file (with .imp extension) for future use for image building if needed. </p><p>
+Once preferences are configured, an image can be built by clicking the <b>Run</b> button in the dialog. All saved preferences under current project are visible on the pulldown menu of imaker in the carbide.c++ toolbar. 
+Any of these saved preferences can be used for image creation by just selecting it. </p>  <h3>
+Features:</h3> <ul>
+<li>UI for building ROM images.</li>
+<li>UI for configuring multiple build settings.</li>
+<li>UI for viewing the build log and debugging image build errors.</li>
+<li>Management of preferences files.</li>
+<li>An independent dialog for managing imaker creation parameters.</li>
+<li>Possibility to override the default image creation parameter values</li>
+</ul> <h3>New Features:</h3> <p><ul>
+<li>Possibility to create Platsim images and run selected Platsim instance configured with the created image</li>
+<li>Possibility to add debug binaries and files to different sections of the image</li>
+<li>Simplified UI</li>
+</ul> </p>  <h3>Enhancements:
+</h3> <p><ul>
+<li>Code cleaned and copy right headers added.</li>
+<li>Few bugs have been fixed.</li>
+<li>Simplified handling of preference files.</li>
+</ul></p>  <h3>System Requirements:</h3>  <p>Basic
+Requirements:</p><ul>
+<li>Windows XP</li>
+</ul> <p>Additional Requirements:</p><ul>
+<li>S60 3rd edition R&amp;D SDK (version 3.2 or higher) environment for building ROM
+images. </li>
+</ul>  <h3>Compatibility Issues:</h3> <ul>
+<li>N/A</li>
+</ul>   <h3>Known Problems:</h3> <ul>
+</ul>  <div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/build_image.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<?Pub Inc>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Building an image</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Building an image</h2>  <a name="select_prev"></a><h3>Using saved
+preferences</h3> <p>Preferences saved under the selected project
+will be shown in the toolbar pulldown menu of iMaker. </p><p>Select the preferences
+you want to use for creating the ROM image, as shown below. Image building
+will start immediately.</p>  <img src="images/iMakerPluginSelectPreferences.png">  <a
+name="build"></a><h3>Building a previous image</h3> <p>To build an image that
+has been built previously<?Pub Caret>, click the <b>Build image</b> button
+on the toolbar.</p>  <img src="images/iMakerPluginBuild.png">  <div id="footer">
+Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
+reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">
+http://www.eclipse.org/legal/epl-v10.html</a>.</div></body></html>
+<?Pub *0000001191>
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/debug_tab.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginBuild.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginPreferences.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginPreferencesDetails.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginSaveAction.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPluginSelectPreferences.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/iMakerPreference.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/images/platsim_tab.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/manage_settings.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<?Pub Inc>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting Started</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Managing settings</h2>  <p>Before you can start building or flashing
+any ROM images, you must have at least one setting for one configuration.
+A configuration can be thought of as a container of product and other information.
+When you enter the ImageFlasher preferences via <b>Window > Preferences...
+> ImageFlasher</b> the configurations are automatically queried from iMaker
+and <b>HWID</b> and <b>Target</b> drop down menus are populated with data.
+</p> <img src="images/preferences.jpg">  <a name="create"></a><h3>Creating
+a setting for a configuration</h3> <p>First select a product with a HWID from
+the <b>HWID</b> drop down menu. Then select the desired target from the <b>
+Target</b> drop down menu. Proceed with selecting the <b>Image type</b> and
+possible <b>Flags</b>. In the <b>Additional parameters</b> field you can enter
+additional build options if necessary. When done, click on the <b>Create new
+configuration</b> button to save the setting. Enter a name for your new setting
+and hit OK to save it.</p> <img src="images/new_setting.jpg">  <a name="delete"></a><h3>
+Deleting a setting</h3><?Pub Caret> <p>The <b>Settings</b> drop down menu
+shows all the saved settings. If you wish to delete a setting first select
+it from the <b>Settings</b> drop down menu and then click on the <b>Delete
+selected configuration</b></p>  <div id="footer">Copyright &copy;2008 Nokia
+Corporation</div> </body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/steps.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<?Pub Inc>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Steps for build...</title>
+<link href="../book.css" type="text/css" rel="StyleSheet"></head>
+<body><h2>Steps for building a ROM image</h2> <p>Follow these steps in order
+to build a ROM image.</p> <div class="step"><ol>
+<li><a href="taskPreferences.html">Edit preferences</a> <ol type="a">
+<li>You may save the preferences if needed through <a href="taskPreferences.html#management">
+preferences management</a></li>
+</ol>   </li>
+<li>Optionally, use one of the previously <a href="build_image.html#select_prev">
+saved preferences</a></li>
+<li><a href="build_image.html#build">Build the ROM image</a></li>
+</ol></div><div id="footer">Copyright &copy;2008 Nokia Corporation</div></body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/taskPreferences.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<?Pub Inc>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+<meta http-equiv="content-style-type" content="text/css" />
+<title>Managing preferences</title>
+<link href="../book.css" type="text/css" rel="stylesheet" />
+</head>
+<body>
+<h2>Managing preferences</h2>  
+<p>Before you can build a ROM image, you must define the preferences for a configuration. In iMaker,
+a configuration can be thought of as a container of product and other information.</p> 
+<ol>
+<li>Select the project that you want to use as the basis for image creation. </li>
+<li>Select <b>Open iMaker Dialog...</b> option from the iMaker pulldown menu on the toolbar. iMaker Extension will now start scanning the environtment to query 
+information from the underlying iMaker commandline tool. This may take a while, but this action occurs only once for each project.</li>
+<li>When the <b>iMaker Dialog</b> is opened, it is populated with data from the active environment. Default product is selected if one is configured, otherwise the first product is selected. 
+User can change the product using the <b>Change...</b> button. Example is shown bellow. <p><img
+src="images/iMakerPluginPreferences.png"></p></li>
+<li>Once data is filled in the fields, a flashable image can be created. Press
+the <b>Run</b> button at the bottom of the dialog. Remember to add the desired targets to the <b>selected</b> list of targets.</li>
+</ol> 
+<h3>Saving the preferences for a configuration</h3> 
+<p>To save the fields of a configuration to a file, do the following: </p><ol>
+<li>Press the <b>Save as...</b></li>
+<li>Choose the parent folder where to save the file, it is recommended to save under the selected project. See below image.<p><img src="images/iMakerPluginSaveAction.png"></p></li>
+<li>All saved preferences are visible in the <b>configuration</b> combobox on the top of the dialog. Any of these saved files can be activated and used for image creation.</li>
+
+<a name="management"></a><h3>Settings tab</h3> <p>To modify the values
+of the variables of the selected product (or makefile), select the <b>Settings
+</b> tab in the iMaker dialog. See the following example: </p><p><img src="images/iMakerPluginPreferencesDetails.png"> Through this tab user can override the default variable values in the iMaker core. Any modified parameter will be passed to iMaker cmd throuht execution command.</p> 
+
+<a name="debug"></a><h3>Debug tab</h3>
+<p>The debug tab allows user to add binary and data files to the image. These files can be added to different sections of the image. The binary files can be easy changed to debug versions. Currently CORE and ROFS sections are supported. 
+Files cannot be added to UDA for example through this tab.<br>
+<img src="images/debug_tab.png"></p>
+
+<a name="platsim"></a><h3>Platsim tab</h3>
+<p>The contents of the platsim tab will be enabled, when you select a valid platsim configuration from the main tab. The platsim configuration must define USE_PLATSIM variable, in order it to be 
+consider as valid. This variable must be non-empty. Users can edit the platsim configuration makefile and add USE_PLATSIM=1 then restart carbide.c++. Currently only all target is supported. All 
+target creates an image, which contains all image sections (core, rofsx, ...) and configures the selected platsim instance with the created image. Selecting (run platsim after image creation) checkbox causes 
+platsim instance to be started in the end of the image creation process.<br>
+<img src="images/platsim_tab.png"> </p> 
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 	License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tasks/tasks.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<meta name="lastupdated" content="06/17/05 11:09:43">
+<title>Tasks</title>
+<link href="../book.css" type="text/css" rel="StyleSheet"></head>
+<body> <h2>Tasks</h2> <p>The following tasks are available for this tool:
+</p> <ul>
+<li><a href="taskPreferences.html#create">Managing preferences</a></li>
+<li><a href="build_image.html#select_prev">Use previously saved preferences</a></li>
+<li><a href="build_image.html#build">Build a ROM image</a></li>
+</ul> <div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its
+subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">
+http://www.eclipse.org/legal/epl-v10.html</a>.</div></body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocConcepts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts">
+	
+	<!-- Enter topic entries here for Concepts section of help -->
+	
+	<topic label="Configuration" href="html/concepts/configuration.html" />
+	<topic label="iMaker build tool" href="html/concepts/imaker.html" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocReference.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Reference">
+	
+	<!-- Enter topic entries here for References section of help -->
+	
+	<topic label="TOC label" href="html/reference/file_with_useful_content.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tocTasks.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks">
+	
+	<!-- Enter topic entries here for Tasks section of help -->
+	
+	<topic label="Managing preferences" href="html/tasks/taskPreferences.html#create" />
+	<topic label="Use previously saved preferences" href="html/tasks/build_image.html#select_prev" />
+	<topic label="Build a ROM image" href="html/tasks/build_image.html#build" />
+
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/tool.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>iMaker</title>
+	
+	<link rel="StyleSheet" href="book.css" type="text/css" />
+</head>
+
+<body>
+<h2>iMaker</h2>
+<p><a href="release_notes.html">Release Notes</a></p>
+<p><a href="getting_started.html">Getting Started</a></p>
+<p><a href="concepts/concepts.htm">Concepts</a>
+<ul>
+<li><a href="concepts/configuration.html">Configuration</a></li>
+<li><a href="concepts/imaker.html">iMaker build tool</a></li>
+</ul></p>
+
+<p><a href="tasks/tasks.html">Tasks</a>
+<ul>
+<li><a href="tasks/taskPreferences.html#create">Managing preferences</a></li>
+<li><a href="tasks/build_image.html#select_prev">Use previously saved preferences</a></li>
+<li><a href="tasks/build_image.html#build">Build previously built ROM image</a></li>
+</ul></p>
+<a href="legal.html">Legal</a>
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/html/toolTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!-- 
+	Links tool docs to main TOC for Carbide help in the defined location. 
+	NOTE: Tool name seems to be ignored here for display purposes but needed to
+	make the link_to section work.
+-->
+
+<toc label="iMaker" 
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideMisc" >
+
+	<!--
+		Define the TOOL NAME as it should appear in the TOC. The tool.htm page
+		is the cover page for the tool help.
+	-->
+	<topic label="iMaker" href="html/tool.html" >
+		
+	   <!--
+		   Following the Eclipse guidelines, the tool help is arranged as Concepts,
+		   References, and Tasks. Each has their own associated XML file to make it
+		   easy to edit each section as well as an overview page.
+	   -->
+	   <topic label="Release Notes"
+	   	   href="html/release_notes.html" />
+	   
+	   <topic label="Getting Started"
+	   	   href="html/getting_started.html" />
+	   	   
+	   <topic label="Concepts" 
+		   href="html/concepts/concepts.htm" >
+		   <link toc="html/tocConcepts.xml" />
+	   </topic>
+	   
+	  <!--
+	   <topic label="Reference" 
+		   href="html/reference/references.htm" >
+		   <link toc="html/tocReference.xml" />
+	   </topic>
+	-->
+	   
+	   <topic label="Tasks" 
+		   href="html/tasks/tasks.html" >
+		   <link toc="html/tocTasks.xml" />
+	   </topic>
+	   
+	   <topic label="Legal"
+	   	   href="html/legal.html" />
+	   	   
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/plugin.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+pluginName = com.nokia.s60tools.imaker.doc.user
+providerName = Nokia
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+
+<plugin>
+	<extension point="org.eclipse.help.toc">
+		<toc
+			file="html/toolTOC.xml"
+			primary="true"/>
+  <toc
+        file="html/tocConcepts.xml"
+        primary="false"/>
+  <toc
+        file="html/tocReference.xml"
+        primary="false"/>
+  <toc
+        file="html/tocTasks.xml"
+        primary="false"/>
+     
+	</extension>
+   
+	
+	<!-- Carbide.c++ cheatsheets extension -->
+	<!--
+	<extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+		<category
+			id="com.nokia.carbide.ide.cheatsheets"
+			name="Carbide.c++" />
+		<cheatsheet
+			category="com.nokia.carbide.ide.cheatsheets"
+			contentFile="html/cheatsheets/getStarted_cs.xml"
+			id="com.nokia.cdt.debug.help.getStarted"
+			name="HelloCarbide Project Example"/>
+	</extension>
+    -->
+	
+	<!-- CONTEXT IDs for CONTEXTUAL HELP in windows, dialogs, and views -->
+	<!--
+	<extension point="org.eclipse.help.contexts" >
+
+       <contexts file="html/context_help/org_eclipse_debug_ui.xml"
+       		plugin="org.eclipse.debug.ui" />
+
+	</extension>
+	-->
+	
+	<extension point="org.eclipse.help.index" >
+        <index file="html/index.xml"/>
+    </extension>
+    
+ <extension point="org.eclipse.help.contexts">
+ 	<contexts
+       file="html/contexts.xml"
+       plugin="com.nokia.s60tools.imakerplugin.help"/>
+ </extension>
+
+	
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/src/com/nokia/s60tools/imaker/help/internal/Activator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.help.internal;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.imakerplugin.help";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.doc.user/src/com/nokia/s60tools/imaker/help/internal/HelpPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.help.internal;
+
+import org.eclipse.ui.plugin.*;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HelpPlugin extends AbstractUIPlugin {
+
+	//The shared instance.
+	private static HelpPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public HelpPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HelpPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin("com.nokia.s60tools.imageflasher.help", path);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.imaker.tests.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1 @@
+bin.includes = feature.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.imaker.tests.feature" default="build.update.jar" basedir=".">
+	<property file="../common.properties" />
+	
+	<taskdef resource="eclipseTasks.properties" classpath="pdebuild-myant.jar"/>	
+	<target name="init">
+		<property name="feature.temp.folder" value="${basedir}/feature.temp.folder"/>
+		<property name="feature.destination" value="${basedir}"/>
+		<mkdir dir="${plugin.lib}"/>
+	</target>
+
+	<target name="all.plugins" depends="init">
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+		<ant antfile="build.xml" dir="../com.nokia.s60tools.imaker.tests" target="${target}">
+			<property name="arch" value="x86"/>
+			<property name="ws" value="win32"/>
+			<property name="os" value="win32"/>
+		</ant>
+	</target>
+	<target name="all.features" depends="init">
+	</target>
+	<target name="update.feature" depends="init">
+	</target>
+
+	<target name="all.children" depends="init,all.features,all.plugins,update.feature">
+	</target>
+
+	<target name="children" if="include.children">
+		<antcall target="all.children"/>
+	</target>
+
+	<target name="build.jars" depends="init" description="Build all the jars for the feature: com.nokia.s60tools.imaker.tests.feature.">
+		<antcall target="all.children">
+			<param name="target" value="build.jars"/>
+		</antcall>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<antcall target="all.children">
+			<param name="target" value="build.sources"/>
+		</antcall>
+	</target>
+
+	<target name="build.zips" depends="init">
+		<antcall target="all.children">
+			<param name="target" value="build.zips"/>
+		</antcall>
+	</target>
+
+	<target name="build.update.jar" depends="clean, init" description="Build the feature jar of: com.nokia.s60tools.imaker.tests.feature for an update site.">
+		<antcall target="all.children">
+			<param name="target" value="build.update.jar"/>
+		</antcall>
+		<property name="feature.base" value="${feature.temp.folder}"/>
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="gather.bin.parts" inheritAll="false">
+			<param name="os" value="*"/>
+			<param name="feature.base" value="${feature.temp.folder}"/>
+			<param name="ws" value="*"/>
+			<param name="arch" value="*"/>
+			<param name="nl" value="*"/>
+		</antcall>
+		<jar destfile="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.jar" basedir="${feature.temp.folder}/features/com.nokia.s60tools.imaker.tests.feature_${plugin.version}"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="feature.base">
+		<mkdir dir="${feature.base}/features/com.nokia.s60tools.imaker.tests.feature_${plugin.version}"/>
+		<antcall target="children">
+			<param name="target" value="gather.bin.parts"/>
+			<param name="destination.temp.folder" value="${feature.base}/plugins"/>
+		</antcall>
+		<copy todir="${feature.base}/features/com.nokia.s60tools.imaker.tests.feature_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="feature.xml"/>
+			</fileset>
+		</copy>
+	</target>
+	<target name="rootFiles*_*_*">
+	</target>
+	<target name="rootFilesgroup_group_group">
+		<antcall target="rootFiles*_*_*"/>
+	</target>
+
+	<target name="zip.distribution" depends="init" description="Create a zip containing all the plug-ins and features for the feature: com.nokia.s60tools.imaker.tests.feature.">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="gather.bin.parts">
+			<param name="feature.base" value="${feature.temp.folder}"/>
+			<param name="os" value="*"/>
+			<param name="arch" value="*"/>
+			<param name="ws" value="*"/>
+			<param name="nl" value="*"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.bin.dist.zip" basedir="${feature.temp.folder}" filesonly="false" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="zip.sources" depends="init">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children">
+			<param name="target" value="gather.sources"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins/com.nokia.s60tools.imaker.tests.feature.source_${plugin.version}/src"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.src.zip" basedir="${feature.temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="zip.logs" depends="init">
+		<delete dir="${feature.temp.folder}"/>
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children" inheritAll="false">
+			<param name="target" value="gather.logs"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins"/>
+			<param name="include.children" value="true"/>
+		</antcall>
+		<zip destfile="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.log.zip" basedir="${feature.temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${feature.temp.folder}"/>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the feature: com.nokia.s60tools.imaker.tests.feature of all the zips, jars and logs created.">
+		<delete file="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.jar"/>
+		<delete file="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.bin.dist.zip"/>
+		<delete file="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.log.zip"/>
+		<delete file="${feature.destination}/com.nokia.s60tools.imaker.tests.feature_${plugin.version}.src.zip"/>
+		<delete dir="${feature.temp.folder}"/>
+		<antcall target="all.children">
+			<param name="target" value="clean"/>
+		</antcall>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="C:/dev/workspaces/eclipse-3.3.1/imaker_plugin/com.nokia.s60tools.imaker.tests.feature/" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+		<antcall target="all.children">
+			<param name="target" value="refresh"/>
+		</antcall>
+	</target>
+	<target name="gather.sources">
+		<antcall target="children">
+			<param name="target" value="gather.sources"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins/com.nokia.s60tools.imaker.tests.feature.source_${plugin.version}/src"/>
+		</antcall>
+	</target>
+
+	<target name="gather.logs" depends="init">
+		<mkdir dir="${feature.temp.folder}"/>
+		<antcall target="all.children" inheritAll="false">
+			<param name="target" value="gather.logs"/>
+			<param name="destination.temp.folder" value="${feature.temp.folder}/plugins"/>
+		</antcall>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.s60tools.imakerplugin.tests.feature"
+      label="Feature Feature"
+      version="1.0.0"
+      provider-name="NOKIA">
+
+   <description url="http://www.example.com/description">
+      This feature contains imakerplugin and imakerplugin.tests plugins. It is ment for testing purposes.
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      [Enter Copyright Description here.]
+   </copyright>
+
+   <license url="http://www.example.com/license">
+      [Enter License Description here.]
+   </license>
+
+   <plugin
+         id="com.nokia.s60tools.imaker"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.imaker.tests"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
Binary file imakerplugin/com.nokia.s60tools.imaker.tests.feature/pdebuild-myant.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/runImakerPluginTests.bat	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+set ECLIPSE_HOME=E:\APPS\Carbide.c_SYMSEE_layout_2.2.0
+java -jar %ECLIPSE_HOME%\plugins\org.eclipse.equinox.launcher_1.0.200.v20090520.jar -application org.eclipse.ant.core.antRunner -buildfile test.xml -Declipse-home=%ECLIPSE_HOME% -Dos=win32 -Dws=win32 -Darch=x86 -data E:/workspaces/testworkspace
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests.feature/test.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="testsuite" default="run" basedir=".">
+	<property file="../common.properties" />
+	<!-- The property ${eclipse-home} should be passed into this script -->
+	<!-- Set a meaningful default value for when it is not. -->
+	
+	<!-- sets the properties eclipse-home, and library-file -->
+	<property name="plugin-name" value="com.nokia.s60tools.imaker.tests"/>
+	<property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.2.0/library.xml"/>
+
+	<!-- This target holds all initialization code that needs to be done for -->
+	<!-- all tests that are to be run. Initialization for individual tests -->
+	<!-- should be done within the body of the suite target. -->
+	<target name="init">
+		<tstamp/>
+		<delete>
+			<fileset dir="${eclipse-home}" includes="org*.xml"/>
+		</delete>
+	</target>
+
+	<!-- This target defines the tests that need to be run. -->
+	<target name="suite">
+		<property name="refactoring-folder" value="${basedir}/refactoring_folder"/>
+		<delete dir="${refactoring-folder}" quiet="true"/>
+		<ant target="ui-test" antfile="${library-file}" dir="${basedir}">
+			<property name="data-dir" value="${refactoring-folder}"/>
+			<property name="plugin-name" value="${plugin-name}"/>
+			<property name="classname" value="com.nokia.s60tools.imaker.internal.tests.AllTests"/>
+		</ant>
+	</target>
+
+	<!-- This target holds code to cleanup the testing environment after -->
+	<!-- after all of the tests have been run. You can use this target to -->
+	<!-- delete temporary files that have been created. -->
+	<target name="cleanup">
+	</target>
+
+	<!-- This target runs the test suite. Any actions that need to happen -->
+	<!-- after all the tests have been run should go here. -->
+	<target name="run" depends="init,suite,cleanup">
+		<ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="includes" value="org*.xml"/>
+			<property name="output-file" value="${plugin-name}.xml"/>
+		</ant>
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.imaker.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests
+Bundle-SymbolicName: com.nokia.s60tools.imaker.tests
+Bundle-Version: 2.2.4
+Bundle-Activator: com.nokia.s60tools.imaker.internal.tests.Activator
+Bundle-Vendor: NOKIA
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui,
+ com.nokia.s60tools.imaker,
+ org.eclipse.emf.ecore.xmi,
+ org.easymock;bundle-version="2.4.0",
+ org.junit;bundle-version="3.8.2"
+Eclipse-LazyStart: true
+Export-Package: com.nokia.s60tools.imaker.internal.iqrf.tests;uses:="junit.framework,org.eclipse.emf.common.util,iQRF",
+ com.nokia.s60tools.imaker.internal.tests;uses:="org.eclipse.core.runtime,junit.framework,org.osgi.framework"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               tools/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.imaker.tests" default="build.jars" basedir=".">
+	<property file="../common.properties"/>
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	<property name="bundleId" value="com.nokia.s60tools.imaker.tests"/>
+
+	<!-- Compiler settings. -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+
+	<target name="init" depends="properties">
+		<property name="pluginTemp" value="${basedir}"/>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the plug-in: com.nokia.s60tools.imaker.tests for an update site.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<jar destfile="${plugin.destination}/com.nokia.s60tools.imaker.tests_${plugin.version}.jar" basedir="${temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}" filesetmanifest="merge"/>
+		<copy todir="../${plugin.lib}" file="${plugin.destination}/com.nokia.s60tools.imaker.tests_${plugin.version}.jar" failonerror="true" overwrite="true" />
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="@dot" depends="init" unless="@dot" description="Create jar: com.nokia.s60tools.imaker.tests @dot.">
+		<delete dir="${temp.folder}/@dot.bin"/>
+		<mkdir dir="${temp.folder}/@dot.bin"/>
+		<path id="@dot.classpath">
+			<fileset dir="${eclipse.home}/plugins">
+		    	<include name="**/*.jar"/>
+				<exclude name="com.nokia.s60tools.imaker*"/>
+		   	</fileset>
+		      <fileset dir="../com.nokia.s60tools.imaker">
+		        <include name="**/*.jar"/>
+		      </fileset>
+		</path>
+		<!-- compile the source code -->
+		<javac destdir="${temp.folder}/@dot.bin" failonerror="${javacFailOnError}" source="${common.javac-source}" target="${common.javac-target}">
+		<!--
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/@dot.bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		-->
+			<classpath refid="@dot.classpath" />
+			<src path="src/"			/>
+		</javac>
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/@dot.bin" failonerror="true" overwrite="false">
+			<fileset dir="src/">
+				<exclude name="**/*.java"/>
+				<exclude name="**/package.htm*"/>
+			</fileset>
+		</copy>
+		<mkdir dir="${build.result.folder}"/>
+		<copy todir="${build.result.folder}/@dot" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/@dot.bin">
+			</fileset>
+		</copy>
+		<delete dir="${temp.folder}/@dot.bin"/>
+	</target>
+
+	<target name="src.zip" depends="init" unless="src.zip">
+		<mkdir dir="${build.result.folder}"/>
+		<zip destfile="${build.result.folder}/src.zip" filesonly="false" whenempty="skip" update="false">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</zip>
+	</target>
+
+	<target name="build.jars" depends="init" description="Compile classes and build nested jars for the plug-in: com.nokia.s60tools.imaker.tests.">
+		<available property="@dot" file="${build.result.folder}/@dot"/>
+		<antcall target="@dot"/>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<available property="src.zip" file="${build.result.folder}/src.zip"/>
+		<antcall target="src.zip"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${build.result.folder}/@dot">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="META-INF/"/>
+				<include name="tools/"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}"/>
+		<copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}" failonerror="false" overwrite="false"/>
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker.tests_${plugin.version}" failonerror="false" overwrite="false">
+			<fileset dir="${temp.folder}">
+				<include name="@dot.bin${logExtension}"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the plug-in: com.nokia.s60tools.imaker.tests of all the zips, jars and logs created.">
+		<delete dir="${build.result.folder}/@dot"/>
+		<delete file="${build.result.folder}/src.zip"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker.tests_${plugin.version}.jar"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker.tests_${plugin.version}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="C:/dev/workspaces/eclipse-3.3.2/com.nokia.s60tools.imaker.tests" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: com.nokia.s60tools.imaker.tests.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}">
+				<include name="**/*.bin${logExtension}"/>
+			</fileset>
+		</delete>
+		<zip destfile="${plugin.destination}/com.nokia.s60tools.imaker.tests_${plugin.version}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/plugin.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+pluginName = Debug Tests
+providerName = www.example.org
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/AllTests.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for com.nokia.s60tools.imaker.internal.iqrf.tests");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(IMakerTest.class);
+		suite.addTestSuite(TargetTest.class);
+		suite.addTestSuite(ResultTest.class);
+		suite.addTestSuite(SettingTest.class);
+		suite.addTestSuite(InterfaceTest.class);
+		suite.addTestSuite(ConfigurationElementTest.class);
+		suite.addTestSuite(ConfigurationTest.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ConfigurationElementTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+
+
+public class ConfigurationElementTest extends TestCase {
+	protected ConfigurationElement fixture = null;
+
+	protected void setFixture(ConfigurationElement fixture) {
+		this.fixture = fixture;
+	}
+
+	private ConfigurationElement getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createConfigurationElement());
+	}
+
+	public void testName() {
+		String name = "configurationElementName";
+		ConfigurationElement conel = getFixture();
+		conel.setName(name);
+		assertEquals(conel.getName(),name);
+	}
+	
+	public void testDescription() {
+		String description = "This is test description";
+		ConfigurationElement conel = this.getFixture();
+		conel.setDescription(description);
+		assertEquals(conel.getDescription(),description);
+	}
+	
+	public void testValues() {
+		String values = "example value";
+		ConfigurationElement conel = this.getFixture();
+		conel.setValues(values);
+		assertEquals(conel.getValues(),values);
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ConfigurationElementTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ConfigurationTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+public class ConfigurationTest  extends TestCase {
+	protected Configuration fixture = null;
+
+	protected void setFixture(Configuration fixture) {
+		this.fixture = fixture;
+	}
+
+	private Configuration getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createConfiguration());
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	public void testAddSetting__Setting() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		Setting s1 = IQRFFactory.eINSTANCE.createSetting();
+		Setting s2 = IQRFFactory.eINSTANCE.createSetting();
+		Configuration ct = getFixture();
+		ct.addSetting(s1);
+		ct.addSetting(s2);
+		List settings = (List)ct.getSettings();
+		assertTrue(settings.contains(s1));
+		assertTrue(settings.contains(s2));
+		assertEquals(settings.get(0),s1);
+	}
+
+	public void testAddTargetRef__Target() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		Target t1 = IQRFFactory.eINSTANCE.createTarget();
+		Target t2 = IQRFFactory.eINSTANCE.createTarget();
+		Configuration ct = getFixture();
+		ct.addTargetRef(t1);
+		ct.addTargetRef(t2);
+		List targets = (List)ct.getTargetrefs();
+		assertTrue(targets.contains(t1));
+		assertTrue(targets.contains(t2));
+		assertEquals(targets.get(0),t1);
+	}
+	
+	public void testName() {
+		String name = "configurationName";
+		Configuration ct = getFixture();
+		ct.setName(name);
+		assertEquals(ct.getName(),name);
+	}
+	
+	public void testFilePath() {
+		String fp = "c:\\temp\\f1.xml";
+		Configuration ct = getFixture();
+		ct.setFilePath(fp);
+		assertEquals(ct.getFilePath(),fp);
+	}
+} //ConfigurationTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/IMakerTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+
+
+public class IMakerTest extends TestCase {
+	protected IMaker fixture = null;
+
+	protected void setFixture(IMaker fixture) {
+		this.fixture = fixture;
+	}
+
+	private IMaker getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createIMaker());
+	}
+
+	public void testSetQuery() {
+		IMaker imaker = getFixture();
+		String query = "imaker -help";
+		imaker.setQuery(query);
+		assertEquals(imaker.getQuery(),query);
+	}
+
+	public void testSetResult() {
+		IMaker imaker = getFixture();
+		Result result = IQRFFactory.eINSTANCE.createResult();
+		imaker.setResult(result);
+		assertEquals(imaker.getResult(),result);
+	}
+	
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //IMakerTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/InterfaceTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+
+public class InterfaceTest extends TestCase {
+	protected Interface fixture = null;
+
+	protected void setFixture(Interface fixture) {
+		this.fixture = fixture;
+	}
+
+	private Interface getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createInterface());
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	public void testAddConfigurationElement__ConfigurationElement() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		ConfigurationElement c1 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		ConfigurationElement c2 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		Interface it = getFixture();
+		it.addConfigurationElement(c1);
+		it.addConfigurationElement(c2);
+		List conelements = (List)it.getConfigurationElements();
+		assertTrue(conelements.contains(c1));
+		assertTrue(conelements.contains(c2));
+		assertEquals(conelements.get(0),c1);
+	}
+	
+	public void testName() {
+		String name = "interfaceName";
+		Interface it = getFixture();
+		it.setName(name);
+		assertEquals(it.getName(),name);
+	}
+} //InterfaceTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/ResultTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+public class ResultTest extends TestCase {
+	protected Result fixture = null;
+	
+	protected void setFixture(Result fixture) {
+		this.fixture = fixture;
+	}
+
+	private Result getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createResult());
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	public void testAddConfiguration__Configuration() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		Configuration c1 = IQRFFactory.eINSTANCE.createConfiguration();
+		Configuration c2 = IQRFFactory.eINSTANCE.createConfiguration();
+		Result it = getFixture();
+		it.addConfiguration(c1);
+		it.addConfiguration(c2);
+		List conelements = (List)it.getConfigurations();
+		assertTrue(conelements.contains(c1));
+		assertTrue(conelements.contains(c2));
+		assertEquals(conelements.get(0),c1);
+		assertEquals(conelements.size(),2);
+	}
+
+	public void testAddInterface__Interface() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		Interface i1 = IQRFFactory.eINSTANCE.createInterface();
+		Interface i2 = IQRFFactory.eINSTANCE.createInterface();
+		Result it = getFixture();
+		it.addInterface(i1);
+		it.addInterface(i2);
+		List ints = (List)it.getInterfaces();
+		assertTrue(ints.contains(i1));
+		assertTrue(ints.contains(i2));
+		assertEquals(ints.get(0),i1);
+		assertEquals(ints.size(),2);
+	}
+
+	public void testAddTarget__Target() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		Target t1 = IQRFFactory.eINSTANCE.createTarget();
+		Target t2 = IQRFFactory.eINSTANCE.createTarget();
+		Result it = getFixture();
+		it.addTarget(t1);
+		it.addTarget(t2);
+		List targets = (List)it.getTargets();
+		assertTrue(targets.contains(t1));
+		assertTrue(targets.contains(t2));
+		assertEquals(targets.get(0),t1);
+		assertEquals(targets.size(),2);
+	}
+
+} //ResultTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/SettingTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+
+public class SettingTest extends TestCase {
+	protected Setting fixture = null;
+
+	protected void setFixture(Setting fixture) {
+		this.fixture = fixture;
+	}
+
+	private Setting getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createSetting());
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	public void testSetConfigurationElement__ConfigurationElement() {
+		// Ensure that you remove @generated or mark it @generated NOT
+		ConfigurationElement cl = IQRFFactory.eINSTANCE.createConfigurationElement();
+		Setting st = this.getFixture();
+		st.setConfigurationElement(cl);
+		assertEquals(st.getRef(),cl);
+	}
+
+	public void testName() {
+		String name = "settingName";
+		Setting st = getFixture();
+		st.setName(name);
+		assertEquals(st.getName(),name);
+	}
+	
+	public void testValue() {
+		String value = "example value";
+		Setting st = getFixture();
+		st.setValue(value);
+		assertEquals(st.getValue(),value);
+	}
+} //SettingTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/iqrf/tests/TargetTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.tests;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+
+public class TargetTest extends TestCase {
+	protected Target fixture = null;
+
+	protected void setFixture(Target fixture) {
+		this.fixture = fixture;
+	}
+
+	private Target getFixture() {
+		return fixture;
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IQRFFactory.eINSTANCE.createTarget());
+	}
+
+	public void testName() {
+		String name = "targetName";
+		Target target = getFixture();
+		target.setName(name);
+		assertEquals(target.getName(),name);
+	}
+	
+	public void testDescription() {
+		String description = "This is test description";
+		Target target = this.getFixture();
+		target.setDescription(description);
+		assertEquals(target.getDescription(),description);
+	}
+	
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //TargetTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/model/iContent/tests/AllTests.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.model.iContent.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for com.nokia.s60tools.imaker.internal.model.iContent.tests");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(ImageContentTest.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/model/iContent/tests/ImageContentTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.model.iContent.tests;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+public class ImageContentTest extends TestCase {
+	protected ImageContent fixture = null;
+
+	protected void setFixture(ImageContent fixture) {
+		this.fixture = fixture;
+	}
+
+	private ImageContent getFixture() {
+		return fixture;
+	}
+
+	public void testImageContent() throws Exception {
+		ImageContent content = this.getFixture();
+		assertNotNull(content);
+		assertNotNull(content.getEntries());
+		assertTrue(content.getEntries().size()==0);
+		IbyEntry ie = IContentFactory.eINSTANCE.createIbyEntry();
+
+		ie.setDebug(true);
+		ie.setEnabled(false);
+		String file = "huuhaa.exe";
+		ie.setFile(file);
+		ie.setLocation(IMAGESECTION.CORE);
+		
+		assertEquals(file, ie.getFile());
+		content.getEntries().add(ie);
+		assertTrue(content.getEntries().size()==1);
+	}
+
+	public void setUp() throws Exception {
+		setFixture(IContentFactory.eINSTANCE.createImageContent());
+	}
+
+	public void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ImageContentTest
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/Activator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.imakerplugin.tests";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/AllTests.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for com.nokia.s60tools.imaker.internal.tests");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(SettingsViewerTest.class);
+		suite.addTestSuite(PlatsimManagerTest.class);
+		suite.addTestSuite(IMakerWrapperTest.class);
+		suite.addTestSuite(IMakerAPITest.class);
+		suite.addTestSuite(ProjectManagerTest.class);
+		suite.addTestSuite(UIConfigurationTest.class);
+		suite.addTestSuite(EnvironmentTest.class);
+		suite.addTestSuite(ImakerPropertiesTest.class);
+		suite.addTestSuite(IQRFWrapperTest.class);
+		suite.addTestSuite(PatternsTest.class);
+		suite.addTest(com.nokia.s60tools.imaker.internal.iqrf.tests.AllTests.suite());
+		suite.addTest(com.nokia.s60tools.imaker.internal.model.iContent.tests.AllTests.suite());
+		//$JUnit-END$
+		return suite;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/CarbideProjectTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+import junit.framework.TestCase;
+
+public class CarbideProjectTest extends TestCase {
+	public void setUp() throws Exception {
+	}
+	
+	public void tearDown() throws Exception {
+	}
+	
+	
+	public void testBasic() throws Exception {
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/EnvironmentTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+import static org.easymock.EasyMock.*;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.model.Environment;
+
+public class EnvironmentTest extends TestCase {
+	private IEnvironment environment = null;
+	private IIMakerWrapper wrapperMock = null;
+	private static final String DRIVE = "x:\\";
+	
+	public void setUp() throws Exception {
+		wrapperMock = createMock(IIMakerWrapper.class);
+		environment = new Environment(DRIVE);
+		environment.setImakerWrapper(wrapperMock);
+	}
+	
+	public void tearDown() throws Exception {
+		wrapperMock = null;
+		environment = null;
+	}
+	
+	
+	public void testCreate() throws Exception {
+		assertNotNull(environment);
+		assertEquals(DRIVE, environment.getDrive());
+	}
+	
+	public void testLoad() throws Exception {
+		assertFalse(environment.isLoaded());
+		List<UIConfiguration> confs = new ArrayList<UIConfiguration>();
+		confs.add(new UIConfiguration(IQRFFactory.eINSTANCE.createConfiguration()));
+		int numberOfconfs = confs.size();
+		expect(wrapperMock.getConfigurations(isA(IProgressMonitor.class)))
+		.andReturn(confs);
+		
+		replay(wrapperMock);
+		List<UIConfiguration> configurations = environment.load();
+		assertTrue(environment.isLoaded());
+		assertNotNull(configurations);
+		assertTrue(configurations.size()>=numberOfconfs);
+		assertTrue(environment.getConfigurations().size()>=numberOfconfs);
+		assertSame(configurations, environment.getConfigurations());
+		verify(wrapperMock);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerAPITest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+import java.io.File;
+import java.util.List;
+
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreAlreadyRunningException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+
+public class IMakerAPITest extends IMakerCoreTest {
+
+	public void testImakerAPIVersion() throws Exception {
+		String stubPath = iMakerStubPath + "iMakerStub_093701.pl";
+
+		IIMakerWrapper wrapper = getWrapper(stubPath);
+		String version = wrapper.getIMakerCoreVersion();
+		assertTrue("iMaker API don't work as expected!", version.startsWith("iMaker 09.37.01"));
+	}
+
+	private IIMakerWrapper getWrapper(String stubPath) {
+		IIMakerWrapper wrapper = IMakerPlugin.getImakerWrapper(stubPath,true);
+
+		List<String> tool = wrapper.getTool();
+		tool.clear();
+		tool.add(PERL);
+		tool.add(stubPath);
+		return wrapper;
+	}
+
+	public void testImakerAPINotExistingImpFile() throws Exception {
+		String stubPath = iMakerStubPath + "iMakerStub_imp.pl";
+
+		IIMakerWrapper wrapper = getWrapper(stubPath);
+		File f = null;
+		try {
+			wrapper.buildImage(f, System.out);
+			fail("wrapper should't accept illigal arguments!");
+		} catch (Exception e) {
+			// expected
+			assertTrue(e instanceof IMakerCoreExecutionException);
+			String message = e.getMessage();
+			assertTrue(message.startsWith("Invalid"));
+		}
+	}
+
+	public void testImakerAPIEmptyImpFile() throws Exception {
+		String stubPath = iMakerStubPath + "iMaker_imp.pl";
+
+		File f = File.createTempFile("test", ".imp");
+		runAndVerifyResult(stubPath, f);
+	}
+
+
+	public void testImakerAPIImpFileWithSpaces() throws Exception {
+		String stubPath = iMakerStubPath + "iMaker_imp.pl";
+
+		File f = File.createTempFile("test 2", ".imp");
+		System.out.println(f.getAbsolutePath());
+		runAndVerifyResult(stubPath, f);
+	}
+
+	private void runAndVerifyResult(String stubPath, File f)
+	throws IMakerCoreNotFoundException, IMakerCoreExecutionException,
+	IMakerCoreAlreadyRunningException {
+		IIMakerWrapper wrapper = getWrapper(stubPath);
+		boolean result = wrapper.buildImage(f, System.out);		
+		assertEquals(true, result);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerCoreTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.osgi.framework.Bundle;
+
+import junit.framework.TestCase;
+
+public class IMakerCoreTest extends TestCase {
+	protected List<String> command = null;
+	protected final String PERL = "C:\\apps\\actperl\\bin\\perl.exe";
+	protected String iMakerStubPath = null;
+
+	/**
+	 * Setup fixture.
+	 */
+	public void setUp() throws Exception {
+		command = new ArrayList<String>();
+		Bundle bundle = Activator.getDefault().getBundle();
+		URL relativeURL = bundle.getEntry("/");
+		
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+		iMakerStubPath = pluginInstallLocation + "\\tools\\";
+	}
+
+	/**
+	 * Tear down fixture.
+	 */
+	public void tearDown() throws Exception {
+		command.clear();
+	}	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IMakerWrapperTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapper;
+
+
+public class IMakerWrapperTest extends IMakerCoreTest {
+	
+	public void testImakerWrapperAgainsGivenStubs() throws Exception {
+		List<String> script = new ArrayList<String>();
+		File f = new File(iMakerStubPath);
+		String[] files = f.list(new FilenameFilter() {
+//			@Override
+			public boolean accept(File dir, String name) {
+				return name.startsWith("iMakerStub");
+			}
+		});
+		for (int i = 0; i < files.length; i++) {
+			script.add(PERL);
+			String stub = files[i];
+			String stubPath = iMakerStubPath + stub;
+			script.add(stubPath);
+			IIMakerWrapper wrapper = new IMakerWrapper(script);
+			String version = wrapper.getIMakerCoreVersion();
+			assertTrue("iMakerWrapper failed with stub " + stub, version!=null);
+			assertTrue("iMakerWrapper failed with stub " + stub, version.length()>1);
+			assertTrue("iMakerWrapper failed with stub " + stub, version.startsWith("iMaker"));
+
+			List<UIConfiguration> configs = wrapper.getConfigurations(null);
+			assertTrue("iMakerWrapper failed with stub " + stub, !configs.isEmpty());
+			UIConfiguration config = configs.get(0);
+			assertTrue("iMakerWrapper failed with stub " + stub, !config.getAllTargets().isEmpty());
+			assertTrue("iMakerWrapper failed with stub " + stub, !config.getVariables().isEmpty());
+
+			ArrayList<String> params = new ArrayList<String>();
+			params.add("test");
+			String command = wrapper.getBuildCommand(params);
+			assertNotNull("iMakerWrapper failed with stub " + stub, command);
+			params.clear();
+			params.add("-f");
+			params.add("mk");
+			params.add("flash");
+			boolean success = wrapper.buildImage(params, null);
+			assertTrue("iMakerWrapper failed with stub " + stub, success);
+			script.clear();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/IQRFWrapperTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.iqrf.wrapper.IQRFWrapper;
+
+public class IQRFWrapperTest extends TestCase{
+
+	private IQRFWrapper wrapper = null;
+	private IMaker imaker = null;
+	private String xmi = null;
+
+	public void setUp() throws Exception {
+		wrapper = new IQRFWrapper();
+		// Create an object to test the wrapper.
+		imaker = IQRFFactory.eINSTANCE.createIMaker();
+		imaker.setQuery("empty query");
+		Target target1 = IQRFFactory.eINSTANCE.createTarget();
+		target1.setName("Target 1");
+		target1.setDescription("This is a target");
+		Target target2 = IQRFFactory.eINSTANCE.createTarget();
+		target2.setName("Target 2");
+		target2.setDescription("This is another target");
+		Result result = IQRFFactory.eINSTANCE.createResult();
+		Interface intf = IQRFFactory.eINSTANCE.createInterface();
+		intf.setName("A new interface");
+		ConfigurationElement element1 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element1.setName("ProductName");
+		element1.setDescription("Product name");
+		element1.setValues("char[255]");
+		ConfigurationElement element2 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element2.setName("CorePlatformName");
+		element2.setDescription("Core Platform Name");
+		element2.setValues("char[255]");
+		ConfigurationElement element3 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element3.setName("HWID");
+		element3.setDescription("Hardware Id");
+		element3.setValues("char[255]");
+		intf.addConfigurationElement(element1);
+		intf.addConfigurationElement(element2);
+		intf.addConfigurationElement(element3);
+		Configuration config = IQRFFactory.eINSTANCE.createConfiguration();
+		config.setName("MAKEFILE.MK");
+		config.setFilePath("c:\\temp\\something");
+		config.addTargetRef(target1);
+		config.addTargetRef(target2);
+		Setting setting1 = IQRFFactory.eINSTANCE.createSetting();
+		setting1.setName("productname");
+		setting1.setValue("*");
+		setting1.setConfigurationElement(element1);
+		Setting setting2 = IQRFFactory.eINSTANCE.createSetting();
+		setting2.setName("coreplatformname");
+		setting2.setValue("*");
+		setting2.setConfigurationElement(element2);
+		Setting setting3 = IQRFFactory.eINSTANCE.createSetting();
+		setting3.setName("hwid");
+		setting3.setValue("HWID_5101, HWID_510");
+		setting3.setConfigurationElement(element3);
+		config.addSetting(setting1);
+		config.addSetting(setting2);
+		config.addSetting(setting3);
+		result.addConfiguration(config);
+		result.addInterface(intf);
+		result.addTarget(target1);
+		result.addTarget(target2);
+		imaker.setResult(result);
+		
+		// Create an XMI document to test the wrapper.
+		StringBuffer tmp = new StringBuffer();
+		
+		tmp.append("<?xml version=\"1.0\" encoding=\"ASCII\"?>\r\n");
+		tmp.append("<IMaker xmi:version=\"2.0\" xmlns:xmi=\"http://www.omg.org/XMI\" xmlns=\"iqrf\" query=\"empty query\">\r\n");
+		tmp.append("  <result>\r\n");
+		tmp.append("    <interfaces name=\"A new interface\">\r\n");
+		tmp.append("      <configurationElements name=\"ProductName\" description=\"Product name\" values=\"char[255]\"/>\r\n");
+		tmp.append("      <configurationElements name=\"CorePlatformName\" description=\"Core Platform Name\" values=\"char[255]\"/>\r\n");
+		tmp.append("      <configurationElements name=\"HWID\" description=\"Hardware Id\" values=\"char[255]\"/>\r\n");
+		tmp.append("    </interfaces>\r\n");
+		tmp.append("    <configurations name=\"MAKEFILE.MK\" filePath=\"c:\\temp\\something\" targetrefs=\"//@result/@targets.0 //@result/@targets.1\">\r\n");
+		tmp.append("      <settings name=\"productname\" value=\"devlon51\" ref=\"//@result/@interfaces.0/@configurationElements.0\"/>\r\n");
+		tmp.append("      <settings name=\"coreplatformname\" value=\"*\" ref=\"//@result/@interfaces.0/@configurationElements.1\"/>\r\n");
+		tmp.append("      <settings name=\"hwid\" value=\"HWID_5101, HWID_5102\" ref=\"//@result/@interfaces.0/@configurationElements.2\"/>\r\n");
+		tmp.append("    </configurations>\r\n");
+		tmp.append("    <targets name=\"Target 1\" description=\"This is a target\"/>\r\n");
+		tmp.append("    <targets name=\"Target 2\" description=\"This is another target\"/>\r\n");
+		tmp.append("  </result>\r\n");
+		tmp.append("</IMaker>\r\n");
+			
+		xmi = tmp.toString();
+	}
+
+
+	/**
+	 * Tests that the imaker object first serialized to XMI
+	 * and then deserialized back to model again contains
+	 * the exact same data.
+	 */
+	public void testGetResult() {
+		assertTrue(imaker != null);
+		String doc = wrapper.getXMLDocument(imaker);
+		assertTrue(doc != null);
+		IMaker model = wrapper.getModel(doc);
+		assertTrue(model != null);
+	}
+
+	/**
+	 * Tests that the XMI document first deserialized to a model
+	 * and then serialized back to XMI is the same document.
+	 */
+	public void testGetXMLDocument() {
+		assertTrue(xmi != null);
+		IMaker imaker2 = wrapper.getModel(xmi);
+		assertTrue(imaker2 != null);
+		String xmi2 = wrapper.getXMLDocument(imaker2);
+		assertTrue(xmi2 != null);
+		assertTrue(xmi.equals(xmi2));
+	}
+	
+	public void testErrorConditions() {
+		IMaker model1 = wrapper.getModel(xmi);
+		IMaker model2 = wrapper.getModel(xmi);
+		model2.setQuery("sadfasfdas");
+		assertFalse("model1 should be equal to model2!",model1.equals(model2));
+		
+		Result r = model2.getResult();
+		Target t = IQRFFactory.eINSTANCE.createTarget();
+		t.setName("T");
+		r.addTarget(t);
+		
+		assertTrue("model1 should be equal to model2!",!model1.equals(model2));
+		
+		assertFalse("Null should be taken into account",model1.equals(null));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ImakerPropertiesTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public class ImakerPropertiesTest extends ProjectBuilder {
+
+	private String FIELD_NAME = "NAME";
+	private String FIELD_VALUE = "FIELD_VALUE";
+
+	public void setUp() throws Exception {
+		createDefaultProject();
+		assertTrue(project.isAccessible());
+	}
+	
+    public void tearDown() throws Exception {
+        closeAndDeleteDefaultProject();
+    }
+	
+	public void testImakerProperties() throws Exception {
+		IFile[] ifiles = addImakerImpFiles();
+		for (int i = 0; i < ifiles.length; i++) {
+			IFile file = ifiles[i];
+			ImakerProperties ip = ImakerProperties.createFromFile(file);
+			String field = (String) ip.get(IMakerKeyConstants.PRODUCT);
+			assertTrue(!field.equals(""));
+			field = (String) ip.get(IMakerKeyConstants.TYPE);
+			assertTrue(!field.equals(""));
+			
+			ip.put(FIELD_NAME, FIELD_VALUE);
+			
+			ip.saveToFile(file);
+			ip = ImakerProperties.createFromFile(file);
+			assertEquals(FIELD_VALUE, ip.get(FIELD_NAME));
+			
+			String mk = (String) ip.get(IMakerKeyConstants.MAKEFILE);
+			List<String> command = ip.parseImakerCommand(project, project.getLocation());
+			assertTrue("Expected command not correct! command="+command,command.indexOf(mk)!=-1);			
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/PatternsTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+import java.util.regex.Matcher;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.internal.console.IMakerJob;
+
+public class PatternsTest extends TestCase {
+
+	public void testImakerJobPattern1() throws Exception {
+		String[] data = new String[]{"sfdasdf = '/epoc32/rombuild'",
+				"sfdasdf = '\\workdir\\work'",
+		"sfdasdf = '\\workdir/work'"};
+		
+		for (int i = 0; i < data.length; i++) {
+			String str = data[i];
+			Matcher matcher = IMakerJob.VARIABLE_PATTERN1.matcher(str);
+			assertTrue("Match failled on string: "+str,matcher.find());
+		}
+	}
+	
+	public void testImakerJobPattern2() throws Exception {
+		String[] data2 = new String[]{"sfdasdf = 's:/epoc32/rombuild'",
+				"sfdasdf = 's:\\workdir\\work'",
+		"sfdasdf = 's:\\workdir/work'"};
+
+		for (int i = 0; i < data2.length; i++) {
+			String str = data2[i];
+			Matcher matcher = IMakerJob.VARIABLE_PATTERN2.matcher(str);
+			assertTrue("Match failled on string: "+str,matcher.find());
+		}
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/PlatsimManagerTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+import java.io.File;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+
+import com.nokia.s60tools.imaker.internal.wrapper.PlatsimManager;
+
+public class PlatsimManagerTest extends TestCase{
+
+	public void setUp() throws Exception {
+	}
+
+	public void tearDown() throws Exception {
+	}
+
+	public void testGetInstances() {
+		String drive = "z:\\";
+		PlatsimManager manager = new PlatsimManager(drive);
+		String loc = manager.getDefaulfLocation();
+		File f = new File(loc);
+		List<String> ins = manager.getInstances();
+		assertNotNull(ins);
+		if(f.exists()) {
+			assertTrue("No platsim instances exist!",ins.size()>=1);			
+		} else {
+			assertTrue(ins.size()==0);						
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ProjectBuilder.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.InputStream;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+
+public class ProjectBuilder extends TestCase {
+	public static final String TESTDATA_DIR   = "testdata";
+	public static final String[] imp_file_names = new String[] {"test1.imp","test2.imp"};
+	public static final String[] imp_file_contents = new String[] {
+		"#iMaker properties\n" +
+		"#Fri Sep 18 09:31:17 EEST 2009\n" +
+		"PRODUCT=my_product.mk\n" +
+		"TARGET=all\n" +
+		"HWID=1010\n" +
+		"NAME=FIELD_VALUE\n" +
+		"MAKEFILE=\\\\epoc32\\\\rom\\\\config\\\\ncp70\\\\corolla\\\\corolla12mpix\\\\image_conf_corolla12mpix.mk\n" +
+		"TYPE=rnd\n" +
+		"TARGET_LIST=all\n",
+		"#iMaker properties\n" +
+		"#Fri Sep 18 09:31:17 EEST 2009\n" +
+		"PRODUCT=image_conf_dilbert_ui.mk\n" +
+		"TARGET=core\n" +
+		"HWID=0100\n" +
+		"NAME=FIELD_VALUE\n" +
+		"MAKEFILE=\\\\epoc32\\\\rom\\\\config\\\\ncp70\\\\dilbert\\\\image_conf_dilbert_ui.mk\n" +
+		"TYPE=rnd\n" +
+		"TARGET_LIST=core\n" +
+		"DEBUG_FILES=true;false;\\\\epoc32\\\\data\\\\welcome.gif;\\\\welcome.gif;ROFS3"};
+	private final String PROJECT_NAME = "test";
+	protected IProject project = null;
+	
+	protected void createDefaultProject() throws CoreException {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IWorkspaceRoot root = workspace.getRoot();
+		
+		project = root.getProject(PROJECT_NAME);
+		if(!project.exists()) {
+			project.create(null);
+		}
+		if(!project.isOpen()) {
+			project.open(null);
+		}
+	}
+	
+	protected void closeAndDeleteDefaultProject() throws CoreException {
+		if(project!=null&&project.exists()) {
+			project.close(null);
+			project.delete(true, null);
+		}
+	}
+
+	protected IFile[] addImakerImpFiles() {
+		IFolder folder = project.getFolder(TESTDATA_DIR);
+		IFile[] ifiles = new IFile[imp_file_names.length];
+		try {
+			if(!folder.exists()) {
+				folder.create(true, true, null);	
+			}
+			for (int i = 0; i < imp_file_names.length; i++) {
+				String f_name = imp_file_names[i];			
+				IFile file = folder.getFile(f_name);
+				if(!file.exists()) {
+					file.create(getContent(i), true, null);
+				} else {
+					file.setContents(getContent(i), true, false, null);					
+				}
+				ifiles[i]=file;
+			}
+			return ifiles;
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private InputStream getContent(int file) {
+		String contents = imp_file_contents[file];
+		ByteArrayInputStream input = new ByteArrayInputStream(contents.getBytes());
+		return input;
+	}
+
+	public static File[] getTestFiles() {
+		File f = new File(TESTDATA_DIR);
+		File[] files = f.listFiles(new FilenameFilter() {
+			
+//			@Override
+			public boolean accept(File dir, String name) {
+				return name.endsWith(".imp");
+			}
+		});		
+		return files;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/ProjectManagerTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+
+public class ProjectManagerTest extends ProjectBuilder  {
+	private final String CONTENT  = "sample content";
+	private final String LOCATION = "rofs3";
+	private final String FILENAME = ProjectManager.IBY_FILENAME_PREFIX+LOCATION;
+	private ProjectManager projectManager;
+
+	public void setUp() throws Exception {
+		createDefaultProject();
+		addImakerImpFiles();
+		assertTrue(project.isAccessible());
+		projectManager = new ProjectManager(project);
+	}
+	
+    public void tearDown() throws Exception {
+//        closeAndDeleteDefaultProject();
+    }
+
+    public void testLocation() {
+    	assertTrue(!projectManager.getRoot().equals(""));
+    }
+	public void testImplFiles() throws Exception {
+		assertTrue("No impl files found. There shoud be some in the testdata folder!",!projectManager.getImakerFiles().isEmpty());		
+	}
+
+	public void testIbyFiles() {
+		IPath path = project.getLocation(); 
+		IPath filePath = projectManager.createIbyFile(FILENAME, CONTENT, path);
+		File file = filePath.toFile();
+		assertTrue("Coudn't create iby file under test projec!", file.exists());
+		try {
+			FileInputStream fs = new FileInputStream(file);
+			String line = getContents(fs);
+			assertEquals(CONTENT, line);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private String getContents(InputStream contents) throws IOException {
+		BufferedReader br = new BufferedReader(new InputStreamReader(contents));
+		String line = br.readLine();
+		return line;
+	}
+
+	public void testMakefile() throws Exception {
+		List<IPath> ifiles = new ArrayList<IPath>();		
+		IPath path = project.getLocation(); 
+		IPath filePath = projectManager.createIbyFile(FILENAME, CONTENT, path);
+		ifiles.add(filePath);
+
+		IPath mk = projectManager.createAdditionsMakefile(ifiles,path);
+		
+		assertNotNull("Makefile creation failled!",mk);
+		assertTrue("Makefile creation failled!", mk.toFile().exists());
+		FileInputStream fs = new FileInputStream(mk.toFile());
+		String cons = getContents(fs);
+		assertNotNull(cons);
+		assertEquals(LOCATION.toUpperCase()+"_OBY += "+ filePath.toFile().getAbsolutePath(),cons);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/SettingsViewerTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,153 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+
+
+import junit.framework.TestCase;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.viewers.SettingsViewer;
+
+public class SettingsViewerTest extends TestCase{
+	private Shell shell;
+	private SettingsViewer settingsViewer;
+	private Composite composite;
+
+	public void setUp() throws Exception {
+		shell = new Shell();
+		shell.setText("Sample shell");
+		
+		GridLayout layout = new GridLayout();
+		shell.setLayout(layout);
+		
+		composite = new Composite(shell,SWT.NONE);		
+	}
+
+	public void tearDown() throws Exception {
+		shell.dispose();
+	}
+
+	public void testThatControlsAreCreated() {
+		settingsViewer = new SettingsViewer(composite);
+		assertTrue(composite.getChildren()!=null);
+		assertTrue(composite.getChildren().length!=0);
+		displayShellWithSettingsViewer();
+	}
+
+	private void displayShellWithSettingsViewer() {
+		shell.setSize(600, 500);
+		shell.open();
+//		Display display = shell.getDisplay();
+//		while (!shell.isDisposed()) {
+//			if (!display.readAndDispatch())
+//				display.sleep();
+//		}		
+	}
+	
+	public void testViewerTable() {
+		settingsViewer = new SettingsViewer(composite);
+		Control[] children = composite.getChildren();
+		assertTrue(children[0] instanceof Table);
+		Table table = (Table) children[0];
+		assertTrue(table.getHeaderVisible());
+		assertTrue(table.getLinesVisible());
+	}
+	
+	public void testTableColumns() throws Exception {
+		settingsViewer = new SettingsViewer(composite);
+		Control[] children = composite.getChildren();
+		Table table = (Table) children[0];
+		assertEquals(4, table.getColumnCount());
+		TableColumn column = table.getColumn(1);
+		assertEquals("Value", column.getText());
+	}
+	
+	public void testWithUIConfiguration() throws Exception {
+		Target target1          = IQRFFactory.eINSTANCE.createTarget();
+		target1.setName("Target 1");
+		target1.setDescription("This is a target");
+		Target target2          = IQRFFactory.eINSTANCE.createTarget();
+		target2.setName("Target 2");
+		target2.setDescription("This is another target");
+		Result result           = IQRFFactory.eINSTANCE.createResult();
+		Interface intf          = IQRFFactory.eINSTANCE.createInterface();
+		intf.setName("A new interface");
+		ConfigurationElement element1 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element1.setName(com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences.PRODUCT_NAME);
+		element1.setDescription("Product name");
+		element1.setValues("char[255]");
+		ConfigurationElement element2 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element2.setName(com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences.COREPLATFORM_NAME);
+		element2.setDescription("Core Platform Name");
+		element2.setValues("char[255]");
+		ConfigurationElement element3 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element3.setName("HardwareID");
+		element3.setDescription("Hardware Id");
+		element3.setValues("char[255]");
+		intf.addConfigurationElement(element1);
+		intf.addConfigurationElement(element2);
+		intf.addConfigurationElement(element3);
+		Configuration conf = IQRFFactory.eINSTANCE.createConfiguration();
+		conf.setName("MAKEFILE.MK");
+		conf.setFilePath("c:\\temp\\something");
+		conf.addTargetRef(target1);
+		conf.addTargetRef(target2);
+		Setting setting1        = IQRFFactory.eINSTANCE.createSetting();
+		setting1.setName("Product Name");
+		setting1.setValue("devlon51");
+		setting1.setConfigurationElement(element1);
+		Setting setting2        = IQRFFactory.eINSTANCE.createSetting();
+		setting2.setName("Core Platform");
+		setting2.setValue("*");
+		setting2.setConfigurationElement(element2);
+		Setting setting3        = IQRFFactory.eINSTANCE.createSetting();
+		setting3.setName("Hardware Id");
+		setting3.setValue("5101");
+		setting3.setConfigurationElement(element3);
+		conf.addSetting(setting1);
+		conf.addSetting(setting2);
+		conf.addSetting(setting3);
+		result.addConfiguration(conf);
+		result.addInterface(intf);
+		result.addTarget(target1);
+		result.addTarget(target2);
+		
+		UIConfiguration uiConfig = new UIConfiguration(conf);
+		settingsViewer = new SettingsViewer(composite);
+		settingsViewer.setUiConfiguration(uiConfig);
+
+		displayShellWithSettingsViewer();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/src/com/nokia/s60tools/imaker/internal/tests/UIConfigurationTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.tests;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+public class UIConfigurationTest extends TestCase{
+	private Configuration conf = null;
+	private UIConfiguration uiConfig = null;	
+	
+	public void setUp() throws Exception {
+		Target target1          = IQRFFactory.eINSTANCE.createTarget();
+		target1.setName("Target 1");
+		target1.setDescription("This is a target");
+		Target target2          = IQRFFactory.eINSTANCE.createTarget();
+		target2.setName("Target 2");
+		target2.setDescription("This is another target");
+		Result result           = IQRFFactory.eINSTANCE.createResult();
+		Interface intf          = IQRFFactory.eINSTANCE.createInterface();
+		intf.setName("A new interface");
+		ConfigurationElement element1 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element1.setName(com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences.PRODUCT_NAME);
+		element1.setDescription("Product name");
+		element1.setValues("char[255]");
+		ConfigurationElement element2 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element2.setName(com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences.COREPLATFORM_NAME);
+		element2.setDescription("Core Platform Name");
+		element2.setValues("char[255]");
+		ConfigurationElement element3 = IQRFFactory.eINSTANCE.createConfigurationElement();
+		element3.setName("HWID");
+		element3.setDescription("Hardware Id");
+		element3.setValues("char[255]");
+		intf.addConfigurationElement(element1);
+		intf.addConfigurationElement(element2);
+		intf.addConfigurationElement(element3);
+		conf                    = IQRFFactory.eINSTANCE.createConfiguration();
+		conf.setName("MAKEFILE.MK");
+		conf.setFilePath("c:\\temp\\something");
+		conf.addTargetRef(target1);
+		conf.addTargetRef(target2);
+		Setting setting1        = IQRFFactory.eINSTANCE.createSetting();
+		setting1.setName("Product Name");
+		setting1.setValue("devlon51");
+		setting1.setConfigurationElement(element1);
+		Setting setting2        = IQRFFactory.eINSTANCE.createSetting();
+		setting2.setName("core platform name");
+		setting2.setValue("ncp51");
+		setting2.setConfigurationElement(element2);
+		Setting setting3        = IQRFFactory.eINSTANCE.createSetting();
+		setting3.setName("hwid");
+		setting3.setValue("HWID_5101 HWID_5102");
+		setting3.setConfigurationElement(element3);
+		conf.addSetting(setting1);
+		conf.addSetting(setting2);
+		conf.addSetting(setting3);
+		result.addConfiguration(conf);
+		result.addInterface(intf);
+		result.addTarget(target1);
+		result.addTarget(target2);
+		
+		uiConfig = new UIConfiguration(conf);
+		
+	}
+
+	public void testUIConfigurationProductName() {
+		assertEquals("devlon51", uiConfig.getProductName());
+	}
+	
+	public void testUIConfigurationMakeFileName() {
+		assertEquals("MAKEFILE.MK", uiConfig.getMakeFileName());
+	}
+	
+	public void testUIConfigurationMakeFilePath() {
+		assertEquals("c:\\temp\\something", uiConfig.getFilePath());
+	}
+	
+	public void testUIConfigurationDefaultHWID() {
+		assertEquals("HWID_5101", uiConfig.getDefaultHWID());
+	}
+	
+	public void testUIConfigurationTargets() {
+		assertTrue(uiConfig.getAllTargets() != null);
+		assertEquals(2,uiConfig.getAllTargets().size());
+	}
+	
+	public void testUIConfigurationVariables() {
+		assertEquals(3,uiConfig.getVariables().size());
+		UIVariable variable = (UIVariable)uiConfig.getVariables().get(0);
+		assertEquals("Product Name",variable.getName());
+		assertEquals("char[255]",variable.getValueFormat());
+	}
+	
+	public void testUIConfigurationHWID() {
+		assertTrue(uiConfig.getHWIDs() != null);
+		assertEquals(2,uiConfig.getHWIDs().size());
+	}
+	
+	public void testUIConfigurationPlatformName() {
+		assertEquals("ncp51", uiConfig.getPlatformName());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/testdata/test1.imp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,9 @@
+#iMaker properties
+#Fri Sep 18 09:31:17 EEST 2009
+PRODUCT=my_product.mk
+TARGET=all
+HWID=1010
+NAME=FIELD_VALUE
+MAKEFILE=\\epoc32\\rom\\config\\ncp70\\corolla\\corolla12mpix\\image_conf_corolla12mpix.mk
+TYPE=rnd
+TARGET_LIST=all 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/testdata/test2.imp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+#iMaker properties
+#Fri Sep 18 09:31:17 EEST 2009
+PRODUCT=image_conf_dilbert_ui.mk
+TARGET=core
+HWID=0100
+NAME=FIELD_VALUE
+MAKEFILE=/epoc32/rom/config/ncp70/dilbert/image_conf_dilbert_ui.mk
+TYPE=rnd
+TARGET_LIST=core 
+DEBUG_FILES=true;false;\\epoc32\\data\\welcome.gif;\\welcome.gif;ROFS3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub.pl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1054 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+##########################################################################################################################
+##########################################################################################################################
+#
+# iMakerStub.pl
+#
+# Test stub for iMaker plugin JUnit tests.
+#
+# This stub is used by IMakerWrapperTest and runs one iMaker call at the time.
+# File must be placed to C:\tests\ directory.
+#
+#
+##########################################################################################################################
+##########################################################################################################################
+
+
+$time = localtime;
+open OUTFILE, ">>out_iMakerStub.txt";
+print OUTFILE "iMakerStub.pl called at $time\n";
+
+$numArgs = $#ARGV + 1;
+print OUTFILE "Number of arguments: $numArgs\n";
+$testCase = $ARGV[0];
+print OUTFILE "Test case: $testCase\n";
+
+print OUTFILE "Arguments:\n";
+foreach $argnum (0 .. $#ARGV) {
+   print OUTFILE "\t$ARGV[$argnum]\n";
+}
+
+if($numArgs eq 0) {
+print "
+iMaker 09.37.01, 07-Sep-2009.
+
+Print help data on documented iMaker API items; targets and variables.
+Wildcards *, ? and [..] can be used with % patterns.
+
+help                  : Print this message.
+help-%                : Print help on help items matching the pattern.
+help-%-list           : Print a list of help items matching the pattern.
+
+help-target           : Print help on all targets (same as help-target-*).
+help-target-%         : Print help on targets matching the pattern.
+help-target-%-wiki    : Print wiki-formatted help on targets matching the patter
+n.
+help-target-%-list    : Print a list of targets matching the pattern.
+
+help-variable         : Print help on all variables (same as help-variable-*).
+help-variable-%       : Print help on variables matching the pattern.
+help-variable-%-all   : Print full help on variables matching the pattern.
+help-variable-%-wiki  : Print wiki-formatted help on variables matching the patt
+ern.
+help-variable-%-list  : Print a list of variables matching the pattern.
+help-variable-%-value : Print a list of variables with values matching the patte
+rn.
+
+help-config           : Print a list of available configurations in the current
+working environment.
+
+menu                  : Run interactive menu.
+version               : Print the iMaker version number.
+
+For more info: http://configurationtools/imaker
+";
+exit(0);
+}
+
+#@options = @ARGV;
+#shift @options;
+
+# Printing simulated imaker output to wrapper
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testGetConfigurationsNoConfigs" ) {
+print OUTFILE "Running help, no results\n";
+print "
+Testing new API
+
+
+Total duration: 00:01
+";
+
+exit(0); # Just to ensure that no other results are returned
+
+}
+
+
+
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if($ARGV[0] eq "help-config") {
+print OUTFILE "Running help-config, full results\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+Finding available configuration file(s):
+/epoc32/rom/config/ncp77/filippa/image_conf_filippa.mk
+";
+
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoTargets
+# help-target
+#
+##########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /filippa/ ) 
+    and ($ARGV[0] eq "help-target")) {
+print OUTFILE "Running help-target, full results\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+----------------------------------------
+all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+clean
+Type       : Target
+Description: Clean all target files.
+----------------------------------------
+core
+Type       : Target
+Description: Create Core (ROM & ROFS1) image.
+----------------------------------------
+core-dir
+Type       : Target
+Description: Create directory structure for Core (ROM & ROFS1) creation.
+----------------------------------------
+core-i2file
+Type       : Target
+Description: Extract all files from Core (ROM & ROFS1) image.
+----------------------------------------
+core-image
+Type       : Target
+Description: Create Core (ROM & ROFS1) image (.img) file(s).
+----------------------------------------
+core-pre
+Type       : Target
+Description: Run pre-step, create files etc. for Core (ROM & ROFS1) creation.
+----------------------------------------
+core-symbol
+Type       : Target
+Description: Create Core (ROM & ROFS1) symbol file(s).
+----------------------------------------
+default
+Type       : Target
+Description: Default target, uses variable TARGET_DEFAULT to get actual target(s), current default = core.
+----------------------------------------
+e2flash
+Type       : Target
+Description: Create the elf2flash (flash) file.
+----------------------------------------
+f2image
+Type       : Target
+Description: Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)
+----------------------------------------
+flash
+Type       : Target
+Description: Create all image sections files. Not any symbol files.
+----------------------------------------
+flash-all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+fota
+Type       : Target
+Description: Create the FOTA sub-image.
+----------------------------------------
+help
+Type       : Target
+Description: Print help on help targets.
+----------------------------------------
+help-%
+Type       : Target
+Description: Print help on help items matching the pattern.
+----------------------------------------
+help-%-list
+Type       : Target
+Description: Print a list of help items matching the pattern.
+----------------------------------------
+help-config
+Type       : Target
+Description: Print a list of available configurations in the current working environment.
+----------------------------------------
+help-target
+Type       : Target
+Description: Print help on all targets (same as help-target-*).
+----------------------------------------
+help-target-%
+Type       : Target
+Description: Print help on targets matching the pattern.
+----------------------------------------
+help-target-%-list
+Type       : Target
+Description: Print a list of targets matching the pattern.
+----------------------------------------
+help-target-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on targets matching the pattern.
+----------------------------------------
+help-variable
+Type       : Target
+Description: Print help on all variables (same as help-variable-*).
+----------------------------------------
+help-variable-%
+Type       : Target
+Description: Print help on variables matching the pattern.
+----------------------------------------
+help-variable-%-all
+Type       : Target
+Description: Print full help on variables matching the pattern.
+----------------------------------------
+help-variable-%-list
+Type       : Target
+Description: Print a list of variables matching the pattern.
+----------------------------------------
+help-variable-%-value
+Type       : Target
+Description: Print a list of variables with values matching the pattern.
+----------------------------------------
+help-variable-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on variables matching the pattern.
+----------------------------------------
+image
+Type       : Target
+Description: Create only the image file(s) (*.img)
+----------------------------------------
+langpack_all
+Type       : Target
+Description: Create all language packages.
+----------------------------------------
+langpack_china
+Type       : Target
+Description: Create language packages that belong to China region.
+----------------------------------------
+langpack_japan
+Type       : Target
+Description: Create language packages that belong to Japan region.
+----------------------------------------
+langpack_western
+Type       : Target
+Description: Create language packages that belong to Western region.
+----------------------------------------
+mmc
+Type       : Target
+Description: Create MMC/SD image.
+----------------------------------------
+mmc-dir
+Type       : Target
+Description: Create directory structure for MMC/SD creation.
+----------------------------------------
+mmc-image
+Type       : Target
+Description: Create MMC/SD image (.img) file.
+----------------------------------------
+mmc-pre
+Type       : Target
+Description: Run pre-step, create files etc. for MMC/SD creation.
+----------------------------------------
+print-%
+Type       : Target
+Description: Print the value(s) of the given variable(s). Wildcards *, ? and [..] can be used in variable names.
+----------------------------------------
+resignsubcon
+Type       : Target
+Description: Create re-signed security binaries for subcon image creation.
+----------------------------------------
+rofs2
+Type       : Target
+Description: Create ROFS2 image.
+----------------------------------------
+rofs2-dir
+Type       : Target
+Description: Create directory structure for ROFS2 creation.
+----------------------------------------
+rofs2-i2file
+Type       : Target
+Description: Extract all files from ROFS2 image.
+----------------------------------------
+rofs2-image
+Type       : Target
+Description: Create ROFS2 image (.img) file.
+----------------------------------------
+rofs2-pre
+Type       : Target
+Description: Run pre-step, create files etc. for ROFS2 creation.
+----------------------------------------
+rofs2-symbol
+Type       : Target
+Description: Create ROFS2 symbol file.
+----------------------------------------
+rofs3
+Type       : Target
+Description: Create ROFS3 image.
+----------------------------------------
+rofs3-dir
+Type       : Target
+Description: Create directory structure for ROFS3 creation.
+----------------------------------------
+rofs3-i2file
+Type       : Target
+Description: Extract all files from ROFS3 image.
+----------------------------------------
+rofs3-image
+Type       : Target
+Description: Create ROFS3 image (.img) file.
+----------------------------------------
+rofs3-pre
+Type       : Target
+Description: Run pre-step, create files etc. for ROFS3 creation.
+----------------------------------------
+rofs3-symbol
+Type       : Target
+Description: Create ROFS3 symbol file.
+----------------------------------------
+rofs4
+Type       : Target
+Description: Create DCC ROFS4 image.
+----------------------------------------
+rofs4-dir
+Type       : Target
+Description: Create directory structure for DCC ROFS4 creation.
+----------------------------------------
+rofs4-i2file
+Type       : Target
+Description: Extract all files from DCC ROFS4 image.
+----------------------------------------
+rofs4-image
+Type       : Target
+Description: Create DCC ROFS4 image (.img) file.
+----------------------------------------
+rofs4-pre
+Type       : Target
+Description: Run pre-step, create files etc. for DCC ROFS4 creation.
+----------------------------------------
+rofs4-symbol
+Type       : Target
+Description: Create DCC ROFS4 symbol file.
+----------------------------------------
+romsymbol
+Type       : Target
+Description: Create the rom symbol file
+----------------------------------------
+step-%
+Type       : Target
+Description: Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands.
+----------------------------------------
+toolinfo
+Type       : Target
+Description: Print info about the tool
+----------------------------------------
+uda
+Type       : Target
+Description: Create UDA image.
+----------------------------------------
+uda-dir
+Type       : Target
+Description: Create directory structure for UDA creation.
+----------------------------------------
+uda-image
+Type       : Target
+Description: Create UDA image (.img) file.
+----------------------------------------
+uda-pre
+Type       : Target
+Description: Run pre-step, create files etc. for UDA creation.
+----------------------------------------
+udaerase
+Type       : Target
+Description: Create the flashable UDA erase image.
+----------------------------------------
+variant
+Type       : Target
+Description: Create the variant image (rofs2,rofs3)
+----------------------------------------
+variant-image
+Type       : Target
+Description: Create the variant image files (rofs2.img, rofs3.img)
+----------------------------------------
+variantmmc
+Type       : Target
+Description: Create MMC/SD image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantrofs2
+Type       : Target
+Description: Create ROFS2 image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantrofs3
+Type       : Target
+Description: Create ROFS3 image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantuda
+Type       : Target
+Description: Create UDA image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+version
+Type       : Target
+Description: Print the version information
+";
+
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /filippa/ ) 
+    and ($ARGV[0] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, giving full list\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+----------------------------------------
+BLDROBY = `'
+Type       : Variable
+Description: For passing extra oby files (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+BLDROM_OPT = `-loglevel1  -v -nosymbols   -DFEATUREVARIANT=filippa   -D__FEATURE_IBY__  -D_IMAGE_TYPE_RND'
+Type       : Variable
+Description: The default buildrom.pl options
+Values     : (string)
+----------------------------------------
+BLDROPT = `'
+Type       : Variable
+Description: For passing extra parameters (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+CONFIGROOT = `/epoc32/rom/config'
+Type       : Variable
+Description: Define the default configuration root directory.
+Values     : (string)
+----------------------------------------
+CORE_CDPROMFILE = `/epoc32/rombuild/odpcoderomfiles.txt'
+Type       : Variable
+Description: The name of the core Code Demand Paging rom file (Code paging).
+Values     : (string)
+----------------------------------------
+CORE_DIR = `/epoc32/rombuild/filippa/core'
+Type       : Variable
+Description: The working directory, when creating core image
+Values     : (string)
+----------------------------------------
+CORE_FLASH = `/epoc32/rombuild/filippa/filippa_0010_rnd.fpsx'
+Type       : Variable
+Description: The name of the flashable core image.
+Values     : (string)
+----------------------------------------
+CORE_FWIDFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_fwid.txt'
+Type       : Variable
+Description: The (generated) _core_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_imeisv.txt'
+Type       : Variable
+Description: The (generated) _core_imeisv.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVINFO = `00'
+Type       : Variable
+Description: The content string for the imeisv.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MODELFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_model.txt'
+Type       : Variable
+Description: The (generated) _core_model.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_MODELINFO = `S60'
+Type       : Variable
+Description: The content string for the model.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MSTOBY = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_master.oby'
+Type       : Variable
+Description: The generated master oby file name, which includes the CORE_OBY files
+Values     : (string)
+----------------------------------------
+CORE_NAME = `/epoc32/rombuild/filippa/core/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the core image
+Values     : (string)
+----------------------------------------
+CORE_NDPROMFILE = `/epoc32/rombuild/romfiles.txt'
+Type       : Variable
+Description: The name of the core Non Demand Paging rom file.
+Values     : (string)
+----------------------------------------
+CORE_OBY = `/epoc32/rom/ncp.oby'
+Type       : Variable
+Description: The oby file(s) included to the core image creation
+Values     : (string)
+----------------------------------------
+CORE_ODPROMFILE = `/epoc32/rombuild/odpromfiles.txt'
+Type       : Variable
+Description: The name of the core On Demand Paging rom file (Rom paging).
+Values     : (string)
+----------------------------------------
+CORE_OPT = `-loglevel1  -v -nosymbols   -DFEATUREVARIANT=filippa   -D__FEATURE_IBY__  -D_IMAGE_TYPE_RND -D_EABI=ARMV5    -DFILIPPA  -D_IMAGE_TYPE_NCP -DLCD_SHELL -DBSW_USE_TEXTSHELL_UPDATER'
+Type       : Variable
+Description: The core specific buildrom options
+Values     : (string)
+----------------------------------------
+CORE_PLATFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_platform.txt'
+Type       : Variable
+Description: The (generated) _core_platform.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_PLATINFO = `SymbianOSMajorVersion=9\nSymbianOSMinorVersion=5\n'
+Type       : Variable
+Description: The content string for the fwid.txt file.
+Values     : (string)
+----------------------------------------
+CORE_PRODFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_product.txt'
+Type       : Variable
+Description: The (generated) _core_product.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_ROFSFILE = `/epoc32/rombuild/odprofsfiles.txt'
+Type       : Variable
+Description: The name of the core rofs file.
+Values     : (string)
+----------------------------------------
+CORE_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rom version parameter passed to the version.iby
+Values     : (string)
+----------------------------------------
+CORE_SWVERFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_sw.txt'
+Type       : Variable
+Description: The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file.
+Values     : (string)
+----------------------------------------
+CORE_SWVERINFO = `V 77.52.2009.24.0610_RC RND\n10-09-09\nRM-601\n(c) Nokia'
+Type       : Variable
+Description: The content string for the sw.txt file.
+Values     : (string)
+----------------------------------------
+CORE_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the core image
+Values     : (string)
+----------------------------------------
+CORE_UDEBFILE = `/epoc32/rombuild/mytraces.txt'
+Type       : Variable
+Description: The name of the core udeb file. See USE_UDEB.
+Values     : (string)
+----------------------------------------
+CORE_VERIBY = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_version.iby'
+Type       : Variable
+Description: The name of the generated core *version.iby, which included version files and info
+Values     : (string)
+----------------------------------------
+CORE_VERSION = `V 77.52.2009.24.0610_RC RND'
+Type       : Variable
+Description: The version of the core. Used in sw.txt generation.
+Values     : (string)
+----------------------------------------
+COREPLAT_NAME = `ncp77'
+Type       : Variable
+Description: Name of the core platform
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_COMPLP = `'
+Type       : Variable
+Description: Compatible language variant.
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_DIR = `/epoc32/rom/config/ncp77/filippa/customer/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+FLASH_EXT = `.fpsx'
+Type       : Variable
+Description: The flash file extension.
+Values     : (string)
+----------------------------------------
+HWID = `0010'
+Type       : Variable
+Description: Hardware Id
+Values     : ([0-9]4)
+----------------------------------------
+HWID_LIST = `0010 0020 0100 0110 0120 0130 0140 0200 0220'
+Type       : Variable
+Description: Possible Hardware Ids of the product.
+Values     : ([0-9]4)*
+----------------------------------------
+KEEPTEMP = `0'
+Type       : Variable
+Description: Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby
+Values     : ([0|1])
+----------------------------------------
+LABEL = `'
+Type       : Variable
+Description: A label to the NAME of the image
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFCP = `7752 filippa '
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for language pack, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_DEFAULTLANG = `English'
+Type       : Variable
+Description: Default language is the language where the device will boot to (SIM language overrides this selection)
+Values     : (string)
+----------------------------------------
+LANGPACK_DIR = `/epoc32/rom/config/ncp77/filippa/language/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_ID = `01'
+Type       : Variable
+Description: Language id used in the lang.txt generation
+Values     : (string)
+----------------------------------------
+LANGPACK_LANGS = `English'
+Type       : Variable
+Description: Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)
+Values     : (string)
+----------------------------------------
+NAME = `filippa_0010_rnd'
+Type       : Variable
+Description: The name of the image
+Values     : (string)
+----------------------------------------
+OPERATOR_OBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The name for generated operator oby, which is a file generated based on an operator specific content.
+Values     : (string)
+----------------------------------------
+OPERATOR_OBYGEN = `geniby | /epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby | #include \"%3\" | end'
+Type       : Variable
+Description: The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder).
+Values     : (string)|(string)|(string)
+----------------------------------------
+PRODUCT_MODEL = `N00'
+Type       : Variable
+Description: The model of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_NAME = `filippa'
+Type       : Variable
+Description: Name of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_REVISION = `01'
+Type       : Variable
+Description: The revision of the product.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFCP = `7752 filippa'
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for product variant, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_DIR = `/epoc32/rom/config/ncp77/filippa'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+ROFS2_DIR = `/epoc32/rombuild/filippa/rofs2'
+Type       : Variable
+Description: The working directory, when creating the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_FLASH = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd.rofs2.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDFILE = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs2_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDINFO = `id=language\nversion=01\n'
+Type       : Variable
+Description: The content string for the fwid2.txt file.
+Values     : (string)
+----------------------------------------
+ROFS2_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_MSTOBY = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_master.oby'
+Type       : Variable
+Description: The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters
+Values     : (string)
+----------------------------------------
+ROFS2_NAME = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_OBY = `'
+Type       : Variable
+Description: The oby file(s) included to the rofs2 image creation
+Values     : (string)
+----------------------------------------
+ROFS2_OPT = `'
+Type       : Variable
+Description: The rofs2 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS2_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs2 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS2_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_VERIBY = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWFILE = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_customersw.txt'
+Type       : Variable
+Description: The (generated) source file name for customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWINFO = `V 77.52.2009.24.0610_RC RND\n10-09-09'
+Type       : Variable
+Description: The content string for the customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_DIR = `/epoc32/rombuild/filippa/rofs3'
+Type       : Variable
+Description: The working directory, when creating the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_FLASH = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd.rofs3.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDFILE = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs3_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDINFO = `id=customer\nversion=V 77.52.2009.24.0610_RC RND Customer\n'
+Type       : Variable
+Description: The content string for the fwid3.txt file.
+Values     : (string)
+----------------------------------------
+ROFS3_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_MSTOBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_master.oby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_NAME = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_OBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The oby file(s) included to the rofs3 image creation
+Values     : (string)
+----------------------------------------
+ROFS3_OPT = `'
+Type       : Variable
+Description: The rofs3 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS3_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs3 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS3_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_VERIBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+SOS_VERSION = `9.5'
+Type       : Variable
+Description: Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)
+Values     : ([0-9]+.[0-9]+)
+----------------------------------------
+SWUPD_EXT = `.swupd'
+Type       : Variable
+Description: The software update file extension.
+Values     : (string)
+----------------------------------------
+TARGET_DEFAULT = `core'
+Type       : Variable
+Description: Configure actual target(s) for target default.
+Values     : (string)
+----------------------------------------
+TYPE = `rnd'
+Type       : Variable
+Description: Defines the image type.
+Values     : (rnd|prd|subcon)
+----------------------------------------
+USE_OVERRIDE = `1'
+Type       : Variable
+Description: Define whether the override.pm Buildrom.pl plugin is used.
+Values     : ([0|1])
+----------------------------------------
+USE_PAGING = `rom'
+Type       : Variable
+Description: Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code).
+Values     : ((0|rom|code[:[(1|2|3)]+]?))
+----------------------------------------
+USE_PLATSIM = `0'
+Type       : Variable
+Description: Define that the configuration is a PlatSim configuration.
+Values     : (string)
+----------------------------------------
+USE_ROFS = `1'
+Type       : Variable
+Description: Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3).
+Values     : ([[dummy|]0..6][,[dummy|]0..6]*)
+----------------------------------------
+USE_ROMFILE = `1'
+Type       : Variable
+Description: Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1.
+Values     : ([0|1])
+----------------------------------------
+USE_SYMGEN = `0'
+Type       : Variable
+Description: Generate the rom symbol file. 0=Do not generate, 1=Generate
+Values     : ([0|1])
+----------------------------------------
+USE_UDEB = `0'
+Type       : Variable
+Description: Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel.
+Values     : ([0|1|full])
+----------------------------------------
+USE_VERGEN = `1'
+Type       : Variable
+Description: Use iMaker version info generation
+Values     : ([0|1])
+----------------------------------------
+VARIANT_CONFCP = `7752 filippa'
+Type       : Variable
+Description: Configure which ConfigurationTool generated configurations dirs are copied to output.
+Values     : (string)
+----------------------------------------
+VARIANT_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Configure what is the ConfigurationTool input confml file, when configuration tool is ran.
+Values     : (string)
+----------------------------------------
+VARIANT_DIR = `/epoc32/rom/config/ncp77/filippa'
+Type       : Variable
+Description: Configure the directory where to included the customer variant content. By default all content under  is included to the image as it exists in the folder.
+Values     : (string)
+----------------------------------------
+WORKDIR = `/epoc32/rombuild/filippa'
+Type       : Variable
+Description: The working directory for the image creation
+Values     : (string)
+";
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($testCase eq "test_case=testGetConfigurationsNoConfigElements") 
+    and ($ARGV[1] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, no results\n";
+print "
+Testing new API
+----------------------------------------
+
+Total duration: 00:01
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImage
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImage" ) {
+print OUTFILE "Running build image, returning builder result\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+
+Total duration: 01:13
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImageFailed
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImageFailed" ) {
+print OUTFILE "Running build image, returning builder result with errors\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+error: something went wrong
+
+
+";
+}
+
+if(($numArgs eq 3) and ($ARGV[2] eq "flash")) {
+print "
+iMaker 09.37.01, 07-Sep-2009.
+Variant target             USE_VARIANTBLD = `1'
+Variant directory          VARIANT_DIR    = `/epoc32/rom/config/ncp77/filippa'
+Variant config makefile    VARIANT_MK     = -
+Variant include directory  VARIANT_INCDIR = -
+Variant confml file        VARIANT_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Variant CenRep configs     VARIANT_CONFCP = `7752 filippa'
+Variant SIS directory      VARIANT_SISDIR = -
+Variant operator cache dir VARIANT_OPCDIR = -
+Variant widget preinst dir VARIANT_WGZDIR = -
+Variant zip content dir    VARIANT_ZIPDIR = -
+Variant copy content dir   VARIANT_CPDIR  = -
+Variant output directory   VARIANT_OUTDIR = `/epoc32/rombuild/filippa/core/variant'
+Calling S60 Configuration Tool
+Generating Feature manager file(s)
+Generating file(s) for Core (ROM & ROFS1) image creation
+Creating Core (ROM & ROFS1) SOS image
+
+Missing file(s):
+1) \epoc32\rombuild\filippa\core\filippa_0010_rnd_core_master.oby(95): Missing file: '\epoc32\release\ARMV5\urel\BTRACEX_LDD' in statement 'data='
+
+Warning(s):
+1) WARNING: /epoc32/include/s60features.xml doesn't exist
+2) WARNING: /epoc32/include/s60regionalfeatures.xml doesn't exist
+3) WARNING: /epoc32/include/s60customswfeatures.xml doesn't exist
+
+Error(s):
+1) ERROR: Invalid patchable value at \"power_resources.dll\@KHwDrvMMC_CorePinNo     None \"
+2) ERROR: Invalid patchable value at \"power_resources.dll\@KHwDrvMMC_IOPinNo       None \"
+Generating Boot Block Elf2flash configuration
+Creating flashable Boot Block image
+Creating GenIO Initialization subimage
+Adding BB5 Common Header(s) to GenIO Initialization image
+Generating SOS (Core) Elf2flash configuration
+Adding BB5 Common Header(s) to SOS (Core) image
+Creating flashable SOS (Core) image
+Generating Core Elf2flash configuration
+Creating flashable Core image
+Generating UDA Erase Elf2flash configuration
+Creating flashable UDA Erase image
+";
+}
+
+
+####################
+END {
+print OUTFILE "---------------------------------------------------------------\n";
+close OUTFILE;
+}
+
+
+#EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub_091402.pl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,881 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+##########################################################################################################################
+##########################################################################################################################
+#
+# iMakerStub.pl
+#
+# Test stub for iMaker plugin JUnit tests.
+#
+# This stub is used by IMakerWrapperTest and runs one iMaker call at the time.
+# File must be placed to C:\tests\ directory.
+#
+#
+##########################################################################################################################
+##########################################################################################################################
+
+
+$time = localtime;
+open OUTFILE, ">>out_iMakerStub.txt";
+print OUTFILE "iMakerStub.pl called at $time\n";
+
+$numArgs = $#ARGV + 1;
+print OUTFILE "Number of arguments: $numArgs\n";
+$testCase = $ARGV[0];
+print $testCase;
+print OUTFILE "Test case: $testCase\n";
+
+print OUTFILE "Arguments:\n";
+foreach $argnum (0 .. $#ARGV) {
+   print OUTFILE "\t$ARGV[$argnum]\n";
+}
+
+if($numArgs eq 0) {
+print "
+iMaker 09.14.02, 24-Apr-2009.
+
+Print help data on documented iMaker API items; targets and variables.
+Wildcards *, ? and [] can be used with % patterns.
+
+help                  : Print this message.
+help-%                : Print help on help items matching the pattern.
+help-%-list           : Print a list of help items matching the pattern.
+
+help-target           : Print help on all targets (same as help-target-*).
+help-target-%         : Print help on targets matching the pattern.
+help-target-%-wiki    : Print wiki-formatted help on targets matching the pattern.
+help-target-%-list    : Print a list of targets matching the pattern.
+
+help-variable         : Print help on all variables (same as help-variable-*).
+help-variable-%       : Print help on variables matching the pattern.
+help-variable-%-all   : Print full help on variables matching the pattern.
+help-variable-%-wiki  : Print wiki-formatted help on variables matching the pattern.
+help-variable-%-list  : Print a list of variables matching the pattern.
+help-variable-%-value : Print a list of variables with values matching the pattern.
+
+help-config           : Print a list of available configurations in the current working environment.
+
+menu                  : Run interactive menu.
+version               : Print the iMaker version number.
+
+For more info: http://configurationtools/imaker
+";
+exit(0);
+}
+
+#@options = @ARGV;
+#shift @options;
+
+# Printing simulated imaker output to wrapper
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testGetConfigurationsNoConfigs" ) {
+print OUTFILE "Running help, no results\n";
+print "
+Testing new API
+
+
+Total duration: 00:01
+";
+
+exit(0); # Just to ensure that no other results are returned
+
+}
+
+
+
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if($ARGV[0] eq "help-config") {
+print OUTFILE "Running help-config, full results\n";
+print "
+iMaker 09.14.02, 24-Apr-2009.
+Finding available configuration file(s):
+/epoc32/rom/config/ncp52/alvin/image_conf_alvin.mk
+";
+
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoTargets
+# help-target
+#
+##########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /alvin/ ) 
+    and ($ARGV[0] eq "help-target")) {
+print OUTFILE "Running help-target, full results\n";
+print "
+iMaker 09.14.02, 24-Apr-2009.
+----------------------------------------
+all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+clean
+Type       : Target
+Description: Clean all target files.
+----------------------------------------
+core
+Type       : Target
+Description: Create the core image (ROM,ROFS1)
+----------------------------------------
+core-image
+Type       : Target
+Description: Create the core image files (rom.img, rofs1.img)
+----------------------------------------
+e2flash
+Type       : Target
+Description: Create the elf2flash (flash) file.
+----------------------------------------
+f2image
+Type       : Target
+Description: Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)
+----------------------------------------
+flash
+Type       : Target
+Description: Create all image sections files. Not any symbol files.
+----------------------------------------
+flash-all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+help
+Type       : Target
+Description: Print help on help targets.
+----------------------------------------
+help-%
+Type       : Target
+Description: Print help on help items matching the pattern.
+----------------------------------------
+help-%-list
+Type       : Target
+Description: Print a list of help items matching the pattern.
+----------------------------------------
+help-config
+Type       : Target
+Description: Print a list of available configurations in the current working environment.
+----------------------------------------
+help-target
+Type       : Target
+Description: Print help on all targets (same as help-target-*).
+----------------------------------------
+help-target-%
+Type       : Target
+Description: Print help on targets matching the pattern.
+----------------------------------------
+help-target-%-list
+Type       : Target
+Description: Print a list of targets matching the pattern.
+----------------------------------------
+help-target-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on targets matching the pattern.
+----------------------------------------
+help-variable
+Type       : Target
+Description: Print help on all variables (same as help-variable-*).
+----------------------------------------
+help-variable-%
+Type       : Target
+Description: Print help on variables matching the pattern.
+----------------------------------------
+help-variable-%-all
+Type       : Target
+Description: Print full help on variables matching the pattern.
+----------------------------------------
+help-variable-%-list
+Type       : Target
+Description: Print a list of variables matching the pattern.
+----------------------------------------
+help-variable-%-value
+Type       : Target
+Description: Print a list of variables with values matching the pattern.
+----------------------------------------
+help-variable-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on variables matching the pattern.
+----------------------------------------
+image
+Type       : Target
+Description: Create only the image file(s) (*.img)
+----------------------------------------
+langpack_all
+Type       : Target
+Description: Create all language packages.
+----------------------------------------
+langpack_china
+Type       : Target
+Description: Create language packages that belong to China region.
+----------------------------------------
+langpack_japan
+Type       : Target
+Description: Create language packages that belong to Japan region.
+----------------------------------------
+langpack_western
+Type       : Target
+Description: Create language packages that belong to Western region.
+----------------------------------------
+print-%
+Type       : Target
+Description: Print the value of the given variable to the screen.
+----------------------------------------
+rofs2
+Type       : Target
+Description: Create the rofs2 image
+----------------------------------------
+rofs2-image
+Type       : Target
+Description: Create the rofs2 image file (rofs2.img)
+----------------------------------------
+rofs3
+Type       : Target
+Description: Create the rofs3 image
+----------------------------------------
+rofs3-image
+Type       : Target
+Description: Create the rofs3 image file (rofs3.img)
+----------------------------------------
+romsymbol
+Type       : Target
+Description: Create the rom symbol file
+----------------------------------------
+step-%
+Type       : Target
+Description: Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands.
+----------------------------------------
+toolinfo
+Type       : Target
+Description: Print info about the tool
+----------------------------------------
+uda
+Type       : Target
+Description: Create the User Data area (uda) image.
+----------------------------------------
+uda-image
+Type       : Target
+Description: Create the User Data area (uda) image.
+----------------------------------------
+variant
+Type       : Target
+Description: Create the variant image (rofs2,rofs3)
+----------------------------------------
+variant-image
+Type       : Target
+Description: Create the variant image files (rofs3.img,rofs3.img)
+----------------------------------------
+variantrofs2
+Type       : Target
+Description: Create an image from a variant with rofs2. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantrofs3
+Type       : Target
+Description: Create an image from a customer variant folder. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantuda
+Type       : Target
+Description: Create an image from a variant userdata folder. Be sure to define the VARIANT_DIR.
+----------------------------------------
+version
+Type       : Target
+Description: Print the version information
+";
+
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /alvin/ ) 
+    and ($ARGV[0] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, giving full list\n";
+print "
+iMaker 09.14.02, 24-Apr-2009.
+----------------------------------------
+BLDROBY = `'
+Type       : Variable
+Description: For passing extra oby files (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+BLDROM_OPT = `-loglevel1  -v -nosymbols    -D_IMAGE_TYPE_RND'
+Type       : Variable
+Description: The default buildrom.pl options
+Values     : (string)
+----------------------------------------
+BLDROPT = `'
+Type       : Variable
+Description: For passing extra parameters (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+CONFIGROOT = `/epoc32/rom/config'
+Type       : Variable
+Description: Define the default configuration root directory.
+Values     : (string)
+----------------------------------------
+CORE_CDPROMFILE = `/epoc32/rombuild/odpcoderomfiles.txt'
+Type       : Variable
+Description: The name of the core Code Demand Paging rom file (Code paging).
+Values     : (string)
+----------------------------------------
+CORE_DIR = `/epoc32/rombuild/alvin/core'
+Type       : Variable
+Description: The working directory, when creating core image
+Values     : (string)
+----------------------------------------
+CORE_FLASH = `/epoc32/rombuild/alvin/alvin_5230_rnd.fpsx'
+Type       : Variable
+Description: The name of the flashable core image.
+Values     : (string)
+----------------------------------------
+CORE_FWIDFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_fwid.txt'
+Type       : Variable
+Description: The (generated) _core_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_imeisv.txt'
+Type       : Variable
+Description: The (generated) _core_imeisv.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVINFO = `00'
+Type       : Variable
+Description: The content string for the imeisv.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MODELFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_model.txt'
+Type       : Variable
+Description: The (generated) _core_model.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_MODELINFO = `S60'
+Type       : Variable
+Description: The content string for the model.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MSTOBY = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_master.oby'
+Type       : Variable
+Description: The generated master oby file name, which includes the CORE_OBY files
+Values     : (string)
+----------------------------------------
+CORE_NAME = `/epoc32/rombuild/alvin/core/alvin_5230_rnd'
+Type       : Variable
+Description: The name of the core image
+Values     : (string)
+----------------------------------------
+CORE_NDPROMFILE = `/epoc32/rombuild/romfiles.txt'
+Type       : Variable
+Description: The name of the core Non Demand Paging rom file.
+Values     : (string)
+----------------------------------------
+CORE_OBY = `/epoc32/rom/ncp.oby'
+Type       : Variable
+Description: The oby file(s) included to the core image creation
+Values     : (string)
+----------------------------------------
+CORE_ODPROMFILE = `/epoc32/rombuild/odpromfiles.txt'
+Type       : Variable
+Description: The name of the core On Demand Paging rom file (Rom paging).
+Values     : (string)
+----------------------------------------
+CORE_OPT = `-loglevel1  -v -nosymbols    -D_IMAGE_TYPE_RND -D_EABI=ARMV5 -D_ASIC_VER_11    -DALVIN  -DLCD_SHELL'
+Type       : Variable
+Description: The core specific buildrom options
+Values     : (string)
+----------------------------------------
+CORE_PLATFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_platform.txt'
+Type       : Variable
+Description: The (generated) _core_platform.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_PLATINFO = `SymbianOSMajorVersion=9\nSymbianOSMinorVersion=4\n'
+Type       : Variable
+Description: The content string for the fwid.txt file.
+Values     : (string)
+----------------------------------------
+CORE_PRODFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_product.txt'
+Type       : Variable
+Description: The (generated) _core_product.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_ROFSFILE = `/epoc32/rombuild/odpcoderofsfiles.txt'
+Type       : Variable
+Description: The name of the core rofs file.
+Values     : (string)
+----------------------------------------
+CORE_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rom version parameter passed to the version.iby
+Values     : (string)
+----------------------------------------
+CORE_SWVERFILE = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_sw.txt'
+Type       : Variable
+Description: The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file.
+Values     : (string)
+----------------------------------------
+CORE_SWVERINFO = `V 52.50.2009.37.024 RND\n11-09-09\nRM-559\n(c) Nokia'
+Type       : Variable
+Description: The content string for the sw.txt file.
+Values     : (string)
+----------------------------------------
+CORE_TIME = `11/09/2009'
+Type       : Variable
+Description: The time defined to the core image
+Values     : (string)
+----------------------------------------
+CORE_UDEBFILE = `/epoc32/rombuild/mytraces.txt'
+Type       : Variable
+Description: The name of the core udeb file. See USE_UDEB.
+Values     : (string)
+----------------------------------------
+CORE_VERIBY = `/epoc32/rombuild/alvin/core/alvin_5230_rnd_core_version.iby'
+Type       : Variable
+Description: The name of the generated core *version.iby, which included version files and info
+Values     : (string)
+----------------------------------------
+CORE_VERSION = `V 52.50.2009.37.024 RND'
+Type       : Variable
+Description: The version of the core. Used in sw.txt generation.
+Values     : (string)
+----------------------------------------
+COREPLAT_NAME = `ncp52'
+Type       : Variable
+Description: Name of the core platform
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_COMPLP = `'
+Type       : Variable
+Description: Compatible language variant.
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_DIR = `/epoc32/rom/config/ncp52/alvin/customer/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+FLASH_EXT = `.fpsx'
+Type       : Variable
+Description: The flash file extension.
+Values     : (string)
+----------------------------------------
+HWID = `5230'
+Type       : Variable
+Description: Hardware Id
+Values     : ([0-9]4)
+----------------------------------------
+HWID_LIST = `5230'
+Type       : Variable
+Description: Possible Hardware Ids of the product.
+Values     : ([0-9]4)*
+----------------------------------------
+KEEPTEMP = `0'
+Type       : Variable
+Description: Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby
+Values     : ([0|1])
+----------------------------------------
+LABEL = `'
+Type       : Variable
+Description: A label to the NAME of the image
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFCP = `5250  alvin  '
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFML = `/epoc32/rom/config/ncp52/alvin/alvin.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for language pack, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_DEFAULTLANG = `English'
+Type       : Variable
+Description: Default language is the language where the device will boot to (SIM language overrides this selection)
+Values     : (string)
+----------------------------------------
+LANGPACK_DIR = `/epoc32/rom/config/ncp52/alvin/language/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_ID = `01'
+Type       : Variable
+Description: Language id used in the lang.txt generation
+Values     : (string)
+----------------------------------------
+LANGPACK_LANGS = `English'
+Type       : Variable
+Description: Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)
+Values     : (string)
+----------------------------------------
+NAME = `alvin_5230_rnd'
+Type       : Variable
+Description: The name of the image
+Values     : (string)
+----------------------------------------
+OPERATOR_OBY = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The name for generated operator oby, which is a file generated based on an operator specific content.
+Values     : (string)
+----------------------------------------
+OPERATOR_OBYGEN = `geniby | /epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby | #include \"%3\" | end'
+Type       : Variable
+Description: The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder).
+Values     : (string)|(string)|(string)
+----------------------------------------
+PRODUCT_MODEL = `N00'
+Type       : Variable
+Description: The model of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_NAME = `alvin'
+Type       : Variable
+Description: Name of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_REVISION = `01'
+Type       : Variable
+Description: The revision of the product.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFCP = `5250  alvin '
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFML = `/epoc32/rom/config/ncp52/alvin/alvin.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for product variant, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_DIR = `/epoc32/rom/config/ncp52/alvin'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+ROFS2_DIR = `/epoc32/rombuild/alvin/rofs2'
+Type       : Variable
+Description: The working directory, when creating the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_FLASH = `/epoc32/rombuild/alvin/rofs2/alvin_5230_rnd.rofs2.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDFILE = `/epoc32/rombuild/alvin/rofs2/alvin_5230_rnd_rofs2_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs2_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDINFO = `id=language\nversion=01\n'
+Type       : Variable
+Description: The content string for the fwid2.txt file.
+Values     : (string)
+----------------------------------------
+ROFS2_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_MSTOBY = `/epoc32/rombuild/alvin/rofs2/alvin_5230_rnd_rofs2_master.oby'
+Type       : Variable
+Description: The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters
+Values     : (string)
+----------------------------------------
+ROFS2_NAME = `/epoc32/rombuild/alvin/rofs2/alvin_5230_rnd'
+Type       : Variable
+Description: The name of the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_OBY = `'
+Type       : Variable
+Description: The oby file(s) included to the rofs2 image creation
+Values     : (string)
+----------------------------------------
+ROFS2_OPT = `'
+Type       : Variable
+Description: The rofs2 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS2_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs2 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS2_TIME = `11/09/2009'
+Type       : Variable
+Description: The time defined to the rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_VERIBY = `/epoc32/rombuild/alvin/rofs2/alvin_5230_rnd_rofs2_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWFILE = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_customersw.txt'
+Type       : Variable
+Description: The (generated) source file name for customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWINFO = `V 52.50.2009.37.024 RND\n11-09-09'
+Type       : Variable
+Description: The content string for the customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_DIR = `/epoc32/rombuild/alvin/rofs3'
+Type       : Variable
+Description: The working directory, when creating the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_FLASH = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd.rofs3.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDFILE = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs3_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDINFO = `id=customer\nversion=V 52.50.2009.37.024 RND Customer\n'
+Type       : Variable
+Description: The content string for the fwid3.txt file.
+Values     : (string)
+----------------------------------------
+ROFS3_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_MSTOBY = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_master.oby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_NAME = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd'
+Type       : Variable
+Description: The name of the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_OBY = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The oby file(s) included to the rofs3 image creation
+Values     : (string)
+----------------------------------------
+ROFS3_OPT = `'
+Type       : Variable
+Description: The rofs3 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS3_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs3 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS3_TIME = `11/09/2009'
+Type       : Variable
+Description: The time defined to the rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_VERIBY = `/epoc32/rombuild/alvin/rofs3/alvin_5230_rnd_rofs3_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+SOS_VERSION = `9.4'
+Type       : Variable
+Description: Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)
+Values     : ([0-9]+.[0-9]+)
+----------------------------------------
+SWUPD_EXT = `.swupd'
+Type       : Variable
+Description: The software update file extension.
+Values     : (string)
+----------------------------------------
+TYPE = `rnd'
+Type       : Variable
+Description: Defines the image type.
+Values     : (rnd|prd|subcon)
+----------------------------------------
+USE_OVERRIDE = `1'
+Type       : Variable
+Description: Define whether the override.pm Buildrom.pl plugin is used.
+Values     : ([0|1])
+----------------------------------------
+USE_PAGING = `code'
+Type       : Variable
+Description: Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code).
+Values     : ((0|rom|code[:[(1|2|3)]+]?))
+----------------------------------------
+USE_ROFS = `1'
+Type       : Variable
+Description: Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3).
+Values     : ([[dummy|]0..6][,[dummy|]0..6]*)
+----------------------------------------
+USE_ROMFILE = `1'
+Type       : Variable
+Description: Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1.
+Values     : ([0|1])
+----------------------------------------
+USE_SYMGEN = `0'
+Type       : Variable
+Description: Generate the rom symbol file. 0=Do not generate, 1=Generate
+Values     : ([0|1])
+----------------------------------------
+USE_UDEB = `0'
+Type       : Variable
+Description: Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel.
+Values     : ([0|1|full])
+----------------------------------------
+USE_VERGEN = `0'
+Type       : Variable
+Description: Use iMaker version info generation
+Values     : ([0|1])
+----------------------------------------
+VARIANT_CONFCP = `5250  alvin '
+Type       : Variable
+Description: Configure which ConfigurationTool generated configurations dirs are copied to output.
+Values     : (string)
+----------------------------------------
+VARIANT_CONFML = `/epoc32/rom/config/ncp52/alvin/alvin.confml'
+Type       : Variable
+Description: Configure what is the ConfigurationTool input confml file, when configuration tool is ran.
+Values     : (string)
+----------------------------------------
+VARIANT_DIR = `/epoc32/rom/config/ncp52/alvin'
+Type       : Variable
+Description: Configure the directory where to included the customer variant content. By default all content under  is included to the image as it exists in the folder.
+Values     : (string)
+----------------------------------------
+WORKDIR = `/epoc32/rombuild/alvin'
+Type       : Variable
+Description: The working directory for the image creation
+Values     : (string)
+";
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($testCase eq "test_case=testGetConfigurationsNoConfigElements") 
+    and ($ARGV[1] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, no results\n";
+print "
+Testing new API
+----------------------------------------
+
+Total duration: 00:01
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImage
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImage" ) {
+print OUTFILE "Running build image, returning builder result\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+
+Total duration: 01:13
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImageFailed
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImageFailed" ) {
+print OUTFILE "Running build image, returning builder result with errors\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+error: something went wrong
+
+
+";
+}
+
+
+
+####################
+END {
+print OUTFILE "---------------------------------------------------------------\n";
+close OUTFILE;
+}
+
+
+#EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMakerStub_093701.pl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1011 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+##########################################################################################################################
+##########################################################################################################################
+#
+# iMakerStub.pl
+#
+# Test stub for iMaker plugin JUnit tests.
+#
+# This stub is used by IMakerWrapperTest and runs one iMaker call at the time.
+# File must be placed to C:\tests\ directory.
+#
+#
+##########################################################################################################################
+##########################################################################################################################
+
+
+$time = localtime;
+open OUTFILE, ">>out_iMakerStub.txt";
+print OUTFILE "iMakerStub.pl called at $time\n";
+
+$numArgs = $#ARGV + 1;
+print OUTFILE "Number of arguments: $numArgs\n";
+$testCase = $ARGV[0];
+print $testCase;
+print OUTFILE "Test case: $testCase\n";
+
+print OUTFILE "Arguments:\n";
+foreach $argnum (0 .. $#ARGV) {
+   print OUTFILE "\t$ARGV[$argnum]\n";
+}
+
+if($numArgs eq 0) {
+print "
+iMaker 09.37.01, 07-Sep-2009.
+
+Print help data on documented iMaker API items; targets and variables.
+Wildcards *, ? and [..] can be used with % patterns.
+
+help                  : Print this message.
+help-%                : Print help on help items matching the pattern.
+help-%-list           : Print a list of help items matching the pattern.
+
+help-target           : Print help on all targets (same as help-target-*).
+help-target-%         : Print help on targets matching the pattern.
+help-target-%-wiki    : Print wiki-formatted help on targets matching the patter
+n.
+help-target-%-list    : Print a list of targets matching the pattern.
+
+help-variable         : Print help on all variables (same as help-variable-*).
+help-variable-%       : Print help on variables matching the pattern.
+help-variable-%-all   : Print full help on variables matching the pattern.
+help-variable-%-wiki  : Print wiki-formatted help on variables matching the patt
+ern.
+help-variable-%-list  : Print a list of variables matching the pattern.
+help-variable-%-value : Print a list of variables with values matching the patte
+rn.
+
+help-config           : Print a list of available configurations in the current
+working environment.
+
+menu                  : Run interactive menu.
+version               : Print the iMaker version number.
+
+For more info: http://configurationtools/imaker
+";
+exit(0);
+}
+
+#@options = @ARGV;
+#shift @options;
+
+# Printing simulated imaker output to wrapper
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testGetConfigurationsNoConfigs" ) {
+print OUTFILE "Running help, no results\n";
+print "
+Testing new API
+
+
+Total duration: 00:01
+";
+
+exit(0); # Just to ensure that no other results are returned
+
+}
+
+
+
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigs
+# help-config
+#
+##########################################################################################################################
+##########################################################################################################################
+if($ARGV[0] eq "help-config") {
+print OUTFILE "Running help-config, full results\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+Finding available configuration file(s):
+/epoc32/rom/config/ncp77/filippa/image_conf_filippa.mk
+";
+
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoTargets
+# help-target
+#
+##########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /filippa/ ) 
+    and ($ARGV[0] eq "help-target")) {
+print OUTFILE "Running help-target, full results\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+----------------------------------------
+all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+clean
+Type       : Target
+Description: Clean all target files.
+----------------------------------------
+core
+Type       : Target
+Description: Create Core (ROM & ROFS1) image.
+----------------------------------------
+core-dir
+Type       : Target
+Description: Create directory structure for Core (ROM & ROFS1) creation.
+----------------------------------------
+core-i2file
+Type       : Target
+Description: Extract all files from Core (ROM & ROFS1) image.
+----------------------------------------
+core-image
+Type       : Target
+Description: Create Core (ROM & ROFS1) image (.img) file(s).
+----------------------------------------
+core-pre
+Type       : Target
+Description: Run pre-step, create files etc. for Core (ROM & ROFS1) creation.
+----------------------------------------
+core-symbol
+Type       : Target
+Description: Create Core (ROM & ROFS1) symbol file(s).
+----------------------------------------
+default
+Type       : Target
+Description: Default target, uses variable TARGET_DEFAULT to get actual target(s), current default = core.
+----------------------------------------
+e2flash
+Type       : Target
+Description: Create the elf2flash (flash) file.
+----------------------------------------
+f2image
+Type       : Target
+Description: Revert the Symbian image file (.img) from the elf2flash (flash) file.(See CORE_FLASH,ROFS2_FLASH,ROFS3_FLASH)
+----------------------------------------
+flash
+Type       : Target
+Description: Create all image sections files. Not any symbol files.
+----------------------------------------
+flash-all
+Type       : Target
+Description: Create all image sections and symbol files.
+----------------------------------------
+fota
+Type       : Target
+Description: Create the FOTA sub-image.
+----------------------------------------
+help
+Type       : Target
+Description: Print help on help targets.
+----------------------------------------
+help-%
+Type       : Target
+Description: Print help on help items matching the pattern.
+----------------------------------------
+help-%-list
+Type       : Target
+Description: Print a list of help items matching the pattern.
+----------------------------------------
+help-config
+Type       : Target
+Description: Print a list of available configurations in the current working environment.
+----------------------------------------
+help-target
+Type       : Target
+Description: Print help on all targets (same as help-target-*).
+----------------------------------------
+help-target-%
+Type       : Target
+Description: Print help on targets matching the pattern.
+----------------------------------------
+help-target-%-list
+Type       : Target
+Description: Print a list of targets matching the pattern.
+----------------------------------------
+help-target-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on targets matching the pattern.
+----------------------------------------
+help-variable
+Type       : Target
+Description: Print help on all variables (same as help-variable-*).
+----------------------------------------
+help-variable-%
+Type       : Target
+Description: Print help on variables matching the pattern.
+----------------------------------------
+help-variable-%-all
+Type       : Target
+Description: Print full help on variables matching the pattern.
+----------------------------------------
+help-variable-%-list
+Type       : Target
+Description: Print a list of variables matching the pattern.
+----------------------------------------
+help-variable-%-value
+Type       : Target
+Description: Print a list of variables with values matching the pattern.
+----------------------------------------
+help-variable-%-wiki
+Type       : Target
+Description: Print wiki-formatted help on variables matching the pattern.
+----------------------------------------
+image
+Type       : Target
+Description: Create only the image file(s) (*.img)
+----------------------------------------
+langpack_all
+Type       : Target
+Description: Create all language packages.
+----------------------------------------
+langpack_china
+Type       : Target
+Description: Create language packages that belong to China region.
+----------------------------------------
+langpack_japan
+Type       : Target
+Description: Create language packages that belong to Japan region.
+----------------------------------------
+langpack_western
+Type       : Target
+Description: Create language packages that belong to Western region.
+----------------------------------------
+mmc
+Type       : Target
+Description: Create MMC/SD image.
+----------------------------------------
+mmc-dir
+Type       : Target
+Description: Create directory structure for MMC/SD creation.
+----------------------------------------
+mmc-image
+Type       : Target
+Description: Create MMC/SD image (.img) file.
+----------------------------------------
+mmc-pre
+Type       : Target
+Description: Run pre-step, create files etc. for MMC/SD creation.
+----------------------------------------
+print-%
+Type       : Target
+Description: Print the value(s) of the given variable(s). Wildcards *, ? and [..] can be used in variable names.
+----------------------------------------
+resignsubcon
+Type       : Target
+Description: Create re-signed security binaries for subcon image creation.
+----------------------------------------
+rofs2
+Type       : Target
+Description: Create ROFS2 image.
+----------------------------------------
+rofs2-dir
+Type       : Target
+Description: Create directory structure for ROFS2 creation.
+----------------------------------------
+rofs2-i2file
+Type       : Target
+Description: Extract all files from ROFS2 image.
+----------------------------------------
+rofs2-image
+Type       : Target
+Description: Create ROFS2 image (.img) file.
+----------------------------------------
+rofs2-pre
+Type       : Target
+Description: Run pre-step, create files etc. for ROFS2 creation.
+----------------------------------------
+rofs2-symbol
+Type       : Target
+Description: Create ROFS2 symbol file.
+----------------------------------------
+rofs3
+Type       : Target
+Description: Create ROFS3 image.
+----------------------------------------
+rofs3-dir
+Type       : Target
+Description: Create directory structure for ROFS3 creation.
+----------------------------------------
+rofs3-i2file
+Type       : Target
+Description: Extract all files from ROFS3 image.
+----------------------------------------
+rofs3-image
+Type       : Target
+Description: Create ROFS3 image (.img) file.
+----------------------------------------
+rofs3-pre
+Type       : Target
+Description: Run pre-step, create files etc. for ROFS3 creation.
+----------------------------------------
+rofs3-symbol
+Type       : Target
+Description: Create ROFS3 symbol file.
+----------------------------------------
+rofs4
+Type       : Target
+Description: Create DCC ROFS4 image.
+----------------------------------------
+rofs4-dir
+Type       : Target
+Description: Create directory structure for DCC ROFS4 creation.
+----------------------------------------
+rofs4-i2file
+Type       : Target
+Description: Extract all files from DCC ROFS4 image.
+----------------------------------------
+rofs4-image
+Type       : Target
+Description: Create DCC ROFS4 image (.img) file.
+----------------------------------------
+rofs4-pre
+Type       : Target
+Description: Run pre-step, create files etc. for DCC ROFS4 creation.
+----------------------------------------
+rofs4-symbol
+Type       : Target
+Description: Create DCC ROFS4 symbol file.
+----------------------------------------
+romsymbol
+Type       : Target
+Description: Create the rom symbol file
+----------------------------------------
+step-%
+Type       : Target
+Description: Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME. Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands.
+----------------------------------------
+toolinfo
+Type       : Target
+Description: Print info about the tool
+----------------------------------------
+uda
+Type       : Target
+Description: Create UDA image.
+----------------------------------------
+uda-dir
+Type       : Target
+Description: Create directory structure for UDA creation.
+----------------------------------------
+uda-image
+Type       : Target
+Description: Create UDA image (.img) file.
+----------------------------------------
+uda-pre
+Type       : Target
+Description: Run pre-step, create files etc. for UDA creation.
+----------------------------------------
+udaerase
+Type       : Target
+Description: Create the flashable UDA erase image.
+----------------------------------------
+variant
+Type       : Target
+Description: Create the variant image (rofs2,rofs3)
+----------------------------------------
+variant-image
+Type       : Target
+Description: Create the variant image files (rofs2.img, rofs3.img)
+----------------------------------------
+variantmmc
+Type       : Target
+Description: Create MMC/SD image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantrofs2
+Type       : Target
+Description: Create ROFS2 image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantrofs3
+Type       : Target
+Description: Create ROFS3 image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+variantuda
+Type       : Target
+Description: Create UDA image from a variant directory. Be sure to define the VARIANT_DIR.
+----------------------------------------
+version
+Type       : Target
+Description: Print the version information
+";
+
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: all test cases except testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($numArgs eq 3) and ($ARGV[2] =~ /filippa/ ) 
+    and ($ARGV[0] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, giving full list\n";
+print "
+iMaker 09.37.01, 07-Sep-2009.
+----------------------------------------
+BLDROBY = `'
+Type       : Variable
+Description: For passing extra oby files (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+BLDROM_OPT = `-loglevel1  -v -nosymbols   -DFEATUREVARIANT=filippa   -D__FEATURE_IBY__  -D_IMAGE_TYPE_RND'
+Type       : Variable
+Description: The default buildrom.pl options
+Values     : (string)
+----------------------------------------
+BLDROPT = `'
+Type       : Variable
+Description: For passing extra parameters (from command line) to the buildrom.pl
+Values     : (string)
+----------------------------------------
+CONFIGROOT = `/epoc32/rom/config'
+Type       : Variable
+Description: Define the default configuration root directory.
+Values     : (string)
+----------------------------------------
+CORE_CDPROMFILE = `/epoc32/rombuild/odpcoderomfiles.txt'
+Type       : Variable
+Description: The name of the core Code Demand Paging rom file (Code paging).
+Values     : (string)
+----------------------------------------
+CORE_DIR = `/epoc32/rombuild/filippa/core'
+Type       : Variable
+Description: The working directory, when creating core image
+Values     : (string)
+----------------------------------------
+CORE_FLASH = `/epoc32/rombuild/filippa/filippa_0010_rnd.fpsx'
+Type       : Variable
+Description: The name of the flashable core image.
+Values     : (string)
+----------------------------------------
+CORE_FWIDFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_fwid.txt'
+Type       : Variable
+Description: The (generated) _core_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_imeisv.txt'
+Type       : Variable
+Description: The (generated) _core_imeisv.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_IMEISVINFO = `00'
+Type       : Variable
+Description: The content string for the imeisv.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MODELFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_model.txt'
+Type       : Variable
+Description: The (generated) _core_model.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_MODELINFO = `S60'
+Type       : Variable
+Description: The content string for the model.txt file.
+Values     : (string)
+----------------------------------------
+CORE_MSTOBY = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_master.oby'
+Type       : Variable
+Description: The generated master oby file name, which includes the CORE_OBY files
+Values     : (string)
+----------------------------------------
+CORE_NAME = `/epoc32/rombuild/filippa/core/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the core image
+Values     : (string)
+----------------------------------------
+CORE_NDPROMFILE = `/epoc32/rombuild/romfiles.txt'
+Type       : Variable
+Description: The name of the core Non Demand Paging rom file.
+Values     : (string)
+----------------------------------------
+CORE_OBY = `/epoc32/rom/ncp.oby'
+Type       : Variable
+Description: The oby file(s) included to the core image creation
+Values     : (string)
+----------------------------------------
+CORE_ODPROMFILE = `/epoc32/rombuild/odpromfiles.txt'
+Type       : Variable
+Description: The name of the core On Demand Paging rom file (Rom paging).
+Values     : (string)
+----------------------------------------
+CORE_OPT = `-loglevel1  -v -nosymbols   -DFEATUREVARIANT=filippa   -D__FEATURE_IBY__  -D_IMAGE_TYPE_RND -D_EABI=ARMV5    -DFILIPPA  -D_IMAGE_TYPE_NCP -DLCD_SHELL -DBSW_USE_TEXTSHELL_UPDATER'
+Type       : Variable
+Description: The core specific buildrom options
+Values     : (string)
+----------------------------------------
+CORE_PLATFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_platform.txt'
+Type       : Variable
+Description: The (generated) _core_platform.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_PLATINFO = `SymbianOSMajorVersion=9\nSymbianOSMinorVersion=5\n'
+Type       : Variable
+Description: The content string for the fwid.txt file.
+Values     : (string)
+----------------------------------------
+CORE_PRODFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_product.txt'
+Type       : Variable
+Description: The (generated) _core_product.txt file name.
+Values     : (string)
+----------------------------------------
+CORE_ROFSFILE = `/epoc32/rombuild/odprofsfiles.txt'
+Type       : Variable
+Description: The name of the core rofs file.
+Values     : (string)
+----------------------------------------
+CORE_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rom version parameter passed to the version.iby
+Values     : (string)
+----------------------------------------
+CORE_SWVERFILE = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_sw.txt'
+Type       : Variable
+Description: The (generated) _core_sw.txt version file name. This generated file is included in the CORE_VERIBY file.
+Values     : (string)
+----------------------------------------
+CORE_SWVERINFO = `V 77.52.2009.24.0610_RC RND\n10-09-09\nRM-601\n(c) Nokia'
+Type       : Variable
+Description: The content string for the sw.txt file.
+Values     : (string)
+----------------------------------------
+CORE_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the core image
+Values     : (string)
+----------------------------------------
+CORE_UDEBFILE = `/epoc32/rombuild/mytraces.txt'
+Type       : Variable
+Description: The name of the core udeb file. See USE_UDEB.
+Values     : (string)
+----------------------------------------
+CORE_VERIBY = `/epoc32/rombuild/filippa/core/filippa_0010_rnd_core_version.iby'
+Type       : Variable
+Description: The name of the generated core *version.iby, which included version files and info
+Values     : (string)
+----------------------------------------
+CORE_VERSION = `V 77.52.2009.24.0610_RC RND'
+Type       : Variable
+Description: The version of the core. Used in sw.txt generation.
+Values     : (string)
+----------------------------------------
+COREPLAT_NAME = `ncp77'
+Type       : Variable
+Description: Name of the core platform
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_COMPLP = `'
+Type       : Variable
+Description: Compatible language variant.
+Values     : (string)
+----------------------------------------
+CUSTVARIANT_DIR = `/epoc32/rom/config/ncp77/filippa/customer/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+FLASH_EXT = `.fpsx'
+Type       : Variable
+Description: The flash file extension.
+Values     : (string)
+----------------------------------------
+HWID = `0010'
+Type       : Variable
+Description: Hardware Id
+Values     : ([0-9]4)
+----------------------------------------
+HWID_LIST = `0010 0020 0100 0110 0120 0130 0140 0200 0220'
+Type       : Variable
+Description: Possible Hardware Ids of the product.
+Values     : ([0-9]4)*
+----------------------------------------
+KEEPTEMP = `0'
+Type       : Variable
+Description: Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby
+Values     : ([0|1])
+----------------------------------------
+LABEL = `'
+Type       : Variable
+Description: A label to the NAME of the image
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFCP = `7752 filippa '
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for language pack, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_DEFAULTLANG = `English'
+Type       : Variable
+Description: Default language is the language where the device will boot to (SIM language overrides this selection)
+Values     : (string)
+----------------------------------------
+LANGPACK_DIR = `/epoc32/rom/config/ncp77/filippa/language/'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+LANGPACK_ID = `01'
+Type       : Variable
+Description: Language id used in the lang.txt generation
+Values     : (string)
+----------------------------------------
+LANGPACK_LANGS = `English'
+Type       : Variable
+Description: Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt)
+Values     : (string)
+----------------------------------------
+NAME = `filippa_0010_rnd'
+Type       : Variable
+Description: The name of the image
+Values     : (string)
+----------------------------------------
+OPERATOR_OBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The name for generated operator oby, which is a file generated based on an operator specific content.
+Values     : (string)
+----------------------------------------
+OPERATOR_OBYGEN = `geniby | /epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby | /epoc32/rom/include/operator | *.iby | #include \"%3\" | end'
+Type       : Variable
+Description: The name, path, rule for collecting content to the operator specific oby (E.g. operator.oby | /epoc32/rom/include/operator | *.iby collects all iby files from operator folder).
+Values     : (string)|(string)|(string)
+----------------------------------------
+PRODUCT_MODEL = `N00'
+Type       : Variable
+Description: The model of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_NAME = `filippa'
+Type       : Variable
+Description: Name of the product
+Values     : (string)
+----------------------------------------
+PRODUCT_REVISION = `01'
+Type       : Variable
+Description: The revision of the product.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFCP = `7752 filippa'
+Type       : Variable
+Description: Overrides the VARIANT_CONFCP for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Overrides the VARIANT_CONFML for product variant, see the instructions of VARIANT_CONFML for details.
+Values     : (string)
+----------------------------------------
+PRODVARIANT_DIR = `/epoc32/rom/config/ncp77/filippa'
+Type       : Variable
+Description: Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_CONFCP for details.
+Values     : (string)
+----------------------------------------
+ROFS2_DIR = `/epoc32/rombuild/filippa/rofs2'
+Type       : Variable
+Description: The working directory, when creating the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_FLASH = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd.rofs2.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDFILE = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs2_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS2_FWIDINFO = `id=language\nversion=01\n'
+Type       : Variable
+Description: The content string for the fwid2.txt file.
+Values     : (string)
+----------------------------------------
+ROFS2_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs2 master oby.
+Values     : (string)
+----------------------------------------
+ROFS2_MSTOBY = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_master.oby'
+Type       : Variable
+Description: The (generated) rofs2 master oby file name. This file includes the ROFS2_OBY files and other parameters
+Values     : (string)
+----------------------------------------
+ROFS2_NAME = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the rofs2 image
+Values     : (string)
+----------------------------------------
+ROFS2_OBY = `'
+Type       : Variable
+Description: The oby file(s) included to the rofs2 image creation
+Values     : (string)
+----------------------------------------
+ROFS2_OPT = `'
+Type       : Variable
+Description: The rofs2 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS2_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs2 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS2_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the rofs2 image.
+Values     : (string)
+----------------------------------------
+ROFS2_VERIBY = `/epoc32/rombuild/filippa/rofs2/filippa_0010_rnd_rofs2_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs2 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWFILE = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_customersw.txt'
+Type       : Variable
+Description: The (generated) source file name for customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_CUSTSWINFO = `V 77.52.2009.24.0610_RC RND\n10-09-09'
+Type       : Variable
+Description: The content string for the customersw.txt.
+Values     : (string)
+----------------------------------------
+ROFS3_DIR = `/epoc32/rombuild/filippa/rofs3'
+Type       : Variable
+Description: The working directory, when creating the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_FLASH = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd.rofs3.fpsx'
+Type       : Variable
+Description: The name of the flashable rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_FOOTER = `'
+Type       : Variable
+Description: This variable can contain a footer section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDFILE = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_fwid.txt'
+Type       : Variable
+Description: The (generated) _rofs3_fwid.txt file name.
+Values     : (string)
+----------------------------------------
+ROFS3_FWIDINFO = `id=customer\nversion=V 77.52.2009.24.0610_RC RND Customer\n'
+Type       : Variable
+Description: The content string for the fwid3.txt file.
+Values     : (string)
+----------------------------------------
+ROFS3_HEADER = `'
+Type       : Variable
+Description: This variable can contain a header section for the rofs3 master oby.
+Values     : (string)
+----------------------------------------
+ROFS3_MSTOBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_master.oby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+ROFS3_NAME = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd'
+Type       : Variable
+Description: The name of the rofs3 image
+Values     : (string)
+----------------------------------------
+ROFS3_OBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_operator.oby'
+Type       : Variable
+Description: The oby file(s) included to the rofs3 image creation
+Values     : (string)
+----------------------------------------
+ROFS3_OPT = `'
+Type       : Variable
+Description: The rofs3 specific buildrom options
+Values     : (string)
+----------------------------------------
+ROFS3_ROMVER = `0.01(0)'
+Type       : Variable
+Description: The rofs3 ROM version string
+Values     : (string)
+----------------------------------------
+ROFS3_TIME = `10/09/2009'
+Type       : Variable
+Description: The time defined to the rofs3 image.
+Values     : (string)
+----------------------------------------
+ROFS3_VERIBY = `/epoc32/rombuild/filippa/rofs3/filippa_0010_rnd_rofs3_version.iby'
+Type       : Variable
+Description: The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.
+Values     : (string)
+----------------------------------------
+SOS_VERSION = `9.5'
+Type       : Variable
+Description: Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN)
+Values     : ([0-9]+.[0-9]+)
+----------------------------------------
+SWUPD_EXT = `.swupd'
+Type       : Variable
+Description: The software update file extension.
+Values     : (string)
+----------------------------------------
+TARGET_DEFAULT = `core'
+Type       : Variable
+Description: Configure actual target(s) for target default.
+Values     : (string)
+----------------------------------------
+TYPE = `rnd'
+Type       : Variable
+Description: Defines the image type.
+Values     : (rnd|prd|subcon)
+----------------------------------------
+USE_OVERRIDE = `1'
+Type       : Variable
+Description: Define whether the override.pm Buildrom.pl plugin is used.
+Values     : ([0|1])
+----------------------------------------
+USE_PAGING = `rom'
+Type       : Variable
+Description: Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code).
+Values     : ((0|rom|code[:[(1|2|3)]+]?))
+----------------------------------------
+USE_PLATSIM = `0'
+Type       : Variable
+Description: Define that the configuration is a PlatSim configuration.
+Values     : (string)
+----------------------------------------
+USE_ROFS = `1'
+Type       : Variable
+Description: Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3).
+Values     : ([[dummy|]0..6][,[dummy|]0..6]*)
+----------------------------------------
+USE_ROMFILE = `1'
+Type       : Variable
+Description: Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1.
+Values     : ([0|1])
+----------------------------------------
+USE_SYMGEN = `0'
+Type       : Variable
+Description: Generate the rom symbol file. 0=Do not generate, 1=Generate
+Values     : ([0|1])
+----------------------------------------
+USE_UDEB = `0'
+Type       : Variable
+Description: Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel.
+Values     : ([0|1|full])
+----------------------------------------
+USE_VERGEN = `1'
+Type       : Variable
+Description: Use iMaker version info generation
+Values     : ([0|1])
+----------------------------------------
+VARIANT_CONFCP = `7752 filippa'
+Type       : Variable
+Description: Configure which ConfigurationTool generated configurations dirs are copied to output.
+Values     : (string)
+----------------------------------------
+VARIANT_CONFML = `/epoc32/rom/config/ncp77/filippa/filippa.confml'
+Type       : Variable
+Description: Configure what is the ConfigurationTool input confml file, when configuration tool is ran.
+Values     : (string)
+----------------------------------------
+VARIANT_DIR = `/epoc32/rom/config/ncp77/filippa'
+Type       : Variable
+Description: Configure the directory where to included the customer variant content. By default all content under  is included to the image as it exists in the folder.
+Values     : (string)
+----------------------------------------
+WORKDIR = `/epoc32/rombuild/filippa'
+Type       : Variable
+Description: The working directory for the image creation
+Values     : (string)
+";
+}
+
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testGetConfigurationsNoConfigElements
+# help-variable-*-all
+#
+###########################################################################################################################
+##########################################################################################################################
+if(($testCase eq "test_case=testGetConfigurationsNoConfigElements") 
+    and ($ARGV[1] eq "help-variable-*-all")) {
+print OUTFILE "Running help-variable-*-all, no results\n";
+print "
+Testing new API
+----------------------------------------
+
+Total duration: 00:01
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImage
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImage" ) {
+print OUTFILE "Running build image, returning builder result\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+
+Total duration: 01:13
+
+";
+}
+
+##########################################################################################################################
+##########################################################################################################################
+#
+# Test Case: testBuildImageFailed
+# 
+###########################################################################################################################
+##########################################################################################################################
+if( $testCase eq "test_case=testBuildImageFailed" ) {
+print OUTFILE "Running build image, returning builder result with errors\n";
+
+print "
+Testing new API
+Generating oby for Variant ROFS2 image creation
+Generating ROFS2 version file(s)
+Creating Variant ROFS2 SOS image
+Generating Variant ROFS2 Elf2flash configuration
+Adding BB5 Common Header(s) to Variant ROFS2
+Creating flashable Variant ROFS2 image
+error: something went wrong
+
+
+";
+}
+
+
+
+####################
+END {
+print OUTFILE "---------------------------------------------------------------\n";
+close OUTFILE;
+}
+
+
+#EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker.tests/tools/iMaker_imp.pl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,49 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+##########################################################################################################################
+##########################################################################################################################
+#
+# iMakerStub.pl
+#
+# Test stub for iMaker plugin JUnit tests.
+#
+# This stub is used by IMakerWrapperTest and runs one iMaker call at the time.
+# File must be placed to C:\tests\ directory.
+#
+#
+##########################################################################################################################
+##########################################################################################################################
+
+$numArgs = $#ARGV + 1;
+
+sub printArgs {
+	print "-----------------------\n";
+	print "Commandline arguments:\n";
+	foreach $argnum (0 .. $#ARGV) {
+	   print "$ARGV[$argnum]\n";
+	}
+}
+
+if(($numArgs eq 2) and($ARGV[0] eq "-f") and ($ARGV[1] =~ /.imp$/)) {
+	print "Okei!\n";
+	printArgs();
+	exit 0;
+} else {
+	print "Bad arguments!\n";
+	printArgs();
+	exit 2;
+}
+#$testCase = $ARGV[0];
+#print $testCase;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.imaker</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/.settings/org.eclipse.jdt.ui.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3 @@
+#Wed Nov 14 12:01:49 EET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/META-INF/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/META-INF/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.imakerplugin</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/META-INF/.settings/org.eclipse.core.resources.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,4 @@
+#Thu Aug 16 11:06:44 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/codeformatchecker/messages.properties=8859_1
+encoding//src/com/nokia/codeformatchecker/preferences/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %plugin.Name
+Bundle-SymbolicName: com.nokia.s60tools.imaker;singleton:=true
+Bundle-ToolName: iMaker - Carbide.c++ extension
+Bundle-Version: 2.2.4
+Bundle-Date: 01-10-2009
+Bundle-RepositoryVersion: n/a
+Bundle-Activator: com.nokia.s60tools.imaker.IMakerPlugin
+Bundle-Vendor: %plugin.providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.jface.text,
+ org.eclipse.ui.workbench.texteditor,
+ com.nokia.s60tools.util;bundle-version="1.5.0",
+ com.nokia.carbide.cpp.sdk.core;bundle-version="2.0.0",
+ org.eclipse.ui.console;bundle-version="3.4.0",
+ com.nokia.carbide.cdt.builder;bundle-version="2.0.0"
+Eclipse-LazyStart: true
+Export-Package: com.nokia.s60tools.imaker;
+  uses:="org.eclipse.core.runtime,
+   org.eclipse.jface.resource,
+   org.eclipse.ui,
+   org.eclipse.swt.events,
+   org.eclipse.ui.plugin,
+   com.nokia.s60tools.imakerplugin.wrapper,
+   org.eclipse.core.runtime.jobs,
+   org.osgi.framework,
+   org.eclipse.swt.widgets,
+   org.eclipse.ui.editors.text",
+ com.nokia.s60tools.imaker.exceptions,
+ com.nokia.s60tools.imaker.internal.actions;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.jface.action,
+   org.eclipse.ui,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.widgets",
+ com.nokia.s60tools.imaker.internal.console;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.dialogs;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.iqrf;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.emf.ecore,
+   org.eclipse.emf.common.util",
+ com.nokia.s60tools.imaker.internal.iqrf.impl;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.emf.ecore,
+   org.eclipse.emf.common.util,
+   org.eclipse.emf.ecore.impl,
+   org.eclipse.emf.common.notify,
+   iQRF",
+ com.nokia.s60tools.imaker.internal.iqrf.util;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.emf.ecore,
+   org.eclipse.emf.common.notify.impl,
+   org.eclipse.emf.common.notify,
+   iQRF",
+ com.nokia.s60tools.imaker.internal.iqrf.wrapper;x-friends:="com.nokia.s60tools.imaker.tests";uses:="iQRF",
+ com.nokia.s60tools.imaker.internal.managers;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.model;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.model.iContent;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.model.iContent.util;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.preferences;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.jface.preference,
+   org.eclipse.ui,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.widgets,
+   org.eclipse.core.runtime.preferences",
+ com.nokia.s60tools.imaker.internal.providers;x-friends:="com.nokia.s60tools.imaker.tests",
+ com.nokia.s60tools.imaker.internal.viewers;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="com.nokia.s60tools.imakerplugin.wrapper,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.widgets",
+ com.nokia.s60tools.imaker.internal.wrapper;x-friends:="com.nokia.s60tools.imaker.tests";
+  uses:="org.eclipse.core.runtime,
+   com.nokia.s60tools.imakerplugin.viewers,
+   iQRF"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”>
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content=”text/html; charset=ISO-8859-1”>
+</head>
+<body lang=”EN-US”>
+<h2>About This Content</h2>
+ 
+<p>Mar 10, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+This product includes software developed by Eclipse Project. 
+<a href=”http://www.eclipse.org”>http://www.eclipse.org</a>.
+</p>
+
+<p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20071205"
+0=5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - iMaker \n\
+\n\
+Version: 2.2.4\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.\n\
+\n\
+This product includes software developed by Eclipse Project\n\
+(http://www.eclipse.org/).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               icons/,\
+               about.html,\
+               bin/,\
+               build.properties,\
+               .classpath,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               license.txt,\
+               .settings/,\
+               doc/
+src.includes = src/,\
+               plugin.xml,\
+               plugin.properties,\
+               icons/,\
+               build.properties,\
+               about.html,\
+               META-INF/,\
+               .classpath,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               license.txt,\
+               .settings/,\
+               .project,\
+               doc/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.imaker" default="build.jars" basedir=".">
+	<property file="../common.properties"/>
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	<property name="bundleId" value="com.nokia.s60tools.imaker"/>
+
+	<!-- Compiler settings. -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="logExtension"     value=".log"/>
+	<property name="compilerArg"      value=""/>
+
+	<target name="init" depends="properties">
+		<property name="pluginTemp" value="${basedir}"/>
+		<property name="build.result.folder" value="${basedir}/build.result"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the plug-in: com.nokia.s60tools.imaker for an update site.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<jar destfile="${plugin.destination}/com.nokia.s60tools.imaker_${plugin.version}.jar" basedir="${temp.folder}/com.nokia.s60tools.imaker_${plugin.version}" filesetmanifest="merge"/>
+		<copy todir="../${plugin.lib}" file="${plugin.destination}/com.nokia.s60tools.imaker_${plugin.version}.jar" failonerror="true" overwrite="true" />
+		<delete dir="${temp.folder}"/>
+		<delete dir="${build.result.folder}"/>
+	</target>
+
+	<target name="@dot" depends="init" unless="@dot" description="Create jar: com.nokia.s60tools.imaker @dot.">
+		<delete dir="${temp.folder}/@dot.bin"/>
+		<mkdir dir="${temp.folder}/@dot.bin"/>
+		<path id="@dot.classpath">
+			<fileset dir="${eclipse.home}/plugins">
+		    	<include name="**/*.jar"/>
+				<exclude name="com.nokia.s60tools.imaker*"/>
+		   	</fileset>
+		</path>
+		<!-- compile the source code -->
+		<javac destdir="${temp.folder}/@dot.bin" failonerror="${javacFailOnError}" source="${common.javac-source}" target="${common.javac-target}">
+			<classpath refid="@dot.classpath"/>
+			<src path="src/"/>
+		</javac>
+		
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/@dot.bin" failonerror="true" overwrite="false">
+			<fileset dir="src/">
+				<exclude name="**/*.java"/>
+				<exclude name="**/package.htm*"/>
+			</fileset>
+		</copy>
+		<mkdir dir="${build.result.folder}"/>
+		<copy todir="${build.result.folder}/@dot" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/@dot.bin">
+			</fileset>
+		</copy>
+		<delete dir="${temp.folder}/@dot.bin"/>
+	</target>
+
+	<target name="src.zip" depends="init" unless="src.zip">
+		<mkdir dir="${build.result.folder}"/>
+		<antcall target="zip.src.zip"/>
+	</target>
+	<target name="zip.src.zip">
+		<zip destfile="${build.result.folder}/src.zip" filesonly="false" whenempty="skip" update="false">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</zip>
+	</target>
+	<target name="copy.src.zip">
+		<copy todir="${source.destination.folder}/" failonerror="true" overwrite="true">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.jars" depends="init" description="Compile classes and build nested jars for the plug-in: com.nokia.s60tools.imaker.">
+		<available property="@dot" file="${build.result.folder}/@dot"/>
+		<antcall target="@dot"/>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<available property="src.zip" file="${build.result.folder}/src.zip"/>
+		<antcall target="src.zip"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${build.result.folder}/@dot">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="META-INF/"/>
+				<include name="plugin.xml"/>
+				<include name="plugin.properties"/>
+				<include name="icons/"/>
+				<include name="about.html"/>
+			<!--	<include name="bin/"/> -->
+			<!--	<include name="build.properties"/> -->
+			<!--	<include name="model/"/>  -->
+			<!--	<include name=".classpath"/>  -->
+				<include name="about.ini"/>
+				<include name="about.mappings"/>
+				<include name="about.properties"/>
+				<include name="license.txt"/>
+			<!--	<include name=".settings/"/> -->
+				<include name="doc/"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}"/>
+		<copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}" failonerror="false" overwrite="false"/>
+		<antcall target="copy.src.includes">
+			<param name="source.destination.folder" value="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}"/>
+		</antcall>
+	</target>
+
+	<target name="gather.individual.sources" depends="init">
+		<antcall target="copy.src.zip">
+			<param name="source.destination.folder" value="${destination.temp.folder}"/>
+		</antcall>
+		<antcall target="copy.src.includes">
+			<param name="source.destination.folder" value="${destination.temp.folder}"/>
+		</antcall>
+	</target>
+
+	<target name="copy.src.includes" depends="init">
+		<copy todir="${source.destination.folder}" failonerror="false" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="src/"/>
+				<include name="plugin.xml"/>
+				<include name="plugin.properties"/>
+				<include name="model/"/>
+				<include name="icons/"/>
+				<include name="build.properties"/>
+				<include name="about.html"/>
+				<include name="META-INF/"/>
+				<include name=".classpath"/>
+				<include name="about.ini"/>
+				<include name="about.mappings"/>
+				<include name="about.properties"/>
+				<include name="license.txt"/>
+				<include name=".settings/"/>
+				<include name=".project"/>
+				<include name="doc/"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.imaker_${plugin.version}" failonerror="false" overwrite="false">
+			<fileset dir="${temp.folder}">
+				<include name="@dot.bin${logExtension}"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the plug-in: com.nokia.s60tools.imaker of all the zips, jars and logs created.">
+		<delete dir="${build.result.folder}/@dot"/>
+		<delete file="${build.result.folder}/src.zip"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker_${plugin.version}.jar"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.imaker_${plugin.version}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="E:/workspaces/imaker/imaker_plugin/com.nokia.s60tools.imaker" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: com.nokia.s60tools.imaker.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}">
+				<include name="**/*.bin${logExtension}"/>
+			</fileset>
+		</delete>
+		<zip destfile="${plugin.destination}/com.nokia.s60tools.imaker_${plugin.version}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+	
+	<target name="collect.jar">
+		<copy todir="${destination.temp.folder}" file="com.nokia.s60tools.imaker_${plugin.version}.jar" failonerror="true" overwrite="true" />
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/content/concept1.xhtml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>Concept1.xhtml</title>
+  <link rel="stylesheet" href="shared.css" type="text/css" />	
+  </head>
+
+<body>
+<h1>Welcome to iMaker - The Image Maker</h1>
+<h4>Concept One</h4>
+<p>This is where Concept One is explained.</p>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/content/concept2.xhtml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>Concept2.xhtml</title>
+  <link rel="stylesheet" href="shared.css" type="text/css" />
+  </head>
+
+<body>
+<h1>Welcome to iMaker - The Image Maker</h1>
+<h4>Concept Two</h4>
+<p>This is where Concept Two is explained.</p>
+</body>
+</html>
Binary file imakerplugin/com.nokia.s60tools.imaker/content/link_obj.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/content/root.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+img {
+	width: 48px;
+	height: 48px;
+	vertical-align: middle;
+	}
+
+/* Give some space for main div.*/	
+.page-style {
+	text-align: center;
+	margin-top:100px;
+	}
+	
+/* satisfy Mozilla */	
+body > div.page-style {
+	padding-left:30%;
+	}
+
+
+#content {
+	text-align:left;
+	width:23em;
+	} 
+
+
+
+
+		
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/content/root.xhtml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>root.xhtml</title>
+  <link rel="stylesheet" href="shared.css" type="text/css" />
+  <link rel="stylesheet" href="root.css" type="text/css" />
+  </head>
+
+<body> 
+<h1>Welcome to iMaker - The Image Maker</h1>
+<div class="page-style">
+  <div id="content"> 	
+	
+		<a href="http://org.eclipse.ui.intro/showPage?id=concept1" id="firstLink">
+			<img border="0" src="link_obj.gif" alt="Concept1" />
+			Learn about Concept One... 
+		</a>
+	
+		<a href="http://org.eclipse.ui.intro/showPage?id=concept2">
+			<img border="0" src="link_obj.gif" alt="Concept2" />
+			Learn about Concept Two...</a>
+	<anchor id="anchor1" /> 
+  </div> 
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/content/shared.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/* Shared style applied to all pages */
+/* trick to get desired scroll bar behavior on all browsers */ 
+html {
+	overflow:auto;
+	border:0px;
+	height:100%;
+	}
+
+	
+body {	
+	margin-left:14px;
+	margin-top:10px;
+	font-family:Tahoma;
+	font-size: 12px;
+	color:#000000;
+	background-image:url("./titlebanner.gif");
+	background-repeat: repeat-x;
+	} 
+	
+h1 {
+	text-align:left;
+	font-size: 16pt;
+	font-weight:normal;
+	color:#E5E5E5;
+	} 
+
+h4 {
+	color:#787878;
+	}	
+	
+a {
+	display:block;
+	font-family:Tahoma;
+	font-size: 12px;
+	color:#000000;
+	font-weight:normal;
+	text-decoration:none;
+	padding-bottom:20px;
+	}
+	
+p {
+	padding-left:14px;
+	}
+	
+
Binary file imakerplugin/com.nokia.s60tools.imaker/content/titlebanner.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/doc/Test_Summary_ iMakerPlugin_2_2_4.xls has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/doc/change_log_2_2_4.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+Product Description:
+====================
+The iMaker extension for Carbide.c++ is a tool for building ROM images. Its core functionality is implemented in a command line executable called imaker.cmd. 
+The iMaker offers a Carbide.c++ integration that provides a graphical user interface for the imaker.cmd command line tool. The iMaker enables you to set and 
+modify the build parameters that are used by iMaker.
+
+Image building process is started by launching iMaker dialog by choosing the Open iMaker Dialog... menu item from iMaker pulldown menu (hammer with 'i') on the Carbide.c++ toolbar.
+The ROM image is built using the preferences configured in this dialog. Although not necessary, these preferences can be saved for future use for image building if needed. 
+Once preferences are configured, an image can be built by clicking the Run button in the dialog.
+
+
+Version 2.2.4
+===========================================
+New Features
+Ticket #1052: As a SW developer I don't want to have pop-up suggesting to add generated makefile to bld.inf because I consider that as a temporary file
+Ui changes to debug tab related to Ticket #1053. Ability to remember environment specific previous run. Only enabled entries in the debug tab are included to the images.
+Ticket #1053: As a SW developer I want to add automatically all build files to debug dialog so that my manual work is minimized
+Ticket #1115: As a Carbide.c++ developer I want to use iMaker plugin API to create images with .imp file
+
+Enhancements
+iMaker plugin code separated to internal and public API
+
+Error fixes
+iMaker plugin to show appropriate error message if iMaker Core execution fails
+
+Version 2.2.0
+===========================================
+New Features
+- New simplified UI
+- Automatic environment recognition based on Carbide.c++ workspace/project
+- Automatic selection of default product and variant of the environment (needs AMPI configuration in iMaker makefiles)
+- Summary for the created images in console window
+- Platsim integration
+- Support for adding binaries to image in urel/udeb mode.
+- Possibility to cancel fetching on configurations
+
+Enhancements
+- Handling of imp files
+
+Error fixes
+
+Version 2.1.2
+===========================================
+New Features
+
+Enhancements
+- Help updated
+- code cleaned
+- copy right headers updated
+
+Error fixes
+- two error fixed relating to the interface with iMaker core 
+
+Version 2.1.1
+===========================================
+New Features
+#365 The imaker plugin should be able to notice the success/failure of imaker image creation
+#630 Better integration to S60 Configuration Tool
+
+Enhancements
+
+Error fixes
+Fixed to work with iMaker 08.4x.xx interface changes
+ 
+Version 2.1.0
+===========================================
+New Features:
+- The structure and implementation has been changed. 
+- The preferences pages are no longer used. 
+- An independent dialog has been implemented for the iMaker extension. 
+- New way of managing preferences files have been implemented. 
+- A list has been added which displays prefereneces files and which allows deletation and creatation of new file. 
+- Renaming of preferences files has been added. 
+- The detailed settings page has been made editable. 
+- Better integration with S60 Configuration Tool has been implemented. 
+
+Enhancements:
+- Querying of configuration from the environment has been enhanced. 
+- Editing and saving has been enhanced.
+- Querying of targets and variables from one product. 
\ No newline at end of file
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/Build_All_Targets_16x16.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/alt_window_16.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/alt_window_32.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/checked.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/debug.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/delete_file_ds.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/delete_file_en.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/error.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/imaker_dialog.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/imaker_dialog.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/imakerdialog.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/imakermenu16.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/imakerplugin_icon.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/nw_file_ds2020.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/nw_file_en2020.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/platsim.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/preferences.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/preferences.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/rm_file_ds2020.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/rm_file_en2020.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/run_wiz.png has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/sample.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/settings.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/unchecked.gif has changed
Binary file imakerplugin/com.nokia.s60tools.imaker/icons/warning.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/imaker.product	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.1"?>
+
+<product name="iMaker - The Image Maker" id="com.nokia.s60tools.imakerplugin.product" application="com.nokia.s60tools.imakerplugin.application" useFeatures="false">
+
+   <configIni use="default"/>
+
+   <launcherArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <windowImages i16="icons/alt_window_16.gif" i32="icons/alt_window_32.gif"/>
+
+
+   <plugins>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="com.nokia.s60tools.imakerplugin"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.filebuffers"/>
+      <plugin id="org.eclipse.core.filesystem"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.net"/>
+      <plugin id="org.eclipse.core.resources"/>
+      <plugin id="org.eclipse.core.resources.compatibility" fragment="true"/>
+      <plugin id="org.eclipse.core.resources.win32" fragment="true"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.emf.common"/>
+      <plugin id="org.eclipse.emf.ecore"/>
+      <plugin id="org.eclipse.emf.ecore.xmi"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.jface.text"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.text"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.editors"/>
+      <plugin id="org.eclipse.ui.forms"/>
+      <plugin id="org.eclipse.ui.ide"/>
+      <plugin id="org.eclipse.ui.intro"/>
+      <plugin id="org.eclipse.ui.views"/>
+      <plugin id="org.eclipse.ui.win32" fragment="true"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+      <plugin id="org.eclipse.ui.workbench.texteditor"/>
+      <plugin id="org.eclipse.update.configurator"/>
+      <plugin id="org.eclipse.update.core"/>
+      <plugin id="org.eclipse.update.core.win32" fragment="true"/>
+      <plugin id="org.eclipse.update.ui"/>
+   </plugins>
+
+</product>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/introContent.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<introContent>
+    <page id="root" content="content/root.xhtml"/>
+    <page id="concept1" content="content/concept1.xhtml"/>
+    <page id="concept2" content="content/concept2.xhtml"/>
+</introContent>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/model/debug.ecore	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="iContent"
+    nsURI="http://www.nokia.com" nsPrefix="ic">
+  <eClassifiers xsi:type="ecore:EClass" name="ImageContent">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
+        eType="#//IbyEntry" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="IbyEntry">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="file" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="target" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="location" eType="#//IMAGESECTION"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="debug" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enabled" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="statusMessage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="IMAGESECTION">
+    <eLiterals name="CORE"/>
+    <eLiterals name="ROFS2" value="1"/>
+    <eLiterals name="ROFS3" value="2"/>
+    <eLiterals name="UDA" value="3"/>
+  </eClassifiers>
+</ecore:EPackage>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/model/debug.genmodel	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/com.nokia.s60tools.imaker/src"
+    modelPluginID="com.nokia.s60tools.imaker" modelName="Debug" importerID="org.eclipse.emf.importer.ecore"
+    complianceLevel="6.0" copyrightFields="false">
+  <foreignModel>debug.ecore</foreignModel>
+  <genPackages prefix="IContent" basePackage="com.nokia.s60tools.imaker.internal.model"
+      disposableProviderFactory="true" ecorePackage="debug.ecore#/">
+    <genClasses ecoreClass="debug.ecore#//ImageContent">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference debug.ecore#//ImageContent/entries"/>
+    </genClasses>
+    <genClasses ecoreClass="debug.ecore#//IbyEntry">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute debug.ecore#//IbyEntry/file"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute debug.ecore#//IbyEntry/target"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute debug.ecore#//IbyEntry/location"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute debug.ecore#//IbyEntry/debug"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute debug.ecore#//IbyEntry/enabled"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/model/iQRF.ecore	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="iQRF"
+    nsURI="iqrf" nsPrefix="">
+  <eClassifiers xsi:type="ecore:EClass" name="Result">
+    <eOperations name="addConfiguration">
+      <eParameters name="config" eType="#//Configuration"/>
+    </eOperations>
+    <eOperations name="addInterface">
+      <eParameters name="intf" eType="#//Interface"/>
+    </eOperations>
+    <eOperations name="addTarget">
+      <eParameters name="target" eType="#//Target"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaces" lowerBound="1"
+        upperBound="99999" eType="#//Interface" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="configurations" lowerBound="1"
+        upperBound="99999" eType="#//Configuration" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="targets" upperBound="99999"
+        eType="#//Target" defaultValueLiteral="" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Configuration">
+    <eOperations name="addSetting">
+      <eParameters name="setting" eType="#//Setting"/>
+    </eOperations>
+    <eOperations name="addTargetRef">
+      <eParameters name="target" eType="#//Target"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="settings" lowerBound="1"
+        upperBound="999999" eType="#//Setting" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="filePath" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="targetrefs" upperBound="99999"
+        eType="#//Target" defaultValueLiteral=""/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Setting">
+    <eOperations name="setConfigurationElement">
+      <eParameters name="element" eType="#//ConfigurationElement"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//ConfigurationElement"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Interface">
+    <eOperations name="addConfigurationElement">
+      <eParameters name="element" eType="#//ConfigurationElement"/>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="configurationElements"
+        lowerBound="1" upperBound="999999" eType="#//ConfigurationElement" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ConfigurationElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="values" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Target">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="IMaker">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="result" lowerBound="1"
+        eType="#//Result" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="query" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral=""/>
+  </eClassifiers>
+</ecore:EPackage>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/model/iQRF.genmodel	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/com.nokia.s60tools.imakerplugin/src"
+    modelPluginID="com.nokia.imaker.emf" modelName="IQRF" importerID="org.eclipse.emf.importer.ecore">
+  <foreignModel>iQRF.ecore</foreignModel>
+  <genPackages prefix="IQRF" disposableProviderFactory="true" ecorePackage="iQRF.ecore#/">
+    <genClasses ecoreClass="iQRF.ecore#//Result">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Result/interfaces"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Result/configurations"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference iQRF.ecore#//Result/targets"/>
+      <genOperations ecoreOperation="iQRF.ecore#//Result/addConfiguration">
+        <genParameters ecoreParameter="iQRF.ecore#//Result/addConfiguration/config"/>
+      </genOperations>
+      <genOperations ecoreOperation="iQRF.ecore#//Result/addInterface">
+        <genParameters ecoreParameter="iQRF.ecore#//Result/addInterface/intf"/>
+      </genOperations>
+      <genOperations ecoreOperation="iQRF.ecore#//Result/addTarget">
+        <genParameters ecoreParameter="iQRF.ecore#//Result/addTarget/target"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//Configuration">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Configuration/name"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Configuration/settings"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Configuration/filePath"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Configuration/targetrefs"/>
+      <genOperations ecoreOperation="iQRF.ecore#//Configuration/addSetting">
+        <genParameters ecoreParameter="iQRF.ecore#//Configuration/addSetting/setting"/>
+      </genOperations>
+      <genOperations ecoreOperation="iQRF.ecore#//Configuration/addTargetRef">
+        <genParameters ecoreParameter="iQRF.ecore#//Configuration/addTargetRef/target"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//Setting">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Setting/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Setting/value"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Setting/ref"/>
+      <genOperations ecoreOperation="iQRF.ecore#//Setting/setConfigurationElement">
+        <genParameters ecoreParameter="iQRF.ecore#//Setting/setConfigurationElement/element"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//Interface">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Interface/name"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iQRF.ecore#//Interface/configurationElements"/>
+      <genOperations ecoreOperation="iQRF.ecore#//Interface/addConfigurationElement">
+        <genParameters ecoreParameter="iQRF.ecore#//Interface/addConfigurationElement/element"/>
+      </genOperations>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//ConfigurationElement">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//ConfigurationElement/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//ConfigurationElement/description"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//ConfigurationElement/values"/>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//Target">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Target/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//Target/description"/>
+    </genClasses>
+    <genClasses ecoreClass="iQRF.ecore#//IMaker">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference iQRF.ecore#//IMaker/result"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iQRF.ecore#//IMaker/query"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/plugin.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+# ====================================================================
+# To code developer:
+#   Do NOT change the properties between this line and the
+#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
+#   Make a new property name, append to the end of the file and change
+#   the code to use the new property.
+# ====================================================================
+
+# ====================================================================
+# %%% END OF TRANSLATED PROPERTIES %%%
+# ====================================================================
+
+plugin.Name                         = Carbide.c++ Extensions - iMaker
+plugin.providerName                 = Nokia
+plugin.Editors.iMakerBuildLogEditor = iMaker Buildlog Editor
+plugin.ActionSets.Menu.Label        = iMaker
+plugin.ActionSets.Action.Label      = Create Image
+plugin.ActionSets.Action.ToolTip    = Create ROM Image
+plugin.PreferencePages.Page1.Name   = iMaker
+plugin.PreferencePages.Page2.Name   = Detailed settings
+plugin.Product.Name                 = iMaker
+plugin.PopupMenu.Item1.Label        = Clear
+plugin.version                      = 2.2.0
+pluginName = Debug Model
+providerName = www.example.org
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         id="application"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="com.nokia.s60tools.imaker.internal.intro.Application">
+         </run>
+      </application>
+   </extension>
+<!--
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            name="iMaker Perspective"
+            class="com.nokia.s60tools.imakerplugin.intro.Perspective"
+            id="com.nokia.s60tools.imakerplugin.perspective">
+      </perspective>
+   </extension>
+ -->  
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            label="com.nokia.s60tools.imakerplugin.actionSet"
+            visible="true"
+            id="com.nokia.s60tools.imakerplugin.actionSet">
+         <menu
+               label="%plugin.ActionSets.Menu.Label"
+               id="com.nokia.carbide.cpp.ui.CarbideMenu">
+            <separator
+                  name="sampleGroup">
+            </separator>            
+         </menu>
+         <action
+               class="com.nokia.s60tools.imaker.internal.actions.Flashmenu"
+               icon="icons/imakerplugin_icon.png"
+               id="com.nokia.s60tools.imakerplugin.Action"
+               label="%plugin.ActionSets.Action.Label"
+               state="true"
+               style="pulldown"
+               toolbarPath="sampleGroup"
+               tooltip="%plugin.ActionSets.Action.ToolTip">
+            <enablement>
+               <or>
+                  <objectClass
+                        name="org.eclipse.core.resources.IResource">
+                  </objectClass>
+               </or>
+            </enablement>
+         </action>
+      </actionSet>
+   </extension>
+      
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage"
+            class="com.nokia.s60tools.imaker.internal.preferences.ImageFlasherPreferencePage"
+            id="com.nokia.s60tools.imakerplugin.preferences.ImageFlasherPreferencePage"
+            name="%plugin.PreferencePages.Page1.Name"/>
+            
+   </extension>
+   <extension
+         id="com.nokia.s60tools.imakerplugin.IMakerBuildLogEditor"
+         point="org.eclipse.ui.editors">
+		<editor
+        class="com.nokia.s60tools.imaker.internal.IMakerBuildLogEditor"
+        contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+        default="true"
+        extensions="ilog"
+        filenames="imaker_build.ilog"
+        icon="icons/imakerplugin_icon.png"
+        id="com.nokia.s60tools.imakerplugin.IMakerBuildLogEditor"
+        name="%plugin.Editors.iMakerBuildLogEditor"/>
+   </extension>
+   <!--
+   <extension
+		 point="org.eclipse.core.runtime.products"
+		 id="product">      
+		<product name="%plugin.Product.Name" application="org.eclipse.ui.ide.workbench" > 
+			<property name="appName" value="Carbide.c++ Extensions - iMaker"/> 
+		</product>
+   </extension>
+   -->
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="com.nokia.s60tools.imaker.internal.application"
+            name="iMaker - The Image Maker">
+         <property
+               name="windowImages"
+               value="icons/alt_window_16.gif,icons/alt_window_32.gif">
+         </property>
+         <property
+               name="appName"
+               value="iMaker - The Image Maker">
+         </property>
+      </product>
+   </extension>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+         <viewerContribution 
+		 	id="com.nokia.s60tools.imakerplugin.popup.editor"
+		   	targetID="com.nokia.s60tools.imakerplugin.IMakerBuildLogEditor.context"> 
+		    <action
+		       id="com.nokia.s60tools.imakerplugin.editor.action1" 
+		       label="%plugin.PopupMenu.Item1.Label"
+		       menubarPath="additions" 
+		       class="com.nokia.s60tools.imaker.internal.actions.EditorClearActionDelegate"> 
+		    </action> 
+		 </viewerContribution>
+   </extension>
+     <extension
+         point="org.eclipse.ui.intro">
+      <intro
+            class="org.eclipse.ui.intro.config.CustomizableIntroPart"
+            id="com.nokia.s60tools.imakerplugin.intro">
+      </intro>
+      <introProductBinding
+            introId="com.nokia.s60tools.imakerplugin.intro"
+            productId="com.nokia.s60tools.imakerplugin.product">
+      </introProductBinding>
+   </extension>
+   <extension
+         point="org.eclipse.ui.intro.config">
+      <config
+            introId="com.nokia.s60tools.imakerplugin.intro"
+            content="introContent.xml"
+            id="com.nokia.s60tools.imakerplugin.configId">
+         <presentation
+               home-page-id="root">
+            <implementation
+                  kind="html"
+                  os="win32,linux,macosx">
+            </implementation>
+         </presentation>
+      </config>
+   </extension>
+ 
+</plugin>
Binary file imakerplugin/com.nokia.s60tools.imaker/splash.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/CancelObserver.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+public class CancelObserver extends Thread {
+	private static final long WAIT_PERIOD = 100;
+	public volatile boolean done = false;
+	private IProgressMonitor monitor;
+//	private Job job;
+	public CancelObserver(Job builder, IProgressMonitor mon) {
+//		this.job = builder;
+		this.monitor = mon;
+	}
+
+	@Override
+	public void run() {
+		while(!done) {
+			if(monitor.isCanceled()) {
+//				IMakerWrapper.getInstance().cancel();
+//				job.cancel();
+				Display display = PlatformUI.getWorkbench().getDisplay();
+				display.asyncExec(new Runnable() {
+
+					public void run() {
+						Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+						MessageDialog.openInformation(shell, "Canceling not supported",
+						"Cancelling of image creation is not allowed!");
+						
+					}
+					
+				});
+				done=true;
+			}
+			try {
+				sleep(WAIT_PERIOD);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/Confml.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+public class Confml {
+	private String fileName;
+	private String filePath;
+	private String configName;
+	
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public String getFilePath() {
+		return filePath;
+	}
+
+	public void setFilePath(String filePath) {
+		this.filePath = filePath;
+	}
+
+	public String getConfigName() {
+		return configName;
+	}
+
+	public void setConfigName(String configName) {
+		this.configName = configName;
+	}
+
+	public Confml(String fileName, String filePath, String configName) {
+		super();
+		this.fileName = fileName;
+		this.filePath = filePath;
+		this.configName = configName;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IEnvironment.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public interface IEnvironment {
+
+	public abstract String getDrive();
+
+	public abstract boolean isLoaded();
+
+	public abstract List<UIConfiguration> reLoad() throws InvocationTargetException;
+
+	public abstract List<UIConfiguration> load() throws InvocationTargetException;
+
+	public abstract List<UIConfiguration> getConfigurations() throws InvocationTargetException;
+
+	public abstract UIConfiguration getConfigurationByFilePath(String filePath);
+
+	public abstract String getIMakerCoreVersion()
+			throws IMakerCoreNotFoundException, IMakerCoreExecutionException;
+
+	/**
+	 * Sets the currently selected configuration in this environment
+	 * @param uic
+	 */
+	public abstract void setCurrentProduct(UIConfiguration uic);
+
+	public abstract UIConfiguration getCurrentProduct();
+	
+	public abstract IIMakerWrapper getImakerWrapper();
+	public abstract void setImakerWrapper(IIMakerWrapper wrapper);
+	public abstract String getTargetSteps(String target);
+
+	public abstract ImakerProperties getRunProperties();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IEnvironmentManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.util.List;
+
+
+public interface IEnvironmentManager {
+
+	/**
+	 * Sets the environment with the specified epocroot
+	 * as the the active one
+	 * @param epocRoot
+	 */
+	public abstract void setActiveEnvironment(String epocRoot);
+
+	/**
+	 * Returns the currently active environment
+	 * @return
+	 */
+	public abstract IEnvironment getActiveEnvironment();
+
+	/**
+	 * Returns an environment by its epocRoot 
+	 * @param epocRoot
+	 * @return
+	 */
+	public abstract IEnvironment getEnvironmentByDrive(String epocRoot);
+
+	/**
+	 * Returns the list of available environments that contain iMaker tool
+	 * @return
+	 */
+	public abstract List<IEnvironment> getEnviroments();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IIMakerWrapper.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.io.File;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreAlreadyRunningException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+/**
+ * General image generation interface
+ *
+ */
+public interface IIMakerWrapper {
+
+	/**
+	 * Function to get iMaker version information
+	 * @return
+	 * @throws IMakerCoreNotFoundException
+	 * @throws IMakerCoreExecutionException
+	 */
+	public abstract String getIMakerCoreVersion() throws IMakerCoreNotFoundException,
+	IMakerCoreExecutionException;
+
+	/**
+	 * Method is for querying configurations from the iMaker.
+	 * 
+	 * 
+	 * @return A list containing the data as UIConfiguration objects.
+	 *         Return is null in case of an error
+	 * @throws IMakerCoreExecutionException 
+	 * @throws IMakerCoreNotFoundException 
+	 * @throws InterruptedException 
+	 */
+	public abstract List<UIConfiguration> getConfigurations(IProgressMonitor monitor) throws IMakerCoreNotFoundException,
+	IMakerCoreExecutionException;
+
+
+	/**
+	 * Method is for the settings of a specific makefile.
+	 * 
+	 * 
+	 * @return A list containing the data as UIConfiguration objects.
+	 *         Return is null in case of an error
+	 * @throws IMakerCoreExecutionException 
+	 * @throws IMakerCoreNotFoundException 
+	 */
+	public abstract UIConfiguration getConfiguration(List<String> params, IProgressMonitor monitor) 
+	throws IMakerCoreExecutionException, 
+	IMakerCoreNotFoundException;
+
+	/**
+	 * Flashes an image. Currently does nothing
+	 * 
+	 * @param cmdParams Command line parameters for iMaker.
+	 * @return true if flashing succeeded, otherwise false.
+	 */
+	public abstract boolean flashImage(List<String> cmdParams);
+
+	/**
+	 * Runs iMaker with the specified command line parameters. 
+	 * @param cmdParams command line parameters to iMaker. Contains product make
+	 * @return if build was successful, otherwise
+	 * 	                 false
+	 * @throws IMakerCoreNotFoundException
+	 * @throws IMakerCoreExecutionException
+	 * @throws IMakerCoreAlreadyRunningException 
+	 */
+	public abstract boolean buildImage(List<String> cmdParams, OutputStream out) throws IMakerCoreNotFoundException,
+	IMakerCoreExecutionException, IMakerCoreAlreadyRunningException;
+
+
+	/**
+	 * Runs iMaker core with the specified imp file. 
+	 * @param impFile absolute file URI to impFile
+	 * @return if build was successful, otherwise
+	 * 	                 false
+	 * @throws IMakerCoreNotFoundException
+	 * @throws IMakerCoreExecutionException
+	 * @throws IMakerCoreAlreadyRunningException 
+	 */
+	public abstract boolean buildImage(File impFile, OutputStream out) throws IMakerCoreNotFoundException,
+	IMakerCoreExecutionException, IMakerCoreAlreadyRunningException;
+	
+	/**
+	 * Determine whether iMaker is running or not
+	 * @return
+	 */
+	public abstract boolean isRunning();
+
+	/**
+	 * Construct the full iMaker command that will be executed and return it as a String for convenience
+	 * @param params, command line parameters for iMaker
+	 * @return
+	 */
+	public abstract String getBuildCommand(List<String> params);
+	
+	/**
+	 * Get full path to iMaker tool that will be run
+	 * @return
+	 */
+	public abstract List<String> getTool();
+	
+	/**
+	 * Get iMaker steps for specific target
+	 * @param target, iMaker target
+	 * @param makefile, iMaker product makefile
+	 * @param monitor, monitor object
+	 * @return
+	 */
+	public abstract String getTargetSteps(String target,String makefile, IProgressMonitor monitor);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerBuildLogEditor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.editors.text.TextEditor;
+
+/**
+ * An editor for iMaker build log files.
+ * 
+ */
+public class IMakerBuildLogEditor extends TextEditor {
+
+	public static final String DEFAULT_BUILD_LOG  = Messages.getString("IMakerBuildLogEditor.0"); //$NON-NLS-1$
+	public static final String EDITOR_ID          = Messages.getString("IMakerBuildLogEditor.1"); //$NON-NLS-1$
+	public static final String EDITOR_CONTEXT     = EDITOR_ID + Messages.getString("IMakerBuildLogEditor.2"); //$NON-NLS-1$
+	public static final String NEWLINE            = System.getProperty("line.separator");
+	/**
+	 * Default constructor
+	 */
+	public IMakerBuildLogEditor() {
+		super();
+	}
+
+	@Override
+	protected void initializeEditor() {
+		super.initializeEditor();
+		setEditorContextMenuId(EDITOR_CONTEXT);
+	}
+
+	public void dispose() {
+		super.dispose();
+	}
+
+	public boolean isEditable() {
+		return false;
+	}
+
+	public boolean isEditorInputModifiable() {
+		return false;
+	}
+
+	public boolean isEditorInputReadOnly() {
+		return true;
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		super.createPartControl(parent);
+		
+		ISourceViewer isv = getSourceViewer();
+		isv.addTextListener(new ITextListener() {
+			public void textChanged(TextEvent te) {
+				ISourceViewer sv = getSourceViewer();
+				sv.revealRange(te.getOffset(),te.getLength());
+			}
+		});
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerConsoleLogger.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PipedInputStream;
+
+import org.eclipse.ui.console.MessageConsoleStream;
+
+import com.nokia.s60tools.imaker.internal.console.IMakerConsole;
+
+/**
+ * This class is solely for reading data from an input stream,
+ * interpreting and converting it to human readable form and
+ * printing it to a window.
+ * 
+ */
+public class IMakerConsoleLogger extends Thread {
+
+	/**
+	 * Number of lines already printed in the document.
+	 * Usually some static text of notification.
+	 */
+	public static final int PRE_PRINTED_LINE_COUNT = 2;
+
+	public boolean done = false;
+	/**
+	 * A window where to print data.
+	 */
+	public IMakerBuildLogEditor editor = null;
+	/**
+	 * A stream where to read data from.
+	 */
+	public PipedInputStream pis = null;
+
+	/**
+	 * Default constructor
+	 * 
+	 * @param bw A reference to a window where to print the data
+	 * @param pis a reference to input stream to read.
+	 */
+	public IMakerConsoleLogger(PipedInputStream pis) {
+		this.pis = pis;
+	}
+
+	/**
+	 * Runs the thread.
+	 */
+	public void run() {
+		// Read messages from the wrapper until forced to stop
+		BufferedReader br = new BufferedReader(new InputStreamReader(pis));
+		String line;
+		IMakerConsole console = IMakerConsole.getDefault();
+		MessageConsoleStream infoStream = console.getNewMessageConsoleStream(IMakerConsole.MSG_INFORMATION);
+		MessageConsoleStream errorStream = console.getNewMessageConsoleStream(IMakerConsole.MSG_ERROR);
+		MessageConsoleStream warningStream = console.getNewMessageConsoleStream(IMakerConsole.MSG_WARNING);
+		while (!done) {
+			try {
+				// Read bytes from stream and convert them to String
+				//if ((bytesAvailable = pis.available()) > 0)
+				while ((line = br.readLine()) != null) {
+					/*
+					 * Check for errors and create markers to visualize them in the editor.
+					 */					
+					String lc = line.toLowerCase();
+					if ((lc.indexOf("error ") != -1) 
+							|| (lc.indexOf("no rule to make target") != -1 )
+							|| (lc.indexOf("error:") != -1)) {
+						errorStream.println(line);
+					} else if (lc.indexOf("warning:") != -1) {
+						warningStream.println(line);
+					} else {
+						infoStream.println(line);
+					}
+				}
+				Thread.sleep(IMakerKeyConstants.DEFAULT_THREAD_SLEEP_TIME);
+				infoStream.flush();
+				infoStream.close();
+				errorStream.flush();
+				errorStream.close();
+				warningStream.flush();
+				warningStream.close();
+			} catch (IOException e) {
+				done=true;
+				e.printStackTrace();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+
+		try {
+			br.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerKeyConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+public class IMakerKeyConstants {
+	//imaker specific settings
+	public static final String PRODUCT               = "PRODUCT";
+	public static final String MAKEFILE              = "MAKEFILE";
+	public static final String TARGET_LIST           = "TARGET_LIST";
+	public static final String HWID                  = "HWID";
+	public static final String VERBOSE               = "VERBOSE";
+	public static final String TARGET                = "TARGET";
+	public static final String SYMBOLFILES           = "USE_SYMGEN";
+	public static final String TYPE                  = "TYPE";
+    public static final String ADDITIONAL_PARAMETERS = "ADDITIONAL_PARAMETERS";
+	public static final String MODIFIED_SETTINGS     = "MODIFIED_SETTINGS";
+	public static final String PREFS_DIRECTORY       = "imaker";
+	public static final String DEBUGFILES            = "DEBUG_FILES";
+	
+	//platsim specific settings
+	public static final String PLATSIM_RUN           = "RUN_PLATSIM";
+	public static final String PLATSIM_INSTANCE      = "PLATSIM_INSTANCE";
+	public static final String SUMMARY_DELIMETER     = "=============================================================================";	
+	public static final int DEFAULT_THREAD_SLEEP_TIME = 100;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.imaker.internal.managers.EnvironmentManager;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapper;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class IMakerPlugin extends AbstractUIPlugin {
+
+    // The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.imaker"; //$NON-NLS-1$
+
+	// The shared instance
+	private static IMakerPlugin plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public IMakerPlugin() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+    public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static IMakerPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+	
+	/**
+	 * @return Environment manager singleton
+	 */
+	public static IEnvironmentManager getEnvironmentManager() {
+		return EnvironmentManager.getInstance();
+	}
+	
+	/**
+	 * Creates iMaker wrapper object for the iMaker Command line tool located in the specified environment
+	 * @param epocRoot The root of the environment where iMaker is located
+	 * @param isImakerTool if true <b>epocRoot</b> is expected to be full path to iMaker executable file, otherwise 
+	 * it is assumed to be the root of the environment where iMaker is located
+	 * @return IIMakerWrapper object
+	 */
+	public static IIMakerWrapper getImakerWrapper(String epocRoot, boolean isImakerTool) {
+		if(isImakerTool) {
+			List<String> tool = new ArrayList<String>();
+			tool.add(epocRoot);
+			IIMakerWrapper wrapper = new IMakerWrapper(tool);	
+			return wrapper;
+		} else {
+			List<String> imaker = IMakerUtils.getImakerTool(epocRoot);
+			IIMakerWrapper wrapper = new IMakerWrapper(imaker);	
+			return wrapper;			
+		}
+	}
+
+	private class ImakerSchedulingRule implements ISchedulingRule {
+
+		public boolean contains(ISchedulingRule rule) {
+			if(rule instanceof ImakerSchedulingRule) {
+				return true;
+			}
+			return false;
+		}
+
+		public boolean isConflicting(ISchedulingRule rule) {
+			if(rule instanceof ImakerSchedulingRule) {
+				return true;
+			}
+			return false;
+		}
+		
+	};
+	
+	private ISchedulingRule imakerRule = new ImakerSchedulingRule();
+	
+	public ISchedulingRule getImakerRule() {
+		return imakerRule;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/IMakerUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,283 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences;
+
+public class IMakerUtils {
+	public static final int NORMAL_MSG = 1;
+	public static final int WARNING_MSG = 2;
+	public static final int ERROR_MSG = 3;
+	
+	public static String getLocationWithLeadingSlash(String location) {
+		if (location.length()>0) {
+			if(location.charAt(0)=='/') {				
+				return location.substring(1);
+			}
+			return location;
+		}
+		return "";
+	}
+	
+	/**
+	 * Returns the drive of the location where is project is located
+	 * @param resource
+	 * @return
+	 */
+	public static String getProjectRootLocation(IResource resource) {
+		IProject project = resource.getProject();
+		String location = project.getLocation().toString();
+		return getDrive(location);
+	}
+
+	private static String getDrive(String location) {
+		if(location==null||location.length()<2) {
+			return null;
+		}
+		return location.substring(0,2);
+	}
+
+	public static String getLocationDrive(String location) {	
+		return getDrive(location);
+	}
+	
+	public static int getMessageType(String msg) {
+		String message = msg.toLowerCase();
+		if((message.indexOf("error ") != -1) 
+				|| (message.indexOf("error:") != -1)
+				|| (message.indexOf("no rule to make target") != -1)) {
+			return ERROR_MSG;
+		} else if (message.indexOf("warning")!=-1) {
+			return WARNING_MSG;
+		} else {
+			return NORMAL_MSG;
+		}		
+	}
+
+	/**
+	 * @return
+	 */
+	public static List<String> getAvailableSDKs() {
+		List<String> sdks = new ArrayList<String>();
+		ISDKManager sdkManager = SDKCorePlugin.getSDKManager();
+		List<ISymbianSDK> sdkList = sdkManager.getSDKList();
+		for (ISymbianSDK sdk : sdkList) {
+			sdks.add(sdk.getEPOCROOT());
+		}
+		return sdks;
+	}
+
+	/**
+	 * @param file
+	 * @return
+	 */
+	public static String getFileName(String file) {
+		int index = file.lastIndexOf('/');
+		if(index != -1) {
+			return file.substring(index+1);
+		}
+		return "";
+	}
+
+	/**
+	 * Parses the version of imaker from the specified string
+	 * @param output
+	 * @return
+	 */
+	public static String parseIMakerVersion(String output) {
+		String verpattern = "\\d{2}\\.\\d{2}\\.\\d{2}";
+		Matcher matcher = Pattern.compile(verpattern).matcher(output);
+		if(matcher.find()) {
+			String version = output.substring(matcher.start(), matcher.end());
+			return version;
+		} else {
+			return null;			
+		}
+	}
+	
+	/**
+	 * determines weather imaker core exists
+	 * @return
+	 * @throws IMakerCoreNotFoundException
+	 */
+	public static boolean iMakerCoreExists(String tool) {
+		boolean ret = true;
+		try {
+			File f = new File(tool);
+			if(!f.exists()) {
+				ret = false;
+			}
+		} catch(Exception e) {
+			return false;
+		}
+		return ret;
+	}
+	/**
+	 * Converts a list of Variables to a list of Strings 
+	 * @param config
+	 * @return
+	 */
+	public static List<String> convertVariablesToStrings(List<UIVariable> variables) {
+		if(variables==null) {
+			return null;
+		}
+		List<String> parameters = new ArrayList<String>();
+		for (UIVariable variable : variables) {
+			if(variable.isModified() || variable.getInclude()) {
+				parameters.add(variable.getName()+"="+variable.getValue());
+			}
+		}
+		return parameters;
+	}
+	
+	/**
+	 * Converts a list of Strings to a list of Variables 
+	 * @param config
+	 * @return
+	 */
+	public static List<UIVariable> convertStringsToVariables(List<String> variables) {
+		if(variables==null) {
+			return null;
+		}
+		List<UIVariable> retVars = new ArrayList<UIVariable>();
+		for (String variable : variables) {
+			String[] parts = variable.split("=");
+			retVars.add(new UIVariable(parts[0],parts[1],"","",""));
+		}
+		return retVars;
+	}
+	
+	/**
+	 * Extracts modified variables from a configuration
+	 * @param config
+	 * @return
+	 */
+	public static List<UIVariable> getCommandlineIncludeVariables(List<UIVariable> variables) {
+		if(variables==null) {
+			return null;
+		}
+		List<UIVariable> parameters = new ArrayList<UIVariable>();
+
+		for (UIVariable variable : variables) {
+			if(variable.isModified() || variable.getInclude()) {
+				parameters.add(variable);
+			}
+		}
+		return parameters;
+	}
+	
+	public static List<String> getImakerTool(String epocroot) {
+		List<String> tool = new ArrayList<String>();
+		tool.add(epocroot + "\\" + IMakerWrapperPreferences.DEFAULT_COMMAND);
+		return tool;
+	}
+	
+	/**
+	 * This method creates ibyfiles and makefile under the given project
+	 * @param entries
+	 * @param path The location where to put the created files
+	 * @return The absolute path of the makefile created, null if nothing gets created otherwise
+	 */
+	public static IPath createIbyFiles(List<IbyEntry> entries, ProjectManager manager, IPath path) { 
+		List<IPath> ibyFiles = new ArrayList<IPath>();
+		for (Iterator<IbyEntry> iter = entries.iterator(); iter.hasNext();) {
+			StringBuffer sb = new StringBuffer();
+			IbyEntry ibyEntry =  iter.next();
+			iter.remove();
+			append(ibyEntry,sb);
+			for (Iterator<IbyEntry> iter2 = entries.iterator(); iter2.hasNext();) {
+				IbyEntry entry = (IbyEntry) iter2.next();
+				if(entry.getLocation().equals(ibyEntry.getLocation())) {
+					iter2.remove();
+					append(entry,sb);
+				}
+			}
+			String basename = ProjectManager.IBY_FILENAME_PREFIX
+					+ ibyEntry.getLocation().toString().toLowerCase();
+			// save iby file content
+			String content = sb.toString();
+			if(!content.equals("")) {
+				appendHeaderAndFooter(basename,sb);
+				ibyFiles.add(manager.createIbyFile(basename, sb.toString(), path));				
+			}
+		}
+		if(!ibyFiles.isEmpty()) {
+			return manager.createAdditionsMakefile(ibyFiles, path);
+		} else {
+			return null;
+		}
+	}
+	
+	private static void appendHeaderAndFooter(String basename, StringBuffer sb) {
+		sb.insert(0,"OVERRIDE_REPLACE/ADD\n");
+		sb.append("OVERRIDE_END");
+	}
+
+	private static void append(IbyEntry ibyEntry, StringBuffer sb) {
+		String str = ibyEntry.toString();
+		if(ibyEntry.isEnabled() && !str.equals("")) {
+			sb.append(str);
+			sb.append("\n");
+		}
+	}
+	
+	
+	/**
+	 * @param hostPath
+	 * @return
+	 */
+	public static String getFixedTargetPath(IPath hostPath) {
+		String tp = "\\"; //$NON-NLS-1$
+		
+		if (hostPath.getFileExtension().compareToIgnoreCase("app") == 0) { //$NON-NLS-1$
+			// this is an EKA1 app
+			tp += "system\\apps\\" + hostPath.removeFirstSegments(hostPath.segmentCount()-2).setDevice(null).toOSString(); //$NON-NLS-1$
+		} else if (hostPath.toOSString().toLowerCase().indexOf("\\epoc32\\release\\") >= 0) { //$NON-NLS-1$
+			// this is a binary
+			tp += "sys\\bin\\" + hostPath.lastSegment(); //$NON-NLS-1$
+		} else {
+			// see if this is a resource
+			final String dataZDir = "\\epoc32\\data\\z\\"; //$NON-NLS-1$
+			int index = hostPath.toOSString().toLowerCase().indexOf(dataZDir);
+			if (index >= 0) {
+				tp += hostPath.toOSString().substring(index + dataZDir.length());
+			} else {
+				// fallback - just add filename
+				tp += hostPath.lastSegment();
+			}
+		}
+		return tp;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/ImageFlasherHelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class ImageFlasherHelpContextIDs {
+
+	/**
+     * The plug-in ID. Copy from ImageFlasherHelpActivator.PLUGIN_ID
+     * to here to avoid runtime dependency to help project 
+     */	 
+    private static final String IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID = 
+                                        "com.nokia.s60tools.imaker.help";
+	
+    public static final String IMAKERPLUGIN_HELP_PRODUCT = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_PRODUCT";
+
+
+    public static final String IMAKERPLUGIN_HELP_TARGETS = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_TARGETS";
+    
+    public static final String IMAKERPLUGIN_HELP_SELECTED_TARGETS = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_TARGET_LIST";
+    
+    public static final String IMAKERPLUGIN_HELP_IMAGE_TYPE = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_IMAGE_TYPE";
+    
+    public static final String IMAKERPLUGIN_HELP_FLAGS = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_FLAGS";
+    
+    public static final String IMAKERPLUGIN_HELP_ADDITIONAL_PARAMS = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_ADDITIONAL_PARAMS";
+    
+    public static final String IMAKERPLUGIN_HELP_PREFERENCES_MANAGEMENT = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP_PREFERENCES_MANAGEMENT";
+    
+    public static final String IMAKERPLUGIN_HELP = 
+    	IMAKERPLUGIN_HELP_PROJECT_PLUGIN_ID +".IMAKERPLUGIN_HELP";
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.imaker.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/PixelConverter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Control;
+
+public class PixelConverter {
+	
+	private FontMetrics fFontMetrics;
+
+	public int convertHorizontalDLUsToPixels(Control button, int dlus) {
+		GC gc = new GC(button);
+		gc.setFont(button.getFont());
+		fFontMetrics= gc.getFontMetrics();
+		gc.dispose();
+		return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/SWTFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+
+public class SWTFactory {
+		
+	public static int getButtonWidthHint(Button button) {
+		button.setFont(JFaceResources.getDialogFont());
+		PixelConverter converter= new PixelConverter();
+		int widthHint= converter.convertHorizontalDLUsToPixels(button,IDialogConstants.BUTTON_WIDTH);
+		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
+	}
+	
+	public static void setButtonWidthHint(Button button) {
+		Assert.isNotNull(button);
+		Object gd= button.getLayoutData();
+		if (gd instanceof GridData) {
+			((GridData)gd).widthHint= getButtonWidthHint(button);	
+			((GridData)gd).horizontalAlignment = GridData.FILL;	 
+		}
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/StatusHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.osgi.framework.Bundle;
+
+public class StatusHandler {
+	
+	private static IStatus createStatus(int severity, String message, Throwable exception) {
+		Bundle bundle = IMakerPlugin.getDefault().getBundle();
+		String pluginId = (String)bundle.getHeaders().get(Messages.getString("StatusHandler.0")); //$NON-NLS-1$
+		IStatus status = new Status(severity, pluginId, message, exception);
+		return status;
+	}
+	
+	public static void handle(int severity, String message, Throwable exception) {
+		IStatus status = createStatus(severity, message, exception);
+		StatusManager.getManager().handle(status,StatusManager.SHOW);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UIConfiguration.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,316 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.viewers.ISettingViewer;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences;
+
+/**
+ * Class represents a simple container for data presented in Configuration,
+ * Target and Setting objects (EMF). It only contains the most needed data
+ * to be used in upper layers (UI).
+ * 
+ */
+public class UIConfiguration {
+//	public static final HashMap<String,String> UI_TARGETS = new HashMap<String,String>();
+//	static {
+//		UI_TARGETS.put("all",null);
+//		UI_TARGETS.put("core",null);
+//		UI_TARGETS.put("flash",null);
+//		UI_TARGETS.put("image",null);
+//		UI_TARGETS.put("mmc",null);
+//		UI_TARGETS.put("rofs2",null);
+//		UI_TARGETS.put("rofs3",null);
+//		UI_TARGETS.put("rofs4",null);
+//		UI_TARGETS.put("uda",null);
+//		UI_TARGETS.put("udaerase",null);
+//		UI_TARGETS.put("variant",null);
+//		UI_TARGETS.put("default",null);
+//	};
+	/** Private instance variables */
+	private String           productName  = null;
+	private String           platformName = null;
+	private String           makeFileName = null;
+	private String           filePath     = null;
+	private String           defaultHWID  = null;
+	private List<String>     hwids        = null;
+	private List<UITarget>   targets      = null;
+	private List<UIVariable> variables    = null;
+	private boolean          defaultConfig = false;
+	private String           defaultTarget = null;
+	
+
+	private Set<ISettingViewer> changeListeners = new HashSet<ISettingViewer>();
+	
+	/**
+	 * Default constructor. Gets a Configuration object as a parameter
+	 * and goes through it to find the needed data.
+	 * 
+	 * @param conf Configuration object to analyze
+	 */
+	public UIConfiguration(Configuration conf) {
+		if (conf != null) {
+			makeFileName = conf.getName();
+			filePath     = conf.getFilePath();
+			targets      = new ArrayList<UITarget>();
+			variables    = new ArrayList<UIVariable>();
+			Target target;
+			
+			Iterator<Target> targetIter = conf.getTargetrefs().iterator();
+			
+			// Go through targets.
+			while((targetIter != null) && targetIter.hasNext()) {
+				target = targetIter.next();
+				targets.add(new UITarget(target.getName(), target.getDescription()));
+			}
+			
+			Iterator<Setting> settingIter = conf.getSettings().iterator();
+			
+			// Go through settings.
+			while((settingIter != null) && settingIter.hasNext()) {
+				Setting set                  = settingIter.next();
+				ConfigurationElement element = set.getRef();
+				String name = set.getName();
+				if (name==null) continue;
+				String value                 = name.toLowerCase();
+				String elementName           = element.getName().toLowerCase();
+				
+				// Is setting a product name
+				if ((value != null) && (set != null) && (elementName != null)) {
+					// Put setting into variable list
+					UIVariable var = new UIVariable(name, set.getValue(),
+							"variable", element.getDescription(), element.getValues());
+					variables.add(var);
+					
+					if (elementName.equals(IMakerWrapperPreferences.PRODUCT_NAME)) {
+						productName = set.getValue();
+					} else if (elementName.equals(IMakerWrapperPreferences.COREPLATFORM_NAME) ||
+							elementName.equals(IMakerWrapperPreferences.UIPLATFORM_NAME)) {
+						// Is setting a platform name
+						platformName = set.getValue();
+					} else if (elementName.equals(IMakerWrapperPreferences.HWID)) {
+						hwids = new ArrayList<String>();
+						StringTokenizer tokenizer = new StringTokenizer(set.getValue(),
+								IMakerWrapperPreferences.HWID_DELIMITER);
+						// Tokenize the list of HWIDs and loop through it.
+						// Search for a default HWID which is marked by
+						// a special character at the end of it.
+						while (tokenizer.hasMoreTokens()) {
+							String token = tokenizer.nextToken();
+							if ((token != null) && (token.charAt(
+								token.length()-1) == 
+									IMakerWrapperPreferences.HWID_DEFAULT_MARKER)) {
+								token = token.substring(0, token.length()-1);
+								defaultHWID = token;
+							}
+							token = token.trim();
+							hwids.add(token);
+							if ((defaultHWID == null) || defaultHWID.equals("")) {
+								defaultHWID = token;
+							}
+						}
+						Collections.sort(hwids);
+					}
+				} else {
+					// Something else found entirely?
+				}
+			}
+		}
+	}
+
+	public boolean isDefaultConfig() {
+		return defaultConfig;
+	}
+
+	public void setDefaultConfig(boolean def) {
+		this.defaultConfig = def;
+	}
+
+	public String getDefaultTarget() {
+		for (UITarget target : getAllTargets()) {
+			if(target.getName().equals("default")) {
+				return target.getName();
+			}
+		}
+		return null;
+	}
+
+	public void setDefaultTarget(String target) {
+		this.defaultTarget = target;
+	}
+	
+	/**
+	 * Get method for productName
+	 * 
+	 * @return name of the product
+	 */
+	public String getProductName() {
+		return productName;
+	}
+	
+	/**
+	 * Get method for makeFileName
+	 * 
+	 * @return name of the makefile
+	 */
+	public String getMakeFileName() {
+		return makeFileName;
+	}
+	
+	/**
+	 * Get method for filePath
+	 * 
+	 * @return file path
+	 */
+	public String getFilePath() {
+		return filePath;
+	}
+	
+	/**
+	 * Get method for default HWID
+	 * 
+	 * @return default HWID
+	 */
+	public String getDefaultHWID() {
+		return defaultHWID;
+	}
+	
+	/**
+	 * Get method for target names
+	 * 
+	 * @return list of targets
+	 */
+	public List<UITarget> getAllTargets() {
+		return targets;
+	}
+	
+	/**
+	 * Get method for variables
+	 * 
+	 * @return list of variables.
+	 */
+	public List<UIVariable> getVariables() {
+		return variables;
+	}
+	
+	/**
+	 * Get method for HWIDs
+	 * 
+	 * @return a list of HWIDs
+	 */
+	public List<String> getHWIDs() {
+		return hwids;
+	}
+
+	/**
+	 * Get platform name
+	 * 
+	 * @return name of the platform
+	 */
+	public String getPlatformName() {
+		return platformName;
+	}
+	
+	public void removeChangeListener(ISettingViewer viewer) {
+		changeListeners.remove(viewer);
+	}
+	
+	public void addChangeListener(ISettingViewer viewer) {
+		changeListeners.add(viewer);
+	}
+	
+	public void variableChanged(UIVariable variable) {
+		Iterator<ISettingViewer> iterator = changeListeners.iterator();
+		while (iterator.hasNext())
+			iterator.next().updateVariable(variable);
+	}
+	
+	public String toString() {
+		StringBuffer out = new StringBuffer();
+		for(UIVariable v: variables) {
+			if(v.isModified()) {
+				out.append(v.toString()+"\n");
+			}
+		}
+		return out.toString();
+	}
+
+	public void setTargets(List<UITarget> targets) {
+		this.targets=targets;
+	}
+
+	public void setVariables(List<UIVariable> variables) {
+		this.variables=variables;
+	}
+	
+	public String getConfigurationName() {
+		String path = getFilePath();
+		String start = "image_conf_";
+		int index = path.indexOf(start);
+		return path.substring(index+start.length(), path.length()-3);
+	}
+
+	public List<UITarget> getFilteredTargets() {
+//		List<UITarget> temp = new ArrayList<UITarget>();
+		return getAllTargets();
+//
+//		String name = null;
+//		for (UITarget target : all) {
+//			name = target.getName();
+//			if(UI_TARGETS.containsKey(name)) {
+//				UI_TARGETS.put(name, target.getDescription());
+//				temp.add(target);
+//			}
+//		}
+//		return temp;
+	}
+
+	public boolean isPlatsimConfiguration() {
+		List<UIVariable> vars = this.getVariables();
+		for (UIVariable var : vars) {
+			if(var.getName().equals(IMakerWrapperPreferences.USE_PLATSIM)) {
+				String value = var.getValue();
+				return (value.equals("1"))?true:false;
+			}
+		}
+		return false;
+	}
+
+	public UITarget getTarget(String name) {
+		String ret = null;
+		for (UITarget t: getAllTargets()) {
+			if(name.equals(t.getName())) {
+				return t;
+			}
+		}
+		return null;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UITarget.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker;
+
+/**
+ * This class is a simple container class for target
+ * information
+ * 
+ * @version 0.2
+ */
+public class UITarget {
+	/** Private instance variables */
+	private String name = null;
+	private String description = null;
+	private String steps = null;
+	
+	/**
+	 * Default constructor
+	 * 
+	 * @param name Name of the target
+	 * @param description Description of the target
+	 */
+	public UITarget(String name, String description) {
+		this.name = name;
+		this.description = description;
+	}
+	
+	/**
+	 * Get method for name
+	 * 
+	 * @return Name of the target
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Get method for description
+	 * 
+	 * @return Description of the target
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	public void setSteps(String steps) {
+		this.steps = steps;
+	}
+
+	public String getSteps() {
+		return steps;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/UIVariable.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker;
+
+/**
+ * This class is a container for variable information from iMaker.
+ * 
+ * @version 0.2
+ */
+public class UIVariable {
+	/** Private instance variables */
+	private String defaultValue = null;
+
+	private boolean modified;
+
+	private String name = null;
+	private String value = null;
+	private String type = null;
+	private String description = null;
+	private String valueFormat = null;
+	private boolean include = false;
+	/**
+	 * Default constructor
+	 * 
+	 * @param name Name of the variable
+	 * @param value Value of the variable
+	 * @param type Type of the variable
+	 * @param description Description of the variable
+	 * @param valueFormat Value format (values) of the variable
+	 */
+	public UIVariable(String name, String value, String type,
+			          String description, String valueFormat) {
+		this.name = name;
+		this.value = defaultValue = value;
+		this.type = type;
+		this.description = description;
+		this.valueFormat = valueFormat;
+	}
+
+	public void performDefaults() {
+		this.value = defaultValue;
+		this.modified = false;
+	}
+
+	public boolean isModified() {
+		return modified;
+	}
+
+	public void setModified(boolean modified) {
+		this.modified = modified;
+	}
+
+
+	public String getName() {
+		return name;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public String getValueFormat() {
+		return valueFormat;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(getName()+ "\t\t");
+		sb.append(getValue()+ "\t\t");
+		sb.append(getValueFormat() + "\t\t");
+		sb.append(getDescription());
+		return sb.toString();
+	}
+
+	public boolean getInclude() {
+		return include;
+	}
+
+	public void setInclude(boolean inc) {
+		include=inc;
+	}
+
+	@Override
+	public boolean equals(Object that) {
+		if(that==null||!(that instanceof UIVariable)) {
+			return false;
+		}
+		UIVariable v = (UIVariable) that;
+		return this.getName().equals(v.getName()) && this.getValue().equals(v.getValue());
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreAlreadyRunningException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.exceptions;
+
+public class IMakerCoreAlreadyRunningException extends Exception {
+	public IMakerCoreAlreadyRunningException() {
+		super("iMaker core already running");
+	}
+	
+	public IMakerCoreAlreadyRunningException(String message) {
+		super(message);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreCancelledException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.exceptions;
+
+public class IMakerCoreCancelledException extends IMakerCoreExecutionException {
+	public IMakerCoreCancelledException() {
+		super("User Cancellation!");
+	}
+	
+	public IMakerCoreCancelledException(String message) {
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreExecutionException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.exceptions;
+
+public class IMakerCoreExecutionException extends Exception {
+	public IMakerCoreExecutionException() {
+		super("unable to invoke iMaker core commands");
+	}
+	
+	public IMakerCoreExecutionException(String message) {
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerCoreNotFoundException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.exceptions;
+
+public class IMakerCoreNotFoundException extends Exception { 
+	public IMakerCoreNotFoundException() {
+		super("iMaker core not found from environment");
+	}
+	public IMakerCoreNotFoundException(String message) {
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/exceptions/IMakerPluginPreferencesException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.exceptions;
+
+public class IMakerPluginPreferencesException extends Exception {
+	public IMakerPluginPreferencesException() {
+		super("iMaker plugin preferences doesn't contain valid information");
+	}
+	public IMakerPluginPreferencesException(String message) {
+		super(message);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/actions/EditorClearActionDelegate.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.actions;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+
+public class EditorClearActionDelegate implements IEditorActionDelegate {
+
+	public void setActiveEditor(IAction arg0, IEditorPart arg1) {}
+
+	public void run(IAction action) {
+		
+		Display.getDefault().syncExec(new Runnable() {
+			public void run() {
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				IWorkbenchWindow aWindow = workbench.getActiveWorkbenchWindow();
+				IWorkbenchPage aPage = aWindow.getActivePage();
+				TextEditor activeEditor = (TextEditor)aPage.getActiveEditor();
+				IDocumentProvider documentProvider = activeEditor.getDocumentProvider();
+				IDocument document = documentProvider.getDocument(activeEditor.getEditorInput());
+				document.set("");
+				IEditorInput input = activeEditor.getEditorInput();
+				IResource resource = (IResource)input.getAdapter(IResource.class);
+				try {
+					resource.clearHistory(null);
+				} catch (CoreException e1) {
+					e1.printStackTrace();
+				}
+				if(resource!=null) {
+					int depth = IResource.DEPTH_INFINITE;
+					try {
+						IMarker[] markers = resource.findMarkers(null, true, depth);
+						ResourcesPlugin.getWorkspace().deleteMarkers(markers);
+					} catch (CoreException e) {
+						e.printStackTrace();
+					}
+				}
+				activeEditor.doSave(null);
+				try {
+					ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}
+		});
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/actions/Flashmenu.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.actions;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.StatusHandler;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreCancelledException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.console.IMakerJob;
+import com.nokia.s60tools.imaker.internal.dialogs.LaunchIMakerDialog;
+import com.nokia.s60tools.imaker.internal.managers.EnvironmentManager;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapper;
+
+/**
+ * @version 0.1
+ */
+public class Flashmenu implements IWorkbenchWindowPulldownDelegate {
+	/** menus items */
+	private Menu menu;
+	private final String MENU_ITEM_SETTINGS = Messages.getString("Flashmenu.17");
+
+	/** private data members */
+	private MenuItem openDialogItem = null;
+	private Shell shell;
+	private IProject selectedProject;
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowPulldownDelegate#getMenu(org.eclipse.swt.widgets.Control)
+	 */
+	public Menu getMenu(Control parent) {
+		/*dispose the previously used menu*/
+		if(menu!=null) {
+			menu.dispose();
+		}
+		/* Create new menu and listeners if first call */
+		MenuItem item = null;
+		MenuSelectionListener msl = new MenuSelectionListener();
+		menu = new Menu(parent);
+
+		ImageDescriptor descriptor = IMakerPlugin.getImageDescriptor("icons/imakermenu16.png");
+		ProjectManager pm = new ProjectManager(selectedProject);
+		List<IResource> files = pm.getImakerFiles();
+		for(IResource file: files) {
+			IFile f = (IFile) file;
+			item = new MenuItem(menu, SWT.RADIO);
+			item.setText(f.getName());
+			item.setData(file);
+			item.setImage(descriptor.createImage());
+			item.addSelectionListener(msl);
+		}
+
+		item = new MenuItem(menu, SWT.SEPARATOR);
+
+		descriptor = IMakerPlugin.getImageDescriptor("icons/imakerdialog.png");
+		openDialogItem = new MenuItem(menu, SWT.NULL);
+		openDialogItem.setText(MENU_ITEM_SETTINGS); //$NON-NLS-1$
+		openDialogItem.addSelectionListener(msl);
+		openDialogItem.setImage(descriptor.createImage());
+		return menu;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+		if(menu!=null) {
+			menu.dispose();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		this.shell = window.getShell();
+		window.getWorkbench();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		IEnvironmentManager manager = EnvironmentManager.getInstance();
+		IEnvironment env = manager.getEnvironmentByDrive(getSelectionRoot());
+		ImakerProperties run = env.getRunProperties();
+		
+		if(env!=null&&!run.isUsed()) {
+			MessageDialog.openInformation(shell, "Unable To Launch iMaker", "The selection cannot be launched, and there are no recent " +
+			"launches.\n Create new lauch using Open iMaker Dialog... from the pulldown menu.");			
+		} else {
+			executeProperties(run);
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		if(selection instanceof IStructuredSelection) {
+			IStructuredSelection ss = (IStructuredSelection) selection;
+			Object elem = ss.getFirstElement();
+			if(elem instanceof IResource) {
+				selectedProject = ((IResource)elem).getProject();
+			}
+		} else {
+			selectedProject = null;
+		}
+	}
+
+	private void initializeAndRunImaker(List<String> command) {
+		String root = getSelectionRoot();
+		List<String> imaker = IMakerUtils.getImakerTool(root);
+		IIMakerWrapper wrapper = new IMakerWrapper(imaker);
+		IMakerJob job = new IMakerJob("Creating image", command,wrapper);
+		job.setPriority(Job.LONG);
+		job.setRule(IMakerPlugin.getDefault().getImakerRule());
+		job.schedule();
+	}
+
+	private String getSelectionRoot() {
+		return IMakerUtils.getProjectRootLocation(selectedProject);
+	}
+
+	/**
+	 * internal selectionlistener for menu items. 
+	 */
+	private class MenuSelectionListener implements SelectionListener {
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			widgetSelected(e);
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			MenuItem selection = (MenuItem)e.widget;
+			if(selection==openDialogItem) {
+				try {			
+					ProjectManager projectManager = new ProjectManager(selectedProject);
+					IEnvironmentManager manager = IMakerPlugin.getEnvironmentManager();
+					manager.setActiveEnvironment(getSelectionRoot());
+
+					LaunchIMakerDialog dialog = new LaunchIMakerDialog(shell,
+							projectManager,manager);
+					try {
+						manager.getActiveEnvironment().load();
+					} catch (InvocationTargetException ite) {
+						Throwable cause = ite.getCause();
+						if(cause instanceof IMakerCoreCancelledException) {
+							return;
+						} else if(cause instanceof IMakerCoreExecutionException) {
+							StatusHandler.handle(IStatus.ERROR,Messages.getString("Error.1"),cause);
+						} else if(cause instanceof IMakerCoreNotFoundException) {
+							StatusHandler.handle(IStatus.ERROR,Messages.getString("Error.2"),cause);
+						} else {
+							StatusHandler.handle(IStatus.ERROR,cause.getMessage(),cause);							
+						}
+						return;
+					}
+					int returnValue = dialog.open();
+					if(returnValue == IDialogConstants.OK_ID) {
+						String path = dialog.getFilePath();
+						ImakerProperties run = manager.getActiveEnvironment().getRunProperties();
+						if(!path.equals(ProjectManager.NEW_ITEM)) {
+							IFile file = (IFile)projectManager.getImakerFile(new Path(path));
+							ImakerProperties prop = ImakerProperties.createFromFile(file);
+							run.clear();
+							run.putAll(prop);
+						}
+						executeProperties(run);
+						run.setUsed(true);
+					}
+				} catch(NullPointerException ne) {
+					ne.printStackTrace();
+				}
+			} else {
+				IFile file = (IFile) selection.getData();
+				if(file!=null) {
+					ImakerProperties props = ImakerProperties.createFromFile(file);
+					executeProperties(props);
+				}
+			}
+
+		}
+	}
+	private void executeProperties(ImakerProperties prop) {
+		String tempDirectory = System.getProperty("java.io.tmpdir"); 
+		String target = tempDirectory+ImakerProperties.GENERATED_FILES_FOLDER;
+		List<String> command = prop.parseImakerCommand(selectedProject, new Path(target));
+		initializeAndRunImaker(command);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/console/IMakerConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.console;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleConstants;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+
+import com.nokia.s60tools.imaker.IMakerPlugin;
+
+public class IMakerConsole {
+	
+	private static final String IMAKER_CONSOLE_NAME = "iMaker";
+	private static IMakerConsole fDefault = null;
+	private MessageConsole fMessageConsole = null;
+	
+	public static final int MSG_INFORMATION = 1;
+	public static final int MSG_ERROR = 2;
+	public static final int MSG_WARNING = 3;
+		
+	private IMakerConsole() {}
+	
+	public static IMakerConsole getDefault() {
+		if(fDefault==null) {
+			fDefault = new IMakerConsole();
+		}
+		return fDefault;
+	}
+		
+	public void println(String msg, int msgKind) {
+		if( msg == null ) return;
+		
+		/* if console-view in Java-perspective is not active, then show it and
+		 * then display the message in the console attached to it */		
+		if( !displayConsoleView() )
+		{
+			/*If an exception occurs while displaying in the console, then just diplay atleast the same in a message-box */
+			MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", msg);
+			return;
+		}
+		
+		/* display message on console */	
+		getNewMessageConsoleStream(msgKind).println(msg);				
+	}
+	
+	public void clear() {		
+		final IDocument document = getMessageConsole().getDocument();
+		if (document != null) {
+			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+				
+//				@Override
+				public void run() {
+					document.set("");
+				}
+			});
+		}			
+	}	
+		
+	private boolean displayConsoleView() {
+		try
+		{
+			IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			if( activeWorkbenchWindow != null )
+			{
+				IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+				if( activePage != null )
+					activePage.showView(IConsoleConstants.ID_CONSOLE_VIEW, null, IWorkbenchPage.VIEW_VISIBLE);
+			}
+			
+		} catch (PartInitException partEx) {			
+			return false;
+		}
+		
+		return true;
+	}
+	
+	public MessageConsoleStream getNewMessageConsoleStream(final int kind) {		
+		int swtColorId = SWT.COLOR_DARK_GREEN;
+		
+		switch (kind) {
+			case MSG_INFORMATION:
+				swtColorId = SWT.COLOR_DARK_GREEN;				
+				break;
+			case MSG_ERROR:
+				swtColorId = SWT.COLOR_DARK_MAGENTA;
+				break;
+			case MSG_WARNING:
+				swtColorId = SWT.COLOR_DARK_BLUE;
+				break;
+			default:				
+		}	
+		final int colorID = swtColorId;
+		final MessageConsoleStream msgConsoleStream = getMessageConsole().newMessageStream();
+		final Display display = PlatformUI.getWorkbench().getDisplay();
+		display.syncExec(new Runnable() {
+			
+//			@Override
+			public void run() {
+				msgConsoleStream.setColor(display.getSystemColor(colorID));
+			}
+		});
+		return msgConsoleStream;
+	}
+	
+	public MessageConsole getMessageConsole() {
+		if( fMessageConsole == null )
+			createMessageConsoleStream();		
+		return fMessageConsole;
+	}
+		
+	private void createMessageConsoleStream() {
+		fMessageConsole = new MessageConsole(getProductConsoleName(), getProductConsoleImageDescriptor()); 
+		ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{ fMessageConsole });
+	}	
+	
+	private ImageDescriptor getProductConsoleImageDescriptor() {
+		return IMakerPlugin.getImageDescriptor("icons/imakerplugin_icon.png");
+	}
+
+	private String getProductConsoleName() {
+		return IMAKER_CONSOLE_NAME;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/console/IMakerJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.console;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.program.Program;
+import org.eclipse.ui.console.IHyperlink;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerConsoleLogger;
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.StatusHandler;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreAlreadyRunningException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+
+public class IMakerJob extends Job {
+	private List<String> command;
+	public volatile boolean done = false;
+	private IIMakerWrapper wrapper;
+	private String epocroot;
+
+	public static final int DEFAULT_THREAD_SLEEP_TIME = 20;
+	public static final String BUILD_START_MESSAGE    = Messages.getString("ImageBuilder.0"); //$NON-NLS-1$
+	public static final String BUILD_CMD			  = Messages.getString("ImageBuilder.1"); //$NON-NLS-1$
+	public static final String BUILD_SUCCESS_MESSAGE  = Messages.getString("ImageBuilder.2"); //$NON-NLS-1$
+	public static final String BUILD_FAILURE_MESSAGE  = Messages.getString("ImageBuilder.3"); //$NON-NLS-1$
+
+	public static final Pattern VARIABLE_PATTERN1 = Pattern.compile(".*\\s*=\\s*.([\\\\/].*).");
+	public static final Pattern VARIABLE_PATTERN2 = Pattern.compile(".*\\s*=\\s*.(.:.*).");
+	
+	public IMakerJob(String name, List<String> cmd, IIMakerWrapper wrapper) {
+		super(name);
+		this.command = cmd;
+		this.wrapper = wrapper;
+		this.epocroot = IMakerUtils.getLocationDrive(wrapper.getTool().get(0));
+	}
+
+	@Override
+	protected IStatus run(IProgressMonitor monitor) {
+		monitor.beginTask(Messages.getString("ImageBuilder.4"), IProgressMonitor.UNKNOWN);
+		IMakerConsole console = IMakerConsole.getDefault();
+		console.clear();
+		MessageConsoleStream infoStream = console.getNewMessageConsoleStream(IMakerConsole.MSG_INFORMATION);
+		MessageConsoleStream errorStream = console.getNewMessageConsoleStream(IMakerConsole.MSG_ERROR);
+		
+		//print command
+		infoStream.println(BUILD_START_MESSAGE);
+		infoStream.print(BUILD_CMD);
+		infoStream.println(wrapper.getBuildCommand(command));
+
+		try {
+			PipedInputStream pin = new PipedInputStream();
+			PipedOutputStream pout = new PipedOutputStream(pin);
+			
+			IMakerConsoleLogger logger = new IMakerConsoleLogger(pin);
+			logger.start();
+			
+			boolean success = false;
+			success = wrapper.buildImage(command,pout);
+
+			// Stop the thread.
+			logger.done = true;
+			if (success) {
+				infoStream.println(BUILD_SUCCESS_MESSAGE);
+			} else {
+				errorStream.println(BUILD_FAILURE_MESSAGE);
+			}
+
+			pout.close();
+			pin.close();
+			infoStream.close();
+			errorStream.close();
+			Thread.sleep(IMakerKeyConstants.DEFAULT_THREAD_SLEEP_TIME);
+			highlightSummary(console.getMessageConsole());
+			monitor.done();
+		} catch (IOException e1) {
+			e1.printStackTrace();
+		} catch (IMakerCoreNotFoundException e) {
+			StatusHandler.handle(IStatus.ERROR,Messages.getString("Error.2"),e);
+		} catch (IMakerCoreExecutionException e) {
+			StatusHandler.handle(IStatus.ERROR,Messages.getString("Error.1"),e);
+			e.printStackTrace();
+		} catch (IMakerCoreAlreadyRunningException e) {
+			StatusHandler.handle(IStatus.WARNING,Messages.getString("Flashmenu.13"),e);
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		return Status.OK_STATUS;
+	}
+	
+	private void highlightSummary(MessageConsole console) {
+		IDocument doc = console.getDocument();
+		int numberOfLines = doc.getNumberOfLines();
+		boolean begin = true;
+		int startLine = 0;
+		int endLine   = 0;
+		for (int i = numberOfLines-1; i >= 0; i--) {
+			try {
+				String line = doc.get(doc.getLineOffset(i), doc.getLineLength(i));
+				if(isSummaryDelimeter(line)) {
+					if(!begin) {
+						endLine = i;
+						break;
+					} else {
+						startLine = i;
+						begin = false;
+					}
+				}
+			} catch (BadLocationException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		for (int i = startLine-1; i > endLine; i--) {
+			highlightLine(doc,i,console);			
+		}
+	}
+
+
+	private void highlightLine(IDocument doc, int line, MessageConsole console) {
+		try {
+			int lineOffset = doc.getLineOffset(line);
+			String content = doc.get(lineOffset, doc.getLineLength(line));
+			Matcher matcher1 = VARIABLE_PATTERN1.matcher(content);
+			Matcher matcher2 = VARIABLE_PATTERN2.matcher(content);
+			if(matcher1.find()) {
+				int start = matcher1.start(1);
+				int end   = matcher1.end(1);
+				makeLink(epocroot,doc, console, lineOffset, start, end);
+			} else if(matcher2.find()) {
+				int start = matcher2.start(1);
+				int end   = matcher2.end(1);
+				makeLink("",doc, console, lineOffset, start, end);				
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void makeLink(String root, IDocument doc, MessageConsole console,
+			int lineOffset, int start, int end) throws BadLocationException {
+		int length = end-start;
+		String link = doc.get(lineOffset+start, length);
+		console.addHyperlink(new Link(root,link), lineOffset+start, length);
+	}
+
+	private boolean isSummaryDelimeter(String line) {
+		return line.startsWith(IMakerKeyConstants.SUMMARY_DELIMETER);
+	}
+	
+	private class Link implements IHyperlink {
+
+		private String link;
+		private String eroot;
+
+		public Link(String eroot, String link) {
+			this.link = link;
+			this.eroot = eroot;
+		}
+//		@Override
+		public void linkActivated() {
+			String path = eroot+link;
+			File f = new File(path);
+			while(f!=null && !f.exists()) {
+				f=f.getParentFile();				
+			}
+			if(f!=null) {
+				if(f.isFile()) {
+					f = f.getParentFile();
+				}
+				Program.launch(f.getPath());				
+			}
+		}
+
+//		@Override
+		public void linkEntered() {}
+
+//		@Override
+		public void linkExited() {}
+		
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/dialogs/LaunchIMakerDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.dialogs;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.viewers.IMakerTabsViewer;
+
+public class LaunchIMakerDialog extends TitleAreaDialog {
+
+	/** Keep track of the currently visible dialog instance */
+	private static LaunchIMakerDialog fgCurrentlyVisibleLaunchIMakerDialog;
+
+	/** Id for 'Launch' button.*/
+	protected static final int ID_LAUNCH_BUTTON = IDialogConstants.CLIENT_ID + 1;
+
+	/** Id for 'Close' button.*/
+	protected static final int ID_CLOSE_BUTTON = IDialogConstants.CLIENT_ID + 2;
+
+	/** Id for 'Cancel' button.*/
+	protected static final int ID_CANCEL_BUTTON = IDialogConstants.CLIENT_ID + 3;
+
+	/**
+	 * Constant specifying how wide this dialog is allowed to get (as a percentage of
+	 * total available screen width) as a result of tab labels in the edit area.
+	 */
+	protected static final float MAX_DIALOG_WIDTH_PERCENT = 0.75f;
+
+	/**
+	 * Constant specifying how tall this dialog is allowed to get (as a percentage of
+	 * total available screen height) as a result of preferred tab size.
+	 */
+	protected static final float MAX_DIALOG_HEIGHT_PERCENT = 0.60f;
+
+	/**
+	 * Size of this dialog if there is no preference specifying a size.
+	 */
+	protected static final Point DEFAULT_INITIAL_DIALOG_SIZE = new Point(540, 650); //(620, 690)
+
+
+	/**
+	 * Returns the currently visible dialog
+	 * @return the currently visible launch dialog
+	 */
+	public static LaunchIMakerDialog getCurrentlyVisibleLaunchConfigurationDialog() {
+		return fgCurrentlyVisibleLaunchIMakerDialog;
+	}
+
+	/**
+	 * Sets which launch dialog is currently the visible one
+	 * @param dialog the dialog to set as the visible one
+	 */
+	public static void setCurrentlyVisibleLaunchConfigurationDialog(LaunchIMakerDialog dialog) {
+		fgCurrentlyVisibleLaunchIMakerDialog = dialog;
+	}
+
+	/**
+	 * widgets
+	 */
+	private IMakerTabsViewer fTabViewer;
+	private Image fBannerImage;
+
+	private Button runButton;
+
+	private IMakerTabsViewer imakerTabsViewer;
+
+	private ProjectManager projectManager;
+
+	private String filePath;
+
+	private IEnvironmentManager environmentManager;
+
+	public LaunchIMakerDialog(Shell parentShell, ProjectManager projectManager, IEnvironmentManager manager) {
+		super(parentShell);
+		this.projectManager = projectManager;
+		this.environmentManager = manager;
+	}
+	
+	public ProjectManager getProjectManager() {
+		return projectManager;
+	}
+
+	@Override
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		shell.setText(getShellTitle());
+	}
+	private String getShellTitle() {
+		return Messages.getString("Project.name");
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogComp = (Composite)super.createDialogArea(parent);
+		setTitle(Messages.getString("LaunchImakerDialog.title"));
+		setMessage(Messages.getString("LaunchImakerDialog.message"));
+		setImage();
+		
+		addContent(dialogComp);
+		return dialogComp;
+	}
+
+	public void initialize() {
+		getTabViewer().initialize();
+	}
+	/**
+	 * Adds content to the dialog area
+	 * 
+	 * @param dialogComp
+	 */
+	protected void addContent(Composite dialogComp) {
+		GridData gd;
+		Composite topComp = new Composite(dialogComp, SWT.NONE);
+		gd = new GridData(GridData.FILL_BOTH);
+		topComp.setLayoutData(gd);
+		GridLayout topLayout = new GridLayout(1, false);
+		topComp.setLayout(topLayout);
+
+		Composite editAreaComp = createPreferenceEditArea(topComp);
+		gd = new GridData(GridData.FILL_BOTH);
+		editAreaComp.setLayoutData(gd);
+
+		dialogComp.layout(true);
+		initialize();
+		applyDialogFont(dialogComp);
+	}
+
+	private void setImage() {
+		setTitleImage(getBannerImage());
+	}
+
+	private Image getBannerImage() {
+		if (fBannerImage == null) {
+			ImageDescriptor descriptor = IMakerPlugin.getImageDescriptor("icons/imaker_dialog.png");
+			if (descriptor != null) {
+				fBannerImage = descriptor.createImage();
+			}
+		}
+		return fBannerImage;
+	}
+	
+	private Composite createPreferenceEditArea(Composite parent) {
+		imakerTabsViewer = new IMakerTabsViewer(parent,environmentManager, this);
+		setTabViewer(imakerTabsViewer);
+		getTabViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+//				handleTabSelectionChanged();
+			}
+		});
+		return (Composite)getTabViewer().getControl();
+	}
+
+
+	/**
+	 * A launch configuration dialog overrides this method
+	 * to create a custom set of buttons in the button bar.
+	 * This dialog has 'Launch' and 'Cancel'
+	 * buttons.
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+	 */
+	protected void createButtonsForButtonBar(Composite parent) {
+		createButton(parent, IDialogConstants.OK_ID, Messages.getString("LaunchImakerDialog.run"), true);
+		createButton(parent, ID_CLOSE_BUTTON, Messages.getString("LaunchImakerDialog.close"), false);  
+	}
+	
+	public Button getRunButton() {
+		return runButton;
+	}
+	/**
+	 * Handle the 'close' & 'launch' buttons here, all others are handled
+	 * in <code>Dialog</code>
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		if (buttonId == IDialogConstants.OK_ID) {
+			setFilePath(imakerTabsViewer.handleRunPressed());
+			okPressed();
+		} else if (buttonId == ID_CLOSE_BUTTON) {
+//			imakerTabsViewer.handleRunPressed();
+			cancelPressed();
+		} else {
+			super.buttonPressed(buttonId);
+		}
+	}
+	
+	@Override
+	protected Point getInitialSize() {
+		return DEFAULT_INITIAL_DIALOG_SIZE;
+	}
+
+	/**
+	 * Sets the viewer used to display the tabs for a launch configuration.
+	 * 
+	 * @param viewer the new view to set
+	 */
+	protected void setTabViewer(IMakerTabsViewer viewer) {
+		fTabViewer = viewer;
+	}
+
+	/**
+	 * Returns the viewer used to display the tabs for a launch configuration.
+	 * 
+	 * @return LaunchConfigurationTabGroupViewer
+	 */
+	protected IMakerTabsViewer getTabViewer() {
+		return fTabViewer;
+	}
+	
+	/**
+	 * @param filePath the filePath to set
+	 */
+	public void setFilePath(String path) {
+		this.filePath = path;
+	}
+
+	/**
+	 * @return the filePath
+	 */
+	public String getFilePath() {
+		return filePath;
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/dialogs/ProductSelectionDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,156 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.dialogs;
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.UIConfiguration;
+
+public class ProductSelectionDialog extends MessageDialog {
+	private UIConfiguration selectedConfiguration = null;
+	private IEnvironment activeEnvironment = null;
+	protected boolean dontShowAgain;
+	private final int style = SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL;
+	
+	public ProductSelectionDialog(Shell parentShell, IEnvironment env) {
+		super(parentShell, "Select product", null, // accept
+        // the
+        // default
+        // window
+        // icon
+		"The following products are available\n", QUESTION,
+		new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL },
+		0);
+		this.activeEnvironment = env;
+	}
+
+	@Override
+	protected Control createCustomArea(Composite parent) {
+		parent.setLayout(new GridLayout(1,true));
+		
+		//table 
+		Composite tableComp = new Composite(parent,SWT.FILL);
+		tableComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		tableComp.setLayout(new GridLayout(1,true));
+		GridData gridData = new GridData(GridData.FILL,GridData.FILL,true,true);
+		gridData.heightHint = 180;
+		Table table = new Table(tableComp,style);
+		table.setLayoutData(gridData);
+		
+		TableViewer viewer = new TableViewer(table);
+
+		viewer.getTable().setHeaderVisible(true);
+		viewer.getTable().setLinesVisible(true);
+
+		setContentProvider(viewer);
+		createColumns(viewer);
+		
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection sc = (IStructuredSelection) event.getSelection();
+				selectedConfiguration = (UIConfiguration) sc.getFirstElement();
+			}
+		});
+		
+		viewer.setInput(this);
+		return parent;
+	}
+	
+	private void createColumns(TableViewer viewer) {
+		int columnSizes[] = {110,320};
+		
+		TableViewerColumn column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("Name");
+		column.getColumn().setWidth(columnSizes[0]);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			@Override
+			public String getText(Object element) {
+				UIConfiguration c = (UIConfiguration) element;
+				return c.getConfigurationName();
+			}		
+		});
+
+		column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("Makefile");
+		column.getColumn().setWidth(columnSizes[1]);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			@Override
+			public String getText(Object element) {
+				UIConfiguration c = (UIConfiguration) element;
+				return c.getFilePath();
+			}		
+		});
+		
+	}
+
+	private void setContentProvider(TableViewer viewer) {
+		viewer.setContentProvider(new ConfMLFilesContentProvider());
+	}
+
+	public UIConfiguration getSelectedConfiguration() {
+		return selectedConfiguration;
+	}
+
+	public boolean displayDialog() {
+		return open() == 0;
+	}
+
+	public boolean isDontShowAgain() {
+		return dontShowAgain;
+	}
+	
+	/**
+	 * provide content for the table
+	 */
+	private class ConfMLFilesContentProvider implements IStructuredContentProvider {
+
+		public Object[] getElements(Object inputElement) {
+			List<UIConfiguration> configurations;
+			try {
+				configurations = activeEnvironment.getConfigurations();
+				return configurations.toArray();
+			} catch (InvocationTargetException e) {
+				return new UIConfiguration[]{};
+			}
+		}
+
+		public void dispose() {}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/Application.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.intro;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class controls all aspects of the application's execution
+ */
+public class Application implements IApplication {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+	 */
+	public Object start(IApplicationContext context) {
+		Display display = PlatformUI.createDisplay();
+		try {
+			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
+			if (returnCode == PlatformUI.RETURN_RESTART) {
+				return IApplication.EXIT_RESTART;
+			}
+			return IApplication.EXIT_OK;
+		} finally {
+			display.dispose();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.equinox.app.IApplication#stop()
+	 */
+	public void stop() {
+		final IWorkbench workbench = PlatformUI.getWorkbench();
+		if (workbench == null)
+			return;
+		final Display display = workbench.getDisplay();
+		display.syncExec(new Runnable() {
+			public void run() {
+				if (!display.isDisposed())
+					workbench.close();
+			}
+		});
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationActionBarAdvisor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.intro;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+
+public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
+
+    private IWorkbenchAction introAction;
+    
+	public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
+		super(configurer);
+	}
+
+	protected void makeActions(IWorkbenchWindow window) {
+		introAction = ActionFactory.INTRO.create(window);
+		register(introAction);
+	}
+
+	protected void fillMenuBar(IMenuManager menuBar) {
+		
+		MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
+		menuBar.add(helpMenu);
+
+		// Help
+		helpMenu.add(introAction);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationWorkbenchAdvisor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.intro;
+
+import org.eclipse.ui.application.IWorkbenchConfigurer;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchAdvisor;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
+
+	private static final String PERSPECTIVE_ID = "com.nokia.s60tools.imakerplugin.perspective";
+
+    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
+        return new ApplicationWorkbenchWindowAdvisor(configurer);
+    }
+    
+    public void initialize(IWorkbenchConfigurer configurer) {
+        super.initialize(configurer);
+        configurer.setSaveAndRestore(true);
+    }
+
+	public String getInitialWindowPerspectiveId() {
+		return PERSPECTIVE_ID;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/ApplicationWorkbenchWindowAdvisor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.intro;
+
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
+
+    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
+        super(configurer);
+    }
+
+    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
+        return new ApplicationActionBarAdvisor(configurer);
+    }
+    
+    public void preWindowOpen() {
+        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+        configurer.setInitialSize(new Point(700, 550));
+        configurer.setShowCoolBar(false);
+        configurer.setShowStatusLine(false);
+        configurer.setTitle("iMaker - The Image Maker");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/intro/Perspective.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.intro;
+
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class Perspective implements IPerspectiveFactory {
+
+	public void createInitialLayout(IPageLayout layout) {
+		createActions(layout);
+		createViews(layout);
+	}
+
+	private void createViews(IPageLayout layout) {
+		layout.setEditorAreaVisible(false);
+		String editorArea = layout.getEditorArea();
+		
+		IFolderLayout views = layout.createFolder("views", IPageLayout.LEFT, 0.25f,
+			    editorArea);
+		views.addView("com.nokia.s60tools.imakerplugin.views.PreferencesView");
+		views.addView("com.nokia.s60tools.imakerplugin.views.SettingView");
+
+	}
+
+	private void createActions(IPageLayout layout) {
+		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Configuration.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,144 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getSettings <em>Settings</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getFilePath <em>File Path</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getTargetrefs <em>Targetrefs</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfiguration()
+ * @model
+ * @generated
+ */
+public interface Configuration extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfiguration_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Settings</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.Setting}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Settings</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Settings</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfiguration_Settings()
+	 * @model type="iQRF.Setting" containment="true" required="true" upper="999999"
+	 * @generated
+	 */
+	EList getSettings();
+
+	/**
+	 * Returns the value of the '<em><b>File Path</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>File Path</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>File Path</em>' attribute.
+	 * @see #setFilePath(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfiguration_FilePath()
+	 * @model default=""
+	 * @generated
+	 */
+	String getFilePath();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getFilePath <em>File Path</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>File Path</em>' attribute.
+	 * @see #getFilePath()
+	 * @generated
+	 */
+	void setFilePath(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Targetrefs</b></em>' reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.Target}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Targetrefs</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Targetrefs</em>' reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfiguration_Targetrefs()
+	 * @model type="iQRF.Target" upper="99999"
+	 * @generated
+	 */
+	EList getTargetrefs();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addSetting(Setting setting);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addTargetRef(Target target);
+
+} // Configuration
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/ConfigurationElement.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Configuration Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getDescription <em>Description</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getValues <em>Values</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfigurationElement()
+ * @model
+ * @generated
+ */
+public interface ConfigurationElement extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfigurationElement_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfigurationElement_Description()
+	 * @model
+	 * @generated
+	 */
+	String getDescription();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #getDescription()
+	 * @generated
+	 */
+	void setDescription(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Values</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Values</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Values</em>' attribute.
+	 * @see #setValues(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getConfigurationElement_Values()
+	 * @model default=""
+	 * @generated
+	 */
+	String getValues();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getValues <em>Values</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Values</em>' attribute.
+	 * @see #getValues()
+	 * @generated
+	 */
+	void setValues(String value);
+
+} // ConfigurationElement
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IMaker.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>IMaker</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getResult <em>Result</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getQuery <em>Query</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getIMaker()
+ * @model
+ * @generated
+ */
+public interface IMaker extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Result</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Result</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Result</em>' containment reference.
+	 * @see #setResult(Result)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getIMaker_Result()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Result getResult();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getResult <em>Result</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Result</em>' containment reference.
+	 * @see #getResult()
+	 * @generated
+	 */
+	void setResult(Result value);
+
+	/**
+	 * Returns the value of the '<em><b>Query</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Query</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Query</em>' attribute.
+	 * @see #setQuery(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getIMaker_Query()
+	 * @model default=""
+	 * @generated
+	 */
+	String getQuery();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getQuery <em>Query</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Query</em>' attribute.
+	 * @see #getQuery()
+	 * @generated
+	 */
+	void setQuery(String value);
+	
+} // IMaker
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IQRFFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,111 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage
+ * @generated
+ */
+public interface IQRFFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	IQRFFactory eINSTANCE = com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Result</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Result</em>'.
+	 * @generated
+	 */
+	Result createResult();
+
+	/**
+	 * Returns a new object of class '<em>Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Configuration</em>'.
+	 * @generated
+	 */
+	Configuration createConfiguration();
+
+	/**
+	 * Returns a new object of class '<em>Setting</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Setting</em>'.
+	 * @generated
+	 */
+	Setting createSetting();
+
+	/**
+	 * Returns a new object of class '<em>Interface</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Interface</em>'.
+	 * @generated
+	 */
+	Interface createInterface();
+
+	/**
+	 * Returns a new object of class '<em>Configuration Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Configuration Element</em>'.
+	 * @generated
+	 */
+	ConfigurationElement createConfigurationElement();
+
+	/**
+	 * Returns a new object of class '<em>Target</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Target</em>'.
+	 * @generated
+	 */
+	Target createTarget();
+
+	/**
+	 * Returns a new object of class '<em>IMaker</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>IMaker</em>'.
+	 * @generated
+	 */
+	IMaker createIMaker();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	IQRFPackage getIQRFPackage();
+
+} //IQRFFactory
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/IQRFPackage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,904 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface IQRFPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "iQRF";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "iqrf";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	IQRFPackage eINSTANCE = com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl <em>Result</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getResult()
+	 * @generated
+	 */
+	int RESULT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Interfaces</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESULT__INTERFACES = 0;
+
+	/**
+	 * The feature id for the '<em><b>Configurations</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESULT__CONFIGURATIONS = 1;
+
+	/**
+	 * The feature id for the '<em><b>Targets</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESULT__TARGETS = 2;
+
+	/**
+	 * The number of structural features of the '<em>Result</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESULT_FEATURE_COUNT = 3;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl <em>Configuration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getConfiguration()
+	 * @generated
+	 */
+	int CONFIGURATION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Settings</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION__SETTINGS = 1;
+
+	/**
+	 * The feature id for the '<em><b>File Path</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION__FILE_PATH = 2;
+
+	/**
+	 * The feature id for the '<em><b>Targetrefs</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION__TARGETREFS = 3;
+
+	/**
+	 * The number of structural features of the '<em>Configuration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION_FEATURE_COUNT = 4;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl <em>Setting</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getSetting()
+	 * @generated
+	 */
+	int SETTING = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SETTING__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SETTING__VALUE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Ref</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SETTING__REF = 2;
+
+	/**
+	 * The number of structural features of the '<em>Setting</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SETTING_FEATURE_COUNT = 3;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl <em>Interface</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getInterface()
+	 * @generated
+	 */
+	int INTERFACE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERFACE__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Configuration Elements</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERFACE__CONFIGURATION_ELEMENTS = 1;
+
+	/**
+	 * The number of structural features of the '<em>Interface</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERFACE_FEATURE_COUNT = 2;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl <em>Configuration Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getConfigurationElement()
+	 * @generated
+	 */
+	int CONFIGURATION_ELEMENT = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION_ELEMENT__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION_ELEMENT__DESCRIPTION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Values</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION_ELEMENT__VALUES = 2;
+
+	/**
+	 * The number of structural features of the '<em>Configuration Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONFIGURATION_ELEMENT_FEATURE_COUNT = 3;
+
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl <em>Target</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getTarget()
+	 * @generated
+	 */
+	int TARGET = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TARGET__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TARGET__DESCRIPTION = 1;
+
+	/**
+	 * The number of structural features of the '<em>Target</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TARGET_FEATURE_COUNT = 2;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl <em>IMaker</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getIMaker()
+	 * @generated
+	 */
+	int IMAKER = 6;
+
+	/**
+	 * The feature id for the '<em><b>Result</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAKER__RESULT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Query</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAKER__QUERY = 1;
+
+	/**
+	 * The number of structural features of the '<em>IMaker</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAKER_FEATURE_COUNT = 2;
+
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.Result <em>Result</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Result</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Result
+	 * @generated
+	 */
+	EClass getResult();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getInterfaces <em>Interfaces</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Interfaces</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Result#getInterfaces()
+	 * @see #getResult()
+	 * @generated
+	 */
+	EReference getResult_Interfaces();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getConfigurations <em>Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Configurations</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Result#getConfigurations()
+	 * @see #getResult()
+	 * @generated
+	 */
+	EReference getResult_Configurations();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getTargets <em>Targets</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Targets</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Result#getTargets()
+	 * @see #getResult()
+	 * @generated
+	 */
+	EReference getResult_Targets();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration <em>Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Configuration</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration
+	 * @generated
+	 */
+	EClass getConfiguration();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration#getName()
+	 * @see #getConfiguration()
+	 * @generated
+	 */
+	EAttribute getConfiguration_Name();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getSettings <em>Settings</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Settings</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration#getSettings()
+	 * @see #getConfiguration()
+	 * @generated
+	 */
+	EReference getConfiguration_Settings();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getFilePath <em>File Path</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>File Path</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration#getFilePath()
+	 * @see #getConfiguration()
+	 * @generated
+	 */
+	EAttribute getConfiguration_FilePath();
+
+	/**
+	 * Returns the meta object for the reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration#getTargetrefs <em>Targetrefs</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Targetrefs</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration#getTargetrefs()
+	 * @see #getConfiguration()
+	 * @generated
+	 */
+	EReference getConfiguration_Targetrefs();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting <em>Setting</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Setting</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Setting
+	 * @generated
+	 */
+	EClass getSetting();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Setting#getName()
+	 * @see #getSetting()
+	 * @generated
+	 */
+	EAttribute getSetting_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Setting#getValue()
+	 * @see #getSetting()
+	 * @generated
+	 */
+	EAttribute getSetting_Value();
+
+	/**
+	 * Returns the meta object for the reference '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getRef <em>Ref</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Ref</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Setting#getRef()
+	 * @see #getSetting()
+	 * @generated
+	 */
+	EReference getSetting_Ref();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.Interface <em>Interface</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Interface</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Interface
+	 * @generated
+	 */
+	EClass getInterface();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Interface#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Interface#getName()
+	 * @see #getInterface()
+	 * @generated
+	 */
+	EAttribute getInterface_Name();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.iqrf.Interface#getConfigurationElements <em>Configuration Elements</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Configuration Elements</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Interface#getConfigurationElements()
+	 * @see #getInterface()
+	 * @generated
+	 */
+	EReference getInterface_ConfigurationElements();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement <em>Configuration Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Configuration Element</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement
+	 * @generated
+	 */
+	EClass getConfigurationElement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getName()
+	 * @see #getConfigurationElement()
+	 * @generated
+	 */
+	EAttribute getConfigurationElement_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getDescription()
+	 * @see #getConfigurationElement()
+	 * @generated
+	 */
+	EAttribute getConfigurationElement_Description();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getValues <em>Values</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Values</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement#getValues()
+	 * @see #getConfigurationElement()
+	 * @generated
+	 */
+	EAttribute getConfigurationElement_Values();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.Target <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Target</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Target
+	 * @generated
+	 */
+	EClass getTarget();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Target#getName()
+	 * @see #getTarget()
+	 * @generated
+	 */
+	EAttribute getTarget_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Target#getDescription()
+	 * @see #getTarget()
+	 * @generated
+	 */
+	EAttribute getTarget_Description();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker <em>IMaker</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>IMaker</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IMaker
+	 * @generated
+	 */
+	EClass getIMaker();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getResult <em>Result</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Result</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IMaker#getResult()
+	 * @see #getIMaker()
+	 * @generated
+	 */
+	EReference getIMaker_Result();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker#getQuery <em>Query</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Query</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IMaker#getQuery()
+	 * @see #getIMaker()
+	 * @generated
+	 */
+	EAttribute getIMaker_Query();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	IQRFFactory getIQRFFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals  {
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl <em>Result</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getResult()
+		 * @generated
+		 */
+		EClass RESULT = eINSTANCE.getResult();
+
+		/**
+		 * The meta object literal for the '<em><b>Interfaces</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESULT__INTERFACES = eINSTANCE.getResult_Interfaces();
+
+		/**
+		 * The meta object literal for the '<em><b>Configurations</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESULT__CONFIGURATIONS = eINSTANCE.getResult_Configurations();
+
+		/**
+		 * The meta object literal for the '<em><b>Targets</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESULT__TARGETS = eINSTANCE.getResult_Targets();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl <em>Configuration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getConfiguration()
+		 * @generated
+		 */
+		EClass CONFIGURATION = eINSTANCE.getConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONFIGURATION__NAME = eINSTANCE.getConfiguration_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Settings</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONFIGURATION__SETTINGS = eINSTANCE.getConfiguration_Settings();
+
+		/**
+		 * The meta object literal for the '<em><b>File Path</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONFIGURATION__FILE_PATH = eINSTANCE.getConfiguration_FilePath();
+
+		/**
+		 * The meta object literal for the '<em><b>Targetrefs</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONFIGURATION__TARGETREFS = eINSTANCE.getConfiguration_Targetrefs();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl <em>Setting</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getSetting()
+		 * @generated
+		 */
+		EClass SETTING = eINSTANCE.getSetting();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SETTING__NAME = eINSTANCE.getSetting_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SETTING__VALUE = eINSTANCE.getSetting_Value();
+
+		/**
+		 * The meta object literal for the '<em><b>Ref</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SETTING__REF = eINSTANCE.getSetting_Ref();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl <em>Interface</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getInterface()
+		 * @generated
+		 */
+		EClass INTERFACE = eINSTANCE.getInterface();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INTERFACE__NAME = eINSTANCE.getInterface_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Configuration Elements</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INTERFACE__CONFIGURATION_ELEMENTS = eINSTANCE.getInterface_ConfigurationElements();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl <em>Configuration Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getConfigurationElement()
+		 * @generated
+		 */
+		EClass CONFIGURATION_ELEMENT = eINSTANCE.getConfigurationElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONFIGURATION_ELEMENT__NAME = eINSTANCE.getConfigurationElement_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONFIGURATION_ELEMENT__DESCRIPTION = eINSTANCE.getConfigurationElement_Description();
+
+		/**
+		 * The meta object literal for the '<em><b>Values</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONFIGURATION_ELEMENT__VALUES = eINSTANCE.getConfigurationElement_Values();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl <em>Target</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getTarget()
+		 * @generated
+		 */
+		EClass TARGET = eINSTANCE.getTarget();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TARGET__NAME = eINSTANCE.getTarget_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TARGET__DESCRIPTION = eINSTANCE.getTarget_Description();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl <em>IMaker</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl
+		 * @see com.nokia.s60tools.imaker.internal.iqrf.impl.IQRFPackageImpl#getIMaker()
+		 * @generated
+		 */
+		EClass IMAKER = eINSTANCE.getIMaker();
+
+		/**
+		 * The meta object literal for the '<em><b>Result</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IMAKER__RESULT = eINSTANCE.getIMaker_Result();
+
+		/**
+		 * The meta object literal for the '<em><b>Query</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IMAKER__QUERY = eINSTANCE.getIMaker_Query();
+
+	}
+
+} //IQRFPackage
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Interface.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Interface</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Interface#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Interface#getConfigurationElements <em>Configuration Elements</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getInterface()
+ * @model
+ * @generated
+ */
+public interface Interface extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getInterface_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Interface#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Configuration Elements</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Configuration Elements</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Configuration Elements</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getInterface_ConfigurationElements()
+	 * @model type="iQRF.ConfigurationElement" containment="true" required="true" upper="999999"
+	 * @generated
+	 */
+	EList getConfigurationElements();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addConfigurationElement(ConfigurationElement element);
+
+} // Interface
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Result.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Result</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getInterfaces <em>Interfaces</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getConfigurations <em>Configurations</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Result#getTargets <em>Targets</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getResult()
+ * @model
+ * @generated
+ */
+public interface Result extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Interfaces</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.Interface}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Interfaces</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Interfaces</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getResult_Interfaces()
+	 * @model type="iQRF.Interface" containment="true" required="true" upper="99999"
+	 * @generated
+	 */
+	EList getInterfaces();
+
+	/**
+	 * Returns the value of the '<em><b>Configurations</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.Configuration}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Configurations</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Configurations</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getResult_Configurations()
+	 * @model type="iQRF.Configuration" containment="true" required="true" upper="99999"
+	 * @generated
+	 */
+	EList getConfigurations();
+
+	/**
+	 * Returns the value of the '<em><b>Targets</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.iqrf.Target}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Targets</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Targets</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getResult_Targets()
+	 * @model type="iQRF.Target" containment="true" upper="99999"
+	 * @generated
+	 */
+	EList getTargets();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addConfiguration(Configuration config);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addInterface(Interface intf);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addTarget(Target target);
+
+} // Result
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Setting.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Setting</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getValue <em>Value</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getRef <em>Ref</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getSetting()
+ * @model
+ * @generated
+ */
+public interface Setting extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getSetting_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getSetting_Value()
+	 * @model default=""
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Ref</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Ref</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Ref</em>' reference.
+	 * @see #setRef(ConfigurationElement)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getSetting_Ref()
+	 * @model
+	 * @generated
+	 */
+	ConfigurationElement getRef();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting#getRef <em>Ref</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Ref</em>' reference.
+	 * @see #getRef()
+	 * @generated
+	 */
+	void setRef(ConfigurationElement value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void setConfigurationElement(ConfigurationElement element);
+
+} // Setting
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/Target.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,94 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Target</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getDescription <em>Description</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getTarget()
+ * @model
+ * @generated
+ */
+public interface Target extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getTarget_Name()
+	 * @model default=""
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * The default value is <code>""</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(String)
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#getTarget_Description()
+	 * @model default=""
+	 * @generated
+	 */
+	String getDescription();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.iqrf.Target#getDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #getDescription()
+	 * @generated
+	 */
+	void setDescription(String value);
+
+} // Target
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ConfigurationElementImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Configuration Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl#getDescription <em>Description</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationElementImpl#getValues <em>Values</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ConfigurationElementImpl extends EObjectImpl implements ConfigurationElement {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected String description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getValues() <em>Values</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValues()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUES_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getValues() <em>Values</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValues()
+	 * @generated
+	 * @ordered
+	 */
+	protected String values = VALUES_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConfigurationElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.CONFIGURATION_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.CONFIGURATION_ELEMENT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(String newDescription) {
+		String oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.CONFIGURATION_ELEMENT__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValues() {
+		return values;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValues(String newValues) {
+		String oldValues = values;
+		values = newValues;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.CONFIGURATION_ELEMENT__VALUES, oldValues, values));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION_ELEMENT__NAME:
+				return getName();
+			case IQRFPackage.CONFIGURATION_ELEMENT__DESCRIPTION:
+				return getDescription();
+			case IQRFPackage.CONFIGURATION_ELEMENT__VALUES:
+				return getValues();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION_ELEMENT__NAME:
+				setName((String)newValue);
+				return;
+			case IQRFPackage.CONFIGURATION_ELEMENT__DESCRIPTION:
+				setDescription((String)newValue);
+				return;
+			case IQRFPackage.CONFIGURATION_ELEMENT__VALUES:
+				setValues((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION_ELEMENT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case IQRFPackage.CONFIGURATION_ELEMENT__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+			case IQRFPackage.CONFIGURATION_ELEMENT__VALUES:
+				setValues(VALUES_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION_ELEMENT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case IQRFPackage.CONFIGURATION_ELEMENT__DESCRIPTION:
+				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+			case IQRFPackage.CONFIGURATION_ELEMENT__VALUES:
+				return VALUES_EDEFAULT == null ? values != null : !VALUES_EDEFAULT.equals(values);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", description: ");
+		result.append(description);
+		result.append(", values: ");
+		result.append(values);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof ConfigurationElement)) return false;
+		ConfigurationElement other = (ConfigurationElement)object;
+		return IQRFUtil.equals(getName(),other.getName()) && 
+			   IQRFUtil.equals(getDescription(),other.getDescription()) &&
+			   IQRFUtil.equals(getValues(),other.getValues());
+	}
+
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getName().hashCode();
+		result=result*hashMultiplier + getDescription().hashCode();
+		result=result*hashMultiplier + getValues().hashCode();
+		return result;
+	}
+} //ConfigurationElementImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ConfigurationImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl#getSettings <em>Settings</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl#getFilePath <em>File Path</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ConfigurationImpl#getTargetrefs <em>Targetrefs</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ConfigurationImpl extends EObjectImpl implements Configuration {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getSettings() <em>Settings</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSettings()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList settings = null;
+
+	/**
+	 * The default value of the '{@link #getFilePath() <em>File Path</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFilePath()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String FILE_PATH_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getFilePath() <em>File Path</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFilePath()
+	 * @generated
+	 * @ordered
+	 */
+	protected String filePath = FILE_PATH_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getTargetrefs() <em>Targetrefs</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTargetrefs()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList targetrefs = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConfigurationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.CONFIGURATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.CONFIGURATION__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getSettings() {
+		if (settings == null) {
+			settings = new EObjectContainmentEList(Setting.class, this, IQRFPackage.CONFIGURATION__SETTINGS);
+		}
+		return settings;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getFilePath() {
+		return filePath;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFilePath(String newFilePath) {
+		String oldFilePath = filePath;
+		filePath = newFilePath;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.CONFIGURATION__FILE_PATH, oldFilePath, filePath));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getTargetrefs() {
+		if (targetrefs == null) {
+			targetrefs = new EObjectResolvingEList(Target.class, this, IQRFPackage.CONFIGURATION__TARGETREFS);
+		}
+		return targetrefs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addSetting(Setting set) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (settings == null) {
+			settings = new EObjectContainmentEList(Setting.class, this, IQRFPackage.CONFIGURATION__SETTINGS);
+		}
+		settings.add(set);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addTargetRef(Target target) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (targetrefs == null) {
+			targetrefs = new EObjectResolvingEList(Target.class, this, IQRFPackage.CONFIGURATION__TARGETREFS);
+		}
+		targetrefs.add(target);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION__SETTINGS:
+				return ((InternalEList)getSettings()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION__NAME:
+				return getName();
+			case IQRFPackage.CONFIGURATION__SETTINGS:
+				return getSettings();
+			case IQRFPackage.CONFIGURATION__FILE_PATH:
+				return getFilePath();
+			case IQRFPackage.CONFIGURATION__TARGETREFS:
+				return getTargetrefs();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION__NAME:
+				setName((String)newValue);
+				return;
+			case IQRFPackage.CONFIGURATION__SETTINGS:
+				getSettings().clear();
+				getSettings().addAll((Collection)newValue);
+				return;
+			case IQRFPackage.CONFIGURATION__FILE_PATH:
+				setFilePath((String)newValue);
+				return;
+			case IQRFPackage.CONFIGURATION__TARGETREFS:
+				getTargetrefs().clear();
+				getTargetrefs().addAll((Collection)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case IQRFPackage.CONFIGURATION__SETTINGS:
+				getSettings().clear();
+				return;
+			case IQRFPackage.CONFIGURATION__FILE_PATH:
+				setFilePath(FILE_PATH_EDEFAULT);
+				return;
+			case IQRFPackage.CONFIGURATION__TARGETREFS:
+				getTargetrefs().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.CONFIGURATION__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case IQRFPackage.CONFIGURATION__SETTINGS:
+				return settings != null && !settings.isEmpty();
+			case IQRFPackage.CONFIGURATION__FILE_PATH:
+				return FILE_PATH_EDEFAULT == null ? filePath != null : !FILE_PATH_EDEFAULT.equals(filePath);
+			case IQRFPackage.CONFIGURATION__TARGETREFS:
+				return targetrefs != null && !targetrefs.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", filePath: ");
+		result.append(filePath);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof Configuration)) return false;
+		Configuration other = (Configuration)object;
+		boolean self = IQRFUtil.equals(getName(),other.getName()) && 
+					   IQRFUtil.equals(getFilePath(),other.getFilePath());
+		if(!self) return false;
+		
+		Iterator iter1 = getSettings().iterator();
+		Iterator iter2 = other.getSettings().iterator();
+		while (iter1.hasNext() || iter2.hasNext())
+		{
+			Setting s1, s2;
+			s1 = (Setting)iter1.next();
+			s2 = (Setting)iter2.next();
+			if(!s1.equals(s2)) return false;
+		}
+		
+		Iterator iterT1 = getTargetrefs().iterator();
+		Iterator iterT2 = other.getTargetrefs().iterator();
+		while (iterT1.hasNext() || iterT2.hasNext())
+		{
+			Target t1, t2;
+			t1 = (Target)iterT1.next();
+			t2 = (Target)iterT2.next();
+			if(!t1.equals(t2)) return false;
+		}
+		return true;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getName().hashCode();
+		result=result*hashMultiplier + getFilePath().hashCode();
+		return result;
+	}
+} //ConfigurationImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IMakerImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,265 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>IMaker</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl#getResult <em>Result</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl#getQuery <em>Query</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class IMakerImpl extends EObjectImpl implements IMaker {
+	/**
+	 * The cached value of the '{@link #getResult() <em>Result</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getResult()
+	 * @generated
+	 * @ordered
+	 */
+	protected Result result = null;
+
+	/**
+	 * The default value of the '{@link #getQuery() <em>Query</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getQuery()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String QUERY_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getQuery() <em>Query</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getQuery()
+	 * @generated
+	 * @ordered
+	 */
+	protected String query = QUERY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IMakerImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.IMAKER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Result getResult() {
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetResult(Result newResult, NotificationChain msgs) {
+		Result oldResult = result;
+		result = newResult;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, IQRFPackage.IMAKER__RESULT, oldResult, newResult);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setResult(Result newResult) {
+		if (newResult != result) {
+			NotificationChain msgs = null;
+			if (result != null)
+				msgs = ((InternalEObject)result).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - IQRFPackage.IMAKER__RESULT, null, msgs);
+			if (newResult != null)
+				msgs = ((InternalEObject)newResult).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - IQRFPackage.IMAKER__RESULT, null, msgs);
+			msgs = basicSetResult(newResult, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.IMAKER__RESULT, newResult, newResult));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getQuery() {
+		return query;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setQuery(String newQuery) {
+		String oldQuery = query;
+		query = newQuery;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.IMAKER__QUERY, oldQuery, query));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case IQRFPackage.IMAKER__RESULT:
+				return basicSetResult(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.IMAKER__RESULT:
+				return getResult();
+			case IQRFPackage.IMAKER__QUERY:
+				return getQuery();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.IMAKER__RESULT:
+				setResult((Result)newValue);
+				return;
+			case IQRFPackage.IMAKER__QUERY:
+				setQuery((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.IMAKER__RESULT:
+				setResult((Result)null);
+				return;
+			case IQRFPackage.IMAKER__QUERY:
+				setQuery(QUERY_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.IMAKER__RESULT:
+				return result != null;
+			case IQRFPackage.IMAKER__QUERY:
+				return QUERY_EDEFAULT == null ? query != null : !QUERY_EDEFAULT.equals(query);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (query: ");
+		result.append(query);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof IMaker)) return false;
+		IMaker imaker = (IMaker)object;
+		if(!IQRFUtil.equals(getQuery(),imaker.getQuery())) return false;
+		return getResult().equals(imaker.getResult());
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getQuery().hashCode();
+		return result;
+	}
+} //IMakerImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IQRFFactoryImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,180 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IQRFFactoryImpl extends EFactoryImpl implements IQRFFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static IQRFFactory init() {
+		try {
+			IQRFFactory theIQRFFactory = (IQRFFactory)EPackage.Registry.INSTANCE.getEFactory("iqrf"); 
+			if (theIQRFFactory != null) {
+				return theIQRFFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new IQRFFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IQRFFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case IQRFPackage.RESULT: return createResult();
+			case IQRFPackage.CONFIGURATION: return createConfiguration();
+			case IQRFPackage.SETTING: return createSetting();
+			case IQRFPackage.INTERFACE: return createInterface();
+			case IQRFPackage.CONFIGURATION_ELEMENT: return createConfigurationElement();
+			case IQRFPackage.TARGET: return createTarget();
+			case IQRFPackage.IMAKER: return createIMaker();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Result createResult() {
+		ResultImpl result = new ResultImpl();
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Configuration createConfiguration() {
+		ConfigurationImpl configuration = new ConfigurationImpl();
+		return configuration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Setting createSetting() {
+		SettingImpl setting = new SettingImpl();
+		return setting;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Interface createInterface() {
+		InterfaceImpl interface_ = new InterfaceImpl();
+		return interface_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationElement createConfigurationElement() {
+		ConfigurationElementImpl configurationElement = new ConfigurationElementImpl();
+		return configurationElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Target createTarget() {
+		TargetImpl target = new TargetImpl();
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IMaker createIMaker() {
+		IMakerImpl iMaker = new IMakerImpl();
+		return iMaker;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IQRFPackage getIQRFPackage() {
+		return (IQRFPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	public static IQRFPackage getPackage() {
+		return IQRFPackage.eINSTANCE;
+	}
+
+} //IQRFFactoryImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/IQRFPackageImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,541 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IQRFPackageImpl extends EPackageImpl implements IQRFPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass resultEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass configurationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass settingEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass interfaceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass configurationElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass targetEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass iMakerEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private IQRFPackageImpl() {
+		super(eNS_URI, IQRFFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this
+	 * model, and for any others upon which it depends.  Simple
+	 * dependencies are satisfied by calling this method on all
+	 * dependent packages before doing anything else.  This method drives
+	 * initialization for interdependent packages directly, in parallel
+	 * with this package, itself.
+	 * <p>Of this package and its interdependencies, all packages which
+	 * have not yet been registered by their URI values are first created
+	 * and registered.  The packages are then initialized in two steps:
+	 * meta-model objects for all of the packages are created before any
+	 * are initialized, since one package's meta-model objects may refer to
+	 * those of another.
+	 * <p>Invocation of this method will not affect any packages that have
+	 * already been initialized.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static IQRFPackage init() {
+		if (isInited) return (IQRFPackage)EPackage.Registry.INSTANCE.getEPackage(IQRFPackage.eNS_URI);
+
+		// Obtain or create and register package
+		IQRFPackageImpl theIQRFPackage = (IQRFPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof IQRFPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new IQRFPackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theIQRFPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theIQRFPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theIQRFPackage.freeze();
+
+		return theIQRFPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getResult() {
+		return resultEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResult_Interfaces() {
+		return (EReference)resultEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResult_Configurations() {
+		return (EReference)resultEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResult_Targets() {
+		return (EReference)resultEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getConfiguration() {
+		return configurationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConfiguration_Name() {
+		return (EAttribute)configurationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConfiguration_Settings() {
+		return (EReference)configurationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConfiguration_FilePath() {
+		return (EAttribute)configurationEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConfiguration_Targetrefs() {
+		return (EReference)configurationEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSetting() {
+		return settingEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getSetting_Name() {
+		return (EAttribute)settingEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getSetting_Value() {
+		return (EAttribute)settingEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSetting_Ref() {
+		return (EReference)settingEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInterface() {
+		return interfaceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getInterface_Name() {
+		return (EAttribute)interfaceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInterface_ConfigurationElements() {
+		return (EReference)interfaceEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getConfigurationElement() {
+		return configurationElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConfigurationElement_Name() {
+		return (EAttribute)configurationElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConfigurationElement_Description() {
+		return (EAttribute)configurationElementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConfigurationElement_Values() {
+		return (EAttribute)configurationElementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTarget() {
+		return targetEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTarget_Name() {
+		return (EAttribute)targetEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTarget_Description() {
+		return (EAttribute)targetEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIMaker() {
+		return iMakerEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIMaker_Result() {
+		return (EReference)iMakerEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIMaker_Query() {
+		return (EAttribute)iMakerEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IQRFFactory getIQRFFactory() {
+		return (IQRFFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		resultEClass = createEClass(RESULT);
+		createEReference(resultEClass, RESULT__INTERFACES);
+		createEReference(resultEClass, RESULT__CONFIGURATIONS);
+		createEReference(resultEClass, RESULT__TARGETS);
+
+		configurationEClass = createEClass(CONFIGURATION);
+		createEAttribute(configurationEClass, CONFIGURATION__NAME);
+		createEReference(configurationEClass, CONFIGURATION__SETTINGS);
+		createEAttribute(configurationEClass, CONFIGURATION__FILE_PATH);
+		createEReference(configurationEClass, CONFIGURATION__TARGETREFS);
+
+		settingEClass = createEClass(SETTING);
+		createEAttribute(settingEClass, SETTING__NAME);
+		createEAttribute(settingEClass, SETTING__VALUE);
+		createEReference(settingEClass, SETTING__REF);
+
+		interfaceEClass = createEClass(INTERFACE);
+		createEAttribute(interfaceEClass, INTERFACE__NAME);
+		createEReference(interfaceEClass, INTERFACE__CONFIGURATION_ELEMENTS);
+
+		configurationElementEClass = createEClass(CONFIGURATION_ELEMENT);
+		createEAttribute(configurationElementEClass, CONFIGURATION_ELEMENT__NAME);
+		createEAttribute(configurationElementEClass, CONFIGURATION_ELEMENT__DESCRIPTION);
+		createEAttribute(configurationElementEClass, CONFIGURATION_ELEMENT__VALUES);
+
+		targetEClass = createEClass(TARGET);
+		createEAttribute(targetEClass, TARGET__NAME);
+		createEAttribute(targetEClass, TARGET__DESCRIPTION);
+
+		iMakerEClass = createEClass(IMAKER);
+		createEReference(iMakerEClass, IMAKER__RESULT);
+		createEAttribute(iMakerEClass, IMAKER__QUERY);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Add supertypes to classes
+
+		// Initialize classes and features; add operations and parameters
+		initEClass(resultEClass, Result.class, "Result", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getResult_Interfaces(), this.getInterface(), null, "interfaces", null, 1, 99999, Result.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResult_Configurations(), this.getConfiguration(), null, "configurations", null, 1, 99999, Result.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResult_Targets(), this.getTarget(), null, "targets", "", 0, 99999, Result.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		EOperation op = addEOperation(resultEClass, null, "addConfiguration");
+		addEParameter(op, this.getConfiguration(), "config", 0, 1);
+
+		op = addEOperation(resultEClass, null, "addInterface");
+		addEParameter(op, this.getInterface(), "intf", 0, 1);
+
+		op = addEOperation(resultEClass, null, "addTarget");
+		addEParameter(op, this.getTarget(), "target", 0, 1);
+
+		initEClass(configurationEClass, Configuration.class, "Configuration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getConfiguration_Name(), ecorePackage.getEString(), "name", null, 0, 1, Configuration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConfiguration_Settings(), this.getSetting(), null, "settings", null, 1, 999999, Configuration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getConfiguration_FilePath(), ecorePackage.getEString(), "filePath", "", 0, 1, Configuration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConfiguration_Targetrefs(), this.getTarget(), null, "targetrefs", "", 0, 99999, Configuration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(configurationEClass, null, "addSetting");
+		addEParameter(op, this.getSetting(), "setting", 0, 1);
+
+		op = addEOperation(configurationEClass, null, "addTargetRef");
+		addEParameter(op, this.getTarget(), "target", 0, 1);
+
+		initEClass(settingEClass, Setting.class, "Setting", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getSetting_Name(), ecorePackage.getEString(), "name", null, 0, 1, Setting.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getSetting_Value(), ecorePackage.getEString(), "value", "", 0, 1, Setting.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getSetting_Ref(), this.getConfigurationElement(), null, "ref", null, 0, 1, Setting.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(settingEClass, null, "setConfigurationElement");
+		addEParameter(op, this.getConfigurationElement(), "element", 0, 1);
+
+		initEClass(interfaceEClass, Interface.class, "Interface", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getInterface_Name(), ecorePackage.getEString(), "name", null, 0, 1, Interface.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInterface_ConfigurationElements(), this.getConfigurationElement(), null, "configurationElements", null, 1, 999999, Interface.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(interfaceEClass, null, "addConfigurationElement");
+		addEParameter(op, this.getConfigurationElement(), "element", 0, 1);
+
+		initEClass(configurationElementEClass, ConfigurationElement.class, "ConfigurationElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getConfigurationElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, ConfigurationElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getConfigurationElement_Description(), ecorePackage.getEString(), "description", null, 0, 1, ConfigurationElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getConfigurationElement_Values(), ecorePackage.getEString(), "values", "", 0, 1, ConfigurationElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(targetEClass, Target.class, "Target", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getTarget_Name(), ecorePackage.getEString(), "name", "", 0, 1, Target.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTarget_Description(), ecorePackage.getEString(), "description", "", 0, 1, Target.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(iMakerEClass, IMaker.class, "IMaker", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getIMaker_Result(), this.getResult(), null, "result", null, 1, 1, IMaker.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIMaker_Query(), ecorePackage.getEString(), "query", "", 0, 1, IMaker.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //IQRFPackageImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/InterfaceImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,268 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Interface</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.InterfaceImpl#getConfigurationElements <em>Configuration Elements</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class InterfaceImpl extends EObjectImpl implements Interface {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getConfigurationElements() <em>Configuration Elements</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConfigurationElements()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList configurationElements = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InterfaceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.INTERFACE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.INTERFACE__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getConfigurationElements() {
+		if (configurationElements == null) {
+			configurationElements = new EObjectContainmentEList(ConfigurationElement.class, this, IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS);
+		}
+		return configurationElements;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addConfigurationElement(ConfigurationElement element) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (configurationElements == null)
+		{
+			configurationElements = new EObjectContainmentEList(ConfigurationElement.class, this, IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS);
+		}
+		configurationElements.add(element);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS:
+				return ((InternalEList)getConfigurationElements()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.INTERFACE__NAME:
+				return getName();
+			case IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS:
+				return getConfigurationElements();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.INTERFACE__NAME:
+				setName((String)newValue);
+				return;
+			case IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS:
+				getConfigurationElements().clear();
+				getConfigurationElements().addAll((Collection)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.INTERFACE__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS:
+				getConfigurationElements().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.INTERFACE__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case IQRFPackage.INTERFACE__CONFIGURATION_ELEMENTS:
+				return configurationElements != null && !configurationElements.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof Interface)) return false;
+		Interface other = (Interface)object;
+		if(!IQRFUtil.equals(getName(),other.getName())) return false;
+		Iterator iter1 = getConfigurationElements().iterator();
+		Iterator iter2 = other.getConfigurationElements().iterator();
+		while (iter1.hasNext() || iter2.hasNext())
+		{
+			ConfigurationElement c1, c2;
+			c1 = (ConfigurationElement)iter1.next();
+			c2 = (ConfigurationElement)iter2.next();
+			if(!c1.equals(c2)) return false;
+		}
+		return true;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getName().hashCode();
+		return result;
+	}
+} //InterfaceImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/ResultImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,326 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Result</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl#getInterfaces <em>Interfaces</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl#getConfigurations <em>Configurations</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.ResultImpl#getTargets <em>Targets</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ResultImpl extends EObjectImpl implements Result {
+	/**
+	 * The cached value of the '{@link #getInterfaces() <em>Interfaces</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInterfaces()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList interfaces = null;
+
+	/**
+	 * The cached value of the '{@link #getConfigurations() <em>Configurations</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConfigurations()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList configurations = null;
+
+	/**
+	 * The cached value of the '{@link #getTargets() <em>Targets</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTargets()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList targets = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ResultImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.RESULT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getInterfaces() {
+		if (interfaces == null) {
+			interfaces = new EObjectContainmentEList(Interface.class, this, IQRFPackage.RESULT__INTERFACES);
+		}
+		return interfaces;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getConfigurations() {
+		if (configurations == null) {
+			configurations = new EObjectContainmentEList(Configuration.class, this, IQRFPackage.RESULT__CONFIGURATIONS);
+		}
+		return configurations;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList getTargets() {
+		if (targets == null) {
+			targets = new EObjectContainmentEList(Target.class, this, IQRFPackage.RESULT__TARGETS);
+		}
+		return targets;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addConfiguration(Configuration config) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (configurations == null) {
+			configurations = new EObjectContainmentEList(Configuration.class, this, IQRFPackage.RESULT__CONFIGURATIONS);
+		}
+		configurations.add(config);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addInterface(Interface intf) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (interfaces == null) {
+			interfaces = new EObjectContainmentEList(Interface.class, this, IQRFPackage.RESULT__INTERFACES);
+		}
+		interfaces.add(intf);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@SuppressWarnings("unchecked")
+	public void addTarget(Target target) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		if (this.targets == null) {
+			this.targets = new EObjectContainmentEList(Target.class, this, IQRFPackage.RESULT__TARGETS);
+		}
+		this.targets.add(target);
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case IQRFPackage.RESULT__INTERFACES:
+				return ((InternalEList)getInterfaces()).basicRemove(otherEnd, msgs);
+			case IQRFPackage.RESULT__CONFIGURATIONS:
+				return ((InternalEList)getConfigurations()).basicRemove(otherEnd, msgs);
+			case IQRFPackage.RESULT__TARGETS:
+				return ((InternalEList)getTargets()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.RESULT__INTERFACES:
+				return getInterfaces();
+			case IQRFPackage.RESULT__CONFIGURATIONS:
+				return getConfigurations();
+			case IQRFPackage.RESULT__TARGETS:
+				return getTargets();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.RESULT__INTERFACES:
+				getInterfaces().clear();
+				getInterfaces().addAll((Collection)newValue);
+				return;
+			case IQRFPackage.RESULT__CONFIGURATIONS:
+				getConfigurations().clear();
+				getConfigurations().addAll((Collection)newValue);
+				return;
+			case IQRFPackage.RESULT__TARGETS:
+				getTargets().clear();
+				getTargets().addAll((Collection)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.RESULT__INTERFACES:
+				getInterfaces().clear();
+				return;
+			case IQRFPackage.RESULT__CONFIGURATIONS:
+				getConfigurations().clear();
+				return;
+			case IQRFPackage.RESULT__TARGETS:
+				getTargets().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.RESULT__INTERFACES:
+				return interfaces != null && !interfaces.isEmpty();
+			case IQRFPackage.RESULT__CONFIGURATIONS:
+				return configurations != null && !configurations.isEmpty();
+			case IQRFPackage.RESULT__TARGETS:
+				return targets != null && !targets.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof Result)) return false;
+		Result result = (Result)object;
+		
+		// Iterate through targets and compare their member values.
+		Iterator iterT1 = getTargets().iterator();
+		Iterator iterT2 = result.getTargets().iterator();
+		while (iterT1.hasNext() || iterT2.hasNext())
+		{
+			Target t1, t2;
+			t1 = (Target)iterT1.next();
+			t2 = (Target)iterT2.next();
+			if(!t1.equals(t2)) return false;
+		}
+		
+		// Compare Interfaces
+		// Iterate through interfaces and compare their member values.
+		Iterator iterI1 = getInterfaces().iterator();
+		Iterator iterI2 = result.getInterfaces().iterator();
+		while (iterI1.hasNext() || iterI2.hasNext())
+		{
+			Interface i1, i2;
+			i1 = (Interface)iterI1.next();
+			i2 = (Interface)iterI2.next();
+			if(!i1.equals(i2)) return false;
+		}
+		
+		// Compare Configuration
+		Iterator iterC1 = getConfigurations().iterator();
+		Iterator iterC2 = result.getConfigurations().iterator();
+		while (iterC1.hasNext() || iterC2.hasNext())
+		{
+			Configuration c1, c2;
+			c1 = (Configuration)iterC1.next();
+			c2 = (Configuration)iterC2.next();
+			if(!c1.equals(c2)) return false;
+		}
+		return true;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getInterfaces().hashCode();
+		result=result*hashMultiplier + getConfigurations().hashCode();
+		result=result*hashMultiplier + getTargets().hashCode();
+		return result;
+	}
+} //ResultImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/SettingImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,316 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Setting</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.SettingImpl#getRef <em>Ref</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class SettingImpl extends EObjectImpl implements Setting {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRef() <em>Ref</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRef()
+	 * @generated
+	 * @ordered
+	 */
+	protected ConfigurationElement ref = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SettingImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.SETTING;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.SETTING__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.SETTING__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationElement getRef() {
+		if (ref != null && ref.eIsProxy()) {
+			InternalEObject oldRef = (InternalEObject)ref;
+			ref = (ConfigurationElement)eResolveProxy(oldRef);
+			if (ref != oldRef) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, IQRFPackage.SETTING__REF, oldRef, ref));
+			}
+		}
+		return ref;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationElement basicGetRef() {
+		return ref;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRef(ConfigurationElement newRef) {
+		ConfigurationElement oldRef = ref;
+		ref = newRef;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.SETTING__REF, oldRef, ref));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	public void setConfigurationElement(ConfigurationElement element) {
+		// Ensure that you remove @generated or mark it @generated NOT
+		ref = element;
+		//throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.SETTING__NAME:
+				return getName();
+			case IQRFPackage.SETTING__VALUE:
+				return getValue();
+			case IQRFPackage.SETTING__REF:
+				if (resolve) return getRef();
+				return basicGetRef();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.SETTING__NAME:
+				setName((String)newValue);
+				return;
+			case IQRFPackage.SETTING__VALUE:
+				setValue((String)newValue);
+				return;
+			case IQRFPackage.SETTING__REF:
+				setRef((ConfigurationElement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.SETTING__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case IQRFPackage.SETTING__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+			case IQRFPackage.SETTING__REF:
+				setRef((ConfigurationElement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.SETTING__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case IQRFPackage.SETTING__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+			case IQRFPackage.SETTING__REF:
+				return ref != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof Setting)) return false;
+		Setting other = (Setting)object;
+		boolean self = IQRFUtil.equals(getName(),other.getName()) && 
+			   IQRFUtil.equals(getValue(),other.getValue());
+		if(!self) return false;
+		boolean ret = (getRef()==null) ? (other.getRef()==null):getRef().equals(other.getRef());
+		return ret;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getName().hashCode();
+		result=result*hashMultiplier + getValue().hashCode();
+		return result;
+	}
+} //SettingImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/impl/TargetImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.iqrf.util.IQRFUtil;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Target</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.iqrf.impl.TargetImpl#getDescription <em>Description</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class TargetImpl extends EObjectImpl implements Target {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_EDEFAULT = "";
+
+	/**
+	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected String description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TargetImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return IQRFPackage.Literals.TARGET;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.TARGET__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(String newDescription) {
+		String oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IQRFPackage.TARGET__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IQRFPackage.TARGET__NAME:
+				return getName();
+			case IQRFPackage.TARGET__DESCRIPTION:
+				return getDescription();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IQRFPackage.TARGET__NAME:
+				setName((String)newValue);
+				return;
+			case IQRFPackage.TARGET__DESCRIPTION:
+				setDescription((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.TARGET__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case IQRFPackage.TARGET__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IQRFPackage.TARGET__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case IQRFPackage.TARGET__DESCRIPTION:
+				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", description: ");
+		result.append(description);
+		result.append(')');
+		return result.toString();
+	}
+	
+	public boolean equals(Object object) {
+		if(object==null || !(object instanceof Target)) return false;
+		Target other = (Target)object;
+		return IQRFUtil.equals(getName(),other.getName()) && 
+		       IQRFUtil.equals(getDescription(),other.getDescription());
+	}
+	
+	@Override
+	public int hashCode() {
+		final int hashMultiplier = 41;
+		int result = 7;
+		result=result*hashMultiplier + getName().hashCode();
+		result=result*hashMultiplier + getDescription().hashCode();
+		return result;
+	}
+} //TargetImpl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFAdapterFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,239 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.util;
+
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.emf.ecore.EObject;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage
+ * @generated
+ */
+public class IQRFAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static IQRFPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IQRFAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = IQRFPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch the delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IQRFSwitch modelSwitch =
+		new IQRFSwitch() {
+			public Object caseResult(Result object) {
+				return createResultAdapter();
+			}
+			public Object caseConfiguration(Configuration object) {
+				return createConfigurationAdapter();
+			}
+			public Object caseSetting(Setting object) {
+				return createSettingAdapter();
+			}
+			public Object caseInterface(Interface object) {
+				return createInterfaceAdapter();
+			}
+			public Object caseConfigurationElement(ConfigurationElement object) {
+				return createConfigurationElementAdapter();
+			}
+			public Object caseTarget(Target object) {
+				return createTargetAdapter();
+			}
+			public Object caseIMaker(IMaker object) {
+				return createIMakerAdapter();
+			}
+			public Object defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	public Adapter createAdapter(Notifier target) {
+		return (Adapter)modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.Result <em>Result</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Result
+	 * @generated
+	 */
+	public Adapter createResultAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.Configuration <em>Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Configuration
+	 * @generated
+	 */
+	public Adapter createConfigurationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.Setting <em>Setting</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Setting
+	 * @generated
+	 */
+	public Adapter createSettingAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.Interface <em>Interface</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Interface
+	 * @generated
+	 */
+	public Adapter createInterfaceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement <em>Configuration Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement
+	 * @generated
+	 */
+	public Adapter createConfigurationElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.Target <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.Target
+	 * @generated
+	 */
+	public Adapter createTargetAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.iqrf.IMaker <em>IMaker</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.iqrf.IMaker
+	 * @generated
+	 */
+	public Adapter createIMakerAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //IQRFAdapterFactory
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFSwitch.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,275 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.util;
+
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage
+ * @generated
+ */
+public class IQRFSwitch {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static IQRFPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IQRFSwitch() {
+		if (modelPackage == null) {
+			modelPackage = IQRFPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	public Object doSwitch(EObject theEObject) {
+		return doSwitch(theEObject.eClass(), theEObject);
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	protected Object doSwitch(EClass theEClass, EObject theEObject) {
+		if (theEClass.eContainer() == modelPackage) {
+			return doSwitch(theEClass.getClassifierID(), theEObject);
+		}
+		else {
+			List eSuperTypes = theEClass.getESuperTypes();
+			return
+				eSuperTypes.isEmpty() ?
+					defaultCase(theEObject) :
+					doSwitch((EClass)eSuperTypes.get(0), theEObject);
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	protected Object doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case IQRFPackage.RESULT: {
+				Result result = (Result)theEObject;
+				Object theResult = caseResult(result);
+				if (theResult == null) theResult = defaultCase(theEObject);
+				return theResult;
+			}
+			case IQRFPackage.CONFIGURATION: {
+				Configuration configuration = (Configuration)theEObject;
+				Object result = caseConfiguration(configuration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IQRFPackage.SETTING: {
+				Setting setting = (Setting)theEObject;
+				Object result = caseSetting(setting);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IQRFPackage.INTERFACE: {
+				Interface interface_ = (Interface)theEObject;
+				Object result = caseInterface(interface_);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IQRFPackage.CONFIGURATION_ELEMENT: {
+				ConfigurationElement configurationElement = (ConfigurationElement)theEObject;
+				Object result = caseConfigurationElement(configurationElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IQRFPackage.TARGET: {
+				Target target = (Target)theEObject;
+				Object result = caseTarget(target);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IQRFPackage.IMAKER: {
+				IMaker iMaker = (IMaker)theEObject;
+				Object result = caseIMaker(iMaker);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Result</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Result</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseResult(Result object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Configuration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseConfiguration(Configuration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Setting</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Setting</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseSetting(Setting object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Interface</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Interface</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseInterface(Interface object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Configuration Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Configuration Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseConfigurationElement(ConfigurationElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>Target</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>Target</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseTarget(Target object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>IMaker</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>IMaker</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public Object caseIMaker(IMaker object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	public Object defaultCase(EObject object) {
+		return null;
+	}
+
+} //IQRFSwitch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/util/IQRFUtil.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.iqrf.util;
+
+public class IQRFUtil {
+	public static boolean equals(String string1, String string2) {
+		boolean ret = false;
+		if((string1==null)&&(string2==null)) {
+			ret=true;
+		} else if((string1==null)||(string2==null)) {
+			ret=false;
+		} else {
+			ret = string1.equals(string2);
+		}
+		return ret;
+	}
+	public static void main(String[] args) {
+		if(equals(null,null)) {
+			System.out.println("null==null");
+		}
+		if(equals(null,"")) {
+			System.out.println("null==");
+		} else {
+			System.out.println("null!=");
+		}
+		if(equals("","")) {
+			System.out.println("\"\"==\"\"");
+		}else {
+			System.out.println("\"\"==\"\"");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/iqrf/wrapper/IQRFWrapper.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.iqrf.wrapper;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
+
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFPackage;
+import com.nokia.s60tools.imaker.internal.iqrf.impl.IMakerImpl;
+
+public class IQRFWrapper {
+	/**
+	 * The default constructor.
+	 */
+	public IQRFWrapper() {
+	}
+
+	/**
+	 * The method converts an XML document into an object of the IMaker class.
+	 * 
+	 * @param xml XML document content as String.
+	 * @return IMaker object containing the data.
+	 */
+	@SuppressWarnings("unchecked")
+	public IMaker getModel(String xml) {
+		IMaker imaker = null;
+
+		// Register the package -- only needed for stand-alone!
+		@SuppressWarnings("unused")
+		IQRFPackage libraryPackage = IQRFPackage.eINSTANCE;
+
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
+		// Create a resource to handle XMI content.
+		XMIResourceImpl resource = new XMIResourceImpl();
+
+		// Create an input stream to read the String contents into it
+		// and then pass it to resources' load method to load the XMI.
+		InputStream in = new ByteArrayInputStream(xml.getBytes());
+
+		try
+		{
+			resource.load(in, null);
+			Iterator iter = resource.getContents().iterator();
+
+			//Result result = IQRFFactory.eINSTANCE.createResult();
+			//Result result;
+			Object obj;
+
+			while(iter.hasNext())
+			{
+				obj = iter.next();
+				if (obj instanceof IMakerImpl)
+				{
+					imaker = (IMaker)obj;
+					break;
+				}
+			}
+		} catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+
+		return imaker;
+	}
+
+	/**
+	 * This class converts a IMaker object into an XML document.
+	 * 
+	 * @param result instance of the IMaker class.
+	 * @return string containing the data as XML.
+	 */
+	@SuppressWarnings("unchecked")
+	public String getXMLDocument(IMaker imaker) {
+
+		// Register the default resource factory -- only needed for stand-alone!
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
+		// Create a resource for handling XMI.
+		XMIResourceImpl resource = new XMIResourceImpl();
+
+		// Add the imaker object to the contents.
+		resource.getContents().add(imaker);
+
+		// Create a writer to store the generated XMI.
+//		OutputStream out = new ByteArrayOutputStream();
+
+		// Save the contents of the resource to output stream.
+		try {
+			StringWriter writer = new StringWriter (  ) ; 
+			PrintWriter pwriter = new PrintWriter ( writer ) ; 
+			resource.save(pwriter, Collections.EMPTY_MAP);
+			pwriter.close();
+			return writer.toString();
+
+		}
+		catch (IOException e) {}
+		return null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/EnvironmentManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.managers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.internal.model.Environment;
+
+public class EnvironmentManager implements IEnvironmentManager {
+	private static IEnvironmentManager instance = null;
+	private ArrayList<IEnvironment> environments;
+	private IEnvironment activeEnvironment;
+
+	public static IEnvironmentManager getInstance() {
+		if(instance==null) {
+			instance = new EnvironmentManager();
+		}
+		return instance;
+	}
+
+	private EnvironmentManager() {
+		environments = new ArrayList<IEnvironment>();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.managers.IEnvironmentManager#setActiveEnvironment(java.lang.String)
+	 */
+	public void setActiveEnvironment(String drive) {
+		this.activeEnvironment = getEnvironmentByDrive(drive);
+	}
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.managers.IEnvironmentManager#getActiveEnvironment()
+	 */
+	public IEnvironment getActiveEnvironment() {
+		return activeEnvironment;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.managers.IEnvironmentManager#getEnvironmentByDrive(java.lang.String)
+	 */
+	public IEnvironment getEnvironmentByDrive(String drive) {
+		List<IEnvironment> enviroments = getEnviroments();
+		for (Iterator<IEnvironment> iterator = enviroments.iterator(); iterator.hasNext();) {
+			IEnvironment environment = (IEnvironment) iterator.next();
+			if(environment.getDrive().startsWith(drive)) {
+				return environment;
+			}
+		}
+		if(IMakerUtils.iMakerCoreExists(drive)) {
+			Environment newEnv = new Environment(drive);
+			environments.add(newEnv);
+			return newEnv;
+		}
+		//print error
+		System.out.println("iMaker extension can't be used with this project!");
+		return null;
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.managers.IEnvironmentManager#getEnviroments()
+	 */
+	public List<IEnvironment> getEnviroments() {
+		List<String> availableEnvironments = IMakerUtils.getAvailableSDKs();
+		for (Iterator<String> iterator = availableEnvironments.iterator(); iterator.hasNext();) {
+			String env = iterator.next();
+			if(!environmentAlreadyAvailable(env)) {
+				environments.add(new Environment(env));
+			}
+		}
+		return environments;
+	}
+
+	private boolean environmentAlreadyAvailable(String env) {
+		for (Iterator<IEnvironment> iterator = environments.iterator(); iterator.hasNext();) {
+			IEnvironment environment = iterator.next();
+			if(environment.getDrive().equals(env)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/ProjectManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,302 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.managers;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+public class ProjectManager {
+	public static final String NEW_ITEM            = "<New Configuration>";
+	public static final String IBY_FILENAME_PREFIX = "imaker_additional_";
+	public static final String IBY_FOLDER_NAME     = "rombuild";
+	public static final String MAKEFILE_NAME       = "imaker_additions.mk";
+
+	private String activeFile = "";
+	private IProject project;
+	private ArrayList<IResource> imakerFiles;
+
+	public ProjectManager(IProject project) {
+		this.imakerFiles = new ArrayList<IResource>();
+		this.project = project;
+	}
+
+	public String getActiveFile() {
+		return activeFile;
+	}
+
+	public void setActiveFile(String newActive) {
+		activeFile = newActive;
+		
+	}
+	
+	public IProject getProject() {
+		return project;
+	}
+	
+	/**
+	 * @return The root location of the project
+	 */
+	public String getRoot() {
+		return IMakerUtils.getProjectRootLocation(project);
+	}
+	
+	
+	/**
+	 * Returns the imaker file in the specified location
+	 * @param location
+	 * @return
+	 */
+	public IResource getImakerFile(IPath location) {
+		IResource ret = null;
+		for (IResource resource : getImakerFiles()) {
+			if(resource.getLocation().equals(location)) {
+				ret = resource;
+				break;
+			}
+		}
+		return ret;
+	}
+
+//	public IFile getImakerMakeFile() {
+//		IFolder pfolder = project.getFolder(IBY_FOLDER_NAME);
+//		IFile mk = pfolder.getFile(MAKEFILE_NAME);
+//		if(mk.exists()) {
+//			return mk;
+//		} else {
+//			return null;
+//		}
+//	}
+
+
+	/**
+	 * Returns all imaker files in the selected project
+	 * @return
+	 */
+	public List<IResource> getImakerFiles() {
+		imakerFiles.clear();
+		try {
+			project.accept(new ImakerResourceVisitor(imakerFiles));
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+		return imakerFiles;
+	}
+	
+	private class ImakerResourceVisitor implements IResourceVisitor {
+
+		private ArrayList<IResource> list;
+
+		/**
+		 * @param imps
+		 */
+		public ImakerResourceVisitor(ArrayList<IResource> imps) {
+			this.list = imps;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.core.resources.IResourceVisitor#visit(org.eclipse.core.resources.IResource)
+		 */
+//		@Override
+		public boolean visit(IResource res) throws CoreException {
+			String name = res.getName();
+			if(name.endsWith(".imp")) {
+				list.add(res);
+			}
+			if(res instanceof IFolder) {
+				if(name.equals("src") || name.equals("inc")) {
+					return false;
+				}
+			}
+			return true;
+		}
+		
+	}
+
+	/**
+	 * Creates new iby file to the specified location, with the specified content
+	 * @param basename The name of the iby file, without the extension
+	 * @param content The contents fo iby file
+	 * @param path parent folder of the iby file
+	 * @return The location or path of the newly created file
+	 */
+	public IPath createIbyFile(String basename, String content, IPath path) {
+		File parent = path.toFile();
+		createFolder(parent);
+		path = path.append(basename+".iby");
+		File file = path.toFile();
+		
+		FileOutputStream fo;
+		try {
+			if(!file.exists()) {
+				file.createNewFile();
+			}
+			fo = new FileOutputStream(file);
+			OutputStreamWriter osw = new OutputStreamWriter(fo);
+			
+			Writer out = new BufferedWriter(osw);
+			out.write(content);
+			out.flush();
+			out.close();
+			return new Path(file.getAbsolutePath());
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private void createFolder(File folder) {
+		if(folder!=null&&!folder.exists()) {
+			String parent = folder.getParent();
+			File f = new File(parent);
+			createFolder(f);
+			folder.mkdir();
+		}
+	}
+
+	public IPath createAdditionsMakefile(List<IPath> files, IPath path) {
+		createFolder(path.toFile());
+		IPath mk = path.append(MAKEFILE_NAME);
+		File mkFile = mk.toFile();
+		
+		FileOutputStream fo;
+		try {
+			StringBuffer sb = new StringBuffer();
+			for (IPath p : files) {
+				File f = p.toFile();
+				String name = f.getName();
+				int index = name.lastIndexOf('_');
+				String loc = name.substring(index+1, name.length()-4);
+				loc = loc.toUpperCase();
+				sb.append(loc+"_OBY += " + f.getAbsolutePath()+"\n");
+			}
+
+			fo = new FileOutputStream(mkFile);
+			OutputStreamWriter osw = new OutputStreamWriter(fo);
+			
+			Writer out = new BufferedWriter(osw);
+			out.write(sb.toString());
+			out.flush();
+			out.close();
+			return new Path(mkFile.getAbsolutePath());
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * Populate the model of the dialog with content from the selected project
+	 * @param ic
+	 */
+	public void populate(ImageContent ic) {
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+		if (cpi != null) {
+			ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+			String filename = null;
+			
+			boolean debug = "udeb".equalsIgnoreCase(buildConfig.getTargetString());
+			// add the binaries and any resource-type files generated by all mmp files in the project
+			for (IPath mmp : EpocEngineHelper.getMMPFilesForBuildConfiguration(buildConfig)) {
+				IPath hp = EpocEngineHelper.getHostPathForExecutable(buildConfig, mmp);
+				IPath tp = EpocEngineHelper.getTargetPathForExecutable(buildConfig, mmp);
+				
+				filename = hp.segment(hp.segmentCount()-1);
+				
+				// add component executable
+				if (hp != null) {
+					addEntry(ic, debug, hp.toOSString(), tp.toOSString(), filename);
+				}
+
+				HashMap<String, String> hostTargetRSRCMap = EpocEngineHelper.getHostAndTargetResources(buildConfig, mmp);
+				// Add resource files...
+				for (String key : hostTargetRSRCMap.keySet()) {
+					filename = new File(key).getName();
+					addEntry(ic, false, key, hostTargetRSRCMap.get(key),filename);
+				}
+			}
+
+			// check the project for image makefiles
+			HashMap<String, String> hostTargetImagesMap = EpocEngineHelper.getHostAndTargetImages(buildConfig);
+			for (String key : hostTargetImagesMap.keySet()) {
+				filename = new File(key).getName();				
+				addEntry(ic, false, key, hostTargetImagesMap.get(key), filename);
+			}
+		}	
+	}
+
+	private void addEntry(ImageContent ic, boolean debug,
+			String hp, String tp, String filename) {
+		IbyEntry entry = IContentFactory.eINSTANCE.createIbyEntry();
+		if(hp.length()>2) {
+			hp = hp.substring(2);
+		}
+		entry.setFile(hp);
+
+		if(tp!=null&&!tp.endsWith(filename)) {
+			if(tp.endsWith(File.separator)) {
+				tp = tp + filename;
+			} else {
+				tp = tp + File.separator + filename;
+			}
+		}
+		if(tp!=null) {
+			tp = tp.substring(2);			
+		}
+		entry.setTarget(tp);
+		entry.setDebug(debug);
+		boolean contains = false;
+		for (IbyEntry e : ic.getEntries()) {
+			if(e.equals(entry)) {
+				contains = true;
+				break;
+			}
+		}
+		if(!contains) {
+			ic.getEntries().add(entry);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/Environment.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapper;
+
+public class Environment implements IEnvironment {
+	private String drive;
+	private String iMakerCoreVersion=null;
+	private boolean loaded;
+	private List<UIConfiguration> configurations;
+	private UIConfiguration currentProduct;
+	private IIMakerWrapper wrapper = null;
+	private String targetSteps = null;
+	private ImakerProperties runProperties=null; //runtime selected properties
+	
+	public Environment(String drive) {
+		this.drive = drive;
+		this.setImakerWrapper(new IMakerWrapper(IMakerUtils.getImakerTool(drive)));
+		runProperties = new ImakerProperties();		
+	}
+	
+	public IIMakerWrapper getImakerWrapper() {
+		return this.wrapper;
+	}
+	
+	public void setImakerWrapper(IIMakerWrapper wrapper) {
+		this.wrapper = wrapper;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#getDrive()
+	 */
+	public String getDrive() {
+		return drive;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#isLoaded()
+	 */
+	public boolean isLoaded() {
+		return loaded;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#reLoad()
+	 */
+	public List<UIConfiguration> reLoad()  throws InvocationTargetException {
+		loaded = false;
+		return load();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#load()
+	 */
+	public List<UIConfiguration> load() throws InvocationTargetException {
+		if(loaded) {
+			return configurations;
+		}
+		IRunnableWithProgress op = new IMakerCoreRunnable();
+		ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(getDisplay().getActiveShell());
+		try {
+			progressMonitorDialog.run(true, true, op);
+		} catch (InvocationTargetException e) {
+			configurations = null;
+			loaded = false;
+			throw e;
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		loaded=true;
+		return configurations;
+	}
+
+	private Display getDisplay() {
+		Display display = PlatformUI.getWorkbench().getDisplay();
+		return display;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#getConfigurations()
+	 */
+	public List<UIConfiguration> getConfigurations() throws InvocationTargetException {
+		if(loaded) {
+			return configurations;
+		} else {
+			load();
+			return configurations;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#getConfigurationByFilePath(java.lang.String)
+	 */
+	public UIConfiguration getConfigurationByFilePath(String filePath) {
+		if(configurations==null) {
+			return null;
+		}
+		for (Iterator<UIConfiguration> iterator = configurations.iterator(); iterator.hasNext();) {
+			UIConfiguration config = iterator.next();
+			if(config.getFilePath().equals(filePath)) {
+				return config;
+			}
+		}
+		return null;
+	}
+
+	private class IMakerCoreRunnable implements IRunnableWithProgress {
+		public void run(IProgressMonitor monitor)
+		throws InvocationTargetException, InterruptedException {
+			try {
+				configurations = getImakerWrapper().getConfigurations(monitor);
+				if(configurations.size()==0) {
+					IMakerCoreExecutionException ex = new IMakerCoreExecutionException(Messages.getString("Error.1"));
+					InvocationTargetException te = new InvocationTargetException(ex);
+					throw te;
+				}
+			} catch (IMakerCoreExecutionException e) {
+				InvocationTargetException te = new InvocationTargetException(e);
+				throw te;
+			} catch (IMakerCoreNotFoundException e) {
+				InvocationTargetException te = new InvocationTargetException(e);
+				throw te;
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#getIMakerCoreVersion()
+	 */
+	public String getIMakerCoreVersion() throws IMakerCoreNotFoundException, IMakerCoreExecutionException {
+		if(iMakerCoreVersion==null) {
+			iMakerCoreVersion = getImakerWrapper().getIMakerCoreVersion();
+		}
+		return iMakerCoreVersion;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#setCurrentProduct(com.nokia.s60tools.imaker.internal.model.UIConfiguration)
+	 */
+	public void setCurrentProduct(UIConfiguration uic) {
+		this.currentProduct = uic;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.model.IEnvironment#getCurrentProduct()
+	 */
+	public UIConfiguration getCurrentProduct() {
+		return currentProduct;
+	}
+	
+	public String getTargetSteps(final String target) {
+		targetSteps = null;
+		ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(getDisplay().getActiveShell());
+		try {
+			progressMonitorDialog.run(true, false, new IRunnableWithProgress() {
+				
+//				@Override
+				public void run(IProgressMonitor monitor) throws InvocationTargetException,
+						InterruptedException {
+					targetSteps = wrapper.getTargetSteps(target, getCurrentProduct().getFilePath(), monitor);
+				}
+			});
+		} catch (InvocationTargetException e) {
+		} catch (InterruptedException e) {
+		}
+		return targetSteps;
+	}
+
+	public ImakerProperties getRunProperties() {
+		return runProperties;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/FileToImage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model;
+
+public class FileToImage {
+	private String fHostPath = ""; 
+	private String fTargetPath = ""; 
+	private boolean fEnabled = true;
+	
+	public FileToImage() {}
+	
+	public FileToImage(String hostPath, String targetPath, boolean enabled) {
+		fHostPath = hostPath;
+		fTargetPath = targetPath;
+		fEnabled = enabled;
+	}
+
+	public String getHostPath() {
+		return fHostPath;
+	}
+	
+	public void setHostPath(String path) {
+		fHostPath = path;
+	}
+
+	public String getTargetPath() {
+		return fTargetPath;
+	}
+	
+	public	void setTargetPath(String path) {
+		fTargetPath = path;
+	}
+
+	public boolean getEnabled() {
+		return fEnabled;
+	}
+
+	public void setEnabled(boolean enabled) {
+		fEnabled = enabled;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/IObserver.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model;
+
+
+public interface IObserver {
+	public void update(Object selection);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/ImakerProperties.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences;
+import com.nokia.s60tools.imaker.internal.wrapper.PlatsimManager;
+
+public class ImakerProperties extends Properties {
+	public static final String SEPARATOR			  = ":;";
+	public static final String GENERATED_FILES_FOLDER = "imakerplugin";
+	private static final long serialVersionUID = 1L;
+	private List<UIVariable> variables=null;
+	private String activeFile = null;
+	private boolean used = false;
+
+	/**
+	 * Create imaker properties from file
+	 * @param file
+	 * @return
+	 */
+	public static ImakerProperties createFromFile(IFile file) {
+		ImakerProperties imakerPreference = new ImakerProperties();
+
+		if(file!=null) {
+			try {
+				imakerPreference.load(file.getContents());
+			} catch (FileNotFoundException e) {
+				imakerPreference = null;
+			} catch (IOException e) {
+				imakerPreference = null;
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
+
+		return imakerPreference;
+	}
+
+	/**
+	 * Create imaker properties from file
+	 * @param file
+	 * @return
+	 */
+	public void saveToFile(IFile file) {		
+		if(file!=null) {
+			InputStream input = getAsInputStream();
+			try {
+				file.setContents(input, true, false,null);
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	public ImakerProperties() {}
+
+	public InputStream getAsInputStream() {
+		ByteArrayOutputStream bao = new ByteArrayOutputStream();
+		try {
+			store(bao, "iMaker properties");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		ByteArrayInputStream bs = new ByteArrayInputStream(bao.toString().getBytes());
+		return bs;
+	}
+	
+	/**
+	 * Parse the contents of this properties file and create imaker command that is executable
+	 * @param selectedProject
+	 * @param workdir Place where the temporary iby/mk files will be placed
+	 * @return
+	 */
+	public List<String> parseImakerCommand(IProject selectedProject, IPath workdir) {
+		String drive = IMakerUtils.getProjectRootLocation(selectedProject);
+		ArrayList<String> command = new ArrayList<String>();
+
+		String makefile = (String) get(IMakerKeyConstants.MAKEFILE);
+		if(makefile!=null) {
+			appendCommand(command,IMakerWrapperPreferences.ARG_FETCH_CONFIGURATION);
+			appendCommand(command,makefile);
+		}
+		addAdditionalParameters(command,(String) get(IMakerKeyConstants.TARGET_LIST)," ");
+		String platsim = (String) get(IMakerKeyConstants.PLATSIM_INSTANCE);
+		if(platsim!=null) {
+			command.add(IMakerKeyConstants.PLATSIM_INSTANCE +"="+parse(platsim,drive));
+			String run = (String)get(IMakerKeyConstants.PLATSIM_RUN);
+			if(run!=null&&run.equals("true")) {
+				command.add(IMakerKeyConstants.PLATSIM_RUN +"=1");		
+			}
+		}
+		addAdditionalParameters(command,(String) get(IMakerKeyConstants.ADDITIONAL_PARAMETERS),SEPARATOR);
+		addAdditionalParameters(command, (String) get(IMakerKeyConstants.MODIFIED_SETTINGS),SEPARATOR);
+		String type = (String) get(IMakerKeyConstants.TYPE);
+		command.add(IMakerWrapperPreferences.TYPE+"="+type);
+		String verb = (String) get(IMakerKeyConstants.VERBOSE);
+		if(verb!=null) {
+			command.add(Messages.getString("Flashmenu.9"));
+		}
+		
+		// parse iby files and makefile
+		String str = (String)get(IMakerKeyConstants.DEBUGFILES);
+		if(str!=null&&!str.equals("")) {
+			List<IbyEntry> entries = new ArrayList<IbyEntry>();
+			String[] entriesStr = str.split(ImakerProperties.SEPARATOR);
+			for (int i = 0; i < entriesStr.length; i++) {
+				String entryStr = entriesStr[i];
+				if(entryStr!=null&&!entryStr.equals("")) {
+					IbyEntry entry = IContentFactory.eINSTANCE.createEntryFromString(entryStr);
+					if(entry.isEnabled()) {
+						entries.add(entry);						
+					}
+				}
+			}
+			ProjectManager pm = new ProjectManager(selectedProject);
+			IPath mkfile = IMakerUtils.createIbyFiles(entries, pm, workdir);
+			if(mkfile!=null) {
+				appendCommand(command,IMakerWrapperPreferences.ARG_FETCH_CONFIGURATION);
+				appendCommand(command,"\""+mkfile.toOSString()+"\"");
+			}
+		}
+
+		return command;
+	}
+
+	private String parse(String instance, String env) {
+		if(instance==null) {
+			instance="1";
+		}
+		if(instance.equals(Messages.getString("PlatsimTab.0"))) {
+			PlatsimManager pm = new PlatsimManager(env);
+			int max = 1;
+			List<String> instances = pm.getInstances();
+			for (String ins : instances) {
+				int intIns = Integer.parseInt(ins);
+				if(intIns>max) max = intIns;
+			}
+			return String.valueOf(max+1);
+		}
+		return instance;
+	}
+
+	private void addAdditionalParameters(ArrayList<String> command,
+			String adds, String sep) {
+		if(adds==null||adds.equals("")) { //$NON-NLS-1$
+			return;
+		}
+		String[] parts = adds.split(sep); //$NON-NLS-1$
+		for (int i = 0; i < parts.length; i++) {
+			String part = parts[i];
+			if(!part.equals("")) { //$NON-NLS-1$
+				appendCommand(command, part);
+			}
+		}
+	}
+
+	private void appendCommand(ArrayList<String> command, String value) {
+		if((value!=null)&&!(value.equals(""))) { //$NON-NLS-1$
+			command.add(value.trim());
+		}
+	}
+	
+	private void updateVariables() {
+		if(variables==null) {
+			return;
+		}
+		List<UIVariable> includeVariables = IMakerUtils.getCommandlineIncludeVariables(variables);
+		List<String> variablesToStrings = IMakerUtils.convertVariablesToStrings(includeVariables);
+
+		StringBuilder settings = new StringBuilder();
+
+		for (Iterator<String> iterator = variablesToStrings.iterator(); iterator
+		.hasNext();) {
+			String setting = iterator.next();
+			settings.append(setting+SEPARATOR); //$NON-NLS-1$
+		}
+
+		String string = settings.toString();
+		if(!string.equals("")) { //$NON-NLS-1$
+			put(IMakerKeyConstants.MODIFIED_SETTINGS, string);
+		}
+	}
+
+	public void setVariables(List<UIVariable> variables) {
+		this.variables = variables;
+		updateVariables();
+	}
+
+	public void setActiveFile(String path) {
+		this.activeFile = path;
+	}
+
+	public String getActiveFile() {
+		return activeFile;
+	}
+
+	public void setUsed(boolean b) {
+		this.used  = b;
+	}
+	
+	public boolean isUsed() {
+		return this.used;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IContentFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage
+ * @generated
+ */
+public interface IContentFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	IContentFactory eINSTANCE = com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Image Content</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Image Content</em>'.
+	 * @generated
+	 */
+	ImageContent createImageContent();
+
+	/**
+	 * Returns a new object of class '<em>Iby Entry</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Iby Entry</em>'.
+	 * @generated
+	 */
+	IbyEntry createIbyEntry();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	IContentPackage getIContentPackage();
+	
+	IbyEntry createEntryFromString(String initialValue);
+} //IContentFactory
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IContentPackage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface IContentPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "iContent";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.nokia.com";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "ic";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	IContentPackage eINSTANCE = com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.ImageContentImpl <em>Image Content</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.ImageContentImpl
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getImageContent()
+	 * @generated
+	 */
+	int IMAGE_CONTENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Entries</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_CONTENT__ENTRIES = 0;
+
+	/**
+	 * The number of structural features of the '<em>Image Content</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_CONTENT_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl <em>Iby Entry</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getIbyEntry()
+	 * @generated
+	 */
+	int IBY_ENTRY = 1;
+
+	/**
+	 * The feature id for the '<em><b>File</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__FILE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__TARGET = 1;
+
+	/**
+	 * The feature id for the '<em><b>Location</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__LOCATION = 2;
+
+	/**
+	 * The feature id for the '<em><b>Debug</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__DEBUG = 3;
+
+	/**
+	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__ENABLED = 4;
+
+	/**
+	 * The feature id for the '<em><b>Status Message</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY__STATUS_MESSAGE = 5;
+
+	/**
+	 * The number of structural features of the '<em>Iby Entry</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IBY_ENTRY_FEATURE_COUNT = 6;
+
+
+	/**
+	 * The meta object id for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION <em>IMAGESECTION</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getIMAGESECTION()
+	 * @generated
+	 */
+	int IMAGESECTION = 2;
+
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.model.iContent.ImageContent <em>Image Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Image Content</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.ImageContent
+	 * @generated
+	 */
+	EClass getImageContent();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link com.nokia.s60tools.imaker.internal.model.iContent.ImageContent#getEntries <em>Entries</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Entries</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.ImageContent#getEntries()
+	 * @see #getImageContent()
+	 * @generated
+	 */
+	EReference getImageContent_Entries();
+
+	/**
+	 * Returns the meta object for class '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry <em>Iby Entry</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Iby Entry</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry
+	 * @generated
+	 */
+	EClass getIbyEntry();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getFile <em>File</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>File</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getFile()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_File();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getTarget <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Target</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getTarget()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_Target();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getLocation <em>Location</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Location</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getLocation()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_Location();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isDebug <em>Debug</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Debug</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isDebug()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_Debug();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isEnabled <em>Enabled</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Enabled</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isEnabled()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_Enabled();
+
+	/**
+	 * Returns the meta object for the attribute '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getStatusMessage <em>Status Message</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Status Message</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getStatusMessage()
+	 * @see #getIbyEntry()
+	 * @generated
+	 */
+	EAttribute getIbyEntry_StatusMessage();
+
+	/**
+	 * Returns the meta object for enum '{@link com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION <em>IMAGESECTION</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>IMAGESECTION</em>'.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION
+	 * @generated
+	 */
+	EEnum getIMAGESECTION();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	IContentFactory getIContentFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.ImageContentImpl <em>Image Content</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.ImageContentImpl
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getImageContent()
+		 * @generated
+		 */
+		EClass IMAGE_CONTENT = eINSTANCE.getImageContent();
+
+		/**
+		 * The meta object literal for the '<em><b>Entries</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IMAGE_CONTENT__ENTRIES = eINSTANCE.getImageContent_Entries();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl <em>Iby Entry</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getIbyEntry()
+		 * @generated
+		 */
+		EClass IBY_ENTRY = eINSTANCE.getIbyEntry();
+
+		/**
+		 * The meta object literal for the '<em><b>File</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__FILE = eINSTANCE.getIbyEntry_File();
+
+		/**
+		 * The meta object literal for the '<em><b>Target</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__TARGET = eINSTANCE.getIbyEntry_Target();
+
+		/**
+		 * The meta object literal for the '<em><b>Location</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__LOCATION = eINSTANCE.getIbyEntry_Location();
+
+		/**
+		 * The meta object literal for the '<em><b>Debug</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__DEBUG = eINSTANCE.getIbyEntry_Debug();
+
+		/**
+		 * The meta object literal for the '<em><b>Enabled</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__ENABLED = eINSTANCE.getIbyEntry_Enabled();
+
+		/**
+		 * The meta object literal for the '<em><b>Status Message</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute IBY_ENTRY__STATUS_MESSAGE = eINSTANCE.getIbyEntry_StatusMessage();
+
+		/**
+		 * The meta object literal for the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION <em>IMAGESECTION</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION
+		 * @see com.nokia.s60tools.imaker.internal.model.iContent.impl.IContentPackageImpl#getIMAGESECTION()
+		 * @generated
+		 */
+		EEnum IMAGESECTION = eINSTANCE.getIMAGESECTION();
+
+	}
+
+} //IContentPackage
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IMAGESECTION.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,276 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>IMAGESECTION</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIMAGESECTION()
+ * @model
+ * @generated
+ */
+public enum IMAGESECTION implements Enumerator {
+	/**
+	 * The '<em><b>CORE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CORE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CORE(0, "CORE", "CORE"),
+
+	/**
+	 * The '<em><b>ROFS2</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ROFS2_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ROFS2(1, "ROFS2", "ROFS2"),
+
+	/**
+	 * The '<em><b>ROFS3</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ROFS3_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ROFS3(2, "ROFS3", "ROFS3"),
+
+	/**
+	 * The '<em><b>UDA</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UDA_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UDA(3, "UDA", "UDA");
+
+	/**
+	 * The '<em><b>CORE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>CORE</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CORE
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CORE_VALUE = 0;
+
+	/**
+	 * The '<em><b>ROFS2</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>ROFS2</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ROFS2
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ROFS2_VALUE = 1;
+
+	/**
+	 * The '<em><b>ROFS3</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>ROFS3</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ROFS3
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ROFS3_VALUE = 2;
+
+	/**
+	 * The '<em><b>UDA</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>UDA</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UDA
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UDA_VALUE = 3;
+
+	/**
+	 * An array of all the '<em><b>IMAGESECTION</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final IMAGESECTION[] VALUES_ARRAY =
+		new IMAGESECTION[] {
+			CORE,
+			ROFS2,
+			ROFS3,
+			UDA,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>IMAGESECTION</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<IMAGESECTION> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>IMAGESECTION</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static IMAGESECTION get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			IMAGESECTION result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>IMAGESECTION</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static IMAGESECTION getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			IMAGESECTION result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>IMAGESECTION</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static IMAGESECTION get(int value) {
+		switch (value) {
+			case CORE_VALUE: return CORE;
+			case ROFS2_VALUE: return ROFS2;
+			case ROFS3_VALUE: return ROFS3;
+			case UDA_VALUE: return UDA;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private IMAGESECTION(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //IMAGESECTION
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/IbyEntry.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Iby Entry</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getFile <em>File</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getTarget <em>Target</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getLocation <em>Location</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isDebug <em>Debug</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isEnabled <em>Enabled</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getStatusMessage <em>Status Message</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry()
+ * @model
+ * @generated
+ */
+public interface IbyEntry extends EObject {
+	/**
+	 * Returns the value of the '<em><b>File</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>File</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>File</em>' attribute.
+	 * @see #setFile(String)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_File()
+	 * @model
+	 * @generated
+	 */
+	String getFile();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getFile <em>File</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>File</em>' attribute.
+	 * @see #getFile()
+	 * @generated
+	 */
+	void setFile(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' attribute.
+	 * @see #setTarget(String)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_Target()
+	 * @model
+	 * @generated
+	 */
+	String getTarget();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getTarget <em>Target</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' attribute.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Location</b></em>' attribute.
+	 * The literals are from the enumeration {@link com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Location</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Location</em>' attribute.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION
+	 * @see #setLocation(IMAGESECTION)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_Location()
+	 * @model
+	 * @generated
+	 */
+	IMAGESECTION getLocation();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getLocation <em>Location</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Location</em>' attribute.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION
+	 * @see #getLocation()
+	 * @generated
+	 */
+	void setLocation(IMAGESECTION value);
+
+	/**
+	 * Returns the value of the '<em><b>Debug</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Debug</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Debug</em>' attribute.
+	 * @see #setDebug(boolean)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_Debug()
+	 * @model
+	 * @generated
+	 */
+	boolean isDebug();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isDebug <em>Debug</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Debug</em>' attribute.
+	 * @see #isDebug()
+	 * @generated
+	 */
+	void setDebug(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Enabled</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Enabled</em>' attribute.
+	 * @see #setEnabled(boolean)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_Enabled()
+	 * @model
+	 * @generated
+	 */
+	boolean isEnabled();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#isEnabled <em>Enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Enabled</em>' attribute.
+	 * @see #isEnabled()
+	 * @generated
+	 */
+	void setEnabled(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Status Message</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Status Message</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Status Message</em>' attribute.
+	 * @see #setStatusMessage(String)
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getIbyEntry_StatusMessage()
+	 * @model
+	 * @generated
+	 */
+	String getStatusMessage();
+
+	/**
+	 * Sets the value of the '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry#getStatusMessage <em>Status Message</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Status Message</em>' attribute.
+	 * @see #getStatusMessage()
+	 * @generated
+	 */
+	void setStatusMessage(String value);
+
+	void append(StringBuffer sb);
+
+} // IbyEntry
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/ImageContent.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Image Content</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.ImageContent#getEntries <em>Entries</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getImageContent()
+ * @model
+ * @generated
+ */
+public interface ImageContent extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Entries</b></em>' containment reference list.
+	 * The list contents are of type {@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Entries</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Entries</em>' containment reference list.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#getImageContent_Entries()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<IbyEntry> getEntries();
+
+} // ImageContent
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IContentFactoryImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.impl;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.*;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage;
+import com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IContentFactoryImpl extends EFactoryImpl implements IContentFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static IContentFactory init() {
+		try {
+			IContentFactory theIContentFactory = (IContentFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.nokia.com"); 
+			if (theIContentFactory != null) {
+				return theIContentFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new IContentFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IContentFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case IContentPackage.IMAGE_CONTENT: return createImageContent();
+			case IContentPackage.IBY_ENTRY: return createIbyEntry();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case IContentPackage.IMAGESECTION:
+				return createIMAGESECTIONFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case IContentPackage.IMAGESECTION:
+				return convertIMAGESECTIONToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ImageContent createImageContent() {
+		ImageContentImpl imageContent = new ImageContentImpl();
+		return imageContent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IbyEntry createIbyEntry() {
+		IbyEntryImpl ibyEntry = new IbyEntryImpl();
+		return ibyEntry;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IMAGESECTION createIMAGESECTIONFromString(EDataType eDataType, String initialValue) {
+		IMAGESECTION result = IMAGESECTION.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertIMAGESECTIONToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IContentPackage getIContentPackage() {
+		return (IContentPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static IContentPackage getPackage() {
+		return IContentPackage.eINSTANCE;
+	}
+
+	public IbyEntry createEntryFromString(String initialValue) {
+		String[] parts = initialValue.split(";");
+		IbyEntry entry = IContentFactory.eINSTANCE.createIbyEntry();
+		if(parts.length>=5) {
+			entry.setEnabled(new Boolean(parts[0]));
+			entry.setDebug(new Boolean(parts[1]));
+			entry.setFile(parts[2]);
+			entry.setTarget(parts[3]);
+			entry.setLocation(IMAGESECTION.get(parts[4]));
+		}
+		return entry;
+	}	
+} //IContentFactoryImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IContentPackageImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,306 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.impl;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IContentPackageImpl extends EPackageImpl implements IContentPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass imageContentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass ibyEntryEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum imagesectionEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private IContentPackageImpl() {
+		super(eNS_URI, IContentFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link IContentPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static IContentPackage init() {
+		if (isInited) return (IContentPackage)EPackage.Registry.INSTANCE.getEPackage(IContentPackage.eNS_URI);
+
+		// Obtain or create and register package
+		IContentPackageImpl theIContentPackage = (IContentPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof IContentPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new IContentPackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theIContentPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theIContentPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theIContentPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(IContentPackage.eNS_URI, theIContentPackage);
+		return theIContentPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getImageContent() {
+		return imageContentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getImageContent_Entries() {
+		return (EReference)imageContentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIbyEntry() {
+		return ibyEntryEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_File() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_Target() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_Location() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_Debug() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_Enabled() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIbyEntry_StatusMessage() {
+		return (EAttribute)ibyEntryEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getIMAGESECTION() {
+		return imagesectionEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IContentFactory getIContentFactory() {
+		return (IContentFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		imageContentEClass = createEClass(IMAGE_CONTENT);
+		createEReference(imageContentEClass, IMAGE_CONTENT__ENTRIES);
+
+		ibyEntryEClass = createEClass(IBY_ENTRY);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__FILE);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__TARGET);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__LOCATION);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__DEBUG);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__ENABLED);
+		createEAttribute(ibyEntryEClass, IBY_ENTRY__STATUS_MESSAGE);
+
+		// Create enums
+		imagesectionEEnum = createEEnum(IMAGESECTION);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+
+		// Initialize classes and features; add operations and parameters
+		initEClass(imageContentEClass, ImageContent.class, "ImageContent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getImageContent_Entries(), this.getIbyEntry(), null, "entries", null, 0, -1, ImageContent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(ibyEntryEClass, IbyEntry.class, "IbyEntry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getIbyEntry_File(), ecorePackage.getEString(), "file", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIbyEntry_Target(), ecorePackage.getEString(), "target", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIbyEntry_Location(), this.getIMAGESECTION(), "location", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIbyEntry_Debug(), ecorePackage.getEBoolean(), "debug", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIbyEntry_Enabled(), ecorePackage.getEBoolean(), "enabled", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIbyEntry_StatusMessage(), ecorePackage.getEString(), "statusMessage", null, 0, 1, IbyEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(imagesectionEEnum, com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION.class, "IMAGESECTION");
+		addEEnumLiteral(imagesectionEEnum, com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION.CORE);
+		addEEnumLiteral(imagesectionEEnum, com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION.ROFS2);
+		addEEnumLiteral(imagesectionEEnum, com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION.ROFS3);
+		addEEnumLiteral(imagesectionEEnum, com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION.UDA);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //IContentPackageImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/IbyEntryImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,470 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.impl;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage;
+import com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Iby Entry</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#getFile <em>File</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#getTarget <em>Target</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#getLocation <em>Location</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#isDebug <em>Debug</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#isEnabled <em>Enabled</em>}</li>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.IbyEntryImpl#getStatusMessage <em>Status Message</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class IbyEntryImpl extends EObjectImpl implements IbyEntry {
+	/**
+	 * The default value of the '{@link #getFile() <em>File</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFile()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String FILE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getFile() <em>File</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFile()
+	 * @generated
+	 * @ordered
+	 */
+	protected String file = FILE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getTarget() <em>Target</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TARGET_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected String target = TARGET_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLocation() <em>Location</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final IMAGESECTION LOCATION_EDEFAULT = IMAGESECTION.CORE;
+
+	/**
+	 * The cached value of the '{@link #getLocation() <em>Location</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocation()
+	 * @generated
+	 * @ordered
+	 */
+	protected IMAGESECTION location = LOCATION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isDebug() <em>Debug</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDebug()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean DEBUG_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isDebug() <em>Debug</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDebug()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean debug = DEBUG_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isEnabled() <em>Enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isEnabled()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean ENABLED_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isEnabled() <em>Enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isEnabled()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean enabled = ENABLED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getStatusMessage() <em>Status Message</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStatusMessage()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String STATUS_MESSAGE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getStatusMessage() <em>Status Message</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStatusMessage()
+	 * @generated
+	 * @ordered
+	 */
+	protected String statusMessage = STATUS_MESSAGE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IbyEntryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return IContentPackage.Literals.IBY_ENTRY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getFile() {
+		return file;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFile(String newFile) {
+		String oldFile = file;
+		file = newFile;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__FILE, oldFile, file));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTarget(String newTarget) {
+		String oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__TARGET, oldTarget, target));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IMAGESECTION getLocation() {
+		return location;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLocation(IMAGESECTION newLocation) {
+		IMAGESECTION oldLocation = location;
+		location = newLocation == null ? LOCATION_EDEFAULT : newLocation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__LOCATION, oldLocation, location));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isDebug() {
+		return debug;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDebug(boolean newDebug) {
+		boolean oldDebug = debug;
+		debug = newDebug;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__DEBUG, oldDebug, debug));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEnabled(boolean newEnabled) {
+		boolean oldEnabled = enabled;
+		enabled = newEnabled;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__ENABLED, oldEnabled, enabled));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getStatusMessage() {
+		return statusMessage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStatusMessage(String newStatusMessage) {
+		String oldStatusMessage = statusMessage;
+		statusMessage = newStatusMessage;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, IContentPackage.IBY_ENTRY__STATUS_MESSAGE, oldStatusMessage, statusMessage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IContentPackage.IBY_ENTRY__FILE:
+				return getFile();
+			case IContentPackage.IBY_ENTRY__TARGET:
+				return getTarget();
+			case IContentPackage.IBY_ENTRY__LOCATION:
+				return getLocation();
+			case IContentPackage.IBY_ENTRY__DEBUG:
+				return isDebug();
+			case IContentPackage.IBY_ENTRY__ENABLED:
+				return isEnabled();
+			case IContentPackage.IBY_ENTRY__STATUS_MESSAGE:
+				return getStatusMessage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IContentPackage.IBY_ENTRY__FILE:
+				setFile((String)newValue);
+				return;
+			case IContentPackage.IBY_ENTRY__TARGET:
+				setTarget((String)newValue);
+				return;
+			case IContentPackage.IBY_ENTRY__LOCATION:
+				setLocation((IMAGESECTION)newValue);
+				return;
+			case IContentPackage.IBY_ENTRY__DEBUG:
+				setDebug((Boolean)newValue);
+				return;
+			case IContentPackage.IBY_ENTRY__ENABLED:
+				setEnabled((Boolean)newValue);
+				return;
+			case IContentPackage.IBY_ENTRY__STATUS_MESSAGE:
+				setStatusMessage((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IContentPackage.IBY_ENTRY__FILE:
+				setFile(FILE_EDEFAULT);
+				return;
+			case IContentPackage.IBY_ENTRY__TARGET:
+				setTarget(TARGET_EDEFAULT);
+				return;
+			case IContentPackage.IBY_ENTRY__LOCATION:
+				setLocation(LOCATION_EDEFAULT);
+				return;
+			case IContentPackage.IBY_ENTRY__DEBUG:
+				setDebug(DEBUG_EDEFAULT);
+				return;
+			case IContentPackage.IBY_ENTRY__ENABLED:
+				setEnabled(ENABLED_EDEFAULT);
+				return;
+			case IContentPackage.IBY_ENTRY__STATUS_MESSAGE:
+				setStatusMessage(STATUS_MESSAGE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IContentPackage.IBY_ENTRY__FILE:
+				return FILE_EDEFAULT == null ? file != null : !FILE_EDEFAULT.equals(file);
+			case IContentPackage.IBY_ENTRY__TARGET:
+				return TARGET_EDEFAULT == null ? target != null : !TARGET_EDEFAULT.equals(target);
+			case IContentPackage.IBY_ENTRY__LOCATION:
+				return location != LOCATION_EDEFAULT;
+			case IContentPackage.IBY_ENTRY__DEBUG:
+				return debug != DEBUG_EDEFAULT;
+			case IContentPackage.IBY_ENTRY__ENABLED:
+				return enabled != ENABLED_EDEFAULT;
+			case IContentPackage.IBY_ENTRY__STATUS_MESSAGE:
+				return STATUS_MESSAGE_EDEFAULT == null ? statusMessage != null : !STATUS_MESSAGE_EDEFAULT.equals(statusMessage);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+		StringBuffer result = new StringBuffer();
+		result.append("data-override=");
+		result.append(file);
+		result.append(" ");
+		result.append(target);
+		return result.toString();
+	}
+
+//	@Override
+	public void append(StringBuffer sb) {
+		sb.append(isEnabled());
+		sb.append(";");
+		sb.append(isDebug());
+		sb.append(";");
+		sb.append(getFile());
+		sb.append(";");
+		sb.append(getTarget());
+		sb.append(";");
+		sb.append(getLocation());
+	}
+
+	public boolean equals(Object obj) {
+		if(obj instanceof IbyEntry) {
+			IbyEntry other = (IbyEntry) obj;
+			String f = getFile();
+			String t = getTarget();
+			if(f!=null&&t!=null&&f.equals(other.getFile())&&t.equals(other.getTarget())) {
+				return true;
+			} else if(f!=null&&t==null&&f.equals(other.getFile())&&other.getTarget()==null) {
+				return true;
+			} else if(f==null&&t!=null&&other.getFile()==null&&t.equals(other.getTarget())) {
+				return true;
+			} else if(f==null&&t==null&&other.getFile()==null&&other.getTarget()==null) {
+				return true;
+			} else {
+				return false;
+			}
+		}
+		return false;
+	}
+} //IbyEntryImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/impl/ImageContentImpl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,165 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.impl;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Image Content</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link com.nokia.s60tools.imaker.internal.model.iContent.impl.ImageContentImpl#getEntries <em>Entries</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ImageContentImpl extends EObjectImpl implements ImageContent {
+	/**
+	 * The cached value of the '{@link #getEntries() <em>Entries</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEntries()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<IbyEntry> entries;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImageContentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return IContentPackage.Literals.IMAGE_CONTENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<IbyEntry> getEntries() {
+		if (entries == null) {
+			entries = new EObjectContainmentEList<IbyEntry>(IbyEntry.class, this, IContentPackage.IMAGE_CONTENT__ENTRIES);
+		}
+		return entries;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case IContentPackage.IMAGE_CONTENT__ENTRIES:
+				return ((InternalEList<?>)getEntries()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case IContentPackage.IMAGE_CONTENT__ENTRIES:
+				return getEntries();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case IContentPackage.IMAGE_CONTENT__ENTRIES:
+				getEntries().clear();
+				getEntries().addAll((Collection<? extends IbyEntry>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case IContentPackage.IMAGE_CONTENT__ENTRIES:
+				getEntries().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case IContentPackage.IMAGE_CONTENT__ENTRIES:
+				return entries != null && !entries.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ImageContentImpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/util/IContentAdapterFactory.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.util;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage
+ * @generated
+ */
+public class IContentAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static IContentPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IContentAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = IContentPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IContentSwitch<Adapter> modelSwitch =
+		new IContentSwitch<Adapter>() {
+			@Override
+			public Adapter caseImageContent(ImageContent object) {
+				return createImageContentAdapter();
+			}
+			@Override
+			public Adapter caseIbyEntry(IbyEntry object) {
+				return createIbyEntryAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.model.iContent.ImageContent <em>Image Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.ImageContent
+	 * @generated
+	 */
+	public Adapter createImageContentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry <em>Iby Entry</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry
+	 * @generated
+	 */
+	public Adapter createIbyEntryAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //IContentAdapterFactory
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/model/iContent/util/IContentSwitch.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.imaker.internal.model.iContent.util;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.*;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see com.nokia.s60tools.imaker.internal.model.iContent.IContentPackage
+ * @generated
+ */
+public class IContentSwitch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static IContentPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IContentSwitch() {
+		if (modelPackage == null) {
+			modelPackage = IContentPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	public T doSwitch(EObject theEObject) {
+		return doSwitch(theEObject.eClass(), theEObject);
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	protected T doSwitch(EClass theEClass, EObject theEObject) {
+		if (theEClass.eContainer() == modelPackage) {
+			return doSwitch(theEClass.getClassifierID(), theEObject);
+		}
+		else {
+			List<EClass> eSuperTypes = theEClass.getESuperTypes();
+			return
+				eSuperTypes.isEmpty() ?
+					defaultCase(theEObject) :
+					doSwitch(eSuperTypes.get(0), theEObject);
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case IContentPackage.IMAGE_CONTENT: {
+				ImageContent imageContent = (ImageContent)theEObject;
+				T result = caseImageContent(imageContent);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case IContentPackage.IBY_ENTRY: {
+				IbyEntry ibyEntry = (IbyEntry)theEObject;
+				T result = caseIbyEntry(ibyEntry);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Image Content</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Image Content</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseImageContent(ImageContent object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Iby Entry</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Iby Entry</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIbyEntry(IbyEntry object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //IContentSwitch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/preferences/ImageFlasherPreferencePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.ImageFlasherHelpContextIDs;
+import com.nokia.s60tools.imaker.Messages;
+
+/**
+ * This class represents a preference page that is contributed to the
+ * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>,
+ * we can use the field support built into JFace that allows us to create a page
+ * that is small and knows how to save, restore and apply itself.
+ * <p>
+ * This page is used to modify preferences only. They are stored in the
+ * preference store that belongs to the main plug-in class. That way,
+ * preferences can be accessed directly via the preference store.
+ */
+public class ImageFlasherPreferencePage extends PreferencePage implements
+IWorkbenchPreferencePage {
+	/** UI widgets */
+	private Composite parent;
+	private Button buttonBrowseDir;
+	private Text textPreferencesDirectory;
+	private String preferencesDirectory;
+	private Button checkConfml;
+
+	/**
+	 * Constructor
+	 */
+	public ImageFlasherPreferencePage() {
+		super();
+	}
+
+	public void init(IWorkbench workbench) {}
+
+	protected IPreferenceStore doGetPreferenceStore() {
+		return IMakerPlugin.getDefault().getPreferenceStore();
+	}
+
+	private void storeValues() {
+		IPreferenceStore store = doGetPreferenceStore();
+		store.setValue(PreferenceConstants.PREFERENCES_DIRECTORY, textPreferencesDirectory.getText());
+		store.setValue(PreferenceConstants.CONFML_SELECTION_DIALOG, checkConfml.getSelection());
+	}
+
+	private void initializeDefaults() {
+		IPreferenceStore store = doGetPreferenceStore();
+		store.setDefault(PreferenceConstants.PREFERENCES_DIRECTORY, ""); //$NON-NLS-1$
+		store.setDefault(PreferenceConstants.CONFML_SELECTION_DIALOG, false);
+	}
+
+
+	/*
+	 * The user has pressed "Restore defaults". Restore all default preferences.
+	 */
+	@Override
+	protected void performDefaults() {
+		initializeDefaults();
+		super.performDefaults();
+	}
+
+	/*
+	 * The user has pressed Ok. Store/apply this page's values appropriately.
+	 */
+	@Override
+	public boolean performOk() {
+		storeValues();
+		return super.performOk();
+	}
+
+	/*
+	 * The user has pressed Apply. Store/apply this page's values appropriately.
+	 */
+	@Override
+	public void performApply() {
+		storeValues();
+	}
+
+	@Override
+	protected Control createContents(Composite composite) {
+		parent = composite;
+
+		// Create Top composite in top of the parent composite
+		Composite container = new Composite(parent, SWT.LEFT);
+
+		GridData topCompositeGridData = new GridData(SWT.FILL, SWT.FILL, true,false);
+		container.setLayoutData(topCompositeGridData);
+		GridLayout topCompositeGridLayout = createLayout();
+		container.setLayout(topCompositeGridLayout);
+
+		setHelpForControl(container,ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP);
+
+		addPreferencesControls(container);
+		initializeValues();
+		setHelpForControl(textPreferencesDirectory, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_PREFERENCES_MANAGEMENT);
+
+		return container;
+	}
+
+	private void initializeValues() {
+		IPreferenceStore store = doGetPreferenceStore();
+		String str = store.getString(PreferenceConstants.PREFERENCES_DIRECTORY);
+		textPreferencesDirectory.setText(str);
+		boolean show = store.getBoolean(PreferenceConstants.CONFML_SELECTION_DIALOG);
+		checkConfml.setSelection(show);
+	}
+
+	/**
+	 * @param container
+	 */
+	private void addPreferencesControls(Composite container) {
+		//Group groupPreferences = new Group(container, SWT.NONE);
+		Composite comp = new Composite(container,SWT.NONE);
+		GridLayout layoutPreferences = new GridLayout(4, true);
+		comp.setLayout(layoutPreferences);
+		comp.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false,
+				4, 1));
+		//comp.setText(Messages.getString("ImageFlasherPreferencePage.0")); //$NON-NLS-1$
+
+		// Preferences save directory
+		Label labelPreferencesDirectory = new Label(comp, SWT.NONE);
+		labelPreferencesDirectory.setText(Messages.getString("ImageFlasherPreferencePage.1")); //$NON-NLS-1$
+
+		textPreferencesDirectory = new Text(comp, SWT.SINGLE | SWT.BORDER);
+		textPreferencesDirectory.setLayoutData(new GridData(SWT.FILL,
+				SWT.NONE, true, false, 2, 1));
+
+		// Browse directory button
+		buttonBrowseDir = new Button(comp, SWT.PUSH);
+		buttonBrowseDir.setText(Messages.getString("ImageFlasherPreferencePage.2")); //$NON-NLS-1$
+		buttonBrowseDir.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 1, 1));
+		buttonBrowseDir.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				browsePreferencesDirectory();
+			}
+
+		});
+		Composite compCheck = new Composite(container,SWT.NONE);
+		compCheck.setLayout(new GridLayout(1, true));
+		compCheck.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false,
+				1, 1));
+		checkConfml = new Button(compCheck,SWT.CHECK);
+		checkConfml.setText(Messages.getString("ImageFlasherPreferencePage.3"));
+
+	}
+
+	private void setHelpForControl(Control container, String id) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(container, id);
+	}
+
+	private GridLayout createLayout() {
+		GridLayout topCompositeGridLayout = new GridLayout(4, false);
+		topCompositeGridLayout.horizontalSpacing = 5; // CodForChk_Dis_Magic
+		topCompositeGridLayout.verticalSpacing = 5; // CodForChk_Dis_Magic
+		topCompositeGridLayout.marginWidth = 0;
+		topCompositeGridLayout.marginHeight = 0;
+		return topCompositeGridLayout;
+	}
+
+	private void browsePreferencesDirectory() {
+
+		DirectoryDialog dd = new DirectoryDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
+		dd.open();
+
+		preferencesDirectory = dd.getFilterPath();
+		textPreferencesDirectory.setText(preferencesDirectory);
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/preferences/PreferenceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+package com.nokia.s60tools.imaker.internal.preferences;
+
+/**
+ * Constant definitions for plug-in preferences
+ */
+public class PreferenceConstants {
+	/** Public class constants */
+	public static final String MAKEFILE                  = "MAKEFILE"; //$NON-NLS-1$
+	public static final String FILENAME                  = "FILENAME"; //$NON-NLS-1$
+	public static final String SELECTED_SETTING          = "SELECTED_SETTING"; //$NON-NLS-1$
+	public static final String SAVED_SETTINGS_LIST       = "SAVED_SETTINGS_LIST"; //$NON-NLS-1$
+	public static final String SELECTED_PRODUCT          = "SELECTED_PRODUCT"; //$NON-NLS-1$
+    public static final String SELECTED_HWID             = "SELECTED_HWID"; //$NON-NLS-1$
+    public static final String SELECTED_TARGET           = "SELECTED_TARGET"; //$NON-NLS-1$
+    public static final String SELECTED_TARGET_LIST      = "SELECTED_TARGET_LIST"; //$NON-NLS-1$
+    public static final String IMAGE_TYPE_RND            = "IMAGE_TYPE_RND"; //$NON-NLS-1$
+    public static final String IMAGE_TYPE_PRD            = "IMAGE_TYPE_PRD"; //$NON-NLS-1$
+    public static final String IMAGE_TYPE_SUBCON         = "IMAGE_TYPE_SUBCON"; //$NON-NLS-1$
+    public static final String FLAG_FULL_DEBUG           = "FLAG_FULL_DEBUG"; //$NON-NLS-1$
+    public static final String FLAG_VERBOSE              = "FLAG_VERBOSE"; //$NON-NLS-1$
+    public static final String USER_DEFINED_PARAMETERS   = "USER_DEFINED_PARAMETERS"; //$NON-NLS-1$
+    public static final String SETTING_NAME_PREFIX       = "SETTING_NAME_PREFIX"; //$NON-NLS-1$
+    public static final String PREFERENCE_STORE_PREFIX   = "imageflasher."; //$NON-NLS-1$
+    public static final String TARGET_SEPARATOR          = ","; //$NON-NLS-1$
+    public static final String PREFERENCES_DIRECTORY     = "PREFERENCES_DIRECTORY"; //$NON-NLS-1$
+    public static final String PREFERENCE_FILE_EXTENSION = "*.imp"; //$NON-NLS-1$
+    public static final String PREFERENCE_IN_USE         = "PREFERENCE_IN_USE"; //$NON-NLS-1$
+    public static final String PREFERENCE_FILE_PATH      = "PREFERENCE_FILE_PATH"; //$NON-NLS-1$
+    public static final String PREFERENCE_SELECTED_ENV   = "PREFERENCE_SELECTED_ENV"; //$NON-NLS-1$
+	public static final String PREFERENCE_IMAKERCORE_VERSION = "PREFERENCE_IMAKERCORE_VERSION";
+	public static final String HWID						= "HWID";
+	public static final String CONFML_SELECTION_DIALOG	= "CONFML_SELECTION_DIALOG";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/CheckBoxEditingSupport.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,98 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.viewers.DebugTab;
+
+public class CheckBoxEditingSupport extends IbyEntryEditingSupport {
+	private final static int ENABLE_COLUMN_ID = 1;
+	public CheckBoxEditingSupport(ColumnViewer viewer, int column) {
+		super(viewer, column);
+	}
+
+	@Override
+	protected boolean canEdit(Object element) {
+		return true;
+	}
+
+	@Override
+	protected CellEditor getCellEditor(Object element) {
+		TableViewer tv = (TableViewer) getViewer();
+		CheckboxCellEditor cellEditor = new CheckboxCellEditor(tv.getTable());
+		return cellEditor;
+	}
+
+	@Override
+	protected Object getValue(Object element) {
+		Boolean ret = (column==ENABLE_COLUMN_ID)?new Boolean(getEntry(element).isEnabled()):new Boolean(getEntry(element).isDebug());
+		return ret;
+	}
+
+	@Override
+	protected void setValue(Object element, Object value) {
+		Boolean newValue = (Boolean)value;
+		IbyEntry entry = getEntry(element);
+		if(column==ENABLE_COLUMN_ID) {
+			entry.setEnabled(newValue);
+		} else {
+			String dPath = getDebugVersion(entry.getFile(),newValue);
+			if(!dPath.equals(entry.getFile())) {
+				entry.setFile(dPath);
+				entry.setDebug(newValue);
+			} else {
+				return;
+			}
+		}
+		updateWarning(element);
+		getViewer().update(element, null);
+	}
+
+	private String getDebugVersion(String path, Boolean value) {
+		String pattern;
+		if(value) {
+			pattern = DebugTab.REL_PATTERN;
+		} else {
+			pattern = DebugTab.DEBUG_PATTERN;			
+		}
+		Pattern p = Pattern.compile(pattern);
+		Matcher matcher = p.matcher(path);
+		if (matcher.find()) {
+			int start = matcher.start(1);
+			int end = matcher.end(1);
+			String newPath;
+			if(value) {
+				newPath = path.substring(0, start) + "udeb" + path.substring(end);
+			} else {
+				newPath = path.substring(0, start) + "urel" + path.substring(end);
+			}
+			return newPath;
+		} else {
+			return path;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/ComboEditingSupport.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+
+public class ComboEditingSupport extends IbyEntryEditingSupport {
+	public ComboEditingSupport(ColumnViewer viewer, int column) {
+		super(viewer, column);
+	}
+
+	@Override
+	protected boolean canEdit(Object element) {
+		return true;
+	}
+
+	@Override
+	protected CellEditor getCellEditor(Object element) {
+		IMAGESECTION[] values = IMAGESECTION.values();
+		String[] entries = new String[values.length];
+		for (int i = 0; i < values.length; i++) {
+			entries[i]=values[i].getLiteral();
+		}
+		TableViewer tv = (TableViewer) getViewer();
+		ComboBoxCellEditor cellEditor = new ComboBoxCellEditor(tv.getTable(), entries);
+		return cellEditor;
+	}
+
+	@Override
+	protected Object getValue(Object element) {
+		IbyEntry ie = getEntry(element);
+		Integer value = new Integer(ie.getLocation().getValue());
+		return value;
+	}
+
+	@Override
+	protected void setValue(Object element, Object value) {
+		IbyEntry ie = getEntry(element);
+		int oldValue = ie.getLocation().getValue();
+		int newValue = ((Integer)value).intValue();
+		if(oldValue!=newValue) {
+			ie.setLocation(IMAGESECTION.get(newValue));
+		}
+		getViewer().update(element, null);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/IbyEntryEditingSupport.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.EditingSupport;
+
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+
+public abstract class IbyEntryEditingSupport extends EditingSupport {
+	protected int column;
+
+	public IbyEntryEditingSupport(ColumnViewer viewer, int column) {
+		super(viewer);
+		this.column = column;
+	}
+
+	protected void updateWarning(Object element) {
+		IbyEntry entry = getEntry(element);
+		entry.setStatusMessage("Todo!");
+	}
+	
+	protected IbyEntry getEntry(Object element) {
+		return (IbyEntry) element;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/SettingsColumnLabelProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.viewers.SettingsViewer;
+
+public class SettingsColumnLabelProvider {
+	public void createColumns(TableViewer viewer, SettingsViewer settingsViewer) {
+		String[] titles = { 
+				Messages.getString("SettingsTable.header0"), 
+				Messages.getString("SettingsTable.header1"), 
+				Messages.getString("SettingsTable.header2"),
+				Messages.getString("SettingsTable.header3") 
+				};
+		int[] bounds = { 100, 180, 80, 250 };
+
+		// Column 0: Parameter
+		int i = 0;
+		TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+		column.getColumn().setWidth(bounds[i]);
+		column.getColumn().setText(titles[i]);
+		column.getColumn().setMoveable(true);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			public String getText(Object element) {
+				return ((UIVariable) element).getName();
+			}
+		});
+		
+		// Column 1: Value
+		i++;
+		column = new TableViewerColumn(viewer, SWT.NONE);
+		column.getColumn().setWidth(bounds[i]);
+		column.getColumn().setText(titles[i]);
+		column.getColumn().setMoveable(true);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			public String getText(Object element) {
+				return ((UIVariable) element).getValue();
+			}
+		});
+		column.setEditingSupport(new SettingsEditingSupport(viewer, i,settingsViewer));
+
+		// Column 2: Value format
+		i++;
+		column = new TableViewerColumn(viewer, SWT.NONE);
+		column.getColumn().setWidth(bounds[i]);
+		column.getColumn().setText(titles[i]);
+		column.getColumn().setMoveable(true);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			public String getText(Object element) {
+				return ((UIVariable) element).getValueFormat();
+			}
+		});
+
+		// Column 3: Description
+		i++;
+		column = new TableViewerColumn(viewer, SWT.NONE);
+		column.getColumn().setWidth(bounds[i]);
+		column.getColumn().setText(titles[i]);
+		column.getColumn().setMoveable(true);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			public String getText(Object element) {
+				return ((UIVariable) element).getDescription();
+			}
+		});
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/SettingsEditingSupport.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.viewers.PreferencesTab;
+import com.nokia.s60tools.imaker.internal.viewers.SettingsViewer;
+
+public class SettingsEditingSupport extends EditingSupport {
+
+	private int column;
+	private TextCellEditor cellEditor;
+	private String oldValue;
+	private SettingsViewer settingsViewer;
+
+	public SettingsEditingSupport(ColumnViewer viewer, int column, SettingsViewer settingsViewer) {
+		super(viewer);
+		this.settingsViewer = settingsViewer;
+		switch (column) {
+		case 1:
+			cellEditor = new TextCellEditor(((TableViewer)viewer).getTable());
+			break;
+		default:
+		}
+		this.column = column;
+	}
+
+	@Override
+	protected boolean canEdit(Object element) {
+		if(column==1) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	protected CellEditor getCellEditor(Object element) {
+		return cellEditor;
+	}
+
+	@Override
+	protected Object getValue(Object element) {
+		UIVariable variable = (UIVariable)element;
+		switch (column) {
+		case 1:
+			oldValue = variable.getValue();
+			return oldValue;
+		default:
+			break;
+		}
+		return null;
+	}
+
+	@Override
+	protected void setValue(Object element, Object value) {
+		UIVariable variable = (UIVariable)element;
+
+		switch (this.column) {
+		case 1:
+			if(!oldValue.equals(value)) {
+				variable.setValue(String.valueOf(value));
+				variable.setModified(true);
+				settingsViewer.setDirty(true);
+				Display display = ((TableViewer)getViewer()).getTable().getDisplay();
+				display.asyncExec(new Runnable() {
+
+					public void run() {
+						if(PreferencesTab.currentPreferencesTab!=null) {
+							PreferencesTab.currentPreferencesTab.refreshSettingsTab();
+						}
+					}
+					
+				});
+			}
+			break;
+		default:
+			break;
+		}
+		getViewer().update(element, null);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/providers/TextEditingSupport.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.providers;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+
+public class TextEditingSupport extends IbyEntryEditingSupport {
+	private final static int FILE_COLUMN_ID = 2;
+	public TextEditingSupport(ColumnViewer viewer, int column) {
+		super(viewer, column);
+	}
+
+	@Override
+	protected boolean canEdit(Object element) {
+		return true;
+	}
+
+	@Override
+	protected CellEditor getCellEditor(Object element) {
+		TableViewer tv = (TableViewer) getViewer();
+		TextCellEditor cellEditor = new TextCellEditor(tv.getTable());
+		return cellEditor;
+	}
+
+	@Override
+	protected Object getValue(Object element) {
+		String value = null;
+		
+		if(column==FILE_COLUMN_ID) {
+			value = getEntry(element).getFile();
+		} else {
+			value = getEntry(element).getTarget();
+		}
+		return (value==null)?"":value;
+	}
+
+	@Override
+	protected void setValue(Object element, Object value) {
+		String oldValue;
+		String newValue;
+		if(column==FILE_COLUMN_ID) {
+			oldValue = getEntry(element).getFile();
+			newValue = (String) value;
+			if(oldValue!=null&&!oldValue.equals(newValue)) {
+				getEntry(element).setFile(newValue);
+				super.updateWarning(element);
+				getViewer().update(element, null);
+			} else if(oldValue==null) {
+				getEntry(element).setFile(newValue);
+				super.updateWarning(element);
+				getViewer().update(element, null);				
+			} else {}
+		} else {
+			oldValue = getEntry(element).getTarget();
+			newValue = (String) value;
+			if(oldValue!=null&&!oldValue.equals(newValue)) {
+				getEntry(element).setTarget(newValue);
+				super.updateWarning(element);
+				getViewer().update(element, null);
+			} else if(oldValue==null) {
+				getEntry(element).setTarget(newValue);
+				super.updateWarning(element);
+				getViewer().update(element, null);				
+			} else {}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/AddEditFileToTransferDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.internal.model.FileToImage;
+
+public class AddEditFileToTransferDialog extends StatusDialog {
+
+	private FileToImage fFile;
+	private Text hostPath;
+	private Button hostBrowse;
+	private Text targetPath;
+
+	/**
+	 * Create the dialog
+	 * @param parent
+	 * @param file
+	 */
+	public AddEditFileToTransferDialog(Shell parent, FileToImage file) {
+		super(parent);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		fFile = file;
+	}
+
+	/**
+	 * @see Windows#configureShell
+	 */
+	protected void configureShell(Shell newShell) {
+		super.configureShell(newShell);
+//		PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, LaunchTabHelpIds.RUN_MODE_FILE_TRANSFER_DIALOG);
+	}		
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		initializeDialogUnits(parent);
+		Composite composite= (Composite) super.createDialogArea(parent);
+		
+		GridLayout layout = (GridLayout) composite.getLayout();
+		layout.numColumns = 2;
+		
+		final Label hostLabel = new Label(composite, SWT.NONE);
+		hostLabel.setText(Messages.getString("AddEditFileToTransferDialog.1")); //$NON-NLS-1$
+		GridData data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+		data.horizontalSpan = 2;
+		hostLabel.setLayoutData(data);
+		hostLabel.setToolTipText(Messages.getString("AddEditFileToTransferDialog.2")); //$NON-NLS-1$
+
+		hostPath = new Text(composite, SWT.BORDER);
+		hostPath.setText(fFile.getHostPath());
+		data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+		hostPath.setLayoutData(data);
+		hostPath.setToolTipText(Messages.getString("AddEditFileToTransferDialog.2")); //$NON-NLS-1$
+		hostPath.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				checkValues();
+			}
+		});
+
+		hostBrowse = new Button(composite, SWT.PUSH);
+		hostBrowse.setFont(parent.getFont());
+		hostBrowse.setText(Messages.getString("AddEditFileToTransferDialog.3")); //$NON-NLS-1$
+		data = new GridData();
+		hostBrowse.setLayoutData(data);	
+		hostBrowse.addSelectionListener(new SelectionAdapter() {
+
+			public void widgetSelected(SelectionEvent evt) {
+				FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
+
+				dialog.setText(Messages.getString("AddEditFileToTransferDialog.4")); //$NON-NLS-1$
+				dialog.setFilterExtensions(new String[] {"*"}); //$NON-NLS-1$
+				dialog.setFilterNames(new String[] {Messages.getString("AddEditFileToTransferDialog.11")}); //$NON-NLS-1$
+
+				String result = dialog.open();
+				if (result != null) {
+					IPath path = new Path(result);
+					if (path.toFile().exists()) {
+						hostPath.setText(result);
+						
+						// if target path is empty, set it to something useful here.
+						if (targetPath.getText().trim().length() < 1) {
+							String tp = IMakerUtils.getFixedTargetPath(path);
+
+							targetPath.setText(tp);
+						}
+					}
+				}
+			}
+
+
+		});
+
+		final Label targetLabel = new Label(composite, SWT.NONE);
+		targetLabel.setText(Messages.getString("AddEditFileToTransferDialog.5")); //$NON-NLS-1$
+		data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+		data.horizontalSpan = 2;
+		targetLabel.setLayoutData(data);
+		targetLabel.setToolTipText(Messages.getString("AddEditFileToTransferDialog.6")); //$NON-NLS-1$
+
+		targetPath = new Text(composite, SWT.BORDER);
+		targetPath.setText(fFile.getTargetPath());
+		data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+		targetPath.setLayoutData(data);
+		targetPath.setToolTipText(Messages.getString("AddEditFileToTransferDialog.6")); //$NON-NLS-1$
+		targetPath.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				checkValues();
+			}
+		});
+
+		applyDialogFont(composite);		
+
+		return composite;
+	}
+
+	public void create() {
+		super.create();
+		checkValues();
+	}
+
+	protected void okPressed() {
+		fFile.setHostPath(hostPath.getText());
+		fFile.setTargetPath(targetPath.getText());
+
+		super.okPressed();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#getInitialSize()
+	 */
+	protected Point getInitialSize() {
+		Point size = super.getInitialSize();
+		
+		// set the initial size for the add dialog.  note that when editing it
+		// automatically sizes it based on the length of the text in the edit boxes
+		if (hostPath.getText().trim().length() == 0) {
+			size.x *= 3;
+		}
+
+		return size;
+	}
+
+	protected void checkValues() {
+		StatusInfo status= new StatusInfo();
+		status.setOK();
+		
+		String hp = hostPath.getText().trim();
+		if (hp.length() > 0) {
+			if (!new File(hp).exists()) {
+				status.setError(Messages.getString("AddEditFileToTransferDialog.7")); //$NON-NLS-1$
+			}
+		}
+		else {
+			status.setError(Messages.getString("AddEditFileToTransferDialog.8")); //$NON-NLS-1$
+		}
+
+		// if we already have an error then no need to check the rest of the stuff
+		if (status.isOK()) {
+			String tp = targetPath.getText().trim();
+			if (tp.length() > 0) {
+				if (tp.length() < 3) {
+					status.setError(Messages.getString("AddEditFileToTransferDialog.9")); //$NON-NLS-1$					
+				} else {
+//					char drive = tp.charAt(0);
+//					char colon = tp.charAt(1);
+//					if (!Character.isLetter(drive) || colon != ':') { 
+//						status.setError(Messages.getString("AddEditFileToTransferDialog.9")); //$NON-NLS-1$
+//					}
+					
+					// we really want the target file path, not just a directory.  but we do allow directories for
+					// backwards compatibility, but only when they end in a path delimiter.  so if the target path
+					// does not end in a path delimiter, and there is no file extension, warn them that we think
+					// this is just a file without an extension and not a directory.
+					IPath path = new Path(tp);
+					if (!path.hasTrailingSeparator() && path.getFileExtension() == null) {
+						status.setWarning(Messages.getString("AddEditFileToTransferDialog.12")); //$NON-NLS-1$
+					}
+				}
+			}
+			else {
+				status.setError(Messages.getString("AddEditFileToTransferDialog.10")); //$NON-NLS-1$
+			}
+		}
+
+		updateStatus(status);		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/DebugTab.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,521 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.UITarget;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.FileToImage;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+import com.nokia.s60tools.imaker.internal.providers.CheckBoxEditingSupport;
+import com.nokia.s60tools.imaker.internal.providers.ComboEditingSupport;
+import com.nokia.s60tools.imaker.internal.providers.TextEditingSupport;
+
+public class DebugTab extends CTabItem implements IPropertyViewer {
+	public static final String CHECKED_IMAGE 	= "checked";
+	public static final String UNCHECKED_IMAGE  = "unchecked";
+	public static final String WARNING_IMAGE    = "warning";
+	public static final String ERROR_IMAGE      = "error";
+	public static final String REL_PATTERN      = ".*epoc32.release.+?(urel).*";
+	public static final String DEBUG_PATTERN    = ".*epoc32.release.+?(udeb).*";
+
+	// For the checkbox images
+	private static ImageRegistry imageRegistry = IMakerPlugin.getDefault().getImageRegistry();
+	
+	private IMakerTabsViewer tabsViewer;
+	private ProjectManager projectManager;
+	private TableViewer tableViewer;
+	private PreferencesTab mainTab;
+	
+	static {
+		String iconPath = "icons/"; 
+		imageRegistry.put(CHECKED_IMAGE, IMakerPlugin.getImageDescriptor( 
+				iconPath + CHECKED_IMAGE + ".gif"
+		)
+		);
+		imageRegistry.put(UNCHECKED_IMAGE, IMakerPlugin.getImageDescriptor( 
+				iconPath + UNCHECKED_IMAGE + ".gif"
+		)
+		);
+		imageRegistry.put(WARNING_IMAGE, IMakerPlugin.getImageDescriptor( 
+				iconPath + WARNING_IMAGE + ".gif"
+		)
+		);	
+		imageRegistry.put(ERROR_IMAGE, IMakerPlugin.getImageDescriptor( 
+				iconPath + ERROR_IMAGE + ".gif"
+		)
+		);	
+	}
+
+	public DebugTab(CTabFolder parent, int style, IMakerTabsViewer viewer, PreferencesTab main) {
+		super(parent, style);
+		this.tabsViewer = viewer;
+		this.projectManager = tabsViewer.getProjectManager();
+		setControl(createControl(parent));
+		this.mainTab = main;		
+	}
+	
+	private void deleteSelection() {
+		ISelection selection = tableViewer.getSelection();
+		if(selection!=null) {
+			IStructuredSelection ss = (IStructuredSelection) selection;
+			Object[] objects = ss.toArray();
+			for (int i = 0; i < objects.length; i++) {
+				IbyEntry fe = (IbyEntry) objects[i];
+				ImageContent ic = getInput();
+				ic.getEntries().remove(fe);						
+			}
+			tableViewer.refresh();
+		}
+	}
+	
+	private Control createControl(CTabFolder parent) {
+		Composite top = new Composite(parent,SWT.NONE);
+		top.setLayout(new GridLayout(2,false));
+		top.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		// create table
+		Composite tableComp = getNewComposite(top);
+		Table table = new Table(tableComp,SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
+		GridData gridData = new GridData(GridData.FILL,GridData.FILL,true,true);
+		gridData.heightHint = 180;
+		table.setLayoutData(gridData);
+		
+		// create controls
+		Composite controls = getNewComposite(top);
+		Button button = new Button(controls,SWT.PUSH|SWT.LEFT);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(Messages.getString("DebugTab.2"));
+		button.setToolTipText(Messages.getString("DebugTab.3"));
+		button.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent e) {
+				IbyEntry entry = IContentFactory.eINSTANCE.createIbyEntry();
+				ImageContent input = getInput();
+				FileToImage file = new FileToImage();
+				AddEditFileToTransferDialog dialog= new AddEditFileToTransferDialog(getControl().getShell(), file);
+				dialog.setTitle(Messages.getString("FileTransferTab.8"));
+				if (dialog.open() != Window.OK) {
+					return;
+				}
+				entry.setEnabled(file.getEnabled());
+				entry.setFile(file.getHostPath().substring(2));
+				entry.setTarget(file.getTargetPath());
+				entry.setDebug(isDebug(entry.getFile()));
+				input.getEntries().add(entry);
+				tableViewer.refresh();
+			}
+			
+			private boolean isDebug(String file) {
+				Pattern p = Pattern.compile(DEBUG_PATTERN);
+				return p.matcher(file).find();
+			}
+
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+
+		button = new Button(controls,SWT.PUSH|SWT.LEFT);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(Messages.getString("DebugTab.4"));
+		button.setToolTipText(Messages.getString("DebugTab.5"));
+		button.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent e) {
+				deleteSelection();
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		
+		button = new Button(controls,SWT.PUSH|SWT.LEFT);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(Messages.getString("DebugTab.6"));
+		button.setToolTipText(Messages.getString("DebugTab.7"));
+		button.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent e) {
+				ImageContent input = getInput();
+				if(input!=null) {
+					projectManager.populate(input);
+					tableViewer.refresh();
+				}
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		
+		Composite enableButtons = new Composite(top,SWT.NONE);
+		GridLayout layout = new GridLayout(2, false);
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		enableButtons.setLayout(layout);
+		enableButtons.setLayoutData(new GridData());
+		
+		button = new Button(enableButtons,SWT.PUSH|SWT.LEFT);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(Messages.getString("DebugTab.8"));
+		button.setToolTipText(Messages.getString("DebugTab.9"));
+		button.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				ImageContent ic = getInput();
+				if(ic!=null) {
+					for (IbyEntry entry: ic.getEntries()) {
+						entry.setEnabled(true);
+					}
+					tableViewer.refresh();
+				}
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		
+		button = new Button(enableButtons,SWT.PUSH|SWT.LEFT);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(Messages.getString("DebugTab.10"));
+		button.setToolTipText(Messages.getString("DebugTab.11"));
+		button.addSelectionListener(new SelectionListener() {
+			
+			public void widgetSelected(SelectionEvent e) {
+				ImageContent ic = getInput();
+				if(ic!=null) {
+					for (IbyEntry entry: ic.getEntries()) {
+						entry.setEnabled(false);
+					}
+					tableViewer.refresh();
+				}
+			}
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		
+		tableViewer = new TableViewer(table);
+
+		tableViewer.getTable().setHeaderVisible(true);
+		tableViewer.getTable().setLinesVisible(true);
+
+		tableViewer.setContentProvider(new DebugContentProvider());
+
+		createColumns(tableViewer);
+		
+		tableViewer.getTable().addKeyListener(new KeyListener() {
+			
+			public void keyReleased(KeyEvent e) {
+				if(e.character == SWT.DEL) {
+					deleteSelection();
+				}
+			}
+			
+			public void keyPressed(KeyEvent e) {
+			}
+		});
+		tableViewer.setInput(getDefaultInput());
+		return top;	
+	}
+
+	private Object getDefaultInput() {
+		IContentFactory factory = IContentFactory.eINSTANCE;
+		ImageContent ic = factory.createImageContent();
+		return ic;
+	}
+
+	private Composite getNewComposite(Composite top) {
+		Composite comp = new Composite(top,SWT.NONE);
+		GridLayout layout = new GridLayout(1, true);
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		comp.setLayout(layout);
+		GridData layoutData = new GridData(GridData.FILL_BOTH);
+		layoutData.grabExcessHorizontalSpace = true;
+		comp.setLayoutData(layoutData);
+		return comp;
+	}
+
+	private void createColumns(TableViewer viewer) {
+		int columnSizes[] = {20,50,130,130,60,50};
+		
+		TableViewerColumn column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("!");
+		column.getColumn().setWidth(columnSizes[0]);
+		column.setLabelProvider(new ColumnLabelProvider() {	
+			
+			@Override
+			public Image getImage(Object element) {
+				if(isWarning(element)) {
+					return imageRegistry.get(WARNING_IMAGE);					
+				} else if(isError(element)) {
+					return imageRegistry.get(ERROR_IMAGE);
+				} else {
+					return null;
+				}
+			}
+
+			private IbyEntry getEntry(Object element) {
+				return (IbyEntry) element;
+			}
+			
+			private boolean isWarning(Object element) {
+				IbyEntry entry = getEntry(element);
+				String location = "-"+entry.getLocation().toString().toUpperCase();
+				String targets[] = mainTab.getSelectedTargets();
+				UIConfiguration pr = mainTab.getSelectedProduct();
+				for (int i = 0; i < targets.length; i++) {
+					String t = targets[i];
+					UITarget target = pr.getTarget(t);
+					if(target!=null&&target.getSteps()!=null) {
+						int index = target.getSteps().indexOf(location);
+						if(index!=-1) {
+							return false;
+						}
+					}
+				}
+				String message = Messages.getString("DebugTab.0");
+				entry.setStatusMessage(message.replace("xxx", location.substring(1)));
+				return true;
+			}
+
+			private boolean isError(Object element) {
+				IbyEntry entry = getEntry(element);
+				String path = projectManager.getRoot()+entry.getFile();
+				File f = new File(path);
+				if(!f.exists()) {
+					String message = Messages.getString("DebugTab.1");
+					entry.setStatusMessage(message.replace("xxx", f.getAbsolutePath()));
+					return true;
+				}
+				return false;
+			}
+			
+			
+			@Override
+			public String getText(Object element) {
+				if(isWarning(element) || isError(element)) {
+					return getEntry(element).getStatusMessage();
+				}
+				return "";
+			}
+			
+		});
+		column.setEditingSupport(new CheckBoxEditingSupport(viewer, 0));
+		
+		column = new TableViewerColumn(viewer,SWT.CENTER);
+		column.getColumn().setText("Enable");
+		column.getColumn().setWidth(columnSizes[1]);
+		column.setLabelProvider( new ColumnLabelProvider() {	
+			
+			@Override
+			public Image getImage(Object element) {
+				IbyEntry ie = (IbyEntry) element;
+				String key = ie.isEnabled() ? CHECKED_IMAGE : UNCHECKED_IMAGE;
+				return imageRegistry.get(key);
+			}
+
+			@Override
+			public String getText(Object element) {
+				return "";
+			}
+		});
+		column.setEditingSupport(new CheckBoxEditingSupport(viewer, 1));
+		
+		column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("File");
+		column.getColumn().setWidth(columnSizes[2]);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			@Override
+			public String getText(Object element) {
+				IbyEntry e = (IbyEntry) element;
+				return e.getFile();
+			}
+		});
+		column.setEditingSupport(new TextEditingSupport(viewer,2));
+
+		
+		column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("Target");
+		column.getColumn().setWidth(columnSizes[3]);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			@Override
+			public String getText(Object element) {
+				IbyEntry e = (IbyEntry) element;
+				return e.getTarget();
+			}
+		});
+		column.setEditingSupport(new TextEditingSupport(viewer,3));
+		
+		column = new TableViewerColumn(viewer,SWT.NONE);
+		column.getColumn().setText("Location");
+		column.getColumn().setWidth(columnSizes[4]);
+		column.setLabelProvider(new ColumnLabelProvider() {
+			@Override
+			public String getText(Object element) {
+				IbyEntry e = (IbyEntry) element;
+				return e.getLocation().getLiteral();
+			}
+		});
+		column.setEditingSupport(new ComboEditingSupport(viewer,4));
+		
+		column = new TableViewerColumn(viewer,SWT.CENTER);
+		column.getColumn().setText("Debug");
+		column.getColumn().setWidth(columnSizes[5]);
+		column.setLabelProvider( new ColumnLabelProvider() {
+					
+			@Override
+			public Image getImage(Object element) {
+				IbyEntry ie = (IbyEntry) element;
+				String key = ie.isDebug() ? CHECKED_IMAGE : UNCHECKED_IMAGE;
+				return imageRegistry.get(key);
+			}
+
+			@Override
+			public String getText(Object element) {
+				return "";
+			}
+		});
+		column.setEditingSupport(new CheckBoxEditingSupport(viewer, 5));		
+	}
+	
+	
+	private class DebugContentProvider  implements IStructuredContentProvider {
+
+//		@Override
+		public Object[] getElements(Object inputElement) {
+			ImageContent ic = (ImageContent) inputElement;
+			return ic.getEntries().toArray();
+		}
+
+//		@Override
+		public void dispose() {
+		}
+
+//		@Override
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+//
+//
+//	public void runPressed() {
+//		ImageContent ic = getInput();
+//		List<IbyEntry> entries = new ArrayList<IbyEntry>();
+//		entries.addAll(ic.getEntries());
+//		IMakerUtils.createIbyFiles(entries,projectManager);
+//	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.viewers.IPropertyViewer#addToProperties(com.nokia.s60tools.imaker.internal.model.ImakerProperties)
+	 */
+	public void addToProperties(ImakerProperties prop) {
+		ImageContent input = getInput();
+		StringBuffer sb = new StringBuffer();
+		EList<IbyEntry> entries = input.getEntries();
+		for (int i = 0; i < entries.size(); i++) {
+			IbyEntry entry=entries.get(i);
+			entry.append(sb);
+			if(i<entries.size()-1) {
+				sb.append(ImakerProperties.SEPARATOR);				
+			}
+		}
+		String str = sb.toString();
+		if(!str.equals("")) {
+			prop.put(IMakerKeyConstants.DEBUGFILES, str);			
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imaker.internal.viewers.IPropertyViewer#restoreFromProperties(com.nokia.s60tools.imaker.internal.model.ImakerProperties)
+	 */
+	public void restoreFromProperties(ImakerProperties prop) {
+		ImageContent input = getInput();
+		EList<IbyEntry> entries = input.getEntries();
+		String str = (String)prop.get(IMakerKeyConstants.DEBUGFILES);
+		if(str!=null&&!str.equals("")) {
+			entries.clear();
+			String[] entriesStr = str.split(ImakerProperties.SEPARATOR);
+			for (int i = 0; i < entriesStr.length; i++) {
+				String entryStr = entriesStr[i];
+				if(entryStr!=null&&!entryStr.equals("")) {
+					entries.add(IContentFactory.eINSTANCE.createEntryFromString(entryStr));					
+				}
+			}
+			tableViewer.refresh();
+		}
+	}
+
+	private ImageContent getInput() {
+		return (ImageContent) tableViewer.getInput();
+	}
+
+	public void refesh() {
+		tableViewer.refresh();
+	}
+
+//	@Override
+	public void clear() {
+		getInput().getEntries().clear();
+		refesh();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/IMakerTabsViewer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,417 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.ViewForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.SWTFactory;
+import com.nokia.s60tools.imaker.internal.dialogs.LaunchIMakerDialog;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.IObserver;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public class IMakerTabsViewer extends Viewer implements IObserver {
+	/**
+	 * This view's control, which contains a composite area of controls
+	 */
+	private Composite fViewerControl;
+	
+	/**
+	 * Tab folder
+	 */
+	private CTabFolder fTabFolder;
+		
+	private Button fRevertButton;
+
+	/**
+	 * A place holder for switching between the tabs for a config and the getting started tab
+	 * @since 3.2
+	 */
+	private Composite fTabPlaceHolder = null;
+	private ViewForm fViewform;
+	private IEnvironmentManager environmentManager;
+	private PreferencesTab tabPreferences;
+	private Button fRestoreButton;
+	private SettingsTab tabSettings;
+	private Combo fConfigWidget;
+	private Button deleteButton;
+	private DebugTab tabDebug;
+	private PlatsimTab tabPlatsim;
+	private LaunchIMakerDialog dialog;
+	
+	/**
+	 * Constructs a viewer in the given composite, contained by the given
+	 * launch configuration dialog.
+	 * 
+	 * @param parent composite containing this viewer
+	 * @param manager 
+	 * @param launchIMakerDialog 
+	 * @param dialog containing launch configuration dialog
+	 * @param selection 
+	 * @throws InterruptedException 
+	 */
+	public IMakerTabsViewer(Composite parent, IEnvironmentManager manager, LaunchIMakerDialog dialog){
+		super();
+		this.environmentManager = manager;
+		this.dialog = dialog;
+		createControl(parent);
+	}
+
+	public void initialize() {
+		ImakerProperties run = environmentManager.getActiveEnvironment().getRunProperties();
+		String file = run.getActiveFile();
+		if(file!=null) {
+			displayImakerFile(file);
+		} else {
+			displayImakerFile(ProjectManager.NEW_ITEM);			
+		}
+	}
+
+	/**
+	 * @throws InterruptedException 
+	 * 
+	 */
+	private void displayImakerFile(String item){
+		populateConfigurations(item);
+		try {
+			tabPreferences.loadImakerFile(item);
+		} catch (InvocationTargetException e) {}
+	}
+
+	/**
+	 * 
+	 */
+	public void populateConfigurations(String selection) {
+		fConfigWidget.removeAll();
+		List<IResource> files = getProjectManager().getImakerFiles();
+		fConfigWidget.add(ProjectManager.NEW_ITEM);
+		fConfigWidget.select(0);
+		for (int i = 0; i < files.size(); i++) {
+			String item = files.get(i).getLocation().toString();
+			fConfigWidget.add(item);
+			if(item.equals(selection)) {
+				fConfigWidget.select(i+1);
+			}		
+		}
+	}
+
+
+	public IEnvironmentManager getEnvironmentManager() {
+		return environmentManager;
+	}
+	public ProjectManager getProjectManager() {
+		return dialog.getProjectManager();
+	}
+	
+	@Override
+	public Control getControl() {
+		return fViewerControl;
+	}
+
+	@Override
+	public Object getInput() {
+		return null;
+	}
+
+	@Override
+	public ISelection getSelection() {
+		return null;
+	}
+
+	@Override
+	public void refresh() {}
+
+	@Override
+	public void setInput(Object input) {
+
+	}
+
+	@Override
+	public void setSelection(ISelection selection, boolean reveal) {
+
+	}
+	/**
+	 * Creates this viewer's control This area displays the name of the launch
+	 * configuration currently being edited, as well as a tab folder of tabs
+	 * that are applicable to the launch configuration.
+	 *
+	 * @return the composite used for launch configuration editing
+	 */
+	private void createControl(Composite parent) {
+		fViewerControl = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout(1,false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 0;
+		fViewerControl.setLayout(layout);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		fViewerControl.setLayoutData(gd);
+		
+        fViewform = new ViewForm(fViewerControl, SWT.FLAT | SWT.BORDER);
+        layout = new GridLayout(1, false);
+        layout.horizontalSpacing = 0;
+        layout.verticalSpacing = 0;
+        fViewform.setLayout(layout);
+		gd = new GridData(GridData.FILL_BOTH);
+		fViewform.setLayoutData(gd);
+        fViewform.setTopLeft(null);
+        
+        Composite mainComp = new Composite(fViewform, SWT.FLAT);
+        layout = new GridLayout(1, false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+        layout.verticalSpacing = 0;
+        layout.horizontalSpacing = 0;
+        mainComp.setLayout(layout);
+        fViewform.setContent(mainComp);
+
+        Composite comboComp = new Composite(mainComp, SWT.NONE);
+        comboComp.setLayout(new GridLayout(3, false));
+        comboComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        
+        Label fNameLabel = new Label(comboComp, SWT.HORIZONTAL | SWT.LEFT);
+        fNameLabel.setText(Messages.getString("IMakerTabsViewer.1"));
+        fNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+        
+        fConfigWidget = new Combo(comboComp, SWT.NONE);
+        fConfigWidget.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        fConfigWidget.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent se) {
+				try {
+					tabPreferences.loadImakerFile(getSelectedItem());
+				} catch (InvocationTargetException e) {
+					e.printStackTrace();
+				}
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent se) {
+				widgetSelected(se);
+			}
+		});
+        
+        fConfigWidget.setToolTipText(Messages.getString("IMakerTabsViewer.2"));
+        deleteButton = new Button(comboComp, SWT.PUSH);
+		deleteButton.setText("Delete");
+		deleteButton.setEnabled(false);
+        deleteButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+		fTabPlaceHolder = new Composite(mainComp, SWT.NONE);
+        layout = new GridLayout(1, false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		fTabPlaceHolder.setLayout(layout);
+		gd = new GridData(GridData.FILL_BOTH);
+		fTabPlaceHolder.setLayoutData(gd);
+		        
+		createTabFolder(fTabPlaceHolder);
+		
+		
+		Composite buttonComp = new Composite(mainComp, SWT.NONE);
+		GridLayout buttonCompLayout = new GridLayout();
+		buttonCompLayout.numColumns = 2;
+		buttonComp.setLayout(buttonCompLayout);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		buttonComp.setLayoutData(gd);
+
+		fRestoreButton = new Button(buttonComp, SWT.PUSH);
+		fRestoreButton.setText(Messages.getString("IMakerTabsViewer.0")); //$NON-NLS-1$
+		fRestoreButton.setToolTipText(Messages.getString("IMakerTabsViewer.11")); //$NON-NLS-1$
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		fRestoreButton.setLayoutData(gd);
+		SWTFactory.setButtonWidthHint(fRestoreButton);
+		fRestoreButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent evt) {
+				handleRestorePressed();
+			}
+		});
+		
+        Dialog.applyDialogFont(parent);
+	}
+
+	
+	protected void handleNameModified() {
+		if(!fConfigWidget.getText().equals("")) {
+			deleteButton.setEnabled(true);
+		}
+	}
+
+	private void handleRestorePressed() {
+		tabPreferences.restore();
+	}
+		
+	protected void handleRevertPressed() {
+		if(fTabFolder.getSelection() == tabSettings) {
+			tabPreferences.refreshSettingsTab();
+		} else {
+//			tabPreferences.revert();
+		}
+	}
+
+	/**
+	 * Creates the tab folder for displaying config instances
+	 * @param parent
+	 */
+	private void createTabFolder(Composite parent) {
+		if (fTabFolder == null) {
+			Composite tabComposite = new Composite(parent, SWT.NONE);
+	        GridLayout layout = new GridLayout(1, false);
+			layout.marginHeight = 0;
+			layout.marginWidth = 0;
+			tabComposite.setLayout(layout);
+			tabComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+			ColorRegistry reg = JFaceResources.getColorRegistry();
+			Color c1 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"), //$NON-NLS-1$
+				  c2 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_END"); //$NON-NLS-1$
+			fTabFolder = new CTabFolder(tabComposite, SWT.NO_REDRAW_RESIZE | SWT.NO_TRIM | SWT.FLAT);
+
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			gd.horizontalSpan = 2;
+			fTabFolder.setSelectionBackground(new Color[] {c1, c2},	new int[] {100}, true);
+			fTabFolder.setSelectionForeground(reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")); //$NON-NLS-1$
+			fTabFolder.setSimple(PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS));
+			fTabFolder.setLayoutData(gd);
+	        fTabFolder.setBorderVisible(true);
+			fTabFolder.setFont(tabComposite.getFont());
+			fTabFolder.addSelectionListener(new SelectionListener() {
+				
+//				@Override
+				public void widgetSelected(SelectionEvent e) {
+					if(e.item instanceof DebugTab) {
+						tabDebug.refesh();
+					}
+				}
+				
+//				@Override
+				public void widgetDefaultSelected(SelectionEvent e) {
+					widgetSelected(e);
+				}
+			});
+			createTabs(fTabFolder);
+			fTabFolder.setSelection(0);
+		}
+	}
+
+	private void createTabs(CTabFolder tabFolder) {
+		tabPreferences = new PreferencesTab(tabFolder, SWT.NONE, this);
+		PreferencesTab.currentPreferencesTab = tabPreferences;
+		tabPreferences.setText(Messages.getString("IMakerTabsViewer.3")); //$NON-NLS-1$
+		tabPreferences.setToolTipText(Messages.getString("IMakerTabsViewer.4"));
+		tabPreferences.setImage(getTabImage(1));
+		tabSettings = new SettingsTab(tabFolder, SWT.NONE);
+		tabSettings.setText(Messages.getString("IMakerTabsViewer.5")); //$NON-NLS-1$
+		tabSettings.setToolTipText(Messages.getString("IMakerTabsViewer.6"));
+		tabSettings.setImage(getTabImage(2));        
+        tabDebug = new DebugTab(tabFolder, SWT.NONE, this, tabPreferences);
+        tabDebug.setImage(getTabImage(3));        
+        tabDebug.setText(Messages.getString("IMakerTabsViewer.7")); //$NON-NLS-1$
+        tabDebug.setToolTipText(Messages.getString("IMakerTabsViewer.8"));
+
+        tabPlatsim = new PlatsimTab(tabFolder, SWT.NONE);
+        tabPlatsim.setImage(getTabImage(4));        
+        tabPlatsim.setText(Messages.getString("IMakerTabsViewer.9")); //$NON-NLS-1$
+        tabPlatsim.setToolTipText(Messages.getString("IMakerTabsViewer.10"));
+        
+        tabPreferences.setSettings(tabSettings);
+        tabPreferences.setDebug(tabDebug);
+        tabPreferences.setPlatsim(tabPlatsim);
+	}
+
+	private Image getTabImage(int tab) {
+		ImageDescriptor descriptor = null;
+		switch (tab) {
+		case 1:
+			descriptor = IMakerPlugin.getImageDescriptor("icons/preferences.gif");
+			return descriptor.createImage();
+		case 2:
+			descriptor = IMakerPlugin.getImageDescriptor("icons/settings.gif"); //$NON-NLS-1$
+			return descriptor.createImage();
+		case 3:
+			descriptor = IMakerPlugin.getImageDescriptor("icons/debug.gif"); //$NON-NLS-1$
+			return descriptor.createImage();
+		case 4:
+			descriptor = IMakerPlugin.getImageDescriptor("icons/platsim.png"); //$NON-NLS-1$
+			return descriptor.createImage();
+		default:
+			break;
+		}
+		return null;
+	}
+
+	public void update(Object selection) {
+		if(selection!=null) {
+			setNameField((ImakerProperties) selection);
+			deleteButton.setEnabled(false);
+		} else {
+			fConfigWidget.setText("");
+			deleteButton.setEnabled(false);
+		}
+	}
+
+	private void setNameField(ImakerProperties prop) {
+//		fConfigWidget.setText(prop.getFilename());
+	}
+
+	public String handleRunPressed() {
+		String item = getSelectedItem();
+		tabPreferences.runPressed(item);
+		return item;
+	}
+
+	public String getSelectedItem() {
+		int index = fConfigWidget.getSelectionIndex();
+		return fConfigWidget.getItem(index);
+	}
+
+	public Button getFRevertButton() {
+		return fRevertButton;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/IPropertyViewer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public interface IPropertyViewer {
+
+	public abstract void addToProperties(ImakerProperties prop);
+
+	public abstract void restoreFromProperties(ImakerProperties prop);
+
+	public abstract void clear();
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/ISettingViewer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import com.nokia.s60tools.imaker.UIVariable;
+
+public interface ISettingViewer {
+	/**
+	 * Update the view to reflect the fact that one of the variables
+	 * was modified 
+	 * 
+	 * @param variable
+	 */
+	public void updateVariable(UIVariable variable);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/PlatsimTab.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.internal.managers.EnvironmentManager;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+import com.nokia.s60tools.imaker.internal.wrapper.PlatsimManager;
+
+public class PlatsimTab extends CTabItem implements IPropertyViewer {
+
+	private Group platsimGroup;
+	private IEnvironmentManager environmentManager;
+	private PlatsimManager platsimManager;
+	private Label locationLabel;
+	private Text locationField;
+	private Label instancesLabel;
+	private Combo instancesCombo;
+	private Button run;
+	private boolean activated;
+	private boolean isRun = false;
+
+	public PlatsimTab(CTabFolder parent, int style) {
+		super(parent, style);
+		environmentManager = EnvironmentManager.getInstance();
+		IEnvironment active = environmentManager
+				.getActiveEnvironment();
+		platsimManager = new PlatsimManager(active.getDrive());
+		setControl(createControl(parent));
+	}
+	
+	private Control createControl(CTabFolder parent) {
+		Composite top = new Composite(parent,SWT.FLAT);
+		GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
+		top.setLayoutData(layoutData);
+		top.setLayout(new GridLayout(1,false));
+
+		platsimGroup = new Group(top, SWT.NONE);
+		platsimGroup.setText("PlatSim");
+		platsimGroup.setLayout(new GridLayout(2,false));
+		layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
+		platsimGroup.setLayoutData(layoutData);
+		
+		locationLabel = new Label(platsimGroup, SWT.NONE);
+		locationLabel.setText("Location");
+		locationField = new Text(platsimGroup, SWT.SINGLE|SWT.BORDER);
+		layoutData = new GridData();
+		layoutData.widthHint = 200;
+		locationField.setLayoutData(layoutData);
+		
+		instancesLabel = new Label(platsimGroup, SWT.NONE);
+		instancesLabel.setText("Instance");
+		instancesCombo = new Combo(platsimGroup, SWT.NONE);
+		run = new Button(top,SWT.CHECK);
+		run.setText("Run PlatSim after image creation");
+		populate();
+		instancesCombo.setEnabled(false);
+		run.setEnabled(isRun);
+		run.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent e) {
+				isRun = run.isEnabled();
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		return top;
+	}
+
+	private void populate() {
+		locationField.setText(platsimManager.getDefaulfLocation());
+		locationField.setEditable(false);
+		List<String> ins = platsimManager.getInstances();
+		for (String in : ins) {
+			instancesCombo.add(in);
+		}
+		instancesCombo.add(Messages.getString("PlatsimTab.0"));
+		instancesCombo.select(0);
+	}
+	
+	public void activate(boolean activate) {
+		instancesCombo.setEnabled(activate);
+		run.setEnabled(activate);
+		this.activated = activate;
+	}
+	
+	public boolean isActivated() {
+		return this.activated;
+	}
+	
+	private String getInstance() {
+		int index = instancesCombo.getSelectionIndex();
+		return instancesCombo.getItem(index);
+	}
+
+	public void addToProperties(ImakerProperties prop) {
+		if(isActivated()) {
+			prop.put(IMakerKeyConstants.PLATSIM_INSTANCE, getInstance());
+			prop.put(IMakerKeyConstants.PLATSIM_RUN, String.valueOf(run.getSelection()));
+		}
+	}
+
+//	@Override
+	public void restoreFromProperties(ImakerProperties prop) {
+		String instance = (String) prop.get(IMakerKeyConstants.PLATSIM_INSTANCE);
+		if(instance!=null) {
+			String[] items = instancesCombo.getItems();
+			for (int i = 0; i < items.length; i++) {
+				String item = items[i];
+				if(item.equals(instance)) {
+					instancesCombo.select(i);
+					break;
+				}
+			}
+		}
+		String str = (String) prop.get(IMakerKeyConstants.PLATSIM_RUN);
+		if(str!=null&&str.equals("true")) {
+			this.run.setSelection(true);
+		} else {
+			this.run.setSelection(false);			
+		}
+	}
+
+//	@Override
+	public void clear() {
+//		instancesCombo.removeAll();
+		run.setSelection(false);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/PreferencesTab.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,965 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowData;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.imaker.IEnvironment;
+import com.nokia.s60tools.imaker.IEnvironmentManager;
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.ImageFlasherHelpContextIDs;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.StatusHandler;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.UITarget;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.dialogs.ProductSelectionDialog;
+import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+import com.nokia.s60tools.imaker.internal.wizards.NewImakerFileWizard;
+import com.nokia.s60tools.imaker.internal.wrapper.IMakerWrapperPreferences;
+
+public class PreferencesTab extends CTabItem {
+	public static PreferencesTab currentPreferencesTab = null;
+
+//	private enum EDIT_STATE {EMPTY,EDITED,SAVED};
+//	private enum NAME_STATE {UNNAMED,NAMED};
+//	private EDIT_STATE editState = EDIT_STATE.EMPTY;
+//	private NAME_STATE nameState = NAME_STATE.UNNAMED;
+
+	private Label labelVersion;
+	private Text textUserDefinedParameters;
+	private Button buttonSymbolFiles;
+	private Button buttonVerbose;
+	private Button buttonImageTypeRnd;
+	private Button buttonImageTypePrd;
+	private Button buttonImageTypeSubcon;
+	private Text textProduct;
+	private org.eclipse.swt.widgets.List listTarget;
+	private Button buttonSave;
+	private Button buttonSaveAs;
+	private IEnvironmentManager environmentManager = null;
+	private IEnvironment activeEnvironment = null;
+	private PreferenceSelectionListener pListener;
+	private String iMakerCoreVersion;
+	private String pluginVersion;
+	private String pluginDate;
+	private IMakerTabsViewer tabsViewer;
+	private org.eclipse.swt.widgets.List listSource;
+
+	private IPropertyViewer tabDebug;
+	private SettingsTab settingsTab;
+	private PlatsimTab platsimTab;
+	
+	private ProjectManager projectManager;
+
+	/**
+	 * The only constructor
+	 * @param parent
+	 * @param style
+	 * @param tabsViewer
+	 */
+	public PreferencesTab(CTabFolder parent, int style, IMakerTabsViewer tabsViewer) {
+		super(parent, style);
+		this.tabsViewer = tabsViewer;
+		environmentManager  = tabsViewer.getEnvironmentManager();
+		this.activeEnvironment = environmentManager.getActiveEnvironment();
+		this.projectManager = tabsViewer.getProjectManager();
+		
+		pListener = new PreferenceSelectionListener();
+		iMakerCoreVersion = Messages.getString("PreferencesTab.32"); //$NON-NLS-1$
+
+		pluginVersion = 
+			(String)Platform.getBundle(IMakerPlugin.PLUGIN_ID) //$NON-NLS-1$
+			.getHeaders()
+			.get("Bundle-Version"); //$NON-NLS-1$
+		pluginDate = 
+			(String)Platform.getBundle(IMakerPlugin.PLUGIN_ID) //$NON-NLS-1$
+			.getHeaders()
+			.get("Bundle-Date"); //$NON-NLS-1$
+
+		setControl(createControl(parent));
+	}
+	
+//	public void displayCurrentProperties() {
+//		selectedProperties = workstation.getCurrentProperties();
+//		if(selectedProperties!=null) {
+//			displayProperties(selectedProperties);
+//			if(!selectedProperties.getFilename().equals(ImakerProperties.CREATE_NEW)) {
+//				nameState = NAME_STATE.NAMED;
+//				changeEditState(EDIT_STATE.SAVED);				
+//			}
+//		}
+//		setTextField();
+//	}
+
+	private Control createControl(CTabFolder parent) {
+		// Create Top composite in top of the parent composite
+		Composite container = new Composite(parent, SWT.FLAT);
+
+		GridData topCompositeGridData = new GridData(SWT.FILL, SWT.FILL, true,false);
+		container.setLayoutData(topCompositeGridData);
+		GridLayout topCompositeGridLayout = createLayout();
+		container.setLayout(topCompositeGridLayout);
+
+		setHelpForControl(container,ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP);
+
+		try {
+			addConfigurationControls(container);
+			addImageTypeSelectionControls(container);
+			addFlagSelectionControls(container);
+			addAdditionalParametersControl(container);
+			
+			addPreferencesControls(container);
+			addVersionInfoControls(container);
+
+//			// Set up context help ids
+			setHelpForControl(textProduct, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_PRODUCT);
+			setHelpForControl(listSource, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_TARGETS);
+			setHelpForControl(listTarget, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_SELECTED_TARGETS);
+			setHelpForControl(buttonImageTypeRnd, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_IMAGE_TYPE);
+			setHelpForControl(buttonImageTypePrd, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_IMAGE_TYPE);
+			setHelpForControl(buttonImageTypeSubcon, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_IMAGE_TYPE);
+			setHelpForControl(buttonSymbolFiles, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_FLAGS);
+			setHelpForControl(buttonVerbose, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_FLAGS);
+			setHelpForControl(textUserDefinedParameters, ImageFlasherHelpContextIDs.IMAKERPLUGIN_HELP_ADDITIONAL_PARAMS);
+		} catch( Exception e ) {
+			//Creating preferences dialog caused an exception
+			e.printStackTrace();
+		}
+		return container;
+	}
+
+	private GridLayout createLayout() {
+		GridLayout topCompositeGridLayout = new GridLayout(2, false);
+		topCompositeGridLayout.horizontalSpacing = 5; // CodForChk_Dis_Magic
+		topCompositeGridLayout.verticalSpacing = 5; // CodForChk_Dis_Magic
+		topCompositeGridLayout.marginWidth = 3;
+		topCompositeGridLayout.marginHeight = 3;
+		return topCompositeGridLayout;
+	}
+
+	private void addVersionInfoControls(Composite container) {
+		labelVersion =  new Label(container, SWT.NONE);
+		labelVersion.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 2, 1));
+
+		String versionText = getVersionText();
+
+		labelVersion.setText(versionText + "\n" + iMakerCoreVersion); //$NON-NLS-1$
+		labelVersion.setToolTipText(Messages.getString("PreferencesTab.20"));
+	}
+
+	private String getVersionText() {
+		String versionText = "iMaker Extension: " + pluginVersion + ", " + pluginDate;
+		return versionText;
+	}
+
+	/**
+	 * @param container
+	 */
+	private void addPreferencesControls(Composite container) {
+		Composite controlGroup = new Composite(container, SWT.NONE);
+		GridLayout layoutAdditionalParameters = new GridLayout(4, true);
+		controlGroup.setLayout(layoutAdditionalParameters);
+		controlGroup.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false,
+				2, 1));
+
+		buttonSave = new Button(controlGroup, SWT.PUSH);
+		buttonSave.setEnabled(true);
+		buttonSave.setText(Messages.getString("PreferencesTab.16")); //$NON-NLS-1$
+		buttonSave.setToolTipText(Messages.getString("PreferencesTab.17")); //$NON-NLS-1$
+		buttonSave.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 1, 1));
+		buttonSave.addSelectionListener(pListener);
+
+		buttonSaveAs = new Button(controlGroup, SWT.PUSH);
+		buttonSaveAs.setText(Messages.getString("PreferencesTab.18")); //$NON-NLS-1$
+		buttonSaveAs.setToolTipText(Messages.getString("PreferencesTab.19")); //$NON-NLS-1$
+		buttonSaveAs.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 1, 1));
+		buttonSaveAs.addSelectionListener(pListener);
+	}
+
+	private void addAdditionalParametersControl(Composite container) {
+		Label label = new Label(container, SWT.NONE);
+		label.setText(Messages.getString("PreferencesTab.14")); //$NON-NLS-1$
+
+		label.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false,
+						1, 1));
+		
+		Composite comp = new Composite(container,SWT.NONE);
+		RowLayout layout = new RowLayout();
+		layout.type = SWT.HORIZONTAL;
+		layout.marginLeft = 0;
+		comp.setLayout(layout);
+		comp
+				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+						1, 1));
+
+		// User defined parameters text
+		textUserDefinedParameters = new Text(comp, SWT.BORDER);
+		textUserDefinedParameters.setText("");
+		textUserDefinedParameters.setToolTipText(Messages.getString("PreferencesTab.15"));		
+		RowData rData = new RowData();
+		rData.width = 335;
+		textUserDefinedParameters.setLayoutData(rData);
+	}
+
+	private void addFlagSelectionControls(Composite container) {
+		Label label = new Label(container, SWT.NONE);
+		label.setText(Messages.getString("PreferencesTab.9")); //$NON-NLS-1$
+		
+		label.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false,
+						1, 1));
+		Composite comp = new Composite(container,SWT.NONE);
+		RowLayout layout = new RowLayout();
+		layout.type = SWT.VERTICAL;
+		layout.spacing = 2;
+		layout.marginLeft = 0;
+		comp.setLayout(layout);
+		comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+						1, 1));
+
+		buttonSymbolFiles = new Button(comp, SWT.CHECK);
+		buttonSymbolFiles.setText(Messages.getString("PreferencesTab.10"));
+		buttonSymbolFiles.setToolTipText(Messages.getString("PreferencesTab.11"));
+		buttonVerbose = new Button(comp, SWT.CHECK);
+		buttonVerbose.setText(Messages.getString("PreferencesTab.12"));
+		buttonVerbose.setToolTipText(Messages.getString("PreferencesTab.13"));
+	}
+
+	/**
+	 * Adds image selection user interface components
+	 * @param container
+	 */
+	private void addImageTypeSelectionControls(Composite container) {
+		Label label = new Label(container, SWT.NONE);
+		label.setText(Messages.getString("PreferencesTab.2")); //$NON-NLS-1$
+		label.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false,
+						1, 1));
+		Composite comp = new Composite(container,SWT.NONE);
+		RowLayout layout = new RowLayout();
+		layout.type = SWT.VERTICAL;
+		layout.spacing = 2;
+		layout.marginLeft = 0;
+		comp.setLayout(layout);
+		comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+						1, 1));
+
+		// Rnd/Prd/Subcon
+		buttonImageTypeRnd = new Button(comp,SWT.RADIO);
+		buttonImageTypeRnd.setText(Messages.getString("PreferencesTab.3"));
+		buttonImageTypeRnd.setToolTipText(Messages.getString("PreferencesTab.4"));
+		buttonImageTypeRnd.setSelection(true);
+		buttonImageTypePrd = new Button(comp,SWT.RADIO);
+		buttonImageTypePrd.setText(Messages.getString("PreferencesTab.5"));
+		buttonImageTypePrd.setToolTipText(Messages.getString("PreferencesTab.6"));
+		buttonImageTypeSubcon = new Button(comp,SWT.RADIO);
+		buttonImageTypeSubcon.setText(Messages.getString("PreferencesTab.7"));
+		buttonImageTypeSubcon.setToolTipText(Messages.getString("PreferencesTab.8"));
+	}
+
+
+	/**
+	 * Add configuration user interface components
+	 * @param container
+	 */
+	private void addConfigurationControls(Composite container) {
+		Label label = null;
+
+		label = new Label(container, SWT.NONE);
+		label.setText(Messages.getString("PreferencesTab.0")); //$NON-NLS-1$
+
+		// Product combo
+		createProductWidgets(container);
+
+		// Target selection label
+		label = new Label(container, SWT.NONE);
+		label.setText(Messages.getString("PreferencesTab.1"));
+		label.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false,
+						1, 1));
+
+		addTargetLists(container);
+	}
+	/**
+	 * @param container
+	 */
+	private void createProductWidgets(Composite container) {
+		Composite product = new Composite(container,SWT.NONE);
+		product.setLayoutData(new GridData(SWT.BEGINNING, SWT.NONE, false, false, 1, 1));
+		product.setLayout(new GridLayout(2, false));
+		textProduct = new Text(product, SWT.BORDER);
+		textProduct.setText("");
+		textProduct.setEditable(false);
+		GridData layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, true, true, 1, 1);
+		layoutData.widthHint = 280;
+		textProduct.setLayoutData(layoutData);
+		
+		Button select = new Button(product,SWT.PUSH);
+		select.setText("&Change...");
+		select.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent se) {
+				ProductSelectionDialog selectDialog = new ProductSelectionDialog(getControl().getShell(),
+						activeEnvironment);
+				boolean ret = selectDialog.displayDialog();
+				if(ret) {
+					UIConfiguration config = selectDialog.getSelectedConfiguration();
+					refreshProduct(config);
+				}
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent se) {
+				widgetSelected(se);
+			}
+		});
+		select.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	}
+
+	private void addTargetLists(Composite parent) {
+		Composite top = new Composite(parent,SWT.NONE);
+		GridLayout layout = new GridLayout(3, false);
+		layout.horizontalSpacing = 6;
+		layout.verticalSpacing = 1;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		top.setLayout(layout);
+		top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
+
+		listSource = createListComponent(top, "&All");
+		listSource.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent se) {
+				String item = listSource.getItem(listSource.getSelectionIndex());
+				UIConfiguration p = activeEnvironment.getCurrentProduct();
+				listSource.setToolTipText(p.getTarget(item).getDescription());
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+			}
+		});
+		createListButtons(top);
+		listTarget = createListComponent(top, "&Selected");
+		listTarget.addSelectionListener(new SelectionListener() {
+			
+//			@Override
+			public void widgetSelected(SelectionEvent se) {
+				String item = listTarget.getItem(listTarget.getSelectionIndex());
+				UIConfiguration p = activeEnvironment.getCurrentProduct();
+				listTarget.setToolTipText(p.getTarget(item).getDescription());
+			}
+			
+//			@Override
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+			}
+		});
+	}
+	
+
+	private org.eclipse.swt.widgets.List createListComponent(Composite top,
+			String txt) {
+		Composite comp = new Composite(top,SWT.NONE);
+		GridLayout layout = new GridLayout(1, true);
+		layout.verticalSpacing = 1;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		comp.setLayout(layout);
+		comp
+				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+						1, 1));
+		GridData gData;
+		Label label = new Label(comp,SWT.NONE);
+		label.setText(txt);
+		org.eclipse.swt.widgets.List list;
+		list = new org.eclipse.swt.widgets.List(comp, SWT.MULTI | SWT.V_SCROLL
+				| SWT.BORDER);
+		gData = new GridData();
+		gData.widthHint = 132;
+		gData.heightHint = 132;
+		list.setLayoutData(gData);
+		return list;
+	}
+	
+	private void createListButtons(Composite top) {
+		Composite bComp = new Composite(top,SWT.NONE);
+		GridLayout layout = new GridLayout(1, true);
+		layout.marginWidth = 1;
+		layout.verticalSpacing = 1;
+		bComp.setLayout(layout);
+		bComp.setLayoutData(new GridData(SWT.NONE, SWT.CENTER, false, false, 1,
+				1));
+		Button button = new Button(bComp,SWT.PUSH);
+		button.setText(">");
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				String[] selections = listSource.getSelection();
+				addToListTarget(selections);
+				listSource.setToolTipText("");
+			}
+		});
+		
+		GridData gData = new GridData();
+		gData.verticalAlignment = SWT.END;
+		button.setLayoutData(gData);
+		button = new Button(bComp,SWT.PUSH);
+		button.setText("<");
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				String[] selections = listTarget.getSelection();
+				addToListSource(selections);
+				listTarget.setToolTipText("");
+			}
+		});
+		gData = new GridData();
+		gData.verticalAlignment = SWT.CENTER;
+		button.setLayoutData(gData);
+	}	
+	
+
+	private void moveItemsInList(org.eclipse.swt.widgets.List source,
+			org.eclipse.swt.widgets.List target, String[] items) {
+		List<String> sourceItems = Arrays.asList(source.getItems());
+		for (int i = 0; i < items.length; i++) {
+			String item = items[i];
+			if(sourceItems.contains(item)) {
+				source.remove(item);
+				target.add(item);				
+			}
+		}
+	}
+
+	protected void addToListSource(String[] selections) {
+		moveItemsInList(listTarget, listSource, selections);
+		String[] items = listSource.getItems();
+		Arrays.sort(items);
+		listSource.removeAll();
+		listSource.setItems(items);
+	}
+
+	protected void addToListTarget(String[] selections) {
+		UIConfiguration pr = activeEnvironment.getCurrentProduct();
+		moveItemsInList(listSource, listTarget, selections);
+		for (int i = 0; i < selections.length; i++) {
+			String target = selections[i];
+			UITarget tr = pr.getTarget(target);
+			if(tr.getSteps()==null) {
+				String targetSteps = activeEnvironment.getTargetSteps(target);
+				tr.setSteps(targetSteps);				
+			}
+		}
+	}
+
+
+	private void setHelpForControl(Control container, String id) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(container, id);
+	}
+
+	private void resetAdditionalFields() {
+		buttonImageTypeRnd.setSelection(true);
+		buttonImageTypePrd.setSelection(false);
+		buttonImageTypeSubcon.setSelection(false);
+		buttonSymbolFiles.setSelection(false);
+		buttonVerbose.setSelection(false);
+		textUserDefinedParameters.setText("");
+	}
+
+
+	private void loadConfigurations() throws InvocationTargetException {
+		try {
+			iMakerCoreVersion = activeEnvironment.getIMakerCoreVersion();
+			
+			//check imaker version here 
+			if(!verifyIMakerVersion()) {
+				String msg = Messages.getString("Error.3"); //$NON-NLS-1$
+				String minVersion = Messages.getString("PreferencesTab.22"); //$NON-NLS-1$
+				StatusHandler.handle(IStatus.ERROR,msg.replace("xxx", minVersion),null); //$NON-NLS-1$
+				return;
+			}
+			fixVersionText();
+			activeEnvironment.load();
+			if(activeEnvironment.isLoaded()) {
+				UIConfiguration def = getDefaultConfig();
+				if(def==null) {
+					def = activeEnvironment.getConfigurations().get(0);				
+				}
+				refreshProduct(def);
+			}
+		} catch (IMakerCoreNotFoundException e) {
+			StatusHandler.handle(IStatus.ERROR,"iMaker Core was not found.",e); //$NON-NLS-1$
+			return;
+		} catch (IMakerCoreExecutionException e) {
+			StatusHandler.handle(IStatus.ERROR,"An error has occurred while executing iMaker Core. The selected environment cannot be used with iMaker extension.",e); //$NON-NLS-1$
+			return;
+		}
+	}
+
+	/**
+	 * @param environment
+	 * @return
+	 */
+	private UIConfiguration getDefaultConfig() {
+		List<UIConfiguration> configs;
+		try {
+			configs = activeEnvironment.getConfigurations();
+			UIConfiguration ret = null;
+			for (UIConfiguration config : configs) {
+				if(config.isDefaultConfig()) {
+					ret = config;
+					break;
+				}
+			}
+			return ret;
+		} catch (InvocationTargetException e) {
+			return null;
+		}
+	}
+
+	private void refreshProduct(UIConfiguration product) {
+		if(product==null) return;
+		textProduct.setText(product.getConfigurationName());
+		textProduct.setData(product);
+		clearWidgets();
+		activeEnvironment.setCurrentProduct(product);
+
+		List<UITarget> targets = product.getFilteredTargets();
+		if(targets!=null) {
+			for(UITarget target: targets) {
+				listSource.add(target.getName());
+			}						
+		}
+		settingsTab.setInput(product);
+		textProduct.setToolTipText(product.getFilePath());
+		platsimTab.activate(product.isPlatsimConfiguration());
+	}
+
+	/**
+	 * 
+	 */
+	private void clearWidgets() {
+		listSource.removeAll();
+		listTarget.removeAll();
+		resetAdditionalFields();
+	}
+
+	private void fixVersionText() {
+		StringBuilder version = new StringBuilder(labelVersion.getText());
+		int index = version.indexOf(Messages.getString("PreferencesTab.32")); //$NON-NLS-1$
+		if(index != -1) {
+			version.replace(index, version.length(), Messages.getString("PreferencesTab.32") + " " + iMakerCoreVersion);
+			labelVersion.setText(version.toString());			
+		}
+	}
+
+
+	private boolean verifyIMakerVersion() {
+		String minVersion = Messages.getString("PreferencesTab.22"); //$NON-NLS-1$
+		String curVersion = IMakerUtils.parseIMakerVersion(iMakerCoreVersion);
+		if(curVersion.compareTo(minVersion)>0) {
+			return true;
+		}
+		return false;
+	}
+
+	private void savePreferencesToFile(String filePath) {
+		ImakerProperties uiValues = new ImakerProperties();
+		uiValues.putAll(getUIValues());
+		
+		UIConfiguration current = null;
+		current = activeEnvironment.getCurrentProduct();
+		
+		if (filePath == null||filePath.equals(ProjectManager.NEW_ITEM)) {
+			IStructuredSelection selection = new StructuredSelection(tabsViewer
+					.getProjectManager().getProject());
+			IWorkbench workbench = PlatformUI.getWorkbench();
+
+			NewImakerFileWizard wizard = new NewImakerFileWizard(uiValues, current,
+					this);
+			wizard.init(workbench, selection);
+
+			WizardDialog dialog = new WizardDialog(workbench
+					.getActiveWorkbenchWindow().getShell(), wizard);
+			dialog.open();
+
+			if (wizard.isSaved()) {
+				IFile file = wizard.getFile();
+				String loc = file.getLocation().toString();
+				tabsViewer.populateConfigurations(loc);
+			}
+		} else {
+			IFile file = (IFile)projectManager.getImakerFile(new Path(filePath));
+			uiValues.saveToFile(file);
+		}
+	}
+
+	private Properties getUIValues() {
+		ImakerProperties prop = new ImakerProperties();
+		try {
+			UIConfiguration config = (UIConfiguration) textProduct.getData();
+			if(config!=null) {
+				addField(prop,IMakerKeyConstants.MAKEFILE,config.getFilePath());
+				addField(prop,IMakerKeyConstants.PRODUCT,config.getMakeFileName());
+			}
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < listTarget.getItemCount(); i++) {
+				sb.append(listTarget.getItem(i));
+				if(i<listTarget.getItemCount()-1) {
+					sb.append(" ");
+				}
+			}
+			if(sb.length()>0) {
+				addField(prop,IMakerKeyConstants.TARGET_LIST,sb.toString());
+			}
+			if(buttonImageTypePrd.getSelection()) {
+				addField(prop,IMakerKeyConstants.TYPE,Messages.getString("PreferencesTab.23")); //$NON-NLS-1$
+			} else if(buttonImageTypeSubcon.getSelection()) {
+				addField(prop,IMakerKeyConstants.TYPE,Messages.getString("PreferencesTab.24")); //$NON-NLS-1$
+			} else {
+				addField(prop,IMakerKeyConstants.TYPE,Messages.getString("PreferencesTab.25")); //$NON-NLS-1$
+			}
+			if(buttonVerbose.getSelection()) {
+				addField(prop,IMakerKeyConstants.VERBOSE,Messages.getString("PreferencesTab.26")); //$NON-NLS-1$
+			}
+			if(buttonSymbolFiles.getSelection()) {
+				addField(prop,IMakerKeyConstants.SYMBOLFILES,Messages.getString("PreferencesTab.27")); //$NON-NLS-1$
+			}
+			addField(prop, IMakerKeyConstants.ADDITIONAL_PARAMETERS, 
+					textUserDefinedParameters.getText());
+			settingsTab.addChangedSettings(prop);
+			platsimTab.addToProperties(prop);
+			tabDebug.addToProperties(prop);
+		} catch(Exception e) {
+
+		}
+		return prop;
+	}
+
+	private void addField(Properties properties, String name, String value) {
+		if((name==null)||(name.equals(""))||(value==null)||(value.equals(""))) { //$NON-NLS-1$ //$NON-NLS-2$
+			return;
+		}
+		properties.setProperty(name, value);
+	}
+
+	private void fillUIForm(ImakerProperties prop) throws InvocationTargetException {
+		String filePath = (String) prop.remove(IMakerKeyConstants.MAKEFILE);
+		if(filePath==null) return;
+		filePath = filePath.replaceAll("\\\\", "/");
+		List<UIConfiguration> configs = activeEnvironment.getConfigurations();
+		for (UIConfiguration config : configs) {
+			if(config.getFilePath().equals(filePath)) {
+				refreshProduct(config);
+				break;
+			}
+		}
+
+		String targets = (String) prop.remove(IMakerKeyConstants.TARGET_LIST);
+		if((targets!=null)&&!(targets.equals(""))) { //$NON-NLS-1$
+			String[] tars = targets.split(" "); //$NON-NLS-1$
+			addToListTarget(tars);
+		}
+		
+		String str = (String)prop.remove(IMakerKeyConstants.TYPE);
+		if(str!=null){
+			buttonImageTypeRnd.setSelection(false);
+			if(str.equals(Messages.getString("PreferencesTab.24"))) { //$NON-NLS-1$
+				buttonImageTypeSubcon.setSelection(true);
+			} else if(str.equals(Messages.getString("PreferencesTab.23"))) { //$NON-NLS-1$
+				buttonImageTypePrd.setSelection(true);
+			} else {
+				buttonImageTypeRnd.setSelection(true);
+			}
+		}
+
+		str = (String)prop.remove(IMakerKeyConstants.VERBOSE);
+		if((str!=null)&&!(str.equals(""))) { //$NON-NLS-1$
+			buttonVerbose.setSelection(true);
+		}
+		str = (String)prop.remove(IMakerKeyConstants.SYMBOLFILES);
+		if((str!=null)&&!(str.equals(""))) { //$NON-NLS-1$
+			buttonSymbolFiles.setSelection(true);
+		}
+		String adds = (String)prop.remove(IMakerKeyConstants.ADDITIONAL_PARAMETERS);
+		if(adds!=null) {
+			textUserDefinedParameters.setText(adds);
+		}
+		updateSettings(prop);
+		tabDebug.restoreFromProperties(prop);
+		platsimTab.restoreFromProperties(prop);
+	}
+
+	public void setSettings(SettingsTab tabSettings) {
+		this.settingsTab = tabSettings;
+	}
+
+	/**
+	 *
+	 */
+	private class PreferenceSelectionListener implements SelectionListener {
+		public void widgetDefaultSelected(SelectionEvent e) {
+			widgetSelected(e);
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			Widget source = e.widget;			
+			if(source==buttonSave) {
+				savePreferencesToFile(tabsViewer.getSelectedItem());
+			} else if(source==buttonSaveAs) {
+				savePreferencesToFile(null);
+			} else {}
+		}
+	}
+
+	public void revertSettingsTab() {
+
+	}
+
+	/**
+	 * Called when something changed in the settingsTab.
+	 */
+	public void refreshSettingsTab() {
+		if(!settingsTab.isDirty()) {
+			return;
+		}
+		String drive = activeEnvironment.getDrive();
+		IRunnableWithProgress op = new IMakerSettingsUpdater(null,drive);
+		executeRunnable(op);
+	}
+
+	private void executeRunnable(IRunnableWithProgress op) {
+		IWorkbench wb = PlatformUI.getWorkbench();
+		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
+		Shell shell = win != null ? win.getShell() : null;
+		try {
+			ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog(shell);
+			progressMonitorDialog.run(true, false, op);
+			settingsTab.getTableViewer().refresh();
+		} catch (InvocationTargetException e) {
+			StatusHandler.handle(IStatus.ERROR,Messages.getString("Error.1"),e.getTargetException()); //$NON-NLS-1$
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private class IMakerSettingsUpdater implements IRunnableWithProgress {
+		private List<String> modifiedVariables=null;
+		private String environment;
+		
+		public IMakerSettingsUpdater(List<String> modifiedVariables, String env) {
+			this.modifiedVariables = modifiedVariables;
+			this.environment = env;
+		}
+		
+		public void run(IProgressMonitor monitor)
+		throws InvocationTargetException, InterruptedException {
+			try {
+				IIMakerWrapper wrapper = activeEnvironment.getImakerWrapper();
+				ArrayList<String> parameters = new ArrayList<String>();
+				UIConfiguration currentConfiguration = activeEnvironment.getCurrentProduct();
+				parameters.add(environment +
+						IMakerWrapperPreferences.DEFAULT_COMMAND);
+				parameters.add(currentConfiguration.getFilePath());
+				UIConfiguration configuration=null;
+				List<UIVariable> incVars = null;
+				if(modifiedVariables==null) {
+					incVars = IMakerUtils.getCommandlineIncludeVariables(currentConfiguration.getVariables());
+					List<String> varList = IMakerUtils.convertVariablesToStrings(incVars);
+					parameters.addAll(varList);
+					configuration = wrapper.getConfiguration(parameters, monitor);
+				} else {
+					incVars = IMakerUtils.convertStringsToVariables(modifiedVariables);
+					parameters.addAll(modifiedVariables);
+					configuration = wrapper.getConfiguration(parameters, monitor);
+				}
+				for (UIVariable variable : incVars) {
+					UIVariable v = findVariable(configuration,variable);
+					if(v!=null) {
+						v.setInclude(true);
+					}
+				}
+				currentConfiguration.setVariables(configuration.getVariables());
+			} catch (Exception e) {
+				throw new InvocationTargetException(e);
+			}
+			monitor.worked(100);
+			monitor.done();
+		}
+		private UIVariable findVariable(UIConfiguration configuration,
+				UIVariable var) {
+			List<UIVariable> variables = configuration.getVariables();
+			for (UIVariable variable : variables) {
+				if(var.equals(variable)) {
+					return variable;
+				}
+			}
+			return null;
+		}
+	}
+
+	public void runPressed(String item) {
+		if(item.equals(ProjectManager.NEW_ITEM)) {
+			ImakerProperties run = activeEnvironment.getRunProperties();
+			run.clear();
+			Properties uiValues = getUIValues();
+			run.putAll(uiValues);
+			run.setActiveFile(null);
+		} else {
+			savePreferencesToFile(item);
+			ImakerProperties run = activeEnvironment.getRunProperties();
+			run.setActiveFile(item);
+		}
+	}
+
+	public void setDebug(IPropertyViewer debug) {
+		tabDebug = debug;
+	}
+
+	/**get
+	 * @param item
+	 * @throws InterruptedException 
+	 */
+	public void loadImakerFile(String item) throws InvocationTargetException {
+		if(!item.equals(ProjectManager.NEW_ITEM)) {
+			IFile file = (IFile)projectManager.getImakerFile(new Path(item));
+			ImakerProperties prop = new ImakerProperties();
+			try {
+				prop.load(file.getContents());
+				fillUIForm(prop);
+			} catch (IOException e) {
+				e.printStackTrace();
+			} catch (CoreException e) {
+				e.printStackTrace();
+			};
+		} else {
+			loadDefaults();
+			fillUIForm(activeEnvironment.getRunProperties());
+		}
+	}
+
+
+	private void updateSettings(Properties content) {
+		List<String> modified = new ArrayList<String>();
+		
+		String mods = (String)content.get(IMakerKeyConstants.MODIFIED_SETTINGS);
+		if(mods==null) return;
+		String[] parts;
+		if(mods!=null) {
+			parts = mods.split(ImakerProperties.SEPARATOR);
+			for (int i = 0; i < parts.length; i++) {
+				modified.add(parts[i]);
+			}			
+		}
+		mods = (String) content.get(IMakerKeyConstants.ADDITIONAL_PARAMETERS);
+		if(mods!=null) {
+			parts = mods.split(ImakerProperties.SEPARATOR);
+			for (int i = 0; i < parts.length; i++) {
+				modified.add(parts[i]);
+			}
+		}
+		String drive = activeEnvironment.getDrive();
+		IRunnableWithProgress op = new IMakerSettingsUpdater(modified,drive);
+		executeRunnable(op);
+	}
+
+
+	/**
+	 * @throws InterruptedException 
+	 * 
+	 */
+	private void loadDefaults() throws InvocationTargetException {
+		loadConfigurations();
+		tabDebug.clear();
+		platsimTab.clear();
+		updateDefaultTarget(getDefaultConfig());
+	}
+
+	/**
+	 * 
+	 */
+	public void restore() {
+		UIConfiguration def = getDefaultConfig();
+		refreshProduct(def);
+		updateDefaultTarget(def);
+	}
+
+	/**
+	 * @param def 
+	 * 
+	 */
+	private void updateDefaultTarget(UIConfiguration def) {
+		if(def==null) return;
+		String target = "default";
+		addToListTarget(new String[]{target});
+	}
+
+	public void setPlatsim(PlatsimTab tabPlatsim) {
+		this.platsimTab = tabPlatsim;
+	}
+
+	public String[] getSelectedTargets() {
+		return listTarget.getItems();
+	}
+
+	public UIConfiguration getSelectedProduct() {
+		return activeEnvironment.getCurrentProduct();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/SettingsTab.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import com.nokia.s60tools.imaker.IMakerKeyConstants;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public class SettingsTab extends CTabItem {
+
+	private SettingsViewer settingsViewer;
+	
+	public SettingsTab(CTabFolder parent, int style) {
+		super(parent, style);
+		setControl(createControl(parent));
+	}
+
+	private Control createControl(CTabFolder parent) {
+		Composite top = new Composite(parent,SWT.NONE);
+		settingsViewer = new SettingsViewer(top);
+		return top;
+	}
+
+	public void setInput(UIConfiguration uic) {
+		settingsViewer.setUiConfiguration(uic);
+	}
+
+	public boolean isDirty() {
+		return settingsViewer.isDirty();
+	}
+
+	public TableViewer getTableViewer() {
+		return settingsViewer.getTableViewer();
+	}
+	public void setDirty(boolean dirty) {
+		settingsViewer.setDirty(dirty);
+	}
+
+	public void addChangedSettings(ImakerProperties prop) {
+		StringBuffer sb = new StringBuffer();
+		List<UIVariable> variables = settingsViewer.getUiConfiguration().getVariables();
+		List<UIVariable> vars = IMakerUtils.getCommandlineIncludeVariables(variables);
+		List<String> vs = IMakerUtils.convertVariablesToStrings(vars);
+		for (int i = 0; i < vs.size(); i++) {
+			String str = vs.get(i);
+			sb.append(str);
+			if(i<vs.size()-1) {
+				sb.append(ImakerProperties.SEPARATOR);
+			}
+		}
+		String mods = sb.toString();
+		if(mods!=null&&!mods.equals("")) {
+			prop.put(IMakerKeyConstants.MODIFIED_SETTINGS, mods);			
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/SettingsViewer.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.UIVariable;
+import com.nokia.s60tools.imaker.internal.providers.SettingsColumnLabelProvider;
+
+/**
+ *
+ */
+public class SettingsViewer {
+
+	private TableViewer tableViewer;
+	private UIConfiguration uiConfiguration;
+	private boolean dirty = false;
+	
+	public SettingsViewer(Composite parent) {
+		addChildControls(parent);
+	}
+
+	private void addChildControls(Composite parent) {
+		int style = GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH;
+		GridData gridData = new GridData (style);
+		parent.setLayoutData (gridData);
+		parent.setLayout(new GridLayout());
+
+		/* Create and setup the TableViewer */
+		createTableViewer(parent);
+	}
+
+	private void createTableViewer(Composite parent) {
+		int style = SWT.SINGLE | SWT.H_SCROLL
+		| SWT.V_SCROLL | SWT.FULL_SELECTION;
+		tableViewer = new TableViewer(parent,style);
+
+		tableViewer.setContentProvider(new SettingsContentProvider());
+		
+		SettingsColumnLabelProvider settingsColumnLabelProvider = new SettingsColumnLabelProvider();
+		settingsColumnLabelProvider.createColumns(tableViewer,this);
+		
+		tableViewer.getTable().setHeaderVisible(true);
+		tableViewer.getTable().setLinesVisible(true);
+
+		GridData gridData = new GridData(GridData.FILL_BOTH);
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalSpan = 3;
+		tableViewer.getTable().setLayoutData(gridData);
+	}
+
+	public UIConfiguration getUiConfiguration() {
+		return uiConfiguration;
+	}
+
+	public void setUiConfiguration(UIConfiguration uic) {
+		this.uiConfiguration = uic;
+		tableViewer.setInput(uiConfiguration);
+	}
+
+	/**
+	 * InnerClass that acts as a proxy for the UIConfiguration 
+	 * providing content for the Table. 
+	 *
+	 */
+	class SettingsContentProvider implements IStructuredContentProvider,ISettingViewer {
+
+		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+			if (newInput != null)
+				((UIConfiguration) newInput).addChangeListener(this);
+			if (oldInput != null)
+				((UIConfiguration) oldInput).removeChangeListener(this);
+		}
+
+		public Object[] getElements(Object inputElement) {
+			UIConfiguration uic = (UIConfiguration) inputElement;
+			return uic.getVariables().toArray();
+		}
+
+		public void dispose() {
+		}
+
+		public void updateVariable(UIVariable variable) {
+			tableViewer.update(variable, null);	
+		}
+	}
+
+	public TableViewer getTableViewer() {
+		return tableViewer;
+	}
+
+	public boolean isDirty() {
+		return dirty;
+	}
+
+	public void setDirty(boolean dirty) {
+		this.dirty = dirty;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/StatusInfo.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.viewers;
+
+import org.eclipse.core.runtime.IStatus;
+
+import org.eclipse.core.runtime.Assert;
+
+import com.nokia.s60tools.imaker.IMakerPlugin;
+
+/**
+ * A settable IStatus. 
+ * Can be an error, warning, info or ok. For error, info and warning states,
+ * a message describes the problem.
+ */
+public class StatusInfo implements IStatus {
+	
+	public static final IStatus OK_STATUS= new StatusInfo();
+	
+	private String fStatusMessage;
+	private int fSeverity;
+	
+	/**
+	 * Creates a status set to OK (no message)
+	 */
+	public StatusInfo() {
+		this(OK, null);
+	}
+
+	/**
+	 * Creates a status .
+	 * @param severity The status severity: ERROR, WARNING, INFO and OK.
+	 * @param message The message of the status. Applies only for ERROR,
+	 * WARNING and INFO.
+	 */	
+	public StatusInfo(int severity, String message) {
+		fStatusMessage= message;
+		fSeverity= severity;
+	}		
+	
+	/**
+	 *  Returns if the status' severity is OK.
+	 */
+	public boolean isOK() {
+		return fSeverity == IStatus.OK;
+	}
+
+	/**
+	 *  Returns if the status' severity is WARNING.
+	 */	
+	public boolean isWarning() {
+		return fSeverity == IStatus.WARNING;
+	}
+
+	/**
+	 *  Returns if the status' severity is INFO.
+	 */	
+	public boolean isInfo() {
+		return fSeverity == IStatus.INFO;
+	}	
+
+	/**
+	 *  Returns if the status' severity is ERROR.
+	 */	
+	public boolean isError() {
+		return fSeverity == IStatus.ERROR;
+	}
+	
+	/**
+	 * @see IStatus#getMessage
+	 */
+	public String getMessage() {
+		return fStatusMessage;
+	}
+	
+	/**
+	 * Sets the status to ERROR.
+	 * @param errorMessage The error message (can be empty, but not null)
+	 */	
+	public void setError(String errorMessage) {
+		Assert.isNotNull(errorMessage);
+		fStatusMessage= errorMessage;
+		fSeverity= IStatus.ERROR;
+	}
+
+	/**
+	 * Sets the status to WARNING.
+	 * @param warningMessage The warning message (can be empty, but not null)
+	 */		
+	public void setWarning(String warningMessage) {
+		Assert.isNotNull(warningMessage);
+		fStatusMessage= warningMessage;
+		fSeverity= IStatus.WARNING;
+	}
+
+	/**
+	 * Sets the status to INFO.
+	 * @param infoMessage The info message (can be empty, but not null)
+	 */		
+	public void setInfo(String infoMessage) {
+		Assert.isNotNull(infoMessage);
+		fStatusMessage= infoMessage;
+		fSeverity= IStatus.INFO;
+	}	
+
+	/**
+	 * Sets the status to OK.
+	 */		
+	public void setOK() {
+		fStatusMessage= null;
+		fSeverity= IStatus.OK;
+	}
+	
+	/*
+	 * @see IStatus#matches(int)
+	 */
+	public boolean matches(int severityMask) {
+		return (fSeverity & severityMask) != 0;
+	}
+
+	/**
+	 * Returns always <code>false</code>.
+	 * @see IStatus#isMultiStatus()
+	 */
+	public boolean isMultiStatus() {
+		return false;
+	}
+
+	/*
+	 * @see IStatus#getSeverity()
+	 */
+	public int getSeverity() {
+		return fSeverity;
+	}
+
+	/*
+	 * @see IStatus#getPlugin()
+	 */
+	public String getPlugin() {
+		return IMakerPlugin.PLUGIN_ID;
+	}
+
+	/**
+	 * Returns always <code>null</code>.
+	 * @see IStatus#getException()
+	 */
+	public Throwable getException() {
+		return null;
+	}
+
+	/**
+	 * Returns always the error severity.
+	 * @see IStatus#getCode()
+	 */
+	public int getCode() {
+		return fSeverity;
+	}
+
+	/**
+	 * Returns always <code>null</code>.
+	 * @see IStatus#getChildren()
+	 */
+	public IStatus[] getChildren() {
+		return new IStatus[0];
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wizards/NewImakerFileWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.wizards;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+import com.nokia.s60tools.imaker.internal.viewers.PreferencesTab;
+
+public class NewImakerFileWizard extends Wizard implements INewWizard {
+	private IStructuredSelection selection;
+	private NewImakerFileWizardPage newFileWizardPage;
+	
+
+	private ImakerProperties values;
+	private UIConfiguration configuration;
+	private boolean saved = false;
+	private IFile file = null;
+
+	public NewImakerFileWizard(ImakerProperties values, UIConfiguration current, PreferencesTab tab) {
+		setWindowTitle("New iMaker File");
+		this.values = values;
+		this.configuration = current;
+	} 
+
+	public boolean isSaved() {
+		return saved;
+	}
+
+	public NewImakerFileWizardPage getNewFileWizardPage() {
+		return newFileWizardPage;
+	}
+
+	@Override
+	public void addPages() {
+		newFileWizardPage = new NewImakerFileWizardPage(selection,values,configuration);
+		addPage(newFileWizardPage);
+	}
+
+	@Override
+	public boolean performFinish() {
+		file = newFileWizardPage.createNewFile();
+		this.saved = true;
+		return true;
+	}
+	
+	public IFile getFile() {
+		return file;
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		this.selection = selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wizards/NewImakerFileWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
+
+public class NewImakerFileWizardPage extends WizardNewFileCreationPage {
+
+	private ImakerProperties values;
+	private UIConfiguration config;
+
+	public NewImakerFileWizardPage(IStructuredSelection selection, ImakerProperties values, UIConfiguration config) {
+        super("NewImakerFileWizardPage", selection);
+        setTitle("iMaker File");
+        setDescription("Creates a new iMaker File");
+        setFileExtension("imp");
+        this.values = values;
+        this.config = config;
+	}
+
+	@Override
+	protected InputStream getInitialContents() {
+		try {
+			ByteArrayOutputStream bao = new ByteArrayOutputStream();
+			values.setVariables(config.getVariables());
+			values.store(bao, "iMaker properties");
+			ByteArrayInputStream bs = new ByteArrayInputStream(bao.toString().getBytes());
+			return bs;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/IMakerWrapper.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,864 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.wrapper;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import com.nokia.s60tools.imaker.IIMakerWrapper;
+import com.nokia.s60tools.imaker.IMakerPlugin;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.Messages;
+import com.nokia.s60tools.imaker.UIConfiguration;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreAlreadyRunningException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreCancelledException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreExecutionException;
+import com.nokia.s60tools.imaker.exceptions.IMakerCoreNotFoundException;
+import com.nokia.s60tools.imaker.internal.iqrf.Configuration;
+import com.nokia.s60tools.imaker.internal.iqrf.ConfigurationElement;
+import com.nokia.s60tools.imaker.internal.iqrf.IMaker;
+import com.nokia.s60tools.imaker.internal.iqrf.IQRFFactory;
+import com.nokia.s60tools.imaker.internal.iqrf.Interface;
+import com.nokia.s60tools.imaker.internal.iqrf.Result;
+import com.nokia.s60tools.imaker.internal.iqrf.Setting;
+import com.nokia.s60tools.imaker.internal.iqrf.Target;
+import com.nokia.s60tools.imaker.internal.iqrf.wrapper.IQRFWrapper;
+
+/**
+ * This class implements the IIMakerWrapper interface which is used
+ * to interface with iMaker core.
+ * 
+ * @version 1.0
+ */
+public class IMakerWrapper implements IIMakerWrapper {
+	/** Shared singleton instance */
+//	private static IIMakerWrapper instance;
+
+	/** Public instance variables */
+	public PipedOutputStream pos = null;
+	public PipedInputStream pis = null;
+
+	/** Public instance variables */
+	private Boolean builderRunning = false;
+	private List<String> params = null;
+	private IProgressMonitor monitor = null;
+	private int exitValue = 0;
+	private boolean runVerdict;
+	private String dProduct = null;
+//	private String dTarget = null;
+	private Pattern blockBegin = Pattern.compile("-{30,}");
+
+	private OutputStream outputStream;
+	private List<String> tool;
+	private IMakerCoreExecutionException lastImakerException;
+
+	/**
+	 * Default constructor
+	 */
+	public IMakerWrapper(List<String> tool) {
+		params = new ArrayList<String>();
+		this.tool = tool;
+		this.lastImakerException = new IMakerCoreExecutionException("No configurations loaded!");
+	}
+
+	public boolean isRunning() {
+		return builderRunning;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imakerplugin.wrapper.IIMakerWrapper#getIMakerCoreVersion()
+	 */
+	public String getIMakerCoreVersion() throws IMakerCoreNotFoundException, IMakerCoreExecutionException {
+		verifyExists();
+		params.clear();
+		params.add(IMakerWrapperPreferences.CMD_FETCH_VERSION);
+		List<String> version = executeCommand(params);
+		String vers = "";
+		for (String line : version) {
+			if(line.startsWith("iMaker")) {
+				vers = line;
+				break;
+			}
+		}
+		return vers;
+	}
+
+	private void verifyExists() throws IMakerCoreNotFoundException {
+		if(!IMakerUtils.iMakerCoreExists(tool.get(0))) {
+			IMakerCoreNotFoundException e = new IMakerCoreNotFoundException();
+			String newMessage = e.getMessage() +" "+ Messages.getString("IMakerWrapper.27").replace("xxx", tool.get(0));
+			throw new IMakerCoreNotFoundException(newMessage);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imakerplugin.wrapper.IIMakerWrapper#getConfigurations(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public List<UIConfiguration> getConfigurations(IProgressMonitor monitor) 
+	throws IMakerCoreExecutionException, IMakerCoreNotFoundException {
+		this.monitor = monitor;
+		verifyExists();
+		List<UIConfiguration> configurations = getConfigurations((String)null);
+		return configurations;
+	}
+
+	private List<UIConfiguration> getConfigurations(String makefile) throws IMakerCoreExecutionException {
+		List<UIConfiguration> uiConfigs = new ArrayList<UIConfiguration>();
+		List<String> makeFiles=null;
+		if(makefile==null||makefile.equals("")) {
+			makeFiles = queryMakefiles();
+		} else {
+			makeFiles = new ArrayList<String>();
+			makeFiles.add(makefile);
+		}
+		
+		if (monitor != null) {
+			monitor.beginTask(Messages.getString("IMakerWrapper.3"), (makeFiles.size()*2));
+		}
+		loadDefaultData();
+		Result result = parseResult(makeFiles);
+		
+		// Get configurations out of the result object
+		Iterator<Configuration> configIter = result.getConfigurations().iterator();
+		while (configIter.hasNext()) {
+			Configuration item = configIter.next();
+			if(item.getTargetrefs().size()==0) continue;
+			uiConfigs.add(new UIConfiguration(item));
+		}
+		if(uiConfigs.isEmpty()) {
+			throw lastImakerException;
+		}
+		if (monitor != null) {
+			monitor.done();
+		}
+		if(dProduct!=null) {
+			for(UIConfiguration config: uiConfigs) {
+				String pname = config.getConfigurationName();
+				if(pname != null && pname.equals(dProduct)) {
+					config.setDefaultConfig(true);
+//					config.setDefaultTarget(dTarget);
+					break;
+				}
+			}			
+		}
+		return uiConfigs;
+	}
+
+	/**
+	 * fetches default configuration and target if given
+	 */
+	private void loadDefaultData() {
+		params.clear();
+		params.add(IMakerWrapperPreferences.DEFAULT_DATA);// + configPath
+		Pattern product = Pattern.compile("\\s*IMAKER_CONFMK.*image_conf_(.*)\\.mk.\\s*");
+//		Pattern target  = Pattern.compile("\\s*TARGET_DEFAULT\\s*=\\s*.(.*).\\s*");
+		try {
+			List<String> lines = executeCommand(params);
+			for (String line : lines) {
+				Matcher matcher = product.matcher(line);
+				if(matcher.matches()) {
+					String pr = matcher.group(1);
+					if(!pr.equals("")) {
+						dProduct = pr;
+						break;
+					}
+				}
+//				matcher = target.matcher(line);
+//				if(matcher.matches()) {
+//					String tr = matcher.group(1);
+//					if(!tr.equals("")) {
+//						dTarget = tr;
+//						System.out.println("default target = " + tr);
+//						continue;
+//					}
+//				}
+			}
+		} catch (IMakerCoreExecutionException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private List<String> queryMakefiles() throws IMakerCoreExecutionException {
+		List<String> makeFiles;
+		params.clear();
+		params.add(IMakerWrapperPreferences.CMD_FETCH_CONFIGURATIONS);// + configPath
+		makeFiles = executeCommand(params);
+		
+		// Remove redundant lines of information from makeFile list
+		if ((makeFiles != null) && (makeFiles.size() > 0)) {
+			List<String> tmpMakeFiles = new ArrayList<String>();
+			
+			Iterator<String> iter = makeFiles.iterator();
+			while (iter.hasNext()) {
+				String makefile = iter.next().toLowerCase();
+				if (makefile.matches(
+						IMakerWrapperPreferences.MAKEFILE_LIST_PATTERN)) {
+					tmpMakeFiles.add(makefile);					
+				}
+			}
+			makeFiles = tmpMakeFiles;
+		}
+		return makeFiles;
+	}
+
+	public UIConfiguration getConfiguration(List<String> parameters,
+			IProgressMonitor mon) throws IMakerCoreExecutionException,
+			IMakerCoreNotFoundException {
+		this.monitor = mon;
+		verifyExists();
+		if(parameters==null||parameters.size()<2) {
+			return null;
+		}
+		if (monitor != null) {
+			monitor.beginTask(Messages.getString("IMakerWrapper.4"), 2); //$NON-NLS-1$
+		}
+		
+		params.clear();
+		params.add(parameters.remove(0));
+		params.add(IMakerWrapperPreferences.ARG_FETCH_CONFIGURATION);
+		String makefile = parameters.remove(0);
+		params.add(makefile);
+		params.add(IMakerWrapperPreferences.CMD_FETCH_CONFIGURATION);
+		params.addAll(parameters);
+		
+		builderRunning=true;
+		List<String> settingsList = executeCommand(params);
+		builderRunning=false;
+		
+		ArrayList<ConfigurationElement> elements = new ArrayList<ConfigurationElement>();
+		ArrayList<Setting> settings = new ArrayList<Setting>();
+		
+		parseConfigurations(settingsList, elements, settings);
+		
+		Configuration config = createConfiguration(makefile);
+		setUpConfiguration(config, settings);
+		
+		if (monitor != null) {
+			monitor.done();
+		}
+		return new UIConfiguration(config);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imakerplugin.wrapper.IIMakerWrapper#isBuilderRunning()
+	 */
+	public Boolean isBuilderRunning() {
+		return builderRunning;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imakerplugin.wrapper.IIMakerWrapper#flashImage(java.util.List)
+	 */
+	public boolean flashImage(List<String> cmdParams) {
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.imakerplugin.wrapper.IIMakerWrapper#buildImage(java.util.List)
+	 */
+	public boolean buildImage(List<String> cmdParams, OutputStream out) throws IMakerCoreExecutionException, 
+	IMakerCoreAlreadyRunningException, IMakerCoreNotFoundException {
+		this.outputStream = out;
+		verifyExists();
+		builderRunning = true;
+		List<String> ret = executeCommand(cmdParams);
+		builderRunning = false;
+		return getReturnStatus(ret);
+	}
+
+	private boolean getReturnStatus(List<String> ret) {
+		if(exitValue==0) {
+			//old imaker check output
+			try {
+				String vers = ret.get(0);
+				String verNumber = IMakerUtils.parseIMakerVersion(vers);
+				String versionNumber = verNumber;
+				String[] parts = versionNumber.split("\\.");
+				if(Integer.parseInt(parts[0])<=8&&Integer.parseInt(parts[1])<35&&Integer.parseInt(parts[2])<3) {
+					runVerdict = validateBuildResult(ret);
+				} else {
+					runVerdict = true;
+				}
+			} catch (Exception e) {
+				return runVerdict = true;
+			}
+			return runVerdict;
+		} else {
+			return (runVerdict=false);
+		}
+	}
+
+	/**
+	 * Method returns configuration information as an XMI document.
+	 * 
+	 * @return An XMI document describing configurations.
+	 * @throws IMakerCoreExecutionException 
+	 */
+	public String getConfigurationsAsXMI() throws IMakerCoreExecutionException {
+		// First create a result object and then use it to query
+		// the EMF for xmi document.
+
+		List<String> makeFiles = queryMakefiles();
+		Result result=null;
+		result = parseResult(makeFiles);
+
+		IMaker imaker = IQRFFactory.eINSTANCE.createIMaker();
+		imaker.setResult(result);
+		imaker.setQuery(IMakerWrapperPreferences.CMD_FETCH_CONFIGURATIONS);
+		IQRFWrapper wrapper = new IQRFWrapper();
+		String xmi = wrapper.getXMLDocument(imaker);
+		return xmi;
+	}
+
+	/**
+	 * Calls the iMaker on a command line and reads the output.
+	 * 
+	 * @param  cmd additional arguments to be passed to the iMaker core.
+	 * @return Output of iMaker as list of Strings.
+	 */
+	private List<String> executeCommand(List<String> params) throws IMakerCoreExecutionException {
+		List<String> cmd = prepareCommand(params);
+
+		// Try to start a process to execute iMaker
+		try {
+			// Finally build a new ProcessBuilder with cmds.
+			ProcessBuilder builder = new ProcessBuilder(cmd);
+			Map<String, String> environment = builder.environment();
+			environment.put(IMakerWrapperPreferences.IMAKER_EXITSHELL, "1");
+			// In windows environment, the working directory of
+			// ProcessBuilder must point to the drive/path where
+			// the imaker is run. Usually x:\
+			String com = cmd.get(0);
+			if (com.charAt(1) == IMakerWrapperPreferences.MAKEFILE_DRIVE_DESIGNATOR) {
+				String dir = com.substring(0, 2);
+				builder.directory(new File(dir));
+			}
+
+			builder.redirectErrorStream(true);
+			Process process = builder.start();
+
+			// Start reading the output
+			StreamGobbler gobbler = new StreamGobbler(process.getInputStream(), outputStream);
+			gobbler.start();
+			
+			ArrayList<String> output;
+			try {
+				exitValue = process.waitFor();
+				gobbler.join();
+				output = gobbler.getOutput();
+				exitValue  = process.exitValue();
+				if(exitValue!=0) {
+					StringBuilder error = new StringBuilder();
+//					for (String str : output) {
+//						error.append(str+"\n");
+//					}
+					
+					error.append(Messages.getString("IMakerWrapper.28") + " ");
+					for (String str : cmd) {
+						error.append(str+" ");
+					}
+					throw new IMakerCoreExecutionException(error.toString());
+				}
+				return output;
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		} catch (IOException ioe) {
+			throw new IMakerCoreExecutionException(ioe.getMessage());
+		}
+		throw new IMakerCoreExecutionException();
+	}
+
+	private List<String> prepareCommand(List<String> prm) {
+		List<String> cmd = new ArrayList<String>();
+		cmd.addAll(tool);
+		cmd.addAll(prm);
+		return cmd;
+	}
+
+	/**
+	 * Validates the output from iMaker to determine if the
+	 * operation was successful.
+	 * 
+	 * @param  out  output from the iMaker.
+	 * @return true if the iMaker exited successfully based
+	 *              on the output, otherwise false.
+	 */
+	private boolean validateBuildResult(List<String> out) {
+		if(out.size()>1) {
+			String last = out.get(out.size()-2) + out.get(out.size()-1);
+
+			if(last.indexOf(Messages.getString("IMakerWrapper.22"))>-1) {
+				return (runVerdict=true);
+			}
+			if (last.indexOf(Messages.getString("IMakerWrapper.7")) > -1) { //$NON-NLS-1$
+				return (runVerdict=false);
+			}
+			if (last.indexOf(Messages.getString("IMakerWrapper.8")) > -1) { //$NON-NLS-1$
+				return (runVerdict=false);
+			}
+		}
+		if(out.size()==1) {
+			String entry = out.get(0);
+			return (runVerdict=entry.startsWith(Messages.getString("IMakerWrapper.23")));
+		}
+		return (runVerdict=false);
+	}
+
+	public boolean getRunVerdict() {
+		return runVerdict;
+	}
+
+	/**
+	 * Parses ConfigurationElement and Setting objects from the output
+	 * of iMaker.
+	 * 
+	 * @param confData Lines of data to be parsed.
+	 * @param elements ConfigurationElement list where to store results
+	 * @param settings Setting list where to store results
+	 */
+	private void parseConfigurations(List<String> confData,
+			ArrayList<ConfigurationElement> elements,
+			ArrayList<Setting> settings) {
+
+		confData = clearResultList(confData);
+
+		String line                        = null;
+		Iterator<String> lineIter          = confData.iterator();
+		Pattern varValuePt                 = Pattern.compile(Messages.getString("IMakerWrapper.9")); //$NON-NLS-1$
+		Pattern varBodyPt                  = Pattern.compile(Messages.getString("IMakerWrapper.10")); //$NON-NLS-1$
+		Setting setting                    = null;
+		ConfigurationElement configElement = null;
+
+		String name = null;
+		String desc = null;
+		String values = null;
+		while (lineIter.hasNext()) {
+			line = lineIter.next();
+
+			if(blockBegin.matcher(line).matches()) {
+				setting       = IQRFFactory.eINSTANCE.createSetting();
+				configElement = IQRFFactory.eINSTANCE.createConfigurationElement();
+				name = lineIter.next();
+				lineIter.next(); // ignore type line
+				desc = lineIter.next();
+				values = lineIter.next();
+				Matcher matcher = varValuePt.matcher(name);
+				if(matcher.matches()) {
+					setting.setName(matcher.group(1));
+					configElement.setName(setting.getName());
+					setting.setValue(matcher.group(2));
+				}
+				matcher = varBodyPt.matcher(desc);
+				if(matcher.matches()) {
+					configElement.setDescription(matcher.group(2));
+				}
+				matcher = varBodyPt.matcher(values);
+				if(matcher.matches()) {
+					values = matcher.group(2);
+					values = values.replaceAll(Messages.getString("IMakerWrapper.12"), "");
+					values = values.replaceAll(Messages.getString("IMakerWrapper.14"), ""); //$NON-NLS-1$ //$NON-NLS-2$
+					configElement.setValues(values);
+				}
+				setting.setConfigurationElement(configElement);
+				settings.add(setting);
+				elements.add(configElement);				
+			}	
+		}
+	}
+
+	/**
+	 * Parses an interface object from a string.
+	 * 
+	 * @return An interface object.
+	 */
+	private Interface parseInterface() {
+		Interface intf = IQRFFactory.eINSTANCE.createInterface();
+		intf.setName(IMakerWrapperPreferences.INTERFACE_DEFAULT_NAME);
+		return intf;
+	}
+
+
+	/**
+	 * Parses targets from the output of iMaker.
+	 * 
+	 * @param targetStr Lines of data to be parsed.
+	 * @return List of parsed Target objects.
+	 */
+	private ArrayList<Target> parseTargets(List<String> targetStr) {
+
+		targetStr = clearResultList(targetStr);
+
+		String line               = null;
+		Iterator<String> lineIter = targetStr.iterator();
+		ArrayList<Target> targets = new ArrayList<Target>();
+		Pattern tgBodyPt          = Pattern.compile(Messages.getString("IMakerWrapper.16")); //$NON-NLS-1$
+		Matcher tgValueMt         = null;
+		Target target             = null;
+		
+		while ((lineIter != null) && lineIter.hasNext()) {
+			line = lineIter.next();
+			//new target
+			if(blockBegin.matcher(line).matches()) {
+				String name = lineIter.next();
+				target = IQRFFactory.eINSTANCE.createTarget();
+				target.setName(name.trim());				
+				//ignore type
+				lineIter.next();
+				
+				String desc = lineIter.next();
+				tgValueMt = tgBodyPt.matcher(desc);
+				if (tgValueMt.matches()) {
+					if (tgValueMt.group(1).toLowerCase().equals(
+							IMakerWrapperPreferences.TARGET_FIELD_DESCRIPTION)) {
+						target.setDescription(tgValueMt.group(2));
+					}
+				}
+				targets.add(target);
+			}
+		}
+		return targets;
+	}
+
+	/**
+	 * @param dirtyList
+	 * @return
+	 */
+	private ArrayList<String> clearResultList(List<String> dirtyList) {
+		ArrayList<String> cleanList = new ArrayList<String>();
+		Iterator<String> lineIter = dirtyList.iterator();
+		while(lineIter.hasNext()) {
+			String line = lineIter.next();
+			if(!line.startsWith(Messages.getString("IMakerWrapper.17"))  //$NON-NLS-1$
+					&& !line.startsWith(Messages.getString("IMakerWrapper.18"))  //$NON-NLS-1$
+					&& line.length() > 0 ) {
+				cleanList.add(line);
+			}
+		}
+		return cleanList;
+	}
+
+	/**
+	 * Finds a target in the list of targets given as a parameter.
+	 * 
+	 * @param targets A List of targets to search.
+	 * @param target  The target to search for.
+	 * @return The target found in the list or null if not found. 
+	 */
+	private Target findTarget(List<Target> targets, Target target) {
+		Target retTarget = null;
+		Iterator<Target> targetIter = targets.iterator();
+
+		while ((targetIter != null) && targetIter.hasNext()) {
+			Target tmp = targetIter.next();
+			if (tmp.getName().equals(target.getName())) {
+				retTarget = tmp;
+				break;
+			}
+		}
+		return retTarget;
+	}
+
+	/**
+	 * Parses a result object from a string.
+	 * 
+	 * @param configElements A list of configuration elements as strings.
+	 * @param makeFiles      A list of makefiles as strings.
+	 * @return A result object.
+	 * @throws IMakerCoreExecutionException 
+	 * @throws InterruptedException if the operation gets cancelled
+	 */
+	private Result parseResult(List<String> makeFiles) throws IMakerCoreExecutionException {
+		ArrayList<Target> targets = null;
+		Result result = IQRFFactory.eINSTANCE.createResult();
+
+		Interface intf = parseInterface();
+
+		// Process configurations/settings, targets and hwids
+		if ((makeFiles != null) && (makeFiles.size() > 0)) {
+			Iterator<String> iterConfigs = makeFiles.iterator();
+			while ((iterConfigs != null) && iterConfigs.hasNext()) {
+				// Get settings and targets for each configuration/makefile
+				// and first create a Configuration object.
+				String makeFile = iterConfigs.next();
+				Configuration config = createConfiguration(makeFile);
+				if (monitor != null) {
+					monitor.subTask(Messages.getString("IMakerWrapper.19")+": "+makeFile); //$NON-NLS-1$
+				}
+				params.clear();
+				params.add(IMakerWrapperPreferences.CMD_FETCH_TARGETS);
+				params.add(IMakerWrapperPreferences.ARG_FETCH_CONFIGURATION);
+				params.add(makeFile);
+				List<String> prodTargets; 
+				try {
+					prodTargets = executeCommand(params);
+				} catch (IMakerCoreExecutionException e) {
+					this.lastImakerException = e;
+					if(monitor != null) {
+						monitor.worked(1);
+					}
+					String message = "Error while fetching configurations. " +
+					e.getMessage();
+					IStatus status = new Status(IStatus.ERROR,
+							IMakerPlugin.getDefault().getBundle().getSymbolicName(),
+							IStatus.ERROR, message, e);
+					IMakerPlugin.getDefault().getLog().log(status);
+					continue;
+				}
+
+				ArrayList<Target> allTargets = new ArrayList<Target>();
+				targets = parseTargets(prodTargets);
+				Iterator<Target> targetIter = targets.iterator();
+				
+				while ((targetIter != null) && targetIter.hasNext()) {
+					Target target = targetIter.next();
+					Target found = findTarget(allTargets, target);
+					if (found == null) {
+						allTargets.add(target);
+						result.addTarget(target);
+						config.addTargetRef(target);
+					} else {
+						config.addTargetRef(found);
+					}
+				}
+				if (monitor != null) {
+					monitor.worked(1);
+					monitor.subTask(Messages.getString("IMakerWrapper.20")+": "+makeFile); //$NON-NLS-1$
+				}
+				params.set(0, IMakerWrapperPreferences.CMD_FETCH_CONFIGURATION);
+				List<String> settingsList;
+				try {
+					settingsList = executeCommand(params);
+				} catch (IMakerCoreExecutionException e) {
+					this.lastImakerException = e;
+					if(monitor != null) {
+						monitor.worked(1);
+					}
+					String message = "Error while fetching configurations. " +
+					e.getMessage();
+					IStatus status = new Status(IStatus.ERROR,
+							IMakerPlugin.getDefault().getBundle().getSymbolicName(),
+							IStatus.ERROR, message, e);
+					IMakerPlugin.getDefault().getLog().log(status);
+					continue;
+				}
+				
+				ArrayList<ConfigurationElement> elements = new ArrayList<ConfigurationElement>();
+				ArrayList<Setting> settings = new ArrayList<Setting>();
+
+				parseConfigurations(settingsList, elements, settings);
+
+				Iterator<ConfigurationElement> iterElem = elements.iterator();
+				while ((iterElem != null) && (iterElem.hasNext())) {
+					intf.addConfigurationElement(iterElem.next());
+				}
+				setUpConfiguration(config, settings);
+				result.addInterface(intf);
+				result.addConfiguration(config);
+				
+				if(monitor != null) {
+					monitor.worked(1);
+					if(monitor.isCanceled()) {
+						throw new IMakerCoreCancelledException("User cancellation!");
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	private void setUpConfiguration(Configuration config,
+			ArrayList<Setting> settings) {
+		// Go through settings and find hwid data
+		String[] hwids = null;
+		Iterator<Setting> iterSetting = settings.iterator();
+		while ((iterSetting != null) && iterSetting.hasNext()) {
+			Setting setting = iterSetting.next();
+			String name = setting.getName();
+			if(name!=null&&name.equals(Messages.getString("IMakerWrapper.21"))) { //$NON-NLS-1$
+				String str = setting.getValue();
+				hwids =	str.split(IMakerWrapperPreferences.HWID_DELIMITER);
+			}
+		}
+
+		iterSetting = settings.iterator();
+		while ((iterSetting != null) && iterSetting.hasNext()) {
+			Setting setting = iterSetting.next();
+			// Check to see if it's a hwid
+			String name = setting.getName();
+			if (name!=null&&name.toLowerCase().equals(IMakerWrapperPreferences.HWID)) {
+				// Process hwids
+				String defHwid = setting.getValue();
+				String hwidList = ""; //$NON-NLS-1$
+
+				for (int i=0,j=hwids.length; i<j; i++) {
+					if (hwids[i].equals(defHwid)) {
+						hwids[i] = hwids[i]+IMakerWrapperPreferences.HWID_DEFAULT_MARKER;
+					}
+					hwidList += hwids[i];
+					if (i < j-1) {
+						hwidList += " "; //$NON-NLS-1$
+					}
+				}
+				setting.setValue(hwidList);
+			}
+			config.addSetting(setting);
+		}
+	}
+
+	private Configuration createConfiguration(String makeFile) {
+		Configuration config = IQRFFactory.eINSTANCE.createConfiguration();
+//		File file = new File(makeFile);
+		config.setFilePath(makeFile);
+//		config.setName(file.getName());
+		return config;
+	}
+
+	public void cancel() {
+//		if(process!=null&&builderRunning) {
+//			try {
+//				process.getInputStream().close();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			process.destroy();
+//			builderRunning=false;
+//		}
+	}
+
+	public String getWorkdir(String makefile) throws IMakerCoreNotFoundException, IMakerCoreAlreadyRunningException, IMakerCoreExecutionException {
+		String target = "help-variable-WORKDIR*-value";
+		String retValue = null;
+		verifyExists();
+		List<String> parameters = new ArrayList<String>();
+		parameters.add("-f");
+		parameters.add(makefile);
+		parameters.add(target);
+		
+		List<String> ret = executeCommand(parameters);
+		String output = ret.get(0);
+		for (String str : ret) {
+			if(str.startsWith("WORK")) {
+				output = str;
+				break;
+			}
+		}
+		int start = output.indexOf('/');
+		output = output.substring(start+1,output.length()-1);
+		retValue = output;
+		return retValue;
+	}
+
+//	@Override
+	public String getBuildCommand(List<String> params) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(tool.get(0) + " ");
+		String[] parameters = null;
+		String prms = params.toString();
+		if(prms.length()>2) {
+			prms = prms.substring(1, prms.length()-1);
+			parameters=prms.split(Messages.getString("IMakerWrapper.5")); //$NON-NLS-1$
+		}
+		for(String str: parameters) {
+			sb.append(str);
+		}
+		return sb.toString();
+	}
+
+	public List<String> getTool() {
+		return this.tool;
+	}
+
+	public String getTargetSteps(String target, String makefile, IProgressMonitor monitor) {
+		if (monitor != null) {
+			monitor.beginTask(Messages.getString("IMakerWrapper.24"),2);
+			monitor.subTask(Messages.getString("IMakerWrapper.25"));
+		}
+		Pattern pattern = Pattern.compile(".*\\s*=\\s*.(.*).");
+		List<String> cmd = new ArrayList<String>();
+		cmd.add(IMakerWrapperPreferences.ARG_FETCH_CONFIGURATION);
+		cmd.add(makefile);
+		cmd.add(target);
+		cmd.add(IMakerWrapperPreferences.TARGET_STEPS);
+		try {
+			if(monitor!=null) {
+				monitor.worked(1);
+				monitor.subTask(Messages.getString("IMakerWrapper.26"));
+			}
+			StringBuilder sb = new StringBuilder();
+			List<String> ret = executeCommand(cmd);
+			for (String str : ret) {
+				Matcher matcher = pattern.matcher(str);
+				if(matcher.find()) {
+					int end = matcher.end(1);
+					int start = matcher.start(1);
+					String retValue = str.substring(start,end);
+					if(monitor!=null) {
+						monitor.worked(1);
+						monitor.done();
+					}
+					sb.append(retValue);
+					sb.append(" ");
+				}
+			}
+			String str = sb.toString();
+			if(str.equals("")) {
+				return null;
+			} else {
+				return str;
+			}
+		} catch (IMakerCoreExecutionException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public boolean buildImage(File impFile, OutputStream out)
+			throws IMakerCoreNotFoundException, IMakerCoreExecutionException,
+			IMakerCoreAlreadyRunningException {
+		if(impFile==null||!impFile.exists()) {
+			throw new IMakerCoreExecutionException("Invalid imp file given!");
+		}
+		this.outputStream = out;
+		verifyExists();
+		
+		params.clear();
+		params.add("-f");
+		params.add("\""+impFile.getAbsolutePath()+"\"");
+		builderRunning = true;
+		List<String> ret = executeCommand(params);
+		builderRunning = false;
+		return getReturnStatus(ret);
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/IMakerWrapperPreferences.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.imaker.internal.wrapper;
+
+/**
+ * A simple preferences class for iMaker wrapper.
+ *
+ */
+public class IMakerWrapperPreferences {
+	/** Preferences */
+	public static final String CMD_FETCH_VERSION                = "";
+	public static final String CMD_FETCH_CONFIGURATIONS         = "help-config";  //"help-config CONFIGROOT=";
+	public static final String ARG_CONFIGURATIONS_PATH          = "/epoc32/rom/config";
+	public static final String CMD_FETCH_TARGETS                = "help-target";
+	public static final String CMD_FETCH_CONFIGURATION          = "help-variable-*-all";
+	public static final String CMD_FETCH_HWIDS                  = "help-variable-HWID_LIST-value";
+	public static final String ARG_FETCH_CONFIGURATION          = "-f";
+	public static final String DEFAULT_COMMAND                  = "epoc32\\tools\\imaker.cmd";
+	public static final String PRODUCT_NAME                     = "product_name";
+	public static final String COREPLATFORM_NAME                = "coreplat_name";
+	public static final String UIPLATFORM_NAME                  = "uiplat_name";
+	public static final String MAKEFILE_LIST_PATTERN            = "/epoc32/rom/config/.*?/image_conf.*?\\.mk";
+	public static final String HWID                             = "hwid";
+	public static final String HWID_LIST_PATTERN                = "HWID_LIST = `.*";
+	public static final String HWID_DELIMITER                   = " ";
+	public static final char   HWID_DEFAULT_MARKER              = '*';
+	public static final char   HWID_FIELD_DELIMITER             = ' ';
+	public static final char   IMAKER_PARAM_DELIMITER           = ' ';
+	public static final char   TARGET_FIELD_DELIMITER           = ';';
+	public static final char   TARGET_VALUE_DELIMITER           = '=';
+	public static final String TARGET_FIELD_NAME                = "name";
+	public static final String TARGET_FIELD_DESCRIPTION         = "description";
+	public static final char   CONFIGURATION_FIELD_DELIMITER    = ';';
+	public static final char   CONFIGURATION_REF_DELIMITER      = ',';
+	public static final char   CONFIGURATION_VALUE_DELIMITER    = '=';
+	public static final String CONFIGURATION_FIELD_NAME         = "name";
+	public static final String CONFIGURATION_FIELD_VALUE        = "value";
+	public static final String CONFIGURATION_FIELD_DESCRIPTION  = "description";
+	public static final String CONFIGURATION_FIELD_VALUEFORMAT  = "values";
+	public static final String INTERFACE_DEFAULT_NAME           = "An interface";
+	public static final char   MAKEFILE_PATH_DELIMITER          = '/';
+	public static final char   MAKEFILE_DRIVE_DESIGNATOR        = ':';
+	public static final String IMAKER_EXITSHELL 				= "IMAKER_EXITSHELL";
+	public static final String DEFAULT_DATA     				= "print-IMAKER_CONFMK,TARGET_DEFAULT";	
+	public static final String TYPE     				        = "TYPE";	
+	public static final String PLATSIM_STEP 			        = "step-PLATBLD";
+	public static final String USE_PLATSIM 			        	= "USE_PLATSIM";
+	public static final String TARGET_STEPS 			      	= "print-IMAKER_STEPS";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/PlatsimManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.imaker.internal.wrapper;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlatsimManager {
+	private static final String DEFAULT_LOCATION = "rd_sw\\platsim";
+	private static final String INSTANCES_FOLDER = "instances";
+	private String epocroot = null;
+	public PlatsimManager(String epocroot) {
+		this.epocroot = epocroot;
+	}
+	
+	public String getDefaulfLocation() {
+		return epocroot + DEFAULT_LOCATION;
+	}
+	public List<String> getInstances() {
+		List<String> ins = new ArrayList<String>();
+		File f = new File(epocroot+DEFAULT_LOCATION+"\\"+INSTANCES_FOLDER);
+		File[] files = f.listFiles();
+		if(files != null) {
+			for (int i = 0; i < files.length; i++) {
+				File file = files[i];
+				if(file.isDirectory()) {
+					File ini = new File(file.getAbsolutePath()+"\\platsim.ini");
+					if(ini.exists()) {
+						ins.add(file.getName());
+					}
+				}
+			}			
+		}
+		return ins;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/wrapper/StreamGobbler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+package com.nokia.s60tools.imaker.internal.wrapper;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.ArrayList;
+
+/**
+ * Helper class to read and parse command line output data
+ * 
+ * @version 0.3
+ */
+public class StreamGobbler extends Thread {
+	/** Default thread sleed time in milliseconds. */
+	public static final int DEFAULT_THREAD_SLEEP_TIME = 200;
+	public static final String NEWLINE            = System.getProperty("line.separator");
+
+	/** Buffer where output is stored. */
+    private ArrayList<String> cmdOutput;
+    private OutputStream output;
+	private InputStream input;
+
+
+     /**
+      * Default constructor
+      */
+     public StreamGobbler(InputStream in, OutputStream out) {
+    	 cmdOutput = new ArrayList<String>();
+    	 this.output = out;
+    	 this.input = in;
+     }
+     
+     /**
+      * Returns output generated by the input stream.
+      * 
+      * @return output of input stream
+      */
+     public ArrayList<String> getOutput() {
+    	 return cmdOutput;
+     }
+
+     /*
+      * (non-Javadoc)
+      * 
+      * @see java.lang.Thread#run()
+     */
+     @Override
+     public void run() {
+    	 try {
+    		 // Get BufferedReader from InputStream
+             BufferedReader br = new BufferedReader(new InputStreamReader(input));
+             String line = null;
+             
+             // Go through lines in BufferedReader
+             while ((line = br.readLine()) != null) {
+            	 if (output != null) {
+            		 output.write((line+NEWLINE).getBytes());
+            		 output.flush();
+            	 }
+            	 cmdOutput.add(line);
+             }
+             br.close();
+             if (output != null) {
+            	 output.flush();
+            	 output.close();
+            	 output = null;
+             }
+         } catch (IOException ioe) {
+    		 ioe.printStackTrace();
+         }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,154 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+Project.name=iMaker
+StatusHandler.0=Bundle-SymbolicName
+ImageBuilder.0=Building started.
+ImageBuilder.1=Command: 
+ImageBuilder.2=Building completed successfully.\n
+ImageBuilder.3=Building failed.\n
+ImageBuilder.4=Creating iMaker image...please wait.
+IMakerBuildLogEditor.0=imaker_build.ilog
+IMakerBuildLogEditor.1=com.nokia.s60tools.imakerplugin.IMakerBuildLogEditor
+IMakerBuildLogEditor.2=.context
+IMakerTabsViewer.0=Restore Defaults
+IMakerTabsViewer.1=&Configuration
+IMakerTabsViewer.2=Select preferences file
+IMakerTabsViewer.3=Main
+IMakerTabsViewer.4=Edit main image creation parameters
+IMakerTabsViewer.5=Settings
+IMakerTabsViewer.6=Edit detailed image creation parameters
+IMakerTabsViewer.7=Debug
+IMakerTabsViewer.8=Add debug files to the image
+IMakerTabsViewer.9=PlatSim
+IMakerTabsViewer.10=Configure PlatSim instance settings
+IMakerTabsViewer.11=Restore default configuration 
+Flashmenu.0=iMaker plugin preferences doesn't contain valid information. Please verify the preferences you provided.
+Flashmenu.1=Build preferences are not set. Set build preferences by selecting 'Preferences...' from iMaker Plugin's menu.
+Flashmenu.4=TYPE=prd
+Flashmenu.6=TYPE=subcon
+Flashmenu.7=TYPE=rnd
+Flashmenu.9=VERBOSE=31
+Flashmenu.11=BLDROPT=-D_FULL_DEBUG
+Flashmenu.12=Unable to inialize the iMaker plugin preferences page.
+Flashmenu.13=iMaker core is already running.
+Flashmenu.14=Preferences data is not set correctly.
+Flashmenu.15=No open project exists. 
+Flashmenu.16=HWID=
+Flashmenu.17=Open iMaker Dialog...
+LaunchImakerDialog.title=Create flashable images with iMaker
+LaunchImakerDialog.message=Manage iMaker image creation preferences.
+LaunchImakerDialog.run=Run
+LaunchImakerDialog.close=Close
+ImakerProperties.0=<Create New>
+ImageFlasherPreferencePage.0=Preferences management
+ImageFlasherPreferencePage.1=Preferences directory:
+ImageFlasherPreferencePage.2=Browse
+ImageFlasherPreferencePage.3=Don't show Confml file selection dialog.
+IMakerWrapper.0=iMaker - The Image Maker, version .*
+IMakerWrapper.1=unchecked
+IMakerWrapper.3=Fetching configurations please wait.
+IMakerWrapper.4=Fetching configuration values for a product...please wait.
+IMakerWrapper.5=,
+IMakerWrapper.7=Error
+IMakerWrapper.8=Stop.
+IMakerWrapper.9=\\s*(.*?)\\s*=\\s*`(.*)'\\s*
+IMakerWrapper.10=\\s*(.*?)\\s*:\\s*(.*)\\s*
+IMakerWrapper.12=^"
+IMakerWrapper.14="$
+IMakerWrapper.16=\\s*(.*?)\\s*:\\s+(.*)\\s*
+IMakerWrapper.17=Testing
+IMakerWrapper.18=Total duration
+IMakerWrapper.19=Fetching targets for a product
+IMakerWrapper.20=Fetching variables for a product
+IMakerWrapper.21=HWID_LIST
+IMakerWrapper.22=Total duration
+IMakerWrapper.23=iMaker
+IMakerWrapper.24=Fetching target information please wait.
+IMakerWrapper.25=Initializing... 
+IMakerWrapper.26=Getting target information from iMaker...please wait. 
+IMakerWrapper.27=Make sure that iMaker cmd (xxx) exists. 
+IMakerWrapper.28=command: 
+SettingsTable.header0=Parameter
+SettingsTable.header1=Value
+SettingsTable.header2=Value format
+SettingsTable.header3=Description
+PreferencesTab.0=&Product
+PreferencesTab.1=Targets
+PreferencesTab.2=Image Type
+PreferencesTab.3=&R&&D
+PreferencesTab.4=Development Image
+PreferencesTab.5=Pr&oduction
+PreferencesTab.6=Production Image
+PreferencesTab.7=S&ubcontractor
+PreferencesTab.8=Sub contractor Image
+PreferencesTab.9=Flags
+PreferencesTab.10=&Symbol Files
+PreferencesTab.11=Whether iMaker should create ROM symbol files or not
+PreferencesTab.12=&Verbose
+PreferencesTab.13=Should iMaker print additional output
+PreferencesTab.14=Additional parameters
+PreferencesTab.15=Additional parameters that will be passed to the image creation tool.
+PreferencesTab.16=Save
+PreferencesTab.17=Save UI values to the selected preferences file
+PreferencesTab.18=Save as...
+PreferencesTab.19=Save UI values to a new file under selected project
+PreferencesTab.20=Version informations of iMaker Extension and iMaker cmd
+PreferencesTab.22=08.01.01
+PreferencesTab.23=prd
+PreferencesTab.24=subcon
+PreferencesTab.25=rnd
+PreferencesTab.26=31
+PreferencesTab.27=1
+PreferencesTab.30=subcon
+PreferencesTab.31=prd
+PreferencesTab.32=iMaker Core:
+PreferencesTab.34=Save Resourse
+PreferencesTab.37=\ has been modified. Save changes?
+PreferencesTab.38=Preferences
+PreferencesTab.39=*
+PreferencesTab.41=Settings
+PreferencesTab.42=*
+PlatsimTab.0=<New>
+AddEditFileToTransferDialog.1=Source path\:
+AddEditFileToTransferDialog.10=No target path specified
+AddEditFileToTransferDialog.11=All Files
+AddEditFileToTransferDialog.12=Note\: Target file path has no extension
+AddEditFileToTransferDialog.2=The absolute path on your PC of the file to add to the image section
+AddEditFileToTransferDialog.3=Browse...
+AddEditFileToTransferDialog.4=Select file to transfer
+AddEditFileToTransferDialog.5=Target path\:
+AddEditFileToTransferDialog.6=The target path on the phone to place the file to
+AddEditFileToTransferDialog.7=File to transfer does not exist
+AddEditFileToTransferDialog.8=No file to transfer specified
+AddEditFileToTransferDialog.9=Invalid target path specified
+FileTransferTab.8=Add File to Image
+DebugTab.0=Selected location (xxx) may not be in the selected targets on the main tab.
+DebugTab.1=Source file (xxx) doesn't exist!
+DebugTab.2=Add
+DebugTab.3=Add new entry to the list
+DebugTab.4=Remove
+DebugTab.5=Remove selected item(s) 
+DebugTab.6=Populate
+DebugTab.7=Populate from the selected project
+DebugTab.8=Enable All
+DebugTab.9=Enable All items in the table
+DebugTab.10=Disable All
+DebugTab.11=Disable All items in the table
+Error.0=iMaker Core was not found.
+Error.1=An error has occured while executing iMaker Core. Make sure that imaker.cmd can be run without problems.
+Error.2=Commandline tool imaker.cmd not found. Make sure that imaker.cmd is in the path environment variable.
+Error.3=The iMaker Plugin is not compatible with the selected underlying iMaker Core version. iMaker Core version should be xxx or newer.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/common.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+<!--****************************************************************************
+ * iMaker plugin common properties file
+ *
+ ****************************************************************************-->
+
+plugin.version       = 2.2.4
+eclipse.home         = E:/APPS/Carbide.c_SYMSEE_layout_2.4.0_test
+plugin.lib           = lib
+plugin.dist.dir      = install
+common.javac-target	 = 1.5
+common.javac-source	 = 1.5
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/feature.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,3 @@
+feature.name             = com.nokia.carbide.extensions.imakerplugin
+feature.zip.outdir       = output
+feature.zip.outfile      = ${feature.zip.outdir}/${feature.name}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/generatedoc-build.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+<!--****************************************************************************
+ * Configuration tool main build file
+ * This ant build.xml will compile all Configuration tool plugins
+ ****************************************************************************-->
+ 
+<project name="ConfigurationTool generatedoc" default="generatedoc">
+	<!-- import common properties for this plugin -->
+	<property file="common.properties"/>
+	<property file="install.properties"/>
+  <property file="build.properties"/>
+    
+  <target name="init-generatedoc" depends="get-svnversion">
+      <mkdir dir="${common.documents}"/>
+  </target>
+
+  <target name="generatedoc" depends="doxygen"/>
+    
+  <target name="update-doxyfile">
+		<delete file="$Doxyfile"/>
+		<copy file="Doxyfile.template" tofile="Doxyfile"/>
+		<echo file="Doxyfile" append="yes">
+		# -------------------------------------------------------------------------
+		# generated by ant
+		PROJECT_NAME           = ${ant.project.name}
+		PROJECT_NUMBER         = ${common.version}-${common.svnversion}
+		OUTPUT_DIRECTORY       = "${common.documents}\doxygen"
+		</echo>
+  </target>
+  
+  <target name="doxygen" depends="init-generatedoc,update-doxyfile">
+    <exec executable="doxygen" dir=".">
+	  </exec>
+  </target>
+
+  <target name="javadoc" depends="init-generatedoc">
+	  <javadoc linksource="yes" destdir="${common.documents}/javadoc">
+	    <sourcefiles>
+        <fileset dir=".">
+        	<include name="**/src/**/*.java"/>
+        </fileset>
+      </sourcefiles>
+      <classpath>
+        <pathelement location="lib/*.jar"/>
+      </classpath>
+	  </javadoc>
+  </target>
+  	
+</project>
+     
+     
+     
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/install.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!--****************************************************************************
+ * Configuration tool install properties for S60CT
+ *
+ ****************************************************************************-->
+ 
+install.dir          = iMakerPlugin
+install.pluginsdir   = plugins
+
+<!-- source data and binaries for install -->
+install.src.preinstall   = 
+install.src.libplugins   = *.jar,**/*
+install.src.ownplugins   = *.jar
+
+install.zip.outdir       = output
+install.zip.outfile      = ${install.zip.outdir}/iMakerPlugin
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/plugin-build-template.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+<!--****************************************************************************
+ * Configuration tool plugin build template
+ * This ant pluging-build-template.xml will contain the common targets
+ * to build a eclipse plugin
+ ****************************************************************************-->
+ 
+<project name="${pluginName}" default="all">
+ 	<property file="../common.properties"/>
+  <property file="../${common.buildproperties}"/>
+  <property file="build.properties"/>
+  <property file="plugin.properties"/>
+  <fileset id="plugin-resources" dir="." includes="${bin.includes}"/>
+
+
+ <path id="project.class.path">
+    <!-- add lib jars to classpath -->
+    <fileset dir="${common.plugin-lib}" casesensitive="yes">
+      <include name="**/*.jar"/>
+    </fileset>
+    <!-- add also the generated Configuration Tool jars to classpath -->
+    <fileset dir="${common.plugin-dist}" casesensitive="yes">
+      <include name="**/*.jar"/>
+    </fileset>
+  </path>
+
+  <!-- Gets the svnversion with the svnversion command and stores the output to svnrevision. 
+       The target is executed only if the svnrevision has not been set. 
+       -->
+  <target name="get-svnversion" unless="common.svnversion">
+    <exec dir="." executable="svnversion" outputproperty="common.svnversion" />
+    <echo message="svnversion from svn command = ${common.svnversion}" />
+  </target>
+  <!-- Sets the buildate property if it has not been set by the common property file -->
+  <target name="get-builddate" unless="common.builddate">
+    <tstamp prefix="build"/>
+    <property name="common.builddate" value="${build.DSTAMP}"/>
+  </target>
+
+    <!-- generate a build property file -->
+  <target name="update-properties" depends="get-svnversion">
+    <tstamp prefix="build"/>
+    <echo file="${common.buildproperties}">
+    common.svnversion     =${svnrevision}
+    </echo>
+  <!-- replace the possible : characters because the do not work in filenames-->
+    <replace file="${common.buildproperties}" token=":"/>
+    <property file="${common.buildproperties}"/>
+  </target>
+
+
+  <!-- All target will clean and then commit all the build steps-->
+	<target name="all" depends="clean, build"/> 
+	
+	<!-- Build target will commit all the build steps and can be used for incremental 
+	building, because ant recognized changed files -->
+	<target name="build" depends="init, resource, compile, jar"/> 
+	
+  <target name="clean">
+    <delete dir="${common.plugin-target}" quiet="true" />
+  </target>
+
+  <target name="info">
+    <echoproperties/>
+  </target>    
+
+  <target name="init" depends="get-svnversion,get-builddate">
+    <mkdir dir="${common.plugin-target}/bin" />
+    <mkdir dir="${common.plugin-dist}" />
+  </target>
+    
+  <target name="resource" depends="init">
+    <copy todir="${common.plugin-target}/bin/">
+      <fileset refid="plugin-resources" /> 
+    </copy>
+    <manifest file="${common.plugin-target}/bin/META-INF/MANIFEST.MF" mode="update">
+    	<attribute name="Bundle-FOO" value="${common.plugin-version}"/>
+    	<attribute name="Bundle-Version" value="${common.plugin-version}"/>
+    	<attribute name="Bundle-Date" value="${common.builddate}"/>
+    	<attribute name="Bundle-RepositoryVersion" value="${common.svnversion}"/>
+    </manifest>
+    
+  </target>
+
+  <target name="compile" depends="init"
+    description="compile the source">
+    <!-- Compile the java code from ${src} into ${build} -->
+    <javac srcdir="${source..}" destdir="${common.plugin-target}/bin">
+      <classpath refid="project.class.path"/>
+    </javac>
+  </target>
+
+  <target name="jar" depends="compile,resource">
+  	<jar jarfile="${common.plugin-dist}/${pluginName}_${common.plugin-version}.jar" 
+         basedir="${common.plugin-target}/bin"
+         manifest="${common.plugin-target}/bin/META-INF/MANIFEST.MF">
+    </jar>
+  </target>
+    
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/publish.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!--****************************************************************************
+ * Configuration tool publishing properties for S60CT
+ *
+ ****************************************************************************-->
+ 
+publish.targetdir          = cruisecontrol/builds
+publish.project            = imaker
+publish.documents          = ${publish.targetdir}/${publish.project}
+publish.release            = ${publish.targetdir}/${publish.project}/releases/imaker_plugin
+publish.build              = ${publish.targetdir}/${publish.project}/build
+publish.logs 							 = ${publish.targetdir}/${publish.project}/logs
+publish.server             = delivery.nmp.nokia.com
+publish.user               = configurationtools
+publish.pword              = configurationtools
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/publish.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<!--****************************************************************************
+ * Configuration tool main build file
+ * This ant build.xml will compile all Configuration tool plugins
+ ****************************************************************************-->
+ 
+	
+	 
+<project name="BuildPuplisher" default="publish">
+	<property file="common.properties"/>
+  <property file="publish.properties"/>
+	<property name="feature.name" value="com.nokia.carbide.extensions.imaker_${plugin.version}.zip" />
+	
+	<target name="publish" depends="publish-release"/>
+	
+	<target name="create.zip">
+		<ant antfile="build.xml" target="zip.distribution" />
+	</target>
+	
+	<!-- publishing build logs --> 
+  <target name="publish-release" depends="create.zip">
+  	<echo>Publishing....</echo>
+    <exec executable="pscp">
+    	<arg line="-batch -pw ${publish.pword}"/>
+    	<arg line="install/${feature.name}"/>
+    	<arg line="'${publish.user}@${publish.server}:${publish.release}'"/>
+    </exec>
+  </target>
+</project>
Binary file metadataeditor/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.carbide.extensions.metadataeditor/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.carbide.extensions.metadataeditor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.carbide.extensions.metadataeditor/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.carbide.extensions.metadataeditor/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.metadataeditor"
+      label="Carbide.c++ Extensions - Metadata Editor"
+      version="1.1.2"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.metadataeditor">
+
+   <description>
+      Metadata Editor is validating visual editor for XML based API metadata.
+   </description>
+
+   <copyright>
+      Copyright (c) 2007 - 2009 Nokia Corporation and/or its subsidiary(-ies). 
+      All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+   </copyright>
+
+
+   <license url="license.txt">
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide203"/>
+   </url>         
+
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.ui.workbench.texteditor"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="com.nokia.s60tools.util" version="1.1.10" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.metadataeditor"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.metadataeditor.doc.user"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.carbide.extensions.metadataeditor/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.metadataeditor.doc.user</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Thu Oct 09 15:30:36 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Metadata Editor Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.metadataeditor.doc.user;singleton:=true
+Bundle-Version: 1.1.2
+Bundle-Activator: com.nokia.s60tools.metadataeditor.doc.user.MetadataEditorHelpActivator
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.help
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.metadataeditor.doc.user;uses:="org.eclipse.jface.resource,org.eclipse.ui.plugin,org.osgi.framework"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,181 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+	All rights reserved. 
+	License: http://www.eclipse.org/legal/epl-v10.html
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+html {
+	margin: 2px 10px 10px 10px;
+	}
+
+/* 20091007 added verdana and ariel to list to match SFO website fonts choices */
+body, p, table {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 1.0em;
+	font-weight: normal;
+}
+
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+/* 20091007 - changed sizes to use em versus px */
+h1 { font-size: 1.3em }
+h2 { font-size: 1.2em }
+h3 { font-size: 1.1em }
+h4 { font-size: 1.0em }
+h5 { font-size: 0.9em }
+h6 { font-size: 0.8em }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20090224-changed green fade to gold header image	*/
+h1, h2, h3 {
+	background-image: url(html/images/gold_header.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+/* 20091007 SFO styling added */
+h1.NavTitle		{ font-size: 1.2em }
+h3	.NavListTitle 	{ font-size: 1.1em }
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.8em;
+	color: #333333;
+	}
+
+.listing	{
+	background-color: #ffe869;
+	font-family: "Courier New", Courier, mono;
+	font-size: 1.1em;
+	color: #000000;
+	margin: 5px 0px;
+	}
+		
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 1.1em;
+	color: #000000;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	/* color: #111; */
+	/* border-bottom:2px solid #EEE; */
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+th	{
+	background-color: #ffd62c;
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+div h5, div h4	{
+	padding:5px 0px 5px 12px;
+	background-color: #ffd62c;
+	font-weight:bold;
+	color: #000000;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #026690;
+	text-align: center;
+	font-weight: bold;
+	}
+
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.8em;
+	}
+
+	
+.plain {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #026690 }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #FFD62C }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,9 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               *.xml,\
+               book.css,\
+               build.properties
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.	
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+/* 	20070523-Removed top margin size to close gap between location breadcrumbs and page title	*/
+html {
+	margin: 0px 10px 10px 10px;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(html/images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/concepts/concepts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<title>Concepts</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Concepts</h2>
+<p>The following concepts provide information on basic API MetaData Editor terminology and processes:</p>
+<ul>
+<li><a href="metadata_file.htm">Metadata file</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/concepts/metadata_file.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Metadata file</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Metadata file</h2>
+<p>A metadata file is used to provide information about an Application Programming Interface (API). Metadata files contain the following information of an API, as shown in the example below: </p>
+<p><code>&lt;?xml version="1.0"&nbsp;?><br>
+&lt;api id="16bdb6fdf38e8ced9e907a4eea1f68c5" dataversion="2.0"><br>
+&nbsp; &lt;name>Phone Parser API&lt;/name><br>
+&nbsp; &lt;description>This API is used to parse and validate phone numbers.&lt;/description><br>
+&nbsp; &lt;type>c++&lt;/type><br>
+&nbsp; &lt;collection>commonservices&lt;/collection><br>
+&nbsp; &lt;libs><br>&nbsp;&nbsp;&nbsp; &lt;lib name="CommonEngine.lib" /><br>
+&nbsp; &lt;/libs><br>&nbsp; &lt;release category="public" sinceversion="1.0" deprecatedsince="9.1"/><br>
+&nbsp; &lt;attributes><br>
+&nbsp;&nbsp;&nbsp;&nbsp; &lt;htmldocprovided>yes&lt;/htmldocprovided><br>
+&nbsp;&nbsp;&nbsp;&nbsp; &lt;adaptation>no&lt;/adaptation><br>
+&nbsp; &lt;/attributes><br>
+&lt;/api>
+</code></p>
+<p>Metadata files are identified by the extension <i>.metaxml</i>. This way, the Carbide.c++ development environment can easily associate these files with the API Metadata Editor tool. </p>
+<p>Metadata can then be viewed, example, in the <i>API Query</i> tool (<b>Carbide > API Query</b>), as well as in the common Software Development Kit (SDK) documentation if the API belongs to an SDK.</p><p>The name of the file comes from the API name and should be the same as the API directory name. For example, if the API directory is&nbsp;<i>phone_parser_api</i>, the corresponding metadata file name should be <i>phone_parser_api.metaxml</i>. The file is located directly under the API's own directory.</p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/create_metadata.htm">Creating a metadata file</a></li>
+<li><a href="../tasks/edit_metadata.htm">Editing a metadata file</a></li>
+<li><a href="../tasks/converting_metadata.htm">Converting metadata files</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+	<context id="METADATA_EDITOR_HELP_TOC">
+      <description>Metadata Editor TOC</description>	   
+		<topic label="Metadata Editor TOC" href="html/toc.html" >		
+	    </topic>
+    </context>	  
+
+	<context id="METADATA_EDITOR_HELP_EDIT">
+      <description>Editing and saving a metadata file</description>	   
+		<topic label="Editing a metadata file" href="html/tasks/edit_metadata.htm" >		
+	    </topic>
+    </context>	  
+    
+	<context id="METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK">
+      <description>Editing and saving a metadata file</description>	   
+		<topic label="Editing an extended SDK" href="html/tasks/edit_metadata.htm#edit_sdk" >		
+	    </topic>
+    </context>
+    
+	<context id="METADATA_EDITOR_HELP_EDIT_ATTRIBS">
+      <description>Editing and saving a metadata file</description>	   
+		<topic label="Editing attributes" href="html/tasks/edit_metadata.htm#edit_attribs" >		
+	    </topic>
+    </context>
+    
+	<context id="METADATA_EDITOR_HELP_EDIT_LIBS">
+      <description>Editing and saving a metadata file</description>	   
+		<topic label="Editing libraries" href="html/tasks/edit_metadata.htm#add_libraries" >		
+	    </topic>
+    </context>
+    
+	<context id="METADATA_EDITOR_HELP_EDIT_RELEASE">
+      <description>Editing and saving a metadata file</description>	   
+		<topic label="Editing release information" href="html/tasks/edit_metadata.htm#edit_release" >		
+	    </topic>
+    </context>                
+
+
+	<context id="METADATA_EDITOR_HELP_CREATE">
+      <description>Creating a new metadata file</description>	   
+		<topic label="Creating a new metadata file" href="html/tasks/create_metadata.htm" >		
+	    </topic>
+    </context>	  
+
+	<context id="METADATA_EDITOR_HELP_NEW_PROJECT">
+      <description>Creating a new project and linking it to the file system</description>	   
+		<topic label="Creating a new project" href="html/tasks/create_new_project.htm" >		
+	    </topic>
+    </context>	  
+    
+	<context id="METADATA_EDITOR_HELP_IMPORT_PROJECT">
+      <description>Importing an existing project</description>	   
+		<topic label="Importing a project" href="html/tasks/import_project.htm" >		
+	    </topic>
+    </context>	
+
+	<context id="METADATA_EDITOR_HELP_CONVERT_FILES">
+      <description>Converting metadata files</description>	   
+		<topic label="Converting metadata files" href="html/tasks/converting_metadata.htm" >		
+	    </topic>
+    </context>	
+    
+    
+     		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/gettingstarted/GS_index.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting started</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Getting started</h2>
+<p>Metadata Editor is a tool for creating and editing metadata for Application Programming Interfaces (APIs). The properties that can be edited include libraries, release, attributes and extended SDK information.</p>
+<p>Metadata are contained in files named as <i>&lt;apiname>.metaxml</i>. For example, the filename for <i>phone_parser_api</i> would be <i>phone_parser_api.metaxml</i>.</p>
+<ol>
+<li>Before you can edit metadata files, you need to have a project for them in the Carbide.c++ environment. To do this, either: 
+	<ul>
+	<li><a href="../tasks/create_new_project.htm">Create a new project</a>.</li>
+	<li><a href="../tasks/import_project.htm">Import an existing project</a>.</li>
+	</ul>
+</li>
+<li>To work with the files, do either of the following:
+	<ul>
+	<li>If your project does not contain any <i>.metaxml</i> files, 
+	<a href="../tasks/create_metadata.htm">create a new metadata file</a>.</li>
+	<li>If your project already contains a <i>.metaxml</i> file, open it by double-clicking
+	in the Carbide.c++ Project Explorer, or right-click the name and select 
+	<b>Open/Open with > Metadata Editor</b>.</li>
+	</ul>
+</li>
+<li>You can then <a href="../tasks/edit_metadata.htm">edit the metadata files </a> by changing, for example, libraries, release, attributes and extended SDK values. Metadata Editor automatically validates the structure of the XML when you save the file.
+	<ul>
+	<li>Note: If you have files in the 1.0 version of the API metadata, you can 
+	also <a href="../tasks/converting_metadata.htm">convert the metadata files </a> to version 2.0. </li>
+	</ul>
+</li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/images/.DS_Store has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/images/gold_header.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/index.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<?APT Element gi="index"?>
+<?APT Element gi="entry" attrs="keyword"?>
+<?APT Element gi="topic" empty="yes" attrs="href"?>
+<?NLS TYPE="org.eclipse.help.index"?><!-- INDEX INSTRUCTIONS
+	
+	Use the index.xml file to define the index entries for the plugin's 
+	help contents. In Eclipse 3.2 and beyond an Inex tab appears in the Help
+	viewer making it possible for user to more easily locate subjects of
+	interest to them.
+		
+	In brief, every file used in the help documentation should have at least one
+	associated index entry for it. Ideally, it's simple to make two entries per
+	page by simply re-wording the subject slightly. For example, a view could
+	be indexed twice like this, 1) Breakpoint view, and 2) Views, Breakpoint.
+	
+	See ??? for details on creating indexes.
+	
+	--><index>  	<!-- AAAAAAAA -->  	<entry keyword="API metadata"> 		<topic
+href="html/concepts/metadata_file.htm"/> 	</entry>   	  	<entry keyword="attributes in API metadata"> 
+	<topic href="html/tasks/edit_metadata.htm"/><?Pub Caret1?> 	</entry>   	<!-- BBBBBBBB -->
+	<!-- CCCCCCCC -->	  	<entry keyword="creating API metadata"> 		<topic href="html/tasks/create_metadata.htm"/> 	</entry> <entry
+keyword="converting API metadata"><topic href="html/tasks/converting_metadata.htm"/></entry> 	<!-- DDDDDDDD -->
+ 	<!-- EEEEEEEE -->	  	<entry keyword="editing API metadata"> 		<topic href="html/tasks/edit_metadata.htm"/> 	</entry> 
+	<entry keyword="extended SDK metadata"> 		<topic href="html/tasks/edit_metadata.htm"/> 	</entry> 
+	<!-- FFFFFFFF --> 	<!-- GGGGGGGG -->	 	<!-- HHHHHHHH -->	 	<!-- IIIIIIII -->
+	<!-- JJJJJJJJ --> 	<!-- KKKKKKKK --> 	<!-- LLLLLLLL --> 	<!-- MMMMMMMM -->
+ 	<entry keyword="metadata file"> 		<topic href="html/concepts/metadata_file.htm"/> 	</entry> 
+	<!-- NNNNNNNN --> 	<!-- OOOOOOOO --> 	<!-- PPPPPPPP --> 	<!-- QQQQQQQQ -->
+	<!-- RRRRRRRR --> 	<!-- SSSSSSSS --> 	<!-- TTTTTTTT --> 	<!-- UUUUUUUU -->
+	<!-- VVVVVVVV --> 	<!-- WWWWWWWW --> 	<!-- XXXXXXXX -->  	<entry keyword="XML metadata"> 
+	<topic href="html/concepts/metadata_file.htm"/> 	</entry>   	<!-- YYYYYYYY -->
+	<!-- ZZZZZZZZ -->  </index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/legal.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>License Information</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>License Information</h3>
+
+<h5>COPYRIGHT</h5>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a></p>
+<h5></h5>
+<h5>Initial Contributors:</h5>
+<p>Nokia Corporation - initial contribution</p>
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/nokia.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,165 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+html {
+	margin: 10px;
+	/* fixes gray backgrounds when displayed in external browsers */
+	background-color:#FFFFFF;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: plain;
+}
+
+/*	Use sans-serif fonts for all title styles and Nokia blue	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Arial, Helvetica, sans-serif;
+	color: #333;	
+	}
+
+strong{
+	color: #333;	
+	}
+
+/*	For headlines at the top of a view, add space and a gray line underneath	*/
+h2, h3	{
+	padding:10px 0px;	
+	border-bottom:1px solid #BBB;
+	}
+	
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;	
+	}
+
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	color: #333;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 12px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: 1px solid #999;
+	table-layout: auto;
+	}
+
+td, th	{
+	border: 1px solid #999;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+th	{
+	background-color:#999;
+	color:#FFF;
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light gray background */
+div h5, div h4	{
+	padding: 5px;
+	background-color: #EEE;
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top:1px solid #BBB;
+	border-bottom:1px solid #BBB;
+}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+}
+
+/*	red background and white text for things that need fixing before release	*/
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #333;
+	}
+	
+.titleSmall {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+.copyrightStatement {
+	font-size: 11px;
+	color:			#006699;             /* Symbian blue */
+	}
+
+div.Footer table, div.Footer td, div.Footer th {
+	border: 0px none #000;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/release_notes.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release notes</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Release notes</h2>
+
+<h4>API Metadata Editor 1.1.2</h4>
+<ul>
+	<li> <a href="#description">Product description</a></li>
+	<li><a href="#features">Features</a></li>
+	<li><a href="#enhancements">Enhancements</a></li>
+	<li><a href="#newfeatures">New features</a></li>
+	<li><a href="#requirements">System requirements</a></li>
+	<li><a href="#compissues">Compatibility issues</a></li>
+	<li><a href="#issues">Known issues</a></li>
+</ul>
+
+<h3><a name="description"></a>Product description</h3>
+<p>API Metadata Editor is a validating visual editor for editing and creating XML-based Application Programming Interface (API) metadata. The tool hides the complexity of XML behind a Graphical User Interface (GUI) and ensures that XML is formally valid.</p>
+<p>The API properties that can be edited include libraries, release, attributes and extended SDK. The description of what the API is used for will be visible, for example, in the <i>API Query</i> tool and also in common Software Development Kit (SDK) documentation if the API belongs to an SDK.</p>
+<p>The benefit of using API Metadata Editor for managing XML metadata is that it makes entering the metadata entry more efficient and less prone to errors by removing the need for manual work and providing XML validation.</p>
+
+<h3><a name="features"></a>Features</h3>
+<ul>
+	<li>Wizard for creating a new metadata (<i>.metaxml</i>) file.</li>
+	<li>UI for editing and saving a metadata file</li>
+	<li>Possibility to save a file as a metadata file.</li>
+	<li>Opening a metadata file from the file system.</li>
+	<li>Validating the metadata content.</li>
+	<li>XML on an easy-to-use UI.</li>
+	<li>When changing the API name, the metadata file name will be changed automatically.</li>
+	<li>A property file for adding new values to the drop-down menus.</li>
+</ul>
+
+<h3><a name="enhancements"></a>Enhancements/Fixed</h3>
+<ul>
+	<li>When saving a metadata file, the XML is indented.</li>
+	<li>When saving metadata file, XML comments is not lost.</li>
+</ul>
+
+<h3><a name="newfeatures"></a>New features</h3>
+<ul>
+	<li>Support for metadata version 2.0.</li>
+	<li>Conversion from metadata file version 1.0 to version 2.0.</li>
+	<li>Added as a Carbide.c++ IDE menu item (<b>Carbide > API Metadata Editor</b>).</li>
+</ul>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic Requirements:</p>
+<ul>
+	<li>Windows XP</li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/converting_metadata.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Converting metadata files</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Converting metadata files</h2>
+<p>By default, new API metadata files are created in version 2.0 format. This format has some differences compared to the earlier 1.0 version syntax.</p>
+<p>To convert a version 1.0 metadata file into version 2.0: click the <b>Convert to v.2.0</b> button.</p>
+<p><img src="images/convert.png"></p>
+<p>There are only a few differences between the data formats. In version 2.0:</p>
+<ul>
+	<li><i>Subsystem</i> is called <i>Collection</i>.</li>
+	<li>For category, <i>SDK</i> and <i>Domain</i> are replaced by <i>Public</i> and <i>Platform</i>, respectively.</li>
+	<li>Extended SDKs are not supported.</li>
+</ul>
+<p>The naming pattern of the file itself is still the same. For example, if the API directory is <i>phone_parser_api</i>, the metadata filename is <i>phone_parser_api.metaxml</i>.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="edit_metadata.htm">Editing a metadata file</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/create_metadata.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Creating a new metadata file</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Creating a new metadata file</h2>
+<p>If your project does not already contain any metadata (<i>.metaxml</i>) files, create a new file as follows:</p>
+<ol>
+<li>Select <b>File > New > Other...</b>.</li>
+<li>Select <b>Carbide Extension > API metadata file</b>, and click <b>Next</b>.</li>
+<li>Enter the API name and press <b>Finish</b>. <p>The name of the metadata file is generated based on the API name, as shown on the wizard page:</p>
+<p><img src="images/step_11.png"></p>
+<p><b>Note:</b> When naming the Application Programming Interface (API), follow the Symbian S60 naming conventions. For more information on different types of APIs and their naming, look for the guidelines in the <a href="http://www.symbian.com/developer/techlib/v70sdocs/doc_source/DevGuides/EssentialIdioms/NamingConvs.guide.html" target="_new">Symbian Developer Library</a>.</p></li>
+<li>Click <b>Finish</b>. <p>The <i>.metaxml</i> file is created to the Project Explorer view.</p></li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="edit_metadata.htm">Editing a metadata file</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/create_new_project.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Creating a new project</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Creating a new project</h2>
+
+<h5>Before you start</h5>
+<p>Before you can work with metadata files, you must have a project in the Carbide.c++ environment and a folder that contains the metadata files. If you already have a project that you want to use, see the instructions in <a href="import_project.htm">Importing a project</a>.</p>
+<p>To create a new project from scratch, do the following:</p>
+<ol>
+<li>Go to <b>File > New > Project...</b></li>
+<li>Select <b>General > Project</b>, and click <b>Next</b>.</li>
+<li>Type in the name of your project and select the directory where it is stored.</li>
+<li>Click <b>Finish</b>.<p>The new project is created to the Carbide.c++ project view.</p></li>
+<li>To create a folder for the metadata, right-click the project name and select <b>New > Folder</b>.</li>
+<li>Enter a name for the metadata folder.</li>
+<li>Click <b>Advanced</b> and select the <b>Link to folder in the file system</b> option.</li>
+<li>Click <b>Browse</b> to select your project folder that contains the API Metadata.</li>
+<li>Click <b>Finish</b>. <p>The metadata files can now be found in your project where they can be opened and edited, as shown in the following example:</p>
+<p><img src="images/step_07.png"></p></li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="import_project.htm">Importing a project</a></li>
+	<li><a href="edit_metadata.htm">Editing a metadata file</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/edit_metadata.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,165 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Editing a metadata file</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Editing a metadata file</h2>
+<p>You can edit the properties of a metadata file by modifying the name, description and subsystem information of an Application Programming Interface (API), as well as filling in information related to releases, libraries, Software Development Kits (SDKs) and attributes.</p>
+<p>To edit a file:</p>
+<ol>
+<li>To open a metadata file (<i>.metaxml</i>) for editing, do any of the following:
+<ul>
+<li>double-click the file in the project view,</li>
+<li>right-click your project and select <b>Open/Open with > Metadata Editor</b> from the context menu,</li>
+<li>go to <b>File > Open File</b> and browse for the file from your workstation.</li>
+</ul>
+<p>The file is opened for editing, as shown in the following example:</p>
+<img src="images/ME_overview.png">
+<p><b>Important:</b> Some of the displayed fields are different depending on whether your file complies with version 1.0 or version 2.0 of API metadata.</p>
+<p>For instructions on converting files from 1.0 to 2.0, see <a href="converting_metadata.htm">Converting metadata files</a>.</p></li>
+<li>For more information on how to modify the fields, see the following tables:
+<ul>
+<li><a href="edit_metadata.htm#general">General API fields</a></li>
+<li><a href="edit_metadata.htm#edit_release">Release information</a></li>
+<li><a href="edit_metadata.htm#add_libraries">Libraries</a></li>
+<li><a href="edit_metadata.htm#edit_attribs">Attributes</a></li>
+<li><a href="edit_metadata.htm#edit_sdk">Extended SDK (only in v.1.0)</a></li>
+</ul></li>
+<li>To save, click <b>File > Save</b>.</li>
+</ol>
+
+<h3><a name="general"></a>General API fields</h3>
+<p><b>Name</b>, <b>Description</b> and <b>Subsystem</b> fields can be freely edited.</p>
+<p>The <b>ID</b> and <b>Data version</b> fields cannot be modified because they are created automatically. The <b>ID</b> is a unique identifier for the API, which does not change even if its name did.</p>
+<p>The <b>Type</b> field is automatically set to <i>c++</i>.</p>
+<table border="1" cellspacing="1" cellpadding="2">
+<colgroup><col><col></colgroup>
+<tbody>
+<tr>
+<td width="121"><b>Name</b></td>
+<td width="849"><p>If you change the name of the API, the name of the metadata file will be changed as well and the newly renamed file is opened in the view.</p><p>Note that the renamed file is not opened automatically if the file was opened outside the Carbide.c++ IDE workspace by selecting <b>File > Open File...</b>. In this case, the file is closed and a message is displayed prompting
+you to reopen the file manually for further editing.</p>
+</td>
+</tr>
+<tr>
+<td><b>Description</b></td>
+<td><p>A free-form, short description of what the API is for. It will be visible, for example, in the <b>API Query</b> tool in Carbide.c++ IDE, and also in common SDK documentation if the API belongs to a Software Development Kit (SDK).</p>
+</td>
+</tr>
+<tr>
+<td><i>v. 1.0:</i><br>
+<b>Subsystem</b><br>
+<br>
+<i>v. 2.0:</i><br>
+<b>Collection</b>
+</td>
+<td><p>The collection name that owns the API. It has to be the collection directory name in the source hierarchy and found under the package that exports the API.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+<h3><a name="edit_release"></a>Release information</h3>
+<table border="1" cellspacing="1" cellpadding="2">
+<colgroup><col><col></colgroup>
+<tbody>
+<tr>
+<td><b>Since version</b></td>
+<td><p>Indicates the release in which the API was first visible in the specified category.</p><p>The field is mandatory if the release is <i>SDK</i> or <i> Public</i>, and optional if it is <i>Domain</i> or <i>Platform</i>.</p>
+</td>
+</tr>
+<tr>
+<td><b>Category</b></td>
+<td><p>Indicates the category of the API.</p>
+<ul>
+<li><i>v. 1.0: </i><b> SDK</b> <br>
+<i>v. 2.0: </i> <b> Public</b><br>
+<br>
+Published in SDK for ISVs (Independent Software Vendors).</li>
+<li><i>v. 1.0: </i><b> Domain</b> <br>
+<i>v. 2.0: </i> <b> Platform</b> <br>
+<br>
+Published to other architecture domains (ADO) and can be used from the other ADOs.</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td><b>Deprecated</b></td>
+<td><p>If this box is selected, the API is deprecated, meaning it is not in use anymore. Select the S60 platform version from the <b>Deprecated since </b> menu. </p><p>The <b>Deprecated since</b> value has to be bigger than the value in the <b>Since version</b> menu.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+<h3><a name="add_libraries"></a>Libraries</h3>
+<p>This field lists all the libraries needed to use this API.</p>
+<p><b>Note:</b> In Version 2.0 of the API metadata, this is mandatory to define.</p>
+<p>To add new import libraries (.lib files) to the API metadata file:</p>
+<ol>
+<li>Click <b>Add</b> next to the library list.</li>
+<li>In the dialog that opens, enter the name of the library.</li>
+<li>Click <b>OK</b>.</li>
+</ol>
+
+<h3><a name="edit_attribs"></a>Attributes</h3>
+<table border="1" cellspacing="1" cellpadding="2">
+<colgroup><col><col></colgroup>
+<tbody>
+<tr>
+<td><b>HTML Doc provided</b></td>
+<td><p>By default, all SDK APIS should provide documentation in XML format.
+However, in case HTML documentation for an API already exists, the value of
+this field should be <b>Yes</b>.</p></td>
+</tr>
+<tr>
+<td><b>Adaptation</b></td>
+<td><p>This attribute is mandatory and indicates if the API is an adaptation
+API or not. </p><p>Adaptation APIs are interfaces that an S60 licensee needs
+to implement in order to get its platform working.</p></td>
+</tr>
+</tbody>
+</table>
+<h3><a name="edit_sdk"></a>Extended SDK (only in v. 1.0)</h3>
+<p>
+S60 extension SDKs are made to simplify the delivery of non-SDK APIs to 3rd
+party developers. The plug-ins contain APIs that are not in the public SDK
+but are seen important for 3rd parties' business cases. </p><table border="1"
+cellspacing="1" cellpadding="2">
+<colgroup>
+<col>
+<col></colgroup>
+<tbody>
+<tr>
+<td><b>Extended SDK</b></td>
+<td><p>The selection is optional and needs to be specified only if the API
+is a part of an extended SDK.</p>
+</td>
+</tr>
+<tr>
+<td><b>Since version</b></td>
+<td><p>Defines the version since when the API was a part of an extended SDK.</p><p>If the <b>Is Extended SDK</b> box is selected, you must also select the <b>Since version</b> value from the drop-down menu.</p>
+</td>
+</tr>
+<tr>
+<td><b>Deprecated since</b></td>
+<td><p>Defines the version since when the API was deprecated.</p><p>This value has to be bigger than the <b>Since version</b> value.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="create_metadata.htm">Creating a new metadata file</a></li>
+	<li><a href="converting_metadata.htm">Converting metadata files</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/ME_overview.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/convert.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/import_07.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/sample_v1_0.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/sample_v2_0.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/step_07.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/images/step_11.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/import_project.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Importing a project</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Importing a project</h2>
+<p>To import an existing project to the Project Explorer in the Carbide.c++ IDE, do the following:</p>
+<ol>
+<li>Go to <b>File > Import</b>.</li>
+<li>Select <b>Symbian OS > Symbian OS Bld.inf file</b>, and click <b>Next</b>.</li>
+<li>Click <b>Browse</b> to find an existing <i>bld.inf</i> file from your API project, and click <b> Next</b>.</li>
+<li>Select the build configuration (that is, the S60 Platform release version you want to use for your project), and click <b>Next</b>.</li>
+<li>Select the .mmp file to be used and click <b>Next</b>.</li>
+<li>(Optional) Modify the project's properties: API name and the root directory.</li>
+<li>Click <b>Finish</b>. <p>The metadata (<i>.metaxml</i>) files contained in the project are displayed in Project Explorer, as shown in the example below, and are ready for opening and editing.</p>
+<img src="images/import_07.png">
+<p>If the project does not contain any metadata files, see instructions in <a href="create_metadata.htm">Creating a new metadata file</a>.</p></li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="edit_metadata.htm">Editing a metadata file</a></li>
+	<li><a href="create_new_project.htm">Creating a new project</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tasks/tasks.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<title>Tasks</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Tasks</h2> 
+<p>The following topics show you how to work with XML metadata in MetaData Editor:</p> 
+<ul>
+	<li><a href="create_new_project.htm">Creating a new project</a></li>
+	<li><a href="import_project.htm">Importing a project</a></li>
+	<li><a href="create_metadata.htm">Creating a new metadata file</a></li>
+	<li><a href="edit_metadata.htm">Editing a metadata file</a></li>
+	<li><a href="converting_metadata.htm">Converting metadata files</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+  <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/toc.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Table of Contents</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+<h1>API Metadata Editor Online Help</h1>
+<p><a href="release_notes.htm">Release notes</a></p>
+<p><a href="gettingstarted/GS_index.htm">Getting started</a></p>
+
+<p><a href="concepts/concepts.htm">Concepts</a></p>
+<ul>
+	<li><a href="concepts/metadata_file.htm">Metadata file</a></li>
+</ul>
+
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/create_new_project.htm">Creating a new project</a></li>
+	<li><a href="tasks/import_project.htm">Importing a project</a></li>
+	<li><a href="tasks/create_metadata.htm">Creating a new metadata file</a></li>
+	<li><a href="tasks/edit_metadata.htm">Editing a metadata file</a></li>
+	<li><a href="tasks/converting_metadata.htm">Converting metadata files</a></li>
+</ul>
+
+<a href="legal.htm">Legal</a>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tocConcepts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts">
+	
+	<!-- Enter topic entries here for Concepts section of help -->
+	
+	<topic label="Metadata file" href="html/concepts/metadata_file.htm" />
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/tocTasks.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks">
+	
+	<topic label="Creating a new project" href="html/tasks/create_new_project.htm" >
+	</topic>
+	<topic label="Importing a project" href="html/tasks/import_project.htm" >
+	</topic>
+	<topic label="Creating a new metadata file" href="html/tasks/create_metadata.htm" >
+	</topic>
+	<topic label="Editing a metadata file" href="html/tasks/edit_metadata.htm" >
+	</topic>
+ <topic href="html/tasks/converting_metadata.htm" label="Converting metadata files">
+ </topic>
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/html/toolTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!-- 
+	Links tool docs to main TOC for Carbide help in the defined location. 
+	NOTE: Tool name seems to be ignored here for display purposes but needed to
+	make the link_to section work.
+-->
+
+<toc label="API metadata Editor" 
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+
+	<!--
+		Define the TOOL NAME as it should appear in the TOC. The tool.htm page
+		is the cover page for the tool help.
+	-->
+	<topic label="API Metadata Editor" href="html/toc.html" >
+		
+	   <!--
+		   Following the Eclipse guidelines, the tool help is arranged as Concepts,
+		   References, and Tasks. Each has their own associated XML file to make it
+		   easy to edit each section as well as an overview page.
+	   -->
+	   <topic label="Release notes" 
+		   href="html/release_notes.htm" >
+	   </topic>
+	   		   
+	   <topic label="Getting started" 
+		   href="html/gettingstarted/GS_index.htm" >
+	   </topic>
+	   
+	   <topic label="Concepts" href="html/concepts/concepts.htm" >
+		   <link toc="html/tocConcepts.xml" />
+	   </topic>
+	   		   
+	   <topic label="Tasks" href="html/tasks/tasks.htm" >
+		   <link toc="html/tocTasks.xml" />
+	   </topic>
+
+	   <topic label="Legal" 
+		   href="html/legal.htm" >
+	   </topic>
+		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            file="html/toolTOC.xml"
+            primary="true">
+      </toc>
+      <toc
+            file="html/tocConcepts.xml"
+            primary="false"/>
+      <toc
+            file="html/tocTasks.xml"
+            primary="false"/>
+   </extension>
+
+   <extension
+         point="org.eclipse.help.contexts">
+      <contexts
+            file="html/contexts.xml"
+            plugin="com.nokia.s60tools.metadataeditor.help"/>
+   </extension>
+   
+
+</plugin>
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/.DS_Store has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/.DS_Store has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/.DS_Store has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/.DS_Store has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/metadataeditor/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor.doc.user/src/com/nokia/s60tools/metadataeditor/doc/user/MetadataEditorHelpActivator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.metadataeditor.doc.user;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class MetadataEditorHelpActivator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.metadataeditor.doc.user";
+
+	// The shared instance
+	private static MetadataEditorHelpActivator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public MetadataEditorHelpActivator() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static MetadataEditorHelpActivator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.metadataeditor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Thu Oct 09 15:30:42 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Metadata Editor
+Bundle-SymbolicName: com.nokia.s60tools.metadataeditor; singleton:=true
+Bundle-Version: 1.1.2
+Bundle-Activator: com.nokia.s60tools.metadataeditor.MetadataEditorActivator
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.ide,
+ org.eclipse.core.resources,
+ com.nokia.s60tools.util,
+ org.eclipse.help,
+ org.eclipse.core.filesystem
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.metadataeditor,
+ com.nokia.s60tools.metadataeditor.common,
+ com.nokia.s60tools.metadataeditor.core,
+ com.nokia.s60tools.metadataeditor.dialogs,
+ com.nokia.s60tools.metadataeditor.editors,
+ com.nokia.s60tools.metadataeditor.util,
+ com.nokia.s60tools.metadataeditor.wizards,
+ com.nokia.s60tools.metadataeditor.xml
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>Aug 24, 2007</p>	
+
+<h3>Copyright</h3>
+
+<p>
+
+Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+<a href=”http://forum.nokia.com/carbide”>http://forum.nokia.com/carbide</a>.<br>
+
+This product includes software developed by Eclipse Project. 
+<a href=”http://www.eclipse.org”>http://www.eclipse.org</a>.
+
+<p>
+
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/metadata_editor_16.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+productBlurb=Carbide.c++ Extensions - Metadata Editor \n\
+\n\
+Version: 1.1.2\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).\n\
+\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               about.html,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               data/metadataeditor.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.metadataeditor" default="cc" basedir=".">
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+
+	<property name="help.project.name" value="${ant.project.name}.doc.user"/>
+	<property name="feature.project.folder" location="../com.nokia.carbide.extensions.metadataeditor"/>
+	<property name="feature.name" value="MetadataEditor"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+		
+	<!-- Folder definitions -->
+	<property name="carbide.plugins" location="c:/Carbide_internal/plugins"/>
+	<property name="test.folder" location="../com.nokia.s60tools.metadataeditor.tests"/>
+	<property name="dist.folder" location="c:/Carbide_internal/plugins"/>
+	
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.plugins}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+
+		<delete dir="${temp.folder}/bin"/>
+		<mkdir dir="${temp.folder}/bin"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="${temp.folder}/bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/bin" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+		<!-- Copy classes from the temporary folder to bin -->
+		<copy todir="${build.result.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/bin" />
+		</copy>
+		
+		<!-- Delete temporary folder -->
+		<delete dir="${temp.folder}/bin"/>
+	</target>
+	
+	<!-- Clean target -->
+	<target name="clean" description="Clean" depends="clean-test">
+		<delete dir="${build.result.folder}" />
+		<delete>
+			<fileset dir="${dist.folder}" includes="*.jar"/>
+		</delete>
+	</target>
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${dist.folder}/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+	
+	<!-- JAR target -->
+	<target name="jar" depends="build" description="Create JAR">
+	
+		<delete dir="binaries"/>
+		<mkdir dir="binaries"/>
+		
+		<copy todir="binaries" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}" />
+		</copy>
+		
+
+		<!-- Delete temporary folder -->
+		<delete dir="binaries/src"/>
+		<delete dir="binaries/reports"/>
+		<delete dir="binaries/instr"/>
+		<delete dir="binaries/temp.folder"/>
+		<delete dir="binaries/bin"/>
+		<!--<delete dir="binaries/bin"/>-->
+		<delete file="binaries/ccbuild.xml"/>
+		<delete file="binaries/ccbuild3.xml"/>
+		<delete file="binaries/ReleaseNotes.txt"/>
+		<delete file="binaries/.classpath"/>
+		<delete file="binaries/build.properties"/>
+		<delete file="binaries/ccbuild.xml.bak"/>
+		<delete file="binaries/.project"/>
+		
+		
+		<!-- Create JAR -->
+		<zip destfile="${dist.folder}/${jar.filename}" basedir="binaries" />
+	</target>
+
+	<!-- Clean tests target -->
+  	<target name="clean-test" description="Clean test">
+    	<delete>
+      		<fileset dir="${test.folder}" includes="**/*.class" />
+    	</delete>
+    	<delete dir="${instr.folder}"/>
+    	<delete dir="${reports.folder}"/>
+  	</target>
+	
+	<!-- Feature target -->
+	<target name="feature" depends="jar" description="Create feature">
+		<property name="feature.folder" location="${dist.folder}/feature"/>
+		
+		<mkdir dir="${feature.folder}"/>
+		<mkdir dir="${feature.folder}/plugins"/>
+		<mkdir dir="${feature.folder}/features"/>
+				
+		<!-- Create help JAR -->
+		<jar destfile="${carbide.plugins}/${help.jar.filename}" basedir="../${help.project.name}" excludes="src/,.*"/>
+		
+		<!-- Copy feature stuff to the temp folder -->
+		<copy todir="${feature.folder}/features" file="${feature.project.folder}/feature.xml"/>
+		<copy todir="${feature.folder}/features" file="${feature.project.folder}/license.txt"/>
+		
+		<!-- Copy the actual plug-in to the temp folder -->
+		<copy todir="${feature.folder}/plugins" file="${dist.folder}/${jar.filename}"/>
+		
+		<!-- Create the feature zip -->
+		<zip destfile="${dist.folder}/${feature.name}.zip" basedir="${feature.folder}"/>
+		
+		<deltree dir="${feature.folder}"/>
+		
+		<!-- Nightly build -->
+		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp>
+
+		<copy tofile="../../nightly_builds/${feature.name}/${feature.name}-${timestamp}.zip" file="${dist.folder}/${feature.name}.zip"/>
+	</target>
+  	
+	
+	<target name="cc" depends="jar, analyze, feature" description="Build, instrument, run unit tests and analyze code"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/data/metadataeditor.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,34 @@
+#################################################################################
+# SDK Category values. Comma ',' separeted values for Category drop down menu
+# Values must be set for data versions 1.0 and 2.0.
+# Default if not set: category_values_for_1_0 = sdk, domain
+#                   : category_values_for_2_0 = public, platform
+#################################################################################
+category_values_for_1_0=sdk, domain
+category_values_for_2_0=public, platform
+
+#################################################################################
+# SDK Type values. Comma ',' separeted values for Type drop down menu
+# Default if not set: type_values = c++
+# NOTE: Currenty dropdown menu is disabled, adding more selectable values will 
+# need changes to Metadata Editor
+#################################################################################
+# type_values = c++
+
+#################################################################################
+# Default selection for SDK Types. Value must found in this file, in property
+# type_values. If selected value does not found in type_values, or is not set
+# first item on list will be default value
+# Default if not set: default_type = c++
+#################################################################################
+# default_type = c++
+
+#################################################################################
+# SDK Version values. Comma ',' separeted values for Since version and 
+# Deprecated since drop down menus. If erros on parameters, default values is
+# used instead. All parameters must be format: <Integer>.<Integer> and item
+# length must be three characters
+# Default if not set: 
+# sdk_version_values = 0.9, 1.0, 1.1, 1.2, 2.0, 2.1, 2.6, 2.8, 3.0, 3.1, 3.2, 5.0, 5.1, 5.2
+#################################################################################
+sdk_version_values = 0.9, 1.0, 1.1, 1.2, 2.0, 2.1, 2.6, 2.8, 3.0, 3.1, 3.2, 5.0, 5.1, 5.2
Binary file metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_16.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_55.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_editor_75.png has changed
Binary file metadataeditor/com.nokia.s60tools.metadataeditor/icons/metadata_file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+   <extension
+      point="org.eclipse.core.runtime.products"
+      id="product">      
+      <product name="Metadata Editor" application="org.eclipse.ui.ide.workbench" > 
+          <property name="appName" value="Carbide.c++ Extensions - Metadata Editor"/> 
+     </product> 
+     
+   </extension>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="com.nokia.s60tools.metadataeditor.editors.APIMetadataEditor"
+            contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
+            default="true"
+            extensions="metaxml"
+            icon="icons/metadata_file.png"
+            id="com.nokia.s60tools.metadataeditor.editors.APIMetadataEditor"
+            name="Metadata Editor">
+      </editor>
+   </extension>
+   <extension
+         name="Create a Metadata file"
+         point="org.eclipse.ui.newWizards">
+      <category
+            id="com.nokia.s60tools"
+            name="Carbide Extensions"/>
+      <wizard
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.metadataeditor.wizards.APIMetadataFileNewWizard"
+            descriptionImage="icons/metadata_editor_55.png"
+            icon="icons/metadata_file.png"
+            id="com.nokia.s60tools.metadataeditor.wizards.APIMetadataFileNewWizard"
+            name="API metadata file"
+            >
+         <description>Create a Metadata file</description>
+      </wizard>
+   </extension>
+   
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="API Metadata Editor Actions"
+            id="com.nokia.s60tools.metadataeditor.ui.actionSet"
+            label="Metadata Editor"
+            visible="true">
+         <action
+               class="com.nokia.s60tools.metadataeditor.ui.actions.ToolsMenuAction"
+               icon="icons/metadata_editor_16.png"
+               id="com.nokia.s60tools.metadataeditor.ui.actions.ToolsMenuAction"
+               label="API Metadata Editor"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               style="push"
+               tooltip="%view.Tooltip"/>
+         <menu
+               id="com.nokia.carbide.cpp.ui.CarbideMenu"
+               label="Carbide"
+               path="additions">
+            <groupMarker name="additions"/>
+         </menu>
+      </actionSet>
+   </extension>   
+   
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/readme_build.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+To build data folder for configuration file, select "data" folder and right-click:
+ 
+  Export > General > File System
+  
+And Select "To directory" to be target platforms plugins folder, and type
+com.nokia.s60tools.metadataeditor_<feature version number> as directory.
+
+e.g.
+ 
+  C:\Program Files\Nokia\Carbide_2.0.0.014_Internal\plugins\com.nokia.s60tools.metadataeditor_1.1.1
+  
+Make sure that metadataeditor.properties is ticked.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/resources/metadata_template.metaxml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<api id="METADATA_API_ID" dataversion="METADATA_DATA_VERSION">
+  <name>METADATA_API_NAME</name>
+  <description>METADATA_API_DESCRIPTION</description>
+  <type>METADATA_API_TYPE</type>
+  <subsystem>METADATA_API_SUBSYSTEM</subsystem>
+  <libs>
+    <lib name="METADATA_LIB_NAME" />
+  </libs>
+  <release category="METADATA_RELEASE_CATEGORTY" sinceversion="METADATA_RELEASE_SINCE" deprecatedsince="METADATA_RELEASE_DEPRECATED_SINCE"/>
+  <attributes>
+     <!-- This indicates wether the api provedes separate html documentation -->
+     <!-- or is the additional documentation generated from headers. -->
+     <!-- If you are unsuere then the value is "no" -->
+     <htmldocprovided>METADATA_HTML_DOC_PROVIDED</htmldocprovided>
+     <adaptation>METADATA_ADAPTATION<adaptation/>
+     <extendedsdk sinceversion="METADATA_EXTENDED_SDK_SINCEVERSION" deprecatedsince="METADATA_EXTENDED_SDK_DEPRECATED_SINCE"/>
+  </attributes>
+</api>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorActivator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+
+package com.nokia.s60tools.metadataeditor;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.metadataeditor.common.ProductInfoRegistry;
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class MetadataEditorActivator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.metadataeditor";	
+	public static final String METADATA_EDITOR_ICON = "metadata_editor_16.png";
+	public static final String METADATA_FILE_ICON = "metadata_file.png";
+	public static final String METADATA_LARGE_ICON = "metadata_editor_75.png";
+
+
+	// The shared instance
+	private static MetadataEditorActivator plugin;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;	
+	
+	/**
+	 * The constructor
+	 */
+	public MetadataEditorActivator() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		pluginInstallLocation = getPluginInstallPath();
+		//This startup debug println has been left into the code in purpose
+		System.out.println("pluginInstallLocation: " +  pluginInstallLocation); //$NON-NLS-1$
+
+		// Call to getImagesPath requires that getPluginInstallPath() is
+		// called beforehand.
+		String imagesPath = getImagesPath();
+		
+		//This startup debug println has been left into the code in purpose
+		System.out.println("imagesPath: " +  imagesPath); //$NON-NLS-1$
+		
+		initializeSettings();
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Initialized tool settings.
+	 */
+	private void initializeSettings() {
+		String propPath = null;
+		try {
+			Properties props = new Properties();
+			propPath = getPropertiesPath();
+			System.out.println("Initializin settings from: "  +propPath);
+			MetadataEditorConsole.getInstance().println("Initializin settings from: "  +propPath );
+			
+			FileInputStream in = new FileInputStream(propPath);
+			props.load(in);	
+			MetadataEditorPropertiesSetter propsSetter = new MetadataEditorPropertiesSetter();
+			boolean ok = propsSetter.setProperties(props);
+			if(!ok){
+				MetadataEditorConsole.getInstance().println(
+						"Erros while loading properties from file: "
+						+propPath + ". Erros was: "
+						+propsSetter.getErrors() );
+				showInformationDialog("Errors while loading properties", 
+						"Erros while loading properties from file: "
+						+propPath + ".\n"
+						+propsSetter.getErrors() );
+			}
+		} catch (FileNotFoundException e) {
+			MetadataEditorConsole.getInstance().println(
+					"Can't found settings file: " +propPath + " Using defaults instead." );
+			System.out.println("Can't found settings file: " +propPath + " Using defaults instead." );					
+			e.printStackTrace();
+		} catch (Exception e) {
+			MetadataEditorConsole.getInstance().println(
+					"Errors opening settings file: " +propPath 
+					+ " Using defaults instead. Error was: " +e.getMessage() );
+			System.out.println("Errors opening settings file: " +propPath 
+					+ " Using defaults instead. Error was: " +e.getMessage() );					
+			e.printStackTrace();
+		}
+		
+	}
+
+	
+	/**
+	 * Gets properties filename and path relative to given plugin install path.
+	 * @return Path were properties are located.
+	 */
+	private String getPropertiesPath(){
+		URL url = Platform.getInstallLocation().getURL();
+		String bundleLocation = getBundle().getLocation();
+		
+		String startIndStr = "update@";
+		String endIndStr = ".jar";
+		int startIndx = bundleLocation.indexOf(startIndStr) +startIndStr.length();
+		int endIndx = bundleLocation.indexOf(endIndStr);
+		//Needed for running in Eclipse during develoment. 
+		//If running in Carbide.c++ this is not needed
+		if(endIndx == -1){
+			endIndx = bundleLocation.lastIndexOf('/');
+		}		
+		bundleLocation = bundleLocation.substring( startIndx, endIndx );
+		
+		String path = url.getPath() + bundleLocation 
+			+ File.separatorChar
+			+ ProductInfoRegistry.getDataDirectoryName()
+			+ File.separatorChar
+			+ ProductInfoRegistry.getPropertiesFileName(); 
+								
+		File f = new File(path);
+		return f.getAbsolutePath();
+		
+	}		
+	
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static MetadataEditorActivator getDefault() {
+		return plugin;
+	}
+	
+	
+	public String getPluginInstallPath() throws IOException{
+		 // URL to the plugin's root ("/")
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		//	Converting into local path
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		//	Getting install location in correct form
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+				
+		return pluginInstallLocation;		
+	}
+	
+	/**
+	 * Gets images path relative to given plugin install path.
+	 * @return Path were image resources are located.
+	 */
+	private String getImagesPath(){
+		return pluginInstallLocation
+				+ File.separatorChar
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}	
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
+     */
+    protected void initializeImageRegistry(ImageRegistry imgReg) {
+    	
+    	//
+    	// Storing images to plugin's image registry
+    	//
+    	Display disp = Display.getCurrent();
+    	Image img = null;
+    	
+    	img = new Image( disp, getImagesPath() + "\\" +METADATA_EDITOR_ICON );        	 //$NON-NLS-1$
+        imgReg.put( METADATA_EDITOR_ICON, img );
+
+    	img = new Image( disp, getImagesPath() + "\\" +METADATA_FILE_ICON );        	 //$NON-NLS-1$
+        imgReg.put( METADATA_FILE_ICON, img );
+
+    	img = new Image( disp, getImagesPath() + "\\" +METADATA_LARGE_ICON);        	 //$NON-NLS-1$
+        imgReg.put( METADATA_LARGE_ICON, img );
+    	
+    }	
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+	
+	/**
+	 * Returns image descriptor for the given key from the plugin's image registry.
+	 * @param key Key to search descriptor for.
+	 * @return Image descriptor for the given key from the plugin's image registry.
+	 */
+	public static ImageDescriptor getImageDescriptorForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}	
+
+	/**
+	 * Returns image for the given key from the plugin's image registry.
+	 * @param key Key to search image for.
+	 * @return Image for the given key from the plugin's image registry.
+	 */
+	public static Image getImageForKey( String key ){
+    	ImageRegistry imgReg = getDefault().getImageRegistry();    	
+    	return  imgReg.get(key);		
+	}	
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return Currently active workbench page.
+	 */
+	public static IWorkbenchPage getCurrentlyActivePage(){
+		return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return The shell of the currently active workbench window..
+	 */
+	public static Shell getCurrentlyActiveWbWindowShell(){
+		IWorkbenchPage page = getCurrentlyActivePage();
+		if(page != null){
+			return page.getWorkbenchWindow().getShell();
+		}
+		return null;
+	}	
+	
+	/**
+	 * Show an information dialog
+	 * @param title
+	 * @param message
+	 */
+	private void showInformationDialog( String title, String message) {
+		Shell sh = getCurrentlyActiveWbWindowShell();
+		MessageDialog.openInformation(sh, title, message);
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorHelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor;
+
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class MetadataEditorHelpContextIDs {
+
+	/**
+	 * The plug-in ID. Copy from MetadataEditorHelpActivator.PLUGIN_ID
+	 * to here to avoid runtime dependency to help project 
+	 */	 
+	private static final String METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID = "com.nokia.s60tools.metadataeditor.help";
+	
+	
+	/**
+	 * ID to Metadata Editor Help TOC
+	 */
+    public static final String METADATA_EDITOR_HELP_TOC = 
+  		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_TOC";
+    
+    /**
+     * ID to Editing and saving metadata file
+     */
+    public static final String METADATA_EDITOR_HELP_EDIT = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_EDIT";
+
+    /**
+     * ID to Editing and saving metadata file # Edit Extended sdk
+     */    
+    public static final String METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK";
+    /**
+     * ID to Editing and saving metadata file # Edit Attributes
+     */    
+    public static final String METADATA_EDITOR_HELP_EDIT_ATTRIBS = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_EDIT_ATTRIBS";
+
+    /**
+     * ID to Editing and saving metadata file # Edit Libs
+     */        
+    public static final String METADATA_EDITOR_HELP_EDIT_LIBS = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_EDIT_LIBS";
+
+    /**
+     * ID to Editing and saving metadata file # Edit Release
+     */        
+    public static final String METADATA_EDITOR_HELP_EDIT_RELEASE = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_EDIT_RELEASE";
+    
+    /**
+     * ID to Creating a new metadata file
+     */        
+    public static final String METADATA_EDITOR_HELP_CREATE = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_CREATE";
+    
+    /**
+     * ID to Creating a new project and link to a filesystem
+     */        
+    public static final String METADATA_EDITOR_HELP_NEW_PROJECT = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_NEW_PROJECT";
+    
+    /**
+     * ID to Import the project
+     */        
+    public static final String METADATA_EDITOR_HELP_IMPORT_PROJECT = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_IMPORT_PROJECT";
+        
+
+    /**
+     * ID to convert to v. 2.0
+     */        
+    public static final String METADATA_EDITOR_HELP_CONVERT_FILES = 
+		  METADATA_EDITOR_HELP_PROJECT_PLUGIN_ID +".METADATA_EDITOR_HELP_CONVERT_FILES";
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/MetadataEditorPropertiesSetter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,198 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor;
+
+import java.util.Properties;
+import java.util.Vector;
+
+import com.nokia.s60tools.metadataeditor.core.MetadataEditorSettings;
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+import com.nokia.s60tools.metadataeditor.xml.MetadataNotValidException;
+import com.nokia.s60tools.metadataeditor.xml.MetadataXML;
+
+/**
+ * Helper class to set values from metadataeditor.properties to MetadataEditorSettings
+ *
+ */
+public class MetadataEditorPropertiesSetter {
+	
+	private static final String ERROR_MSG_EMPTY_VALUE_SUFFIX = " values from metadataeditor.properties, values was empty, using defaults instead.";
+	
+	public static final String CATEGORY_KEY_1_0 ="category_values_for_1_0";
+	public static final String CATEGORY_KEY_2_0 ="category_values_for_2_0";
+	public static final String TYPE_KEY ="type_values";
+	public static final String DEFAULT_TYPE_KEY ="default_type";
+	public static final String SDK_VERSION_KEY ="sdk_version_values";
+	
+	private boolean settingWasOK = true;
+	private StringBuffer errors = new StringBuffer();
+	
+	/***
+	 * Set values from metadataeditor.properties to MetadataEditorSettings
+	 * 
+	 * Setting category_values, type_values, default_type and sdk_version_values
+	 * 
+	 * @param props metadataeditor.properties Properties read
+	 * @return true if all settings was ok, false if errors occur. 
+	 * 	Use this.getErrors() to see errors if occur.
+	 */
+	public boolean setProperties(Properties props){
+	
+		setCategorys(props);
+		setTypes(props);
+		setSDKs(props);
+	
+		return settingWasOK;
+	}
+	
+	private void setCategorys(Properties props){
+		try {
+			if(props.containsKey(CATEGORY_KEY_1_0) && props.containsKey(CATEGORY_KEY_2_0)){
+				String cats10 = props.getProperty(CATEGORY_KEY_1_0);
+				String [] values10 = getValues(cats10);
+				String cats20 = props.getProperty(CATEGORY_KEY_2_0);
+				String [] values20 = getValues(cats20);
+				
+				if(values10.length > 0 && values20.length > 0){
+					MetadataEditorSettings.getInstance().setCategoryValues(values10, values20);
+				}
+				else{
+					MetadataEditorConsole.getInstance().println(
+							"Could not set SDK Category" +ERROR_MSG_EMPTY_VALUE_SUFFIX);
+				}
+			}
+		} catch (Exception e) {
+			settingWasOK = false;
+			errors.append("Could not set SDK Category values, using default values instead.\n");
+			MetadataEditorConsole.getInstance().println(
+					"Could not set SDK Category values. Error was: " +e.getMessage());						
+			e.printStackTrace();
+		}
+	}
+
+
+	
+	private void setTypes(Properties props){
+		try {
+			if(props.containsKey(TYPE_KEY)){
+				String cats = props.getProperty(TYPE_KEY);
+				String [] values = getValues(cats);
+				if(values.length > 0){
+					MetadataEditorSettings.getInstance().setTypeValues(values);
+					if(props.containsKey(DEFAULT_TYPE_KEY)){
+						MetadataEditorSettings.getInstance().
+							setDefaultType(props.getProperty(DEFAULT_TYPE_KEY).trim());
+					}
+				}else{
+					MetadataEditorConsole.getInstance().println(
+						"Could not set SDK Type " +ERROR_MSG_EMPTY_VALUE_SUFFIX);
+				}
+			}
+		} catch (Exception e) {
+			settingWasOK = false;
+			errors.append("Could not set SDK Type values, using default values instead.\n");
+			MetadataEditorConsole.getInstance().println(
+					"Could not set SDK Type values. Error was: " +e.getMessage());			
+			
+			e.printStackTrace();
+		}		
+	}
+	private void setSDKs(Properties props){
+		try {
+			if(props.containsKey(SDK_VERSION_KEY)){
+				String cats = props.getProperty(SDK_VERSION_KEY);
+				String [] values = getValues(cats);
+				if(values.length > 0){
+					for (int i = 0; i < values.length; i++) {
+						if(!MetadataXML.isVersionNumberValid(values[i]) ){
+							throw new MetadataNotValidException("Value: '" +values[i] +"', from: '" +SDK_VERSION_KEY + "' was not valid.");
+						}
+					}
+					//in SDK lists first value is blanc
+					String [] valuesWithBlanc = new String [values.length +1 ];
+					valuesWithBlanc[0] = "";
+					for (int i = 1; i < valuesWithBlanc.length; i++) {
+						valuesWithBlanc[i] = values[i-1];
+					}
+					MetadataEditorSettings.getInstance().setSDKVersionValues(valuesWithBlanc);
+				}else{
+					MetadataEditorConsole.getInstance().println(
+						"Could not set SDK Version" +ERROR_MSG_EMPTY_VALUE_SUFFIX);
+				}
+			}
+		} catch (MetadataNotValidException e) {
+			settingWasOK = false;
+			errors.append("Could not set SDK Version values, using default values instead.\n");
+			MetadataEditorConsole.getInstance().println(
+					"Could not set SDK Version values. Error was: " +e.getMessage());
+		}
+		catch (Exception e) {
+			settingWasOK = false;
+			errors.append("Could not set SDK Version values, using default values instead.\n");
+			MetadataEditorConsole.getInstance().println(
+					"Could not set SDK Version values. Error was: " +e.getMessage());			
+			e.printStackTrace();
+		}		
+	}
+	
+	private String [] getValues(String values) {
+		Vector<String> v = new Vector<String>();
+		int beginIndex = 0;
+		int endIndex = values.indexOf(",");
+		String value;
+		
+		//If there is more than one value
+		if(endIndex != -1){
+			while( endIndex != -1 ){
+				value = new String( values.substring(beginIndex, endIndex) );
+				//Making sure that there is no <,> or & chars. Editor must not crash for illeagal values.
+				value = MetadataXML.removeForbiddenChars(value).trim();
+				v.add(value);
+				beginIndex = endIndex + 1;
+				endIndex = values.indexOf(",", endIndex+1);
+				//Adding last value after last ',' 
+				if(beginIndex < values.length() && endIndex == -1){
+					value = new String( values.substring(beginIndex, values.length()) );
+					value = MetadataXML.removeForbiddenChars(value).trim();
+					v.add(value);
+				}
+			}
+		}
+		//If only one value exist
+		else{
+			if(values.trim().length() > 0){
+				v.add(MetadataXML.removeForbiddenChars(values.trim()));
+			}
+		}
+		return v.toArray(new String[0]);
+	}
+
+	/**
+	 * Errors.
+	 * @return erros occurded while setting values to MetadataEditorSettings. 
+	 * 	Empty if no errors occurded. 
+	 */
+	public String getErrors() {
+		return errors.toString();
+	}
+	
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/Product.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.common;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Product {
+
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.metadataeditor.common.product"; //$NON-NLS-1$
+	
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Product() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/ProductInfoRegistry.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.common;
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information in one place.
+ */
+public class ProductInfoRegistry {
+
+	private static final String PRODUCT_NAME = Product.getString("ProductInfoRegistry.Product_Name"); //$NON-NLS-1$
+	private static final String CONSOLE_WINDOW_NAME = PRODUCT_NAME + " " + Product.getString("ProductInfoRegistry.Console_Window_Name_Postfix");	 //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.Images_Directory");	 //$NON-NLS-1$
+	private static final String RESOURCES_RELATIVE_PATH = Product.getString("ProductInfoRegistry.Resources_Relative_Path");	 //$NON-NLS-1$
+	private static final String DATA_DIRECTORY = Product.getString("ProductInfoRegistry.Data_Directory");	 //$NON-NLS-1$
+	private static final String PROPERTIES_FILE_NAME = Product.getString("ProductInfoRegistry.Properties_File_Name");	 //$NON-NLS-1$
+	private static final String METADATA_TEMPLATE_FILE_NAME = Product.getString("ProductInfoRegistry.Metadata_Template_File_Name");	 //$NON-NLS-1$
+	
+	
+	/**
+	 * @return Returns the CONSOLE_WINDOW_NAME.
+	 */
+	public static String getConsoleWindowName() {
+		return CONSOLE_WINDOW_NAME;
+	}
+	/**
+	 * @return Returns the PRODUCT_NAME.
+	 */
+	public static String getProductName() {
+		return PRODUCT_NAME;
+	}
+	
+	/**
+	 * @return Returns the IMAGES_DIRECTORY.
+	 */
+	public static String getImagesDirectoryName() {
+		return IMAGES_DIRECTORY;
+	}
+	/**
+	 * @return Returns the RESOURCES_RELATIVE_PATH.
+	 */
+	public static String getResourcesRelativePath() {
+		return RESOURCES_RELATIVE_PATH;
+	}
+	
+	/**
+	 * @return Returns the METADATA_TEMPLATE_FILE_NAME.
+	 */
+	public static String getMetadataTemplateFileName() {
+		return METADATA_TEMPLATE_FILE_NAME;
+	}	
+		
+	/**
+	 * @return Returns the DATA_DIRECTORY.
+	 */
+	public static String getDataDirectoryName() {
+		return DATA_DIRECTORY;
+	}	
+	/**
+	 * @return Returns the PROPERTIES_FILE_NAME.
+	 */
+	public static String getPropertiesFileName() {
+		return PROPERTIES_FILE_NAME;
+	}		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/common/product.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+ProductInfoRegistry.Product_Name=Metadata Editor
+ProductInfoRegistry.Console_Window_Name_Postfix=Console
+ProductInfoRegistry.Images_Directory=icons
+ProductInfoRegistry.Data_Directory=data
+ProductInfoRegistry.Properties_File_Name=metadataeditor.properties
+ProductInfoRegistry.Resources_Relative_Path=resources
+ProductInfoRegistry.Metadata_Template_File_Name=metadata_template.metaxml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/core/MetadataEditorSettings.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.core;
+
+import com.nokia.s60tools.metadataeditor.xml.MetadataXML;
+
+/**
+ * MetadataEditorSettings. Values for drop down menu on Metadata Editor.
+ * 
+ * Use MetadataEditorPropertiesSetter to set Values on startup
+ */
+public class MetadataEditorSettings {
+	
+	private static MetadataEditorSettings instance;
+	
+	//Default values used if not set, or something wrong with parameter file
+	public static final String [] CATEGORY_VALUES_FOR_1_0 = {"sdk" ,"domain"};
+	public static final String [] CATEGORY_VALUES_FOR_2_0 = {"public" ,"platform"};
+	private String [] categoryValuesFor_1_0;
+	private String [] categoryValuesFor_2_0;
+	private String [] typeValues = {"c++"};
+	private String defaultType = "c++";
+	private int defaultTypeIndex = 0;
+	private String [] SDKVersionValues = {"", "0.9", "1.0", "1.1", "1.2", "2.0", "2.1", "2.6", "2.8", 
+			"3.0", "3.1", "3.2", "5.0", "5.1", "5.2"};
+
+	
+	/**
+	 * Private construction
+	 *
+	 */
+	private MetadataEditorSettings(){
+		init();
+	}	
+	
+	/**
+	 * Set default values
+	 */
+	private void init() {
+		categoryValuesFor_1_0 = CATEGORY_VALUES_FOR_1_0;
+		categoryValuesFor_2_0 = CATEGORY_VALUES_FOR_2_0;
+	}
+
+	/**
+	 * Only instance of Settings
+	 * @return MetadataEditorSettings instance
+	 */
+	public static MetadataEditorSettings getInstance(){
+		if(instance == null){
+			instance = new MetadataEditorSettings();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Get category values by data version 
+	 * @param SDKVersion use {@link MetadataXML#DATA_VERSION_1_0} for 1.0 and
+	 * {@link MetadataXML#DATA_VERSION_2_0} for 2.0.
+	 * @return values for category
+	 */
+	public String[] getCategoryValues(String SDKVersion) {
+		if(SDKVersion.equals(MetadataXML.DATA_VERSION_1_0)){
+			return categoryValuesFor_1_0;
+		}
+		else{
+			return categoryValuesFor_2_0; 
+		}
+	}
+
+	public void setCategoryValues(String[] categoryValuesFor1_0, String[] categoryValuesFor2_0) {
+		this.categoryValuesFor_1_0 = categoryValuesFor1_0;
+		this.categoryValuesFor_2_0 = categoryValuesFor2_0;
+	}
+
+	public String[] getSDKVersionValues() {
+		return SDKVersionValues;
+	}
+
+	public void setSDKVersionValues(String[] versionValues) {
+		this.SDKVersionValues = versionValues;
+	}
+
+	public String[] getTypeValues() {
+		return typeValues;
+	}
+
+	public void setTypeValues(String[] typeValues) {
+		this.typeValues = typeValues;
+	}
+
+	public String getDefaultType() {
+		return defaultType;
+	}
+
+	/**
+	 * Setting default value. If given defaultType does not found in
+	 * this.typeValues not setting it, but first item on this.typeValues
+	 * @param defaultType
+	 */
+	public void setDefaultType(String defaultType) {
+		
+		boolean found = false;
+		if(defaultType != null && typeValues.length > 0){
+			for(int i=0; i<typeValues.length; i++){
+				if(defaultType.equals(typeValues[i])){
+					this.defaultType = defaultType;
+					this.defaultTypeIndex = i;
+					found = true;
+					break;
+				}
+			}			
+		}
+		//If there is only one possible item, setting it as default
+		else if(!found ){
+			this.defaultType = typeValues[0];
+			this.defaultTypeIndex = 0;
+		}
+	}
+
+	public int getDefaultTypeIndex() {
+		return defaultTypeIndex;
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/dialogs/AddLibraryDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog for adding libraries to script
+ */
+public class AddLibraryDialog extends Dialog {
+		
+
+	/**
+	 * List box dialog text control for showing the content.
+	 */
+	private Text listBoxContentTextControl;
+	private String text;
+	
+
+
+
+
+	public AddLibraryDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	public AddLibraryDialog(IShellProvider parentShell) {
+		super(parentShell);
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        // Creating just OK button
+        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+                true);
+        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,
+                false);     
+		Button ok = getButton(IDialogConstants.OK_ID);
+		ok.setEnabled(false);
+        
+    }
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText("Add library");
+    }    
+    
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+	
+		//
+		//Adding custom controls
+		//
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);
+	
+		GridLayout gdl2 = new GridLayout(cols, false);
+		GridData gd2 = new GridData(GridData.FILL_BOTH);
+	
+		dialogAreaComposite.setLayoutData(gd2);
+		listBoxContentTextControl = new Text(dialogAreaComposite, SWT.LEFT | SWT.BORDER | SWT.BORDER);	
+		dialogAreaComposite.setLayout(gdl2);
+		listBoxContentTextControl.setLayoutData(gd2);
+		listBoxContentTextControl.setEnabled(true);
+		
+		Label label = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		label.setText("Library file type must be .lib");
+				
+		listBoxContentTextControl.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				text = listBoxContentTextControl.getText();
+				if(text != null && text.endsWith(".lib") && text.trim().length() >= 5){
+					//save is alloved, otherwise not
+					Button ok = getButton(IDialogConstants.OK_ID);
+					ok.setEnabled(true);	
+				}else{
+					Button ok = getButton(IDialogConstants.OK_ID);
+					ok.setEnabled(false);						
+				}
+			}
+		});	 				
+		return dialogAreaComposite;
+	}    
+	
+	public int open(){
+		text = "";
+		return super.open();
+	}
+	
+	public String getText(){
+		return text;
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/dialogs/RenameFileConfirmStatusDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.dialogs;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class RenameFileConfirmStatusDialog extends StatusDialog {
+
+	
+	private IPath oldFile = null;
+	private IPath newFile = null;
+
+	public RenameFileConfirmStatusDialog(Shell parent) {
+		super(parent);
+	}
+	public RenameFileConfirmStatusDialog(Shell parent, IPath oldFile, IPath newFile) {
+		super(parent);
+		this.oldFile = oldFile;
+		this.newFile = newFile;
+		setTitle("Delete old file");
+		
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite composite = (Composite) super.createDialogArea(parent);		
+	
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		composite.setLayout(gdl);
+		composite.setLayoutData(gd);
+		
+		Label label = new Label(composite,SWT.HORIZONTAL);
+		label.setText("New file was created with name: " +newFile.lastSegment()
+				+"\nDelete " +oldFile.lastSegment() +"?");
+				
+			
+		return composite;
+	}    	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/editors/APIMetadataEditor.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,1761 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+package com.nokia.s60tools.metadataeditor.editors;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.NoSuchAlgorithmException;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.ProgressMonitorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+import com.nokia.s60tools.metadataeditor.MetadataEditorActivator;
+import com.nokia.s60tools.metadataeditor.MetadataEditorHelpContextIDs;
+import com.nokia.s60tools.metadataeditor.dialogs.AddLibraryDialog;
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+import com.nokia.s60tools.metadataeditor.util.MetadataFilenameGenerator;
+import com.nokia.s60tools.metadataeditor.xml.APIIDGenerator;
+import com.nokia.s60tools.metadataeditor.xml.MetadataNotValidException;
+import com.nokia.s60tools.metadataeditor.xml.MetadataXML;
+import com.nokia.s60tools.metadataeditor.xml.MetadataXMLParser;
+
+/**
+ * Editor class for API Metadata Editor
+ */
+public class APIMetadataEditor extends MultiPageEditorPart implements
+		IResourceChangeListener {
+
+	private static final String UNEXPECTED_VALIDITY_ERROR_MSG = "Unexpected validity error occurded when setting values: ";
+	private static final String SUBSYSTEM =  "Subsystem: ";
+	private static final String COLLECTION = "Collection:";
+
+
+	/**
+	 * Fixed Width and height parameters to set UI components 
+	 * precisely 
+	 */
+	
+	private static final int DEFAULT_GROUP_WIDTH = 520;
+	
+	private static final int LIBS_FIELD_HEIGHT = 8;
+
+	private static final int DESCRIPTION_TEXT_FIELD_LINES = 5;
+
+	private static final int V_SCROLLBAR_WIDHT = 16;
+
+	private static final int VERSION_TXT_DEFAULT_WIDTH = 19;
+
+	private static final int DEFAULT_TEXT_AREA_WIDTH = 450;
+
+	private static final int API_ID_TEXT_AREA_WIDTH = 232;
+
+	private static final int BUTTON_WIDTH = 42;
+
+	private static final int BUTTON_HEIGHT = 25;
+
+	private static final int TYPE_COMBO_WIDTH = 47;
+
+	private static final int CATEGORY_COMBO_WIDTH = 57;
+
+	/**
+	 * Metadata XML representing this editor view
+	 */
+	private MetadataXML xml;
+
+	//Editor window widgets
+	private Text APINameTxt;
+
+	private Text APIIDTxt;
+
+	private Text descTxt;
+
+	private Text subsytemTxt;
+
+	private Combo releaseCombo;
+
+	private Combo categoryCombo;
+
+	private Button isDeprecatedButton;
+
+	private Combo releaseDeprecatedCombo;
+
+	private List libs;
+
+	private Button deleteButton;
+
+	private Button addButton;
+
+	private Combo HTMLDOCCombo;
+
+	private Combo adaptationCombo;
+
+	private Button isExtendedButton;
+
+	private Combo extendedCombo;
+
+	private Combo extendedDeprecatedCombo;
+
+	private Color white;
+
+	/**
+	 * if editor data is modified, data is dirty
+	 */
+	private boolean isDirty;
+
+	private Text dataVersionTxt;
+
+	private Label subsystemLabel;
+	private Button convertBtn = null;
+
+	/**
+	 * Creates a multi-page editor example.
+	 */
+	public APIMetadataEditor() {
+		super();
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+	}
+
+	/**
+	 * Adding context sensitive help id:s to components
+	 */
+	private void setHelps() {
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(APINameTxt,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(descTxt,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(subsytemTxt,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(releaseCombo,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_RELEASE);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(categoryCombo,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_RELEASE);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(isDeprecatedButton,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_RELEASE);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(
+				releaseDeprecatedCombo,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_RELEASE);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(libs,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_LIBS);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(deleteButton,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_LIBS);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(addButton,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_LIBS);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(HTMLDOCCombo,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_ATTRIBS);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(adaptationCombo,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_ATTRIBS);
+
+
+	}
+
+	/**
+	 * Set context sensitive help id:s for extended SDK parts and convert to 2.0 button.
+	 * Used only when dataversion is 1.0.
+	 */
+	private void setHelpsFor10version() {
+		PlatformUI
+				.getWorkbench()
+				.getHelpSystem()
+				.setHelp(
+						isExtendedButton,
+						MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK);
+
+		PlatformUI
+				.getWorkbench()
+				.getHelpSystem()
+				.setHelp(
+						extendedCombo,
+						MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK);
+
+		PlatformUI
+				.getWorkbench()
+				.getHelpSystem()
+				.setHelp(
+						extendedDeprecatedCombo,
+						MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_EDIT_EXTENDED_SDK);
+		
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(convertBtn,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_CONVERT_FILES);		
+				
+	}
+
+	/**
+	 * Create Metadata Editor page.
+	 * 
+	 * Creating all Widgets and setting data from this.xml to them.
+	 * Creating listeners for selected Widgets. 
+	 * 
+	 */
+	private void createAPIMetadataEditorPage() {
+
+
+		final Composite composite = new Composite(getContainer(), SWT.SIMPLE);
+
+		final Shell shell = composite.getShell();
+
+		String[] SDKVersionValues = xml.getSDKVersionValues();
+		String[] categoryValues = xml.getCategoryValues(xml.getDataVersion());
+		String[] noYesValues = xml.getNoYesValues();
+		String[] typeValues = xml.getTypeValues();
+
+		GridLayout gridLayout = new GridLayout(2, false);
+		gridLayout.marginRight = 20;
+
+		composite.setLayout(gridLayout);
+		RGB rgbWhite = new RGB(255, 255, 255);
+		white = new Color(null, rgbWhite);
+		composite.setBackground(white);
+
+		//Create part wheres API informations
+		createAPIInformationPart(composite, typeValues);
+
+		//Create part where is release information
+		createReleasePart(composite, SDKVersionValues, categoryValues);
+
+		//Create libs and attributes part, Composite is needed for extended SDK part
+		Composite attrsAndExtdSDKComposite = createLibsAndAttributesPart(
+				composite, shell, noYesValues);
+
+		//Extended SDK only occurs in version 1.0, with 1.0 data version, 
+		//also conversion part will be drawn. 
+		if(xml.getDataVersion().equals(MetadataXML.DATA_VERSION_1_0)){
+			
+			//Extended SDK part
+			Composite extComposite = createExtendedSDKPart(SDKVersionValues, attrsAndExtdSDKComposite);
+			//Conversion to data version 2.0 part
+			createConvertTo2_0Part(composite, extComposite);
+			//Help id:s to data version 1.0
+			setHelpsFor10version();
+			
+		}
+		int index = addPage(composite);
+		composite.pack();
+		setPageText(index, "Metadata Editor");
+	}
+
+	/**
+	 * Create part of UI where are Libs and attributes: Libs, HTML Doc and Adaptation
+	 * @param composite
+	 * @param shell
+	 * @param noYesValues
+	 * @return Composite to add Extended SDK part in same composite if needed
+	 */
+	private Composite createLibsAndAttributesPart(final Composite composite,
+			final Shell shell, String[] noYesValues) {
+		//LIBS & ATTRIBUTES COMPOSITION
+		Composite libs_and_attrs_Composite = new Composite(composite,
+				SWT.SIMPLE);
+
+		GridLayout libs_and_attrs_Layout = new GridLayout(2, false);
+		libs_and_attrs_Layout.marginWidth = 0;
+		libs_and_attrs_Layout.marginHeight = 0;
+		libs_and_attrs_Layout.horizontalSpacing = 0;//THIS IS HOW CLOSE IT IS TO PREV 
+
+		libs_and_attrs_Composite.setLayout(libs_and_attrs_Layout);
+		libs_and_attrs_Composite.setBackground(white);
+		GridData libs_and_attrs_GridData = new GridData(
+				GridData.HORIZONTAL_ALIGN_FILL);
+		libs_and_attrs_GridData.horizontalSpan = 2;
+		libs_and_attrs_Composite.setLayoutData(libs_and_attrs_GridData);
+
+		//LIBS
+		final Group libsGroup = new Group(libs_and_attrs_Composite,
+				SWT.SHADOW_NONE);
+		libsGroup.setText("Libs:");
+		GridLayout libsGrid = new GridLayout(2, false);
+
+		libsGroup.setBackground(white);
+		GridData libsGridData = new GridData();
+		libsGroup.setLayout(libsGrid);
+		libsGroup.setLayoutData(libsGridData);
+
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL
+				| SWT.H_SCROLL;
+		libs = new List(libsGroup, listBoxStyleBits);
+
+		if (!xml.getLibs().isEmpty()) {
+			Vector<String> v = xml.getLibs();
+			String xmlLibs[] = v.toArray(new String[0]);
+			libs.setItems(xmlLibs);
+			libs.select(0);
+		}
+
+		int listWidth = DEFAULT_TEXT_AREA_WIDTH / 3;
+		GridData listData = new GridData(listWidth, SWT.DEFAULT);
+		listData.verticalSpan = 4;
+		int listHeight = libs.getItemHeight() * LIBS_FIELD_HEIGHT;
+		Rectangle trim = libs.computeTrim(0, 0, 0, listHeight);
+		listData.heightHint = trim.height;
+
+		libs.setLayoutData(listData);
+
+		//LIBS BUTTONS 
+		Composite buttonsComposite = new Composite(libsGroup, SWT.SIMPLE);
+		GridLayout buttonsLayout = new GridLayout(1, true);
+		buttonsLayout.marginWidth = 0;
+		buttonsLayout.marginHeight = 0;
+		buttonsComposite.setLayout(buttonsLayout);
+		buttonsComposite.setLayoutData(new GridData());
+		buttonsComposite.setBackground(white);
+
+		deleteButton = new Button(buttonsComposite, SWT.PUSH);
+		deleteButton.setText("Delete");
+		deleteButton.setLayoutData(new GridData(BUTTON_WIDTH, BUTTON_HEIGHT));
+
+		//removing selected library
+		deleteButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				int selection = libs.getSelectionIndex();
+				if (selection != -1) {
+					libs.remove(selection);
+					libs.select(0);
+					deleteButton.setEnabled(libs.getItemCount() > 0);
+					setDirty(true);
+				}
+			}
+		});
+
+		addButton = new Button(buttonsComposite, SWT.PUSH);
+		addButton.setText("Add");
+		addButton.setLayoutData(new GridData(BUTTON_WIDTH, BUTTON_HEIGHT));
+		deleteButton.setEnabled(libs.getItemCount() > 0);
+
+		final AddLibraryDialog a = new AddLibraryDialog(shell);
+
+		addButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				a.open();
+				if (a.getReturnCode() == IDialogConstants.OK_ID) {
+					String libname = a.getText();
+					if (MetadataXML.containForbiddenChars(libname)) {
+						showInformationDialog("Forbidden characters removed",
+								getForbiddenCharsErrorMessage("Lib"));
+					}
+					libname = MetadataXML.removeForbiddenChars(libname);
+					libs.add(libname, libs.getItemCount());
+					libs.select(0);
+					deleteButton.setEnabled(libs.getItemCount() > 0);
+					setDirty(true);
+				}//else, cancel is pushed
+			}
+		});
+
+		buttonsComposite.pack();
+
+		//COMPOSITE FOR ATTRIBUTES AND EXTENDED SDK
+		Composite attrsAndExtdSDKComposite = new Composite(
+				libs_and_attrs_Composite, SWT.SIMPLE | SWT.TOP);
+
+		GridLayout attrsAndExtdSDKCompositeLayout = new GridLayout(1, true);
+		attrsAndExtdSDKCompositeLayout.marginRight = 0;
+		attrsAndExtdSDKCompositeLayout.marginHeight = 0;
+		attrsAndExtdSDKCompositeLayout.marginWidth = 0;
+		attrsAndExtdSDKCompositeLayout.marginTop = 0;
+
+		attrsAndExtdSDKComposite.setLayout(attrsAndExtdSDKCompositeLayout);
+		attrsAndExtdSDKComposite.setLayoutData(new GridData(SWT.RIGHT,
+				SWT.FILL, true, true));
+		attrsAndExtdSDKComposite.setBackground(white);
+
+		//ATTRIBUTES GROUP				
+		Group attributesGroup = new Group(attrsAndExtdSDKComposite,
+				SWT.SHADOW_NONE);
+		attributesGroup.setText("Attributes:");
+		GridLayout attributesGrid = new GridLayout(4, false);
+		attributesGrid.marginRight = 0;
+		attributesGrid.marginTop = 0;
+
+		attributesGroup.setBackground(white);
+		attributesGroup.setLayout(attributesGrid);
+		GridData attributesData = new GridData(SWT.FILL, SWT.DEFAULT, true,
+				true);
+		attributesData.heightHint = 50;
+		attributesGroup.setLayoutData(attributesData);
+
+		// HTML Doc Provided
+		Label html_doc_providedLabel = new Label(attributesGroup,
+				SWT.HORIZONTAL);
+		html_doc_providedLabel.setText("HTML Doc Provided:");
+		html_doc_providedLabel.setLayoutData(new GridData());
+		html_doc_providedLabel.setBackground(white);
+		HTMLDOCCombo = new Combo(attributesGroup, SWT.READ_ONLY);
+		HTMLDOCCombo.setItems(noYesValues);
+		setComboSelection(noYesValues, HTMLDOCCombo, xml.getHtmlDocProvided());
+		HTMLDOCCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(HTMLDOCCombo);
+
+		//ADAPTATION
+		Label adaptationLabel = new Label(attributesGroup, SWT.HORIZONTAL);
+		adaptationLabel.setText("Adaptation:");
+		adaptationLabel.setLayoutData(new GridData());
+		adaptationLabel.setBackground(white);
+		adaptationCombo = new Combo(attributesGroup, SWT.READ_ONLY);
+		adaptationCombo.setItems(xml.getNoYesValues());
+		setComboSelection(noYesValues, adaptationCombo, xml.getAdaptation());
+		adaptationCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(adaptationCombo);
+		return attrsAndExtdSDKComposite;
+	}
+
+	/**
+	 * Createa part of editor wheres API name, ID, Data version, Type, 
+	 * Description and Subsystem (Collection in data version 2.0 and onwards)
+	 * @param composite
+	 * @param typeValues
+	 */
+	private void createAPIInformationPart(final Composite composite,
+			String[] typeValues) {
+
+		//API NAME
+		Label APINameLabel = new Label(composite, SWT.HORIZONTAL);
+		APINameLabel.setText("Name:");
+		APINameLabel.setBackground(white);
+		APINameTxt = new Text(composite, SWT.LEFT | SWT.BORDER | SWT.BORDER);
+		APINameTxt.setLayoutData(new GridData(DEFAULT_TEXT_AREA_WIDTH,
+				SWT.DEFAULT ));
+		APINameTxt.setText(xml.getAPIName());
+
+		addModifyListener(APINameTxt);
+
+		//API ID
+		Label APIIDLabel = new Label(composite, SWT.HORIZONTAL);
+		APIIDLabel.setText("ID:");
+		APIIDLabel.setBackground(white);
+
+		Composite APIComposite = new Composite(composite, SWT.SIMPLE);
+		GridLayout APILayout = new GridLayout(5, false);
+		APILayout.marginWidth = 0;
+		APILayout.marginHeight = 0;
+		APIComposite.setLayout(APILayout);
+		APIComposite.setBackground(white);
+		APIComposite.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, false,
+				false));
+
+		APIIDTxt = new Text(APIComposite, SWT.LEFT | SWT.BORDER);
+		APIIDTxt
+				.setLayoutData(new GridData(API_ID_TEXT_AREA_WIDTH, SWT.DEFAULT));
+		APIIDTxt.setEnabled(false);
+		APIIDTxt.setText(xml.getAPIID());
+
+		//API DATA VERSION
+		Label APIDataVersionLabel = new Label(APIComposite, SWT.HORIZONTAL);
+		APIDataVersionLabel.setText("Data version:");
+		APIDataVersionLabel.setLayoutData(new GridData());
+		APIDataVersionLabel.setBackground(white);
+		dataVersionTxt = new Text(APIComposite, SWT.LEFT | SWT.BORDER);
+		dataVersionTxt.setLayoutData(new GridData(VERSION_TXT_DEFAULT_WIDTH,
+				SWT.DEFAULT));
+		dataVersionTxt.setEnabled(false);
+		dataVersionTxt.setText(xml.getDataVersion());
+
+		//API TYPE
+		Label APITypeLabel = new Label(APIComposite, SWT.HORIZONTAL);
+		APITypeLabel.setText("Type:");
+		APITypeLabel.setLayoutData(new GridData());
+		APITypeLabel.setBackground(white);
+		Combo typeCombo = new Combo(APIComposite, SWT.READ_ONLY);
+		typeCombo.setItems(typeValues);
+		setComboSelection(typeValues, typeCombo, xml.getType());
+		typeCombo.setLayoutData(new GridData(TYPE_COMBO_WIDTH, SWT.DEFAULT));
+		typeCombo.setEnabled(false);
+
+		//DESCRIPTION
+		Label descLabel = new Label(composite, SWT.HORIZONTAL | SWT.TOP);
+		descLabel.setText("Description:");
+		descLabel
+				.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, false));
+		descLabel.setBackground(white);
+		descTxt = new Text(composite, SWT.LEFT | SWT.BORDER | SWT.MULTI
+				| SWT.WRAP | SWT.V_SCROLL);
+		int descHeight = DESCRIPTION_TEXT_FIELD_LINES * descTxt.getLineHeight();
+		GridData descData = new GridData(DEFAULT_TEXT_AREA_WIDTH
+				- V_SCROLLBAR_WIDHT, descHeight);
+
+		descTxt.setLayoutData(descData);
+		descTxt.setText(xml.getDescription());
+		addModifyListener(descTxt);
+
+		subsystemLabel = new Label(composite, SWT.HORIZONTAL);
+		setSubsystemLabel();
+		subsystemLabel.setLayoutData(new GridData());
+		subsystemLabel.setBackground(white);
+		subsytemTxt = new Text(composite, SWT.LEFT | SWT.BORDER);
+		subsytemTxt.setLayoutData(new GridData(DEFAULT_TEXT_AREA_WIDTH,
+				SWT.DEFAULT ));
+		subsytemTxt.setText(xml.getSubsystem());
+		addModifyListener(subsytemTxt);
+	}
+
+	/**
+	 * Create part of UI where are release information: since version, catagory and deprecation
+	 * @param composite
+	 * @param SDKVersionValues
+	 * @param categoryValues
+	 */
+	private void createReleasePart(final Composite composite,
+			String[] SDKVersionValues, String[] categoryValues) {
+		//RELEASE GROUP				
+		Group releaseGroup = new Group(composite, SWT.SHADOW_NONE);
+		releaseGroup.setText("Release:");
+		GridLayout releaseGrid = new GridLayout(8, false);
+		releaseGroup.setBackground(white);
+		GridData releaseGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		releaseGridData.horizontalSpan = 2;
+		releaseGroup.setLayout(releaseGrid);
+		releaseGroup.setLayoutData(releaseGridData);
+
+		//RELEASE VERSION
+		Label versionLabel = new Label(releaseGroup, SWT.HORIZONTAL);
+		versionLabel.setText("Since version:");
+		versionLabel.setLayoutData(new GridData());
+		versionLabel.setBackground(white);
+
+		releaseCombo = new Combo(releaseGroup, SWT.READ_ONLY);
+		releaseCombo.setItems(SDKVersionValues);
+		setComboSelection(SDKVersionValues, releaseCombo, xml.getReleaseSince());
+		releaseCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(releaseCombo);
+
+		//RELEASE CATEGORY
+		Label categoryLabel = new Label(releaseGroup, SWT.HORIZONTAL);
+		categoryLabel.setText("  Category:");
+		categoryLabel.setLayoutData(new GridData());
+		categoryLabel.setBackground(white);
+		categoryCombo = new Combo(releaseGroup, SWT.READ_ONLY);
+		categoryCombo.setItems(categoryValues);
+		setComboSelection(categoryValues, categoryCombo, xml
+				.getReleaseCategory());
+		categoryCombo.setLayoutData(new GridData(CATEGORY_COMBO_WIDTH,
+				SWT.DEFAULT));
+		addSetDirtyModifyListener(categoryCombo);
+
+		//RELEASE DEPRECATED
+		Label deprecatedLabel = new Label(releaseGroup, SWT.HORIZONTAL);
+		deprecatedLabel.setText("   Deprecated:");
+		deprecatedLabel.setLayoutData(new GridData());
+		deprecatedLabel.setBackground(white);
+
+		isDeprecatedButton = new Button(releaseGroup, SWT.CHECK);
+		isDeprecatedButton.setLayoutData(new GridData());
+		isDeprecatedButton.setSelection(xml.isReleaseDeprecated());
+		Label deprecatedSinceLabel = new Label(releaseGroup, SWT.HORIZONTAL);
+		deprecatedSinceLabel.setText(" Deprecated since:");
+		deprecatedSinceLabel.setLayoutData(new GridData());
+		deprecatedSinceLabel.setBackground(white);
+
+		releaseDeprecatedCombo = new Combo(releaseGroup, SWT.READ_ONLY);
+		releaseDeprecatedCombo.setItems(xml.getSDKVersionValues());
+		if (xml.isReleaseDeprecated()) {
+			setComboSelection(SDKVersionValues, releaseDeprecatedCombo, xml
+					.getReleaseDeprecatedSince());
+		}
+		releaseDeprecatedCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(releaseDeprecatedCombo);
+
+		if (!isDeprecatedButton.getSelection()) {
+			releaseDeprecatedCombo.setEnabled(false);
+		}
+
+		//Release is DEPRECATED button
+		isDeprecatedButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				//If state changes, setting file as dirty
+				if (xml.isReleaseDeprecated() != isDeprecatedButton
+						.getSelection()) {
+					setDirty(true);
+				}
+				//Changing combos to disabled/non disabled when check box is ticked
+				if (isDeprecatedButton.getSelection()) {
+					releaseDeprecatedCombo.setEnabled(true);
+				} else {
+					releaseDeprecatedCombo.setEnabled(false);
+					releaseDeprecatedCombo.select(0);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Setting label to subsystem. Label depends on data version, 
+	 * with dataversion 1.0 its "Subsystem" and 2.0 onwards its "Collection".
+	 */
+	private void setSubsystemLabel() {
+		if(xml.getDataVersion().equals(MetadataXML.DATA_VERSION_1_0)){
+			subsystemLabel.setText(SUBSYSTEM);
+		}else{
+			subsystemLabel.setText(COLLECTION);
+		}
+	}
+
+	/**
+	 * Part in UI to convert data to version 2.0
+	 * @param composite
+	 * @param groupWidth
+	 */
+	private void createConvertTo2_0Part(Composite composite, Composite extComposite) {
+		
+		//Convert to 2.0 COMPOSITION
+		Composite convertComposite = new Composite(
+				composite, SWT.SIMPLE);
+
+		GridLayout convertLayout = new GridLayout(1, true);
+		
+		convertLayout.marginRight = 0;
+		convertLayout.marginHeight = 0;
+		convertLayout.marginWidth = 0;
+		convertLayout.marginTop = 0;
+		
+		convertComposite.setLayout(convertLayout);
+		GridData convertData = new GridData();
+		convertData.horizontalSpan = 4;
+		convertComposite.setLayoutData(convertData);
+		convertComposite.setBackground(white);
+		
+
+		//LIBS
+		final Group convertGroup = new Group(convertComposite,
+				SWT.SHADOW_NONE);
+		convertGroup.setText("Metadata Data Version Conversion:");
+		GridLayout convertGrid = new GridLayout(2, false);
+		
+		convertGroup.setBackground(white);
+		GridData libsGridData = new GridData(DEFAULT_GROUP_WIDTH , SWT.DEFAULT);//GridData.FILL_HORIZONTAL
+		libsGridData.horizontalSpan = 8;
+		convertGroup.setLayout(convertGrid);
+		convertGroup.setLayoutData(libsGridData);		
+		
+		
+		convertBtn  = new Button(convertGroup, SWT.PUSH);
+		convertBtn .setText("Convert to v. 2.0");
+		convertBtn .addSelectionListener(new ConvertTo2_0_Listener(extComposite, convertComposite));
+	}
+	
+	/**
+	 * Listener for convert button
+	 */
+	private class ConvertTo2_0_Listener extends SelectionAdapter{
+		
+		private Composite extComposite;
+		private Composite convertComposite;
+		
+		public ConvertTo2_0_Listener(Composite extComposite, Composite convertComposite){
+			this.extComposite = extComposite;
+			this.convertComposite = convertComposite;
+		}
+		// conversion to version 2.0		
+		public void widgetSelected(SelectionEvent event) {
+
+			try {
+				//Setting data from UI to XML, when conversion is done, 
+				//and if release category is changed, it wont change right if data is not set. 
+				setDataFromEditorToXML();
+			} catch (NoSuchAlgorithmException e) {
+				//This really cannot occur, because NoSuchAlgorithmException
+				//is thrown when id is generated, and now we have existing API.
+				MetadataEditorConsole.getInstance().println(
+								"NoSuchAlgorithmException on conversion: " + e);
+				e.printStackTrace();
+			}
+			
+			// update xml data version
+			xml.updateToVersion2_0();
+			// update data version to UI
+			dataVersionTxt.setText(xml.getDataVersion());
+			// update subsystem label
+			setSubsystemLabel();
+			// update category values to combo
+			String[] categoryValues = xml.getCategoryValues(xml.getDataVersion());
+			categoryCombo.setItems(categoryValues);
+			//setting selection to category combo
+			setComboSelection(categoryValues, categoryCombo, xml.getReleaseCategory());
+			// then clean extended SDK part
+			extComposite.dispose();
+			// finally clean convert composite
+			convertComposite.dispose();
+
+		}	
+	}
+
+
+	/**
+	 * Create extended SDK parts
+	 * @param SDKVersionValues
+	 * @param attrsAndExtdSDKComposite
+	 */
+	private Composite createExtendedSDKPart(String[] SDKVersionValues,
+			Composite attrsAndExtdSDKComposite) {
+		//EXTENDED GROUP		
+
+		Composite extComposite = new Composite(
+				attrsAndExtdSDKComposite, SWT.SIMPLE);
+		GridLayout attrsAndExtdSDKCompositeLayout = new GridLayout(1, true);
+		attrsAndExtdSDKCompositeLayout.marginRight = 0;
+		attrsAndExtdSDKCompositeLayout.marginHeight = 0;
+		attrsAndExtdSDKCompositeLayout.marginWidth = 0;
+		attrsAndExtdSDKCompositeLayout.marginTop = 0;
+
+		extComposite.setLayout(attrsAndExtdSDKCompositeLayout);
+		extComposite.setLayoutData(new GridData(SWT.RIGHT,
+				SWT.FILL, true, true));
+		extComposite.setBackground(white);		
+		
+		
+		Group extendedGroup = new Group(extComposite,
+				SWT.SHADOW_NONE);
+		extendedGroup.setText("Extended SDK:");
+		GridLayout extendedCompositeGrid = new GridLayout(3, false);
+		extendedCompositeGrid.marginRight = 0;
+		extendedCompositeGrid.marginBottom = 0;
+
+		extendedGroup.setBackground(white);
+		extendedGroup.setLayout(extendedCompositeGrid);
+		GridData extendedGroupGridData = new GridData(SWT.FILL, SWT.FILL, true,
+				true);
+		extendedGroupGridData.verticalAlignment = SWT.END;
+		extendedGroup.setLayoutData(extendedGroupGridData);
+
+		//EXTENDED SDK
+		isExtendedButton = new Button(extendedGroup, SWT.CHECK);
+		isExtendedButton.setLayoutData(new GridData());
+		isExtendedButton.setSelection(xml.isExtendedSDK());
+		Label extSDKLabel = new Label(extendedGroup, SWT.HORIZONTAL);
+		extSDKLabel.setText("Is Extended SDK   ");
+		extSDKLabel.setLayoutData(new GridData());
+		extSDKLabel.setBackground(white);
+
+		Composite extendedValuesComposite = new Composite(extendedGroup,
+				SWT.SIMPLE);
+		GridLayout extendedValuesLayout = new GridLayout(2, false);
+		extendedValuesLayout.marginRight = 0;
+		extendedValuesLayout.marginBottom = 0;
+
+		extendedValuesComposite.setLayout(extendedValuesLayout);
+		extendedValuesComposite.setBackground(white);
+		GridData extendedValuesGridData = new GridData();
+		extendedValuesComposite.setLayoutData(extendedValuesGridData);
+
+		//EXTENDED SKD SINCE
+		Label extSinceLabel = new Label(extendedValuesComposite, SWT.HORIZONTAL);
+		extSinceLabel.setText("Since version:");
+		extSinceLabel.setLayoutData(new GridData());
+		extSinceLabel.setBackground(white);
+
+		extendedCombo = new Combo(extendedValuesComposite, SWT.READ_ONLY);
+		extendedCombo.setItems(SDKVersionValues);
+		if (xml.isExtendedSDK()) {
+			setComboSelection(SDKVersionValues, extendedCombo, xml
+					.getExtendedSDKSince());
+		}
+		extendedCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(extendedCombo);
+		if (!isExtendedButton.getSelection()) {
+			extendedCombo.setEnabled(false);
+			extendedCombo.select(0);
+		}
+
+		//EXTENDED SDK DEPRECATED SINCE
+		Label extDeprecatedLabel = new Label(extendedValuesComposite,
+				SWT.HORIZONTAL);
+		extDeprecatedLabel.setText("Deprecated since:");
+		extDeprecatedLabel.setLayoutData(new GridData());
+		extDeprecatedLabel.setBackground(white);
+		extendedDeprecatedCombo = new Combo(extendedValuesComposite,
+				SWT.READ_ONLY);
+		extendedDeprecatedCombo.setItems(xml.getSDKVersionValues());
+		if (xml.isExtendedSDKDeprecated()) {
+			setComboSelection(SDKVersionValues, extendedDeprecatedCombo, xml
+					.getExtendedSDKDeprecatedSince());
+		}
+		extendedDeprecatedCombo.setLayoutData(new GridData());
+		addSetDirtyModifyListener(extendedDeprecatedCombo);
+		if (!isExtendedButton.getSelection()) {
+			extendedDeprecatedCombo.setEnabled(false);
+			extendedDeprecatedCombo.select(0);
+		}
+		//EXTENDED SDK CHECK BOX LISTENER
+		isExtendedButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				//If state changes, setting file as dirty
+				if (xml.isExtendedSDK() != isExtendedButton.getSelection()) {
+					setDirty(true);
+				}
+				//Changing combos to disabled/non disabled when check box is ticked
+				if (isExtendedButton.getSelection()) {
+					extendedCombo.setEnabled(true);
+					extendedDeprecatedCombo.setEnabled(true);
+				} else {
+					extendedCombo.setEnabled(false);
+					extendedCombo.select(0);
+					extendedDeprecatedCombo.setEnabled(false);
+					extendedDeprecatedCombo.select(0);
+				}
+			}
+		});
+		
+		return extComposite;
+	}
+
+	/**
+	 * Set Editor as dirty when modification to data has been made
+	 * @param txt
+	 */
+	private void addModifyListener(Text txt) {
+		txt.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				setDirty(true);
+			}
+		});
+	}
+
+	/**
+	 * Set Editor as dirty when modification to data has been made
+	 * @param combo
+	 */
+	private void addSetDirtyModifyListener(final Combo combo) {
+		combo.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				setDirty(true);
+			}
+		});
+	}
+
+	/**
+	 * Selects given value as selected to {@link Combo}
+	 * @param values
+	 * @param combo
+	 * @param value
+	 */
+	private void setComboSelection(String[] values, Combo combo, String value) {
+		if (!value.equals(MetadataXML.NOT_SET)) {
+			for (int i = 0; i < values.length; i++) {
+				if (value.equals(values[i])) {
+					combo.select(i);
+					break;
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
+	 */
+	protected void createPages() {
+
+		createAPIMetadataEditorPage();
+		//When opening very first time, listeners will set file to dirty
+		//Setting file back to not dirty
+		if (xml.isValid()) {
+			setDirty(false);
+		}
+		//Setting context sensitive help id:s to components
+		setHelps();
+
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#dispose()
+	 */
+	public void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+		super.dispose();
+		white.dispose();
+	}
+
+	/**
+	 * If Metadata XML is modified, editor is dirty and can be saved.
+	 * 
+	 * If editor data is changed and then changed back to original
+	 * data contents, status still remain as dirty.
+	 */
+	public boolean isDirty() {
+		return this.isDirty;
+	}
+
+	/**
+	 * Sets data from UI to {@link #xml} If some text widgets contains 
+	 * forbidden characters, those will be removed and 
+	 * information notice will be given to user. Forbidden characters
+	 * in XML data is <, > and &.
+	 * 
+	 * @throws NoSuchAlgorithmException if something fails when creating ID to API.
+	 */
+	private void setDataFromEditorToXML() throws NoSuchAlgorithmException {
+
+		//This is not allowed to throw an exception, because if it is thrown
+		//data setting is incomplete and some validity errors stays unknown 
+
+		StringBuffer errors = new StringBuffer();
+
+		//If XML is just created new file, we need to create unique ID
+		//That can be done only once, setting APIName will set XML to not new
+		if (xml.isNew()
+				&& !APINameTxt.getText().trim().equals(MetadataXML.NOT_SET)) {
+			APIIDGenerator gen = new APIIDGenerator();
+			xml.setAPIID(gen.getID(APINameTxt.getText()));
+			this.APIIDTxt.setText(xml.getAPIID());
+			if (MetadataXML.containForbiddenChars(APINameTxt.getText())) {
+				errors.append(getForbiddenCharsErrorMessage("API Name"));
+			}
+			xml.setAPIName(APINameTxt.getText());
+			this.APINameTxt.setText(xml.getAPIName());
+		}
+		//Else file is not new one
+		else {
+			xml.setAPIName(APINameTxt.getText());
+			if (MetadataXML.containForbiddenChars(APINameTxt.getText())) {
+				errors.append(getForbiddenCharsErrorMessage("API Name"));
+				this.APINameTxt.setText(xml.getAPIName());
+			}
+		}
+
+		xml.setDescription(descTxt.getText());
+		if (MetadataXML.containForbiddenChars(descTxt.getText())) {
+			errors.append(getForbiddenCharsErrorMessage("Description"));
+			this.descTxt.setText(xml.getDescription());
+		}
+
+		xml.setSubsystem(subsytemTxt.getText());
+		if (MetadataXML.containForbiddenChars(subsytemTxt.getText())) {
+			errors.append(getForbiddenCharsErrorMessage(xml.getSubsystemString()));
+			this.subsytemTxt.setText(xml.getSubsystem());
+		}
+
+		//Category must set first, so release since attribute check will work properly
+		xml.setReleaseCategory(categoryCombo.getText());
+		try {
+			xml.setReleaseSince(releaseCombo.getText());
+		} catch (MetadataNotValidException e) {
+			//Should not be able to happen, because values is coming from list
+			MetadataEditorConsole.getInstance().println(UNEXPECTED_VALIDITY_ERROR_MSG +e);
+			e.printStackTrace();
+		}
+		xml.setReleaseDeprecated(isDeprecatedButton.getSelection());
+		if (xml.isReleaseDeprecated()) {
+			try {
+				xml.setReleaseDeprecatedSince(releaseDeprecatedCombo.getText());
+			} catch (MetadataNotValidException e) {
+				//Should not be able to happend, because values is comimg from list
+				MetadataEditorConsole.getInstance().println(UNEXPECTED_VALIDITY_ERROR_MSG +e);				
+				e.printStackTrace();
+			}
+		}
+		String newLibs[] = libs.getItems();
+		Vector<String> libsVector = new Vector<String>(newLibs.length);
+		for (int i = 0; i < newLibs.length; i++) {
+			libsVector.add(newLibs[i]);
+		}
+		xml.setLibs(libsVector);
+		xml.setHtmlDocProvided(xml.isYes(HTMLDOCCombo.getText()));
+		xml.setAdaptation(xml.isYes(adaptationCombo.getText()));
+
+		//With 1.0 data version there is also extended SDK datas
+		if (xml.getDataVersion().equals(MetadataXML.DATA_VERSION_1_0)){
+			//If data is extended SDK
+			setExtendedSDKDataFromEditorToXML();
+		}
+
+		//Finally showing an information notice if there was forbidden characted
+		//that was removed from text fields.
+		if (errors.length() > 1) {
+			showInformationDialog("Forbidden characters removed", errors
+					.toString());
+		}
+
+	}
+
+	/**
+	 * Sets Extended SDK data from UI to {@link #xml} 
+	 * 
+	 * For Extended SDK part only, use only with data version 1.0,
+	 * with data version 2.0 Extended SDK is removed.
+	 */
+	private void setExtendedSDKDataFromEditorToXML() {
+		xml.setExtendedSDK(isExtendedButton.getSelection());
+
+		if(xml.isExtendedSDK()) {
+			try {
+				xml.setExtendedSDKSince(extendedCombo.getText());
+			} catch (MetadataNotValidException e) {
+				//Should not be able to happend, because values is comimg from list
+				e.printStackTrace();
+			}
+			//If extended SDK is set as deprecated, setting combo value
+			if (!extendedDeprecatedCombo.getText().equals(MetadataXML.NOT_SET)) {
+				try {
+					xml.setExtendedSDKDeprecatedSince(extendedDeprecatedCombo
+							.getText());
+				} catch (MetadataNotValidException e) {
+					//Should not be able to happen, because values is coming from list
+					MetadataEditorConsole.getInstance().println(UNEXPECTED_VALIDITY_ERROR_MSG +e);					
+					e.printStackTrace();
+				}				
+			}
+			//Otherwise extended SDK is not deprecated, setting here making sure
+			//that there is no values set in xml
+			else {
+				xml.setExtendedSDKDeprecated(false);
+			}
+		}
+	}
+
+	/**
+	 * Create a error message when forbidden characters (forbidden to XML) occurs
+	 * @param fieldName
+	 * @return error message
+	 */
+	private String getForbiddenCharsErrorMessage(String fieldName) {
+		StringBuffer buf = new StringBuffer();
+		buf.append(fieldName);
+		buf.append(" cannot contain the following characters: ");
+		for (int i = 0; i < MetadataXML.FORBIDDEN_CHARS.length; i++) {
+			//Dialogs prints & -char only if its &&
+			if (MetadataXML.FORBIDDEN_CHARS[i].equals("&")) {
+				buf.append("&&");
+			} else {
+				buf.append(MetadataXML.FORBIDDEN_CHARS[i]);
+			}
+			if (i < (MetadataXML.FORBIDDEN_CHARS.length - 1)) {
+				buf.append(", ");
+			}
+		}
+		buf.append(". Those characters are removed.");
+		buf.append("\n");
+		return buf.toString();
+	}
+
+	/**
+	 * Show an error dialog
+	 * @param title
+	 * @param message
+	 * @param errors
+	 */
+	private void showErrorDialog(String title, String message, String errors) {
+		Status status = new Status(IStatus.ERROR,
+				MetadataEditorActivator.PLUGIN_ID, 0, errors, null);
+		Shell sh;
+		sh = getShell();
+
+		ErrorDialog.openError(sh, title, message, status);
+	}
+
+	/**
+	 * Get shell, checks if Shell is available for different purposes.
+	 * @return shell
+	 */
+	private Shell getShell() {
+		Shell sh;
+		if (getContainer() != null) {
+			try {
+				sh = getContainer().getShell();
+			} catch (SWTException e) {
+				sh = MetadataEditorActivator.getCurrentlyActiveWbWindowShell();
+			}
+		} else {
+			sh = MetadataEditorActivator.getCurrentlyActiveWbWindowShell();
+		}
+		return sh;
+	}
+
+	/**
+	 * Show an information dialog
+	 * @param title
+	 * @param message
+	 */
+	private void showInformationDialog(String title, String message) {
+		Shell sh;
+		sh = getShell();
+
+		MessageDialog.openInformation(sh, title, message);
+	}
+	
+
+	/**
+	 * Saves the document.
+	 * If API name is changed, also filename will be changed.
+	 * 
+	 * If API name is changed, and the file is external file opened
+	 * outside of Eclipse (Carbide) workspace finally the file will be
+	 * closed and information notice will be given to user, saying that 
+	 * the file must be reopend. 
+	 * 
+	 * @see #renameExternalFile(String) documentation for additional information.
+	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) 
+	 */
+	public void doSave(IProgressMonitor monitor) {
+
+
+		InputStream stream = null;
+		try {
+
+			//Setting data from UI to this.xml
+			setDataFromEditorToXML();
+
+			if (!xml.isValid()) {
+				showErrorDialog("Metadata XML is not valid",
+						"Save is not allowed.", xml.getValidityErrors());
+				return;
+			}
+
+			boolean isNameChanged = xml.isAPINameChanged();
+
+
+			IEditorInput editorInput = getEditorInput();
+
+			//Type is IFileEditorInput allways when file is opened from project
+			//If file opened outside project, editor type is IPathEditorInput
+			if (editorInput instanceof IFileEditorInput) {
+				IFile file;
+				//Just making sure that stream is closed before renaming file
+				try {
+					stream = openContentStream();
+
+					IFileEditorInput iFile = (IFileEditorInput) editorInput;
+					file = iFile.getFile();
+
+					if (file.exists()) {
+						file.setContents(stream, true, true, monitor);
+					} else {
+						file.create(stream, true, monitor);
+					}			
+				} finally {
+					stream.close();
+				}
+
+				//If API name is changed, renaming file
+				if (isNameChanged) {
+					renameFile(file);
+				}
+
+			}
+			//Else file is opened outside of Carbide project
+			else {
+				IPathEditorInput javaInput = (IPathEditorInput) editorInput;
+				IPath path = javaInput.getPath();				
+				String fileLocation = path.toOSString();
+				//First write changes to file
+				xml.toFile(fileLocation);
+				
+				//If API name is changed, renaming file
+				if (isNameChanged) {
+					renameExternalFile(fileLocation);
+				}				
+			}
+
+			setDirty(false);
+
+		} catch (CoreException e) {
+			showErrorDialog("Errors on save", "Save was not complete.", e
+					.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"CoreException on save: " + e);
+			e.printStackTrace();
+		} catch (IOException e) {
+			showErrorDialog("Errors on save", "Save was not complete.", e
+					.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"IOException on save: " + e);
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			showErrorDialog("Errors on save", "Save was not complete.", e
+					.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"NoSuchAlgorithmException on save: " + e);
+			e.printStackTrace();
+		} catch (Exception e) {
+			showErrorDialog("Errors on save", "Save was not complete.", e
+					.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"Exception on save: " + e);
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Renames external file when API name is changed by user.
+	 * 
+	 * Editor will be closed and information notice will be given to user.
+	 * 
+	 * Editor must be closed because renaming file will let old "deleted" file
+	 * as open to Metadata Editor, so then it's possible to edit file what
+	 * does not exist. 
+	 * 
+	 * @param fileLocation
+	 * @throws Exception
+	 */
+	
+	private void renameExternalFile(String fileLocation) throws Exception {
+		
+		java.io.File javaFile = new java.io.File(fileLocation);
+		String newFileName = MetadataFilenameGenerator.createMetadataFilename(xml
+				.getAPIName());
+		String newFileLocation = 
+			fileLocation.substring(0, fileLocation.lastIndexOf('\\')+1);
+		newFileLocation += newFileName;
+		java.io.File newJavaFile = new java.io.File(newFileLocation);
+		
+		javaFile.renameTo(newJavaFile);
+		
+		setPartName(newFileName);
+
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+
+		//runnable to close old file
+		final IWorkspaceRunnable runClose = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+					IWorkbench wb = PlatformUI.getWorkbench();
+					IWorkbenchWindow wbWindow = wb.getActiveWorkbenchWindow();
+					IWorkbenchPage wbPage = wbWindow.getActivePage();
+					wbPage.closeEditor(wbPage.getActiveEditor(), false);
+			}
+		};
+
+		showInformationDialog("Reopen external file",
+				"The external file under editing will be closed. API name change" 
+				+" caused renaming of the file into "
+				+newFileName +" and the file must be reopened."
+				+"\n\n\rPlease reopen the renamed file by using 'File -> Open File...'"
+				+" and browse for file '"
+				+newFileLocation +"'.");
+
+		MetadataEditorConsole.getInstance().println(
+				"External file: " + fileLocation 
+				+" was renamed to: " +newFileLocation
+				+" and was closed. Reopen must do to edit file again.");
+
+		
+		//Starting runnable to close old file 
+		workspace.run(runClose, null, IWorkspace.AVOID_UPDATE, null);
+		
+
+	}	
+	
+	/**
+	 * Renames file when API name is changed by user.
+	 * 
+	 * Doing next steps in following order: 
+	 * 			1) copy file
+	 * 			2) Close old file
+	 *			3) Open new file 
+	 *			4) Delete old file
+	 *          5) Show an information dialog that the file name was changed
+	 * 
+	 * @param file
+	 * @throws CoreException
+	 */
+	private void renameFile(final IFile file) throws Exception {
+		
+		//creating new filename
+		IPath path = file.getFullPath();
+		path = path.removeLastSegments(1);
+		final String fileName = MetadataFilenameGenerator.createMetadataFilename(xml
+				.getAPIName());
+		final IPath newPath = path.append(fileName);
+
+		//Doing copy...
+		file.copy(newPath, true, null);
+		String containerName = file.getFullPath().removeLastSegments(1)
+				.toOSString();
+		IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
+		IResource resource = wsRoot.findMember(new Path(containerName));
+
+		IContainer container = (IContainer) resource;
+		final IFile newFile = container.getFile(new Path(fileName));
+
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+
+		
+		// Runnable to delete old file and finaly show an information dialog 
+		final IWorkspaceRunnable runDelete = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+
+				file.delete(true, true, null);
+
+				MetadataEditorConsole.getInstance().println(
+						"API name changed, filename changed also from: "
+								+ file.getFullPath() + " to: " + newPath);
+
+				//Finally show an information dialog that the file name was changed
+				showInformationDialog( "Metadata file name changed", "API name change" 
+						+" caused renaming of the metadata file into "
+						+fileName );				
+			}
+		};
+
+		//Runnable to open new file
+		final IWorkspaceRunnable runOpen = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// do the actual work in here
+
+				IWorkbenchPage page = PlatformUI.getWorkbench()
+						.getActiveWorkbenchWindow().getActivePage();
+				try {
+					IDE.openEditor(page, newFile, true);
+
+				} catch (PartInitException e) {
+					e.printStackTrace();
+					Status status = new Status(IStatus.ERROR,
+							"com.nokia.s60tools.metadataeditor", 0, e
+									.getMessage(), e);
+
+					throw new CoreException(status);
+				} finally {
+					//When new file opened, deleting old file
+					workspace.run(runDelete, null, IWorkspace.AVOID_UPDATE,
+							null);
+				}
+
+			}
+		};
+
+		//runnable to close old file
+		final IWorkspaceRunnable runClose = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				try {
+					IWorkbench wb = PlatformUI.getWorkbench();
+					IWorkbenchWindow wbWindow = wb.getActiveWorkbenchWindow();
+					IWorkbenchPage wbPage = wbWindow.getActivePage();
+					wbPage.closeEditor(wbPage.getActiveEditor(), false);
+
+				} finally {
+					//When old file closed, opening new file
+					workspace.run(runOpen, null, IWorkspace.AVOID_UPDATE, null);
+				}
+
+			}
+		};
+
+		//Startting runnable to close old file whitch starts runnable to 
+		//open new file when finished, which starts runnable to delete
+		//old file when finished.
+		workspace.run(runClose, null, IWorkspace.AVOID_UPDATE, null);
+		
+
+		
+
+	}
+
+	/**
+	 * Saves the document as another file. 
+	 * 
+	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+	 */
+	public void doSaveAs() {
+
+		try {
+			IEditorInput editorInput = getEditorInput();
+
+			//Setting data from UI to this.xml
+			setDataFromEditorToXML();
+
+			if (!xml.isValid()) {
+				showErrorDialog("Metadata XML is not valid",
+						"Save is not allowed.", xml.getValidityErrors());
+				return;
+			}
+			
+
+			SaveAsDialog saveas = new SaveAsDialog(getContainer().getShell());
+
+			//Setting default saveasdialog file name and location
+			//If API name is changed IFileEditorInput is still the same
+			//and if orginal file is not saved yet (xml.isAPINameChanged())
+			//Setting default name to UI as new generated file name instead of old filename and path
+			if (editorInput instanceof IFileEditorInput && !xml.isAPINameChanged()) {
+				IFileEditorInput iFile = (IFileEditorInput) editorInput;				
+				saveas.setOriginalFile(iFile.getFile());
+			} else {
+				IPathEditorInput javaInput = (IPathEditorInput) editorInput;
+				IPath path = javaInput.getPath();
+				
+				if(xml.isAPINameChanged()){
+					String fileName = MetadataFilenameGenerator.createMetadataFilename(xml
+							.getAPIName());					
+					saveas.setOriginalName(fileName);
+				}
+				else{
+					saveas.setOriginalName(path.lastSegment());
+				}
+				
+			}
+
+			saveas.open();
+
+			if (SaveAsDialog.CANCEL == saveas.getReturnCode()) {
+				return;
+			}
+
+			if (saveas.getResult() == null
+					|| !saveas.getResult().toString().endsWith(".metaxml")
+					|| !saveas.getResult().getFileExtension().equals("metaxml")) {
+				showErrorDialog("Wrong file type",
+						"Save as was not complete. Please correct file type.",
+						"File type must be .metaxml");
+				return;
+			}
+
+			String containerName = saveas.getResult().removeLastSegments(1)
+					.toOSString();
+			String fileName = saveas.getResult().lastSegment();
+
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			IResource resource = root.findMember(new Path(containerName));
+
+			//This is also check by SaveAsDialog, double check
+			if (resource == null || !resource.exists()
+					|| !(resource instanceof IContainer)) {
+				showErrorDialog(
+						"Container must exist",
+						"Save as was not complete, container must exist. Please select existing container.",
+						"Conteiner does not exist");
+				return;
+			}
+			IContainer container = (IContainer) resource;
+			final IFile file = container.getFile(new Path(fileName));
+			//Creating temp file because given API name must be found
+			InputStream stream = openContentStream();
+			ProgressMonitorPart monitor = new ProgressMonitorPart(
+					getContainer(), new GridLayout());
+			file.create(stream, true, monitor);
+			stream.close();
+
+		} catch (CoreException e) {
+			showErrorDialog("Errors on save as", "Save as was not complete.",
+					e.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"CoreException on save as: " + e);
+			e.printStackTrace();
+		} catch (IOException e) {
+			showErrorDialog("Errors on save as", "Save as was not complete.",
+					e.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"IOException on save as: " + e);
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			showErrorDialog("Errors on save as", "Save as was not complete.",
+					e.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"NoSuchAlgorithmException on save as: " + e);
+			e.printStackTrace();
+		} catch (Exception e) {
+			showErrorDialog("Errors on save as", "Save as was not complete.",
+					e.getMessage());
+			MetadataEditorConsole.getInstance().println(
+					"Exception on save as: " + e);
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Open a stream from XML file that this class stores.
+	 * Client must close the opened stream.
+	 * @return {@link InputStream}
+	 */
+	private InputStream openContentStream() {
+		return new ByteArrayInputStream(xml.toString().getBytes());
+	}
+
+	/* (non-Javadoc)
+	 * Method declared on IEditorPart
+	 */
+	public void gotoMarker(IMarker marker) {
+		setActivePage(0);
+		IDE.gotoMarker(getEditor(0), marker);
+	}
+
+	/**
+	 * Checks that the input is an instance of {@link IFileEditorInput}
+	 * or {@link IPathEditorInput} when opened file is external file 
+	 * outside of Carbide workspace.
+	 * 
+	 * Sets title, icon and XML data to widgets.
+	 * 
+	 * @throws PartInitException if input was not what's expected.
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
+	 */
+
+	public void init(IEditorSite site, IEditorInput editorInput)
+			throws PartInitException {
+		if (!(editorInput instanceof IFileEditorInput)
+				&& !(editorInput instanceof IPathEditorInput)) {
+			throw new PartInitException(
+					"Invalid Input: Input type must be IFileEditorInput or IPathEditorInput, given input type was: "
+							+ editorInput.getClass().getName());
+		}
+		setTitle(editorInput);
+		setTitleImage(MetadataEditorActivator
+				.getImageForKey(MetadataEditorActivator.METADATA_EDITOR_ICON));
+		setMetadataXML(editorInput);
+
+		super.init(site, editorInput);
+	}
+
+	/**
+	 * When open a file, parsing and setting {@link #xml} from file to object.
+	 * 
+	 * If file was old existing file, parsing file and set it to {@link #xml},
+	 * if file was new just created file, creating new xml object and setting
+	 * it to {@link #xml}
+	 * 
+	 * @param input editor input given by framework.
+	 */
+	private void setMetadataXML(IEditorInput input) {
+
+		String fileName = "";
+		try {
+
+			String xmlString;
+			String fileLocation;
+			//Type is IFileEditorInput allways when file is opened from project
+			//If file opened outside project, editor type is IPathEditorInput			
+			if (input instanceof IFileEditorInput) {
+				IFileEditorInput iFile = (IFileEditorInput) input;
+				IFile file = iFile.getFile();
+				fileLocation = file.getLocation().toOSString();
+				fileName = file.getName();
+				InputStream in = file.getContents();
+				xmlString = getFileContents(in);
+				in.close();
+				in = null;
+
+			} else {
+				IPath path = ((IPathEditorInput) input).getPath();
+				fileLocation = path.toOSString();
+				fileName = path.lastSegment();
+				java.io.File fi = path.toFile();
+				FileInputStream in = new FileInputStream(fi);
+				xmlString = getFileContents(in);
+				in.close();
+				in = null;
+			}
+
+			//if file is just created new API metadatafile with wizard
+			//creating new xml object and opening it
+			if (xmlString.startsWith(MetadataXML.NEW_API_METADATA_FILE_UID)) {
+				//When removin unique ID from new file, API name remains
+				xmlString = xmlString.substring(
+						MetadataXML.NEW_API_METADATA_FILE_UID.length()).trim();
+				this.xml = new MetadataXML(xmlString, fileLocation);
+				setDirty(true);
+				MetadataEditorConsole.getInstance().println(
+						"Metadata XML file: '" + xml.getFileName()
+								+ "' created.");
+			}
+			//Otherwise file is old existing metadata file, parsing it and setting 
+			//xml to this.xml
+			else {
+				this.xml = parseXML(fileLocation);
+				setDirty(false);
+				MetadataEditorConsole.getInstance().println(
+						"Metadata XML file: '" + xml.getFileName()
+								+ "' opened.");
+			}
+
+		} catch (MetadataNotValidException e) {
+			//If parsing was ok, but xml was not walid setting xml so user can correct errors
+			if (e.getMetadataXML() != null) {
+				this.xml = e.getMetadataXML();
+			}
+			MetadataEditorConsole.getInstance().println(
+					"MetadataNotValidException on init: " + e.toString());
+			showErrorDialog("Errors on metadata XML", "Metadata XML file "
+					+ fileName + " could not be parsed.", e.getMessage());
+		} catch (Exception e) {
+			e.printStackTrace();
+			MetadataEditorConsole.getInstance().println(
+					"Exception on init: " + e.toString());
+			showErrorDialog("Error",
+					"Metadata editor could not be opened. Errors on "
+							+ fileName, e.getMessage());
+		}
+
+	}
+
+	/**
+	 * Get XML String from stream
+	 * @param inputStream
+	 * @return file contents
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private String getFileContents(InputStream inputStream) throws CoreException,
+			IOException {
+
+		InputStreamReader isr = new InputStreamReader(inputStream);
+		BufferedReader br = new BufferedReader(isr);
+		StringBuffer buf = new StringBuffer();
+		String line;
+		while ((line = br.readLine()) != null) {
+			buf.append(line);
+		}
+		String xmlString = buf.toString();
+		// Closing buffers
+		br.close();
+		isr.close();
+		return xmlString;
+	}
+
+	/**
+	 * Parse XML file to XML object
+	 * @param fileName
+	 * @return metadata XML this class represents.
+	 * @throws MetadataNotValidException
+	 */
+	private MetadataXML parseXML(String fileName)
+			throws MetadataNotValidException {
+		MetadataXMLParser parser = new MetadataXMLParser();
+		MetadataXML metadata = parser.parse(fileName);
+		return metadata;
+	}
+
+	/**
+	 * Setting editor title as file name
+	 * @param editorInput
+	 */
+	private void setTitle(IEditorInput editorInput) {
+
+		if (editorInput instanceof IFileEditorInput) {
+			IFileEditorInput iFile = (IFileEditorInput) editorInput;
+			IFile file = iFile.getFile();
+			setPartName(file.getName());
+		} else {
+			IPath path = ((IPathEditorInput) editorInput).getPath();
+			String filename = path.lastSegment();
+			setPartName(filename);
+		}
+	}
+
+
+	/**
+	 * Save As is always allowed.
+	 * @return <code>true</code>
+	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+	 */
+	public boolean isSaveAsAllowed() {
+		return true;
+	}
+
+	/**
+	 * Closes all project files on project close.
+	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+	 */
+	public void resourceChanged(final IResourceChangeEvent event) {
+		if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					IWorkbenchPage[] pages = getSite().getWorkbenchWindow()
+							.getPages();
+					for (int i = 0; i < pages.length; i++) {
+						if (((FileEditorInput) getEditorInput()).getFile()
+								.getProject().equals(event.getResource())) {
+							IEditorPart editorPart = pages[i]
+									.findEditor(getEditorInput());
+							pages[i].closeEditor(editorPart, true);
+						}
+					}
+				}
+			});
+		}
+	}
+
+	/**
+	 * If editor contents is modified, save is allowed
+	 * @param isDirty
+	 */
+	private void setDirty(boolean isDirty) {
+		this.isDirty = isDirty;
+		if (isDirty) {
+			firePropertyChange(PROP_DIRTY);
+		} else {
+			firePropertyChange(PROP_INPUT);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/ui/actions/ToolsMenuAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.ui.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.metadataeditor.MetadataEditorActivator;
+import com.nokia.s60tools.metadataeditor.common.ProductInfoRegistry;
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+import com.nokia.s60tools.metadataeditor.wizards.APIMetadataFileNewWizard;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Action for menu action "API Metadata file". Launches {@link APIMetadataFileNewWizard} wizard.
+ */
+public class ToolsMenuAction implements IWorkbenchWindowActionDelegate  {
+	
+	/**
+	 * Reference to workbench window
+	 */
+	private IWorkbenchWindow window;
+	
+	/**
+	 * Constructor.
+	 */
+	public ToolsMenuAction(){			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		this.window = window;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			
+			IProject projects [] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			if(projects.length < 1){
+				showErrorDialog( ProductInfoRegistry.getProductName() + " Error", 
+						"No existing projects in workspace! Please create a project before creating files!");
+				return;
+			}
+
+			
+    		APIMetadataFileNewWizard wiz = new APIMetadataFileNewWizard();
+    		IWorkbench wp = window.getWorkbench();
+    		
+    		ISelectionService selser = window.getSelectionService();
+    		ISelection sel = selser.getSelection(); 
+    		IStructuredSelection structSel = null;
+    		//pre-select selection if made in resource tree
+    		if(sel instanceof IStructuredSelection){
+    			structSel = (IStructuredSelection)sel;
+    		}
+
+    		
+    		wiz.init(wp, structSel);
+    		//Opening new Creator script file dialog.
+  	      	WizardDialog dialog = new WizardDialog
+	         (wp.getActiveWorkbenchWindow().getShell(),wiz);
+    		dialog.open();
+
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			MetadataEditorConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+	
+	/**
+	 * Show an error dialog
+	 * @param title
+	 * @param message
+	 * @param errors
+	 */
+	private void showErrorDialog(String title, String message) {
+		Shell sh = MetadataEditorActivator.getCurrentlyActiveWbWindowShell();
+		MessageDialog.openError(sh, title, message);
+		
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/util/MetadataEditorConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.metadataeditor.MetadataEditorActivator;
+import com.nokia.s60tools.metadataeditor.common.ProductInfoRegistry;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+
+/**
+ * Singleton class that offers console printing
+ * services for the AppDep product.
+ */
+public class MetadataEditorConsole extends AbstractProductSpecificConsole {
+	
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private MetadataEditorConsole instance = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public MetadataEditorConsole getInstance(){
+		if(instance == null ){
+			instance = new MetadataEditorConsole();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private MetadataEditorConsole(){		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleName()
+	 */
+	protected String getProductConsoleName() {
+		return ProductInfoRegistry.getConsoleWindowName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleImageDescriptor()
+	 */
+	protected ImageDescriptor getProductConsoleImageDescriptor() {
+		return MetadataEditorActivator.getImageDescriptorForKey(MetadataEditorActivator.METADATA_EDITOR_ICON);
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/util/MetadataFilenameGenerator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.util;
+
+public class MetadataFilenameGenerator {
+
+	/**
+	 * Characters that are not allowed in file name
+	 */
+	private static final String[] forbiddenChars = 
+	{ "-", "/", "&", "<", ">" };
+	
+
+	
+	public static String createMetadataFilename(String APINAme){
+		
+		String file = APINAme.toLowerCase().trim();
+		
+		//" +" means more than one white spaces, e.g. "a    b c" -> "a b c"
+		file = file.replaceAll(" +", " ");
+		file = file.replace('\\', '-');//Changing, so it will be removed
+		for (int i = 0; i < forbiddenChars.length; i++) {
+			file = file.replaceAll(forbiddenChars[i],  "");
+		}
+		file = file.replaceAll(" ", "_");
+		
+		return file + ".metaxml";
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/wizards/APIMetadataFileNewWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,192 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.s60tools.metadataeditor.MetadataEditorActivator;
+import com.nokia.s60tools.metadataeditor.xml.MetadataXML;
+
+/**
+ * This is a sample new wizard. Its role is to create a new file 
+ * resource in the provided container. If the container resource
+ * (a folder or a project) is selected in the workspace 
+ * when the wizard is opened, it will accept it as the target
+ * container. The wizard creates one file with the extension
+ * "mpe". If a sample multi-page editor (also available
+ * as a template) is registered for the same extension, it will
+ * be able to open it.
+ */
+
+public class APIMetadataFileNewWizard extends Wizard implements INewWizard {
+	private APIMetadataFileNewWizardPage page;
+	private ISelection selection;
+
+	/**
+	 * Constructor for SampleNewWizard.
+	 */
+	public APIMetadataFileNewWizard() {
+		super();
+		setNeedsProgressMonitor(true);
+	}
+	
+	/**
+	 * Adding the page to the wizard.
+	 */
+
+	public void addPages() {
+		page = new APIMetadataFileNewWizardPage(selection);
+		addPage(page);
+	}
+
+	/**
+	 * This method is called when 'Finish' button is pressed in
+	 * the wizard. We will create an operation and run it
+	 * using wizard as execution context.
+	 */
+	public boolean performFinish() {
+		final String containerName = page.getContainerName();
+		final String fileName = page.getFileName();
+		final String APIName = page.getAPIName();
+		IRunnableWithProgress op = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException {
+				try {
+					doFinish(containerName, fileName, APIName , monitor);
+				} catch (CoreException e) {
+					throw new InvocationTargetException(e);
+				} finally {
+					monitor.done();
+				}
+			}
+		};
+		try {
+			getContainer().run(true, false, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			Throwable realException = e.getTargetException();
+			MessageDialog.openError(getShell(), "Error", realException.getMessage());
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * The worker method. It will find the container, create the
+	 * file if missing or just replace its contents, and open
+	 * the editor on the newly created file.
+	 */
+
+	private void doFinish(
+		String containerName,
+		String fileName,
+		String APIName,
+		IProgressMonitor monitor)
+		throws CoreException {
+		// create a sample file
+		monitor.beginTask("Creating " + fileName, 2);
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IResource resource = root.findMember(new Path(containerName));
+		if (!resource.exists() || !(resource instanceof IContainer)) {
+			throwCoreException("Project \"" + containerName + "\" does not exist.");
+		}
+		IContainer container = (IContainer) resource;
+		final IFile file = container.getFile(new Path(fileName));
+		//File should not be possible to exist, because wizard page is chekking that
+		//Not creating file really in here, save file from editor will create file
+		try {
+			//Creating temp file because given API name must be found
+			InputStream stream = openContentStream(APIName);
+			file.create(stream, true, monitor);
+			stream.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		
+		monitor.worked(1);
+		monitor.setTaskName("Opening file for editing...");
+		getShell().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				IWorkbenchPage page =
+					PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				try {
+					IDE.openEditor(page, file, true);
+				} catch (PartInitException e) {
+				}
+			}
+		});
+		monitor.worked(1);
+	}
+	
+
+	private void throwCoreException(String message) throws CoreException {
+		IStatus status =
+			new Status(IStatus.ERROR, "com.nokia.s60tools.metadataeditor", IStatus.OK, message, null);
+		throw new CoreException(status);
+	}
+
+	/**
+	 * We will accept the selection in the workbench to see if
+	 * we can initialize from it.
+	 * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		this.selection = selection;
+		setImage();
+		setWindowTitle("New metadata file");
+
+	}
+	
+	
+	private InputStream openContentStream(String APIName) {
+		String contents = MetadataXML.NEW_API_METADATA_FILE_UID + APIName ;
+		return new ByteArrayInputStream(contents.getBytes());
+	}		
+	private void setImage() {
+		setDefaultPageImageDescriptor(MetadataEditorActivator.getImageDescriptorForKey(MetadataEditorActivator.METADATA_LARGE_ICON));
+	}	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/wizards/APIMetadataFileNewWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,258 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.wizards;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+import com.nokia.s60tools.metadataeditor.MetadataEditorHelpContextIDs;
+import com.nokia.s60tools.metadataeditor.util.MetadataFilenameGenerator;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well
+ * as the file name. The page will only accept file name without the extension
+ * OR with the extension that matches the expected one (mpe).
+ */
+
+public class APIMetadataFileNewWizardPage extends WizardPage {
+	private Text containerText;
+
+	private Text fileText;
+
+	private ISelection selection;
+
+	/**
+	 * Constructor for SampleNewWizardPage.
+	 * 
+	 * @param pageName
+	 */
+	public APIMetadataFileNewWizardPage(ISelection selection) {
+		super("wizardPage");
+		setTitle("Metadata file");
+		setDescription("This wizard creates a new metadata file with *.metaxml extension that can be opened by a Metadata Editor.");
+		this.selection = selection;
+	}
+
+	/**
+	 * Adding context sensitive help id:s to components
+	 *
+	 */
+	private void setHelps() {
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(containerText,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_CREATE);
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(fileText,
+				MetadataEditorHelpContextIDs.METADATA_EDITOR_HELP_CREATE);
+	}
+	
+	/**
+	 * @see IDialogPage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		container.setLayout(layout);
+		layout.numColumns = 3;
+		layout.verticalSpacing = 9;
+		Label label = new Label(container, SWT.NULL);
+		label.setText("&Project:");
+
+		containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		containerText.setLayoutData(gd);
+		containerText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+
+		Button button = new Button(container, SWT.PUSH);
+		button.setText("Browse...");
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleBrowse();
+			}
+		});
+		
+		label = new Label(container, SWT.NULL);
+		label.setText("&Fill API name, file name will be generated automatically.");	
+		
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 3;
+		label.setLayoutData(gd);
+		
+		
+		label = new Label(container, SWT.NULL);
+		label.setText("&API name:");
+
+		fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fileText.setLayoutData(gd);
+		fileText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				dialogChanged();
+			}
+		});
+				
+		initialize();
+		dialogChanged();
+		setControl(container);
+		setHelps();
+		
+	}
+
+	/**
+	 * Tests if the current workbench selection is a suitable container to use.
+	 */
+
+	private void initialize() {
+		if (selection != null && selection.isEmpty() == false
+				&& selection instanceof IStructuredSelection) {
+			IStructuredSelection ssel = (IStructuredSelection) selection;
+			if (ssel.size() > 1)
+				return;
+			Object obj = ssel.getFirstElement();
+			if (obj instanceof IResource) {
+				IContainer container;
+				if (obj instanceof IContainer)
+					container = (IContainer) obj;
+				else
+					container = ((IResource) obj).getParent();
+				containerText.setText(container.getFullPath().toString());
+				//If container is set, setting focus to file name field
+				fileText.setFocus();
+			}
+		}else{
+			//If there is only one project in workspace, we can set that to container, because user has no option
+			IProject projects [] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			if(projects.length == 1){
+				containerText.setText(projects[0].getFullPath().makeAbsolute().toString());
+			}			
+		}
+		
+	}
+
+
+	/**
+	 * Uses the standard container selection dialog to choose the new value for
+	 * the container field.
+	 */
+
+	private void handleBrowse() {
+		ContainerSelectionDialog dialog = new ContainerSelectionDialog(
+				getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+				"Select new file project");
+		if (dialog.open() == ContainerSelectionDialog.OK) {
+			Object[] result = dialog.getResult();
+			if (result.length == 1) {
+				containerText.setText(((Path) result[0]).toString());
+			}
+		}
+	}
+
+	/**
+	 * Ensures that both text fields are set.
+	 */
+
+	private void dialogChanged() {
+		IResource container = ResourcesPlugin.getWorkspace().getRoot()
+				.findMember(new Path(getContainerName()));
+		String APIName = getAPIName();
+		String fileName = getFileName();
+
+		if (getContainerName().length() == 0) {
+			updateStatus("Project must be specified");
+			return;
+		}
+		if (container == null
+				|| (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
+			updateStatus("Project must exist");
+			return;
+		}
+		if (!container.isAccessible()) {
+			updateStatus("Project must be writable");
+			return;
+		}
+
+		if (APIName.length() == 0) {
+			updateStatus("API name must be specified");
+			return;
+		}
+		if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
+			updateStatus("File name must be valid");
+			return;
+		}
+
+		//Checking if file exist
+		IContainer cont = (IContainer) container;
+		final IFile file = cont.getFile(new Path(fileName));
+
+		if (file.exists()) {
+			updateStatus("File allready exist");
+			return;
+		}
+
+		//All OK, showing generated file name
+		updateStatus(null);
+		setMessage("File name will be: " + fileName);
+
+	}
+
+	private void updateStatus(String message) {
+		setErrorMessage(message);
+		setPageComplete(message == null);
+	}
+
+	public String getContainerName() {
+		return containerText.getText();
+	}
+
+	public String getAPIName() {
+		return fileText.getText().trim();
+	}
+
+	public String getFileName() {
+		return MetadataFilenameGenerator.createMetadataFilename(getAPIName());
+	}
+
+	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/APIIDGenerator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.xml;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class APIIDGenerator {
+
+	/**
+	 * Calculates unique id (MD5 checksum) from APIName and returns it.
+	 * @param APIName
+	 * @return MD5 checksum from APIName
+	 * @throws NoSuchAlgorithmException
+	 */
+	public String getID(String APIName) throws NoSuchAlgorithmException {
+
+		MessageDigest md = MessageDigest.getInstance("MD5");
+		StringBuffer chekcsum = new StringBuffer();
+		byte[] bytes = md.digest(APIName.getBytes());
+
+		for (int i = 0; i < bytes.length; i++) {
+			String hexStr = Integer.toHexString(0xff & bytes[i]);
+			if (hexStr.length() < 2) {
+				chekcsum.append("0");
+			}
+			chekcsum.append(hexStr);
+		}
+		return chekcsum.toString();
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataNotValidException.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.xml;
+
+public class MetadataNotValidException extends Exception {
+
+	MetadataXML xml = null;
+	
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Exception must have description, no default constructor
+	 */
+	@SuppressWarnings("unused")
+	private MetadataNotValidException() {
+	}
+
+	public MetadataNotValidException(String arg0) {
+		super(arg0);
+	}
+
+	public MetadataNotValidException(String arg0, Throwable arg1) {
+		super(arg0, arg1);
+	}
+
+	public MetadataNotValidException(String errors, MetadataXML xml) {
+		super(errors);
+		this.xml = xml;
+	}
+
+	/**
+	 * Get so far parsed XML. Not necessarily contain all information what 
+	 * is in xml file. Contains only that information what was found before
+	 * parsing fails, rest of the elements was not parsed.
+	 * 
+	 * @return a XML that could not be parsed. 
+	 */
+	public MetadataXML getMetadataXML() {
+		return this.xml;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataXML.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,957 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+package com.nokia.s60tools.metadataeditor.xml;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+import com.nokia.s60tools.metadataeditor.core.MetadataEditorSettings;
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+import com.nokia.s60tools.metadataeditor.util.MetadataFilenameGenerator;
+import com.nokia.s60tools.util.xml.XMLIndentor;
+
+/**
+ * Metadata class representing metadata in Editor area as well as Metadata XML file in
+ * hard drive. Use <code>toString()</code> to get XML String representing this metadata file.
+ * <code>toFile()</code> can be used to store this XML to file. 
+ * 
+ * When user is updating values in UI and using <code>save</code> or <code>saveAs</code>
+ * functionality, updata corresponding values and get XML data by using <code>toString()</code>.
+ *
+ */
+public class MetadataXML {
+
+	//public constants
+	
+	/**
+	 * Value in version attributes when not set
+	 */
+	public static final String NOT_SET = "";
+	
+	/**
+	 * Current XML data version. Only change when XML format is changing.
+	 * NOTE: When XML format is changed, also backward compatibility issues
+	 * should be taken care of!
+	 */
+	public static final String DATA_VERSION_1_0 = "1.0";
+
+	/**
+	 * Current XML data version. Only change when XML format is changing.
+	 * NOTE: When XML format is changed, also backward compatibility issues
+	 * should be taken care of!
+	 */
+	public static final String DATA_VERSION_2_0 = "2.0";
+	
+	
+	/**
+	 * Unique ID for new with wizard created metadata xml file.
+	 * When file content is just this, UI will know that it's a new file. 
+	 */
+	public static final String NEW_API_METADATA_FILE_UID = "com.nokia.s60tools.metadataeditor.new_file";
+	
+	/**
+	 * Characters that is not allowed to exist in XML
+	 */
+	public static final String[] FORBIDDEN_CHARS = 
+	{"&", "<", ">" };	
+
+	private static String [] noYesValues  = {"no" ,"yes"};
+
+
+	/**
+	 * default location for XML comments.
+	 */
+	public static final String DEFAULT_COMMENT_LOCATION = "xml";
+
+	
+	//DATA
+	private String APIName;
+	private String APIID;
+	private String dataVersion;
+	private String type;
+	private String description;
+	private String subsystem;
+	private Vector<String> libs;
+	private Map<String, Vector<String>> comments;
+	private String releaseCategory;
+	private String releaseSince;
+	private boolean releaseDeprecated;
+	private String releaseDeprecatedSince;
+	private boolean htmlDocProvided;
+	private boolean adaptation;
+	private boolean extendedSDK;
+	private String extendedSDKSince;
+	private boolean extendedSDKDeprecated;
+	private String extendedSDKDeprecatedSince;
+	
+	//FILE NAME
+	private String fileName;
+
+	/**
+	 * flag will tell if this file is just created with Wizard.
+	 * So the Editor view know that this can't be parsed.
+	 * This will set as false when this.setName(String) is called.
+	 */
+	private boolean isNew;
+
+	private String validityErrors;
+	
+	public MetadataXML() {
+		super();
+		this.fileName = NOT_SET;
+		init(false);
+	}	
+	
+	/**
+	 * Use this conrstruction if metadata XML is new (not readed from file).
+	 * When using this construction, remember to set APIID.
+	 * @param fileName
+	 * @throws NoSuchAlgorithmException
+	 */
+	public MetadataXML(String fileName) {
+		super();
+		this.fileName = fileName;
+		this.APIID = NOT_SET;
+		this.APIName = NOT_SET;
+		init(true);
+		
+	}
+	
+	/**
+	 * Use this conrstruction if metadata XML is new (not readed from file).
+	 * Generating APIID from given APIName
+	 * @param APIName
+	 * @param fileName
+	 * @throws NoSuchAlgorithmException if API ID MD5 checksum calculation fails
+	 * @throws MetadataNotValidException 
+	 */
+	public MetadataXML(String APIName, String fileName) throws NoSuchAlgorithmException, MetadataNotValidException {
+		super();
+		this.APIName = removeForbiddenChars(APIName);		
+		this.fileName = fileName;
+
+		//Generate api ID by api name
+		APIIDGenerator gen = new APIIDGenerator();		
+		this.APIID = gen.getID(getAPIName());		
+		
+		init(true);
+	}
+
+	/**
+	 * 
+	 * @param APIName
+	 * @param APIID
+	 * @param dataVersion
+	 * @param type
+	 * @param description
+	 * @param subsystem
+	 * @param libs
+	 * @param releaseCategory
+	 * @param releaseSince
+	 * @param releaseDeprecated
+	 * @param releaseDeprecatedSince
+	 * @param htmlDocProvided
+	 * @param adaptation
+	 * @param extendedSDK
+	 * @param extendedSDKSince
+	 * @param extendedSDKDeprecatedSince
+	 * @param fileName
+	 * @throws MetadataNotValidException 
+	 */
+	public MetadataXML(String APIName, String APIID, String dataVersion, String type, 
+			String description, String subsystem, Vector<String> libs, String releaseCategory, 
+			String releaseSince, boolean releaseDeprecated, String releaseDeprecatedSince, 
+			boolean htmlDocProvided, boolean adaptation, boolean extendedSDK, String extendedSDKSince, 
+			String extendedSDKDeprecatedSince, String fileName, Map<String, Vector<String>> comments) 
+	throws MetadataNotValidException {
+		super();
+		this.APIName = removeForbiddenChars(APIName);
+		
+		this.APIID = APIID;
+		this.dataVersion = dataVersion;
+		this.type = type;
+		this.comments = comments;
+		this.description = removeForbiddenChars(description);
+		this.subsystem = removeForbiddenChars(subsystem);
+		this.libs = libs;
+		this.releaseCategory = releaseCategory;
+		this.releaseSince = releaseSince;
+		this.releaseDeprecated = releaseDeprecated;
+		this.releaseDeprecatedSince = releaseDeprecatedSince;
+		this.htmlDocProvided = htmlDocProvided;
+		this.adaptation = adaptation;
+		this.extendedSDK = extendedSDK;
+		this.extendedSDKSince = extendedSDKSince;
+		this.extendedSDKDeprecatedSince = extendedSDKDeprecatedSince;
+		this.fileName = fileName;
+		this.isNew = false;
+	}
+		
+	private void init(boolean isNew){
+		this.dataVersion = DATA_VERSION_2_0;
+		
+		if(isNew){
+			this.type = MetadataEditorSettings.getInstance().getDefaultType();
+		}else{
+			this.type = NOT_SET;
+		}
+		
+		this.description = NOT_SET;
+		this.subsystem = NOT_SET;
+		this.releaseCategory = NOT_SET;
+		this.releaseSince = NOT_SET;
+		
+		this.libs = new Vector<String>();
+		this.releaseDeprecated = false;
+		this.releaseDeprecatedSince = NOT_SET;
+		this.extendedSDKDeprecated = false;
+		this.extendedSDKDeprecatedSince = NOT_SET;
+		this.extendedSDK = false;
+		this.extendedSDKSince = NOT_SET;		
+		
+		this.validityErrors = NOT_SET;
+		
+		//When creating new file, setting flag
+		this.isNew = isNew;
+		comments = new HashMap<String, Vector<String>>();
+		
+	}
+
+	public String getAdaptation(){
+		return getYesNo(isAdaptation());
+	}	
+	public boolean isAdaptation() {
+		return adaptation;
+	}
+	public void setAdaptation(boolean adaptation) {
+		this.adaptation = adaptation;
+	}
+	public String getAPIID() {
+		return APIID;
+	}
+	public void setAPIID(String apiid) {
+		APIID = apiid;
+	}
+	public String getAPIName() {
+		return APIName;
+	}
+	public void setAPIName(String name){
+		APIName = removeForbiddenChars(name);
+		this.isNew = false; 
+		
+	}
+	public String getDataVersion() {
+		return dataVersion;
+	}	
+	public void setDataVersion(String dataVersion) throws MetadataNotValidException {
+		if(isVersionNumberValid(dataVersion)){
+			this.dataVersion = dataVersion;	
+		}
+		else {
+			throw new MetadataNotValidException("Data version was not valid, value was: " +dataVersion);
+		}					
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = removeForbiddenChars(description);
+	}
+	public boolean isExtendedSDK() {
+		return extendedSDK;
+	}
+	public void setExtendedSDK(boolean extendedSDK) {
+		this.extendedSDK = extendedSDK;
+	}
+	public String getExtendedSDKDeprecatedSince() {
+		return extendedSDKDeprecatedSince;
+	}
+	/**
+	 * @param extendedSDKDeprecatedSince
+	 * @throws MetadataNotValidException
+	 */
+	public void setExtendedSDKDeprecatedSince(String extendedSDKDeprecatedSince) throws MetadataNotValidException {
+
+		if(extendedSDKDeprecatedSince.equals(NOT_SET)){
+			this.setExtendedSDKDeprecated(false);
+			this.extendedSDKDeprecatedSince = NOT_SET;
+		}
+		else if(isVersionNumberValid(extendedSDKDeprecatedSince)){			
+			this.extendedSDKDeprecatedSince = extendedSDKDeprecatedSince;
+			this.setExtendedSDKDeprecated(true);
+		}
+		else {
+			throw new MetadataNotValidException("Extended SDK Deprecated since was not valid, value was: " +dataVersion);
+		}					
+	}
+	public String getExtendedSDKSince() {
+		return extendedSDKSince;
+	}
+	public void setExtendedSDKSince(String extendedSDKSince) throws MetadataNotValidException {
+		if(isVersionNumberValid(extendedSDKSince)){			
+			this.extendedSDKSince = extendedSDKSince;
+			this.setExtendedSDK(true);
+		}
+		else {
+			this.extendedSDKSince = NOT_SET;
+			this.setExtendedSDK(true);
+			throw new MetadataNotValidException("Extended SDK since was not valid, value was: " +dataVersion);
+		}					
+	}
+	
+	public String getHtmlDocProvided(){
+		return getYesNo(isHtmlDocProvided());
+	}
+	public boolean isHtmlDocProvided() {
+		return htmlDocProvided;
+	}
+	public void setHtmlDocProvided(boolean htmlDocProvided) {
+		this.htmlDocProvided = htmlDocProvided;
+	}
+	public Vector<String> getLibs() {
+		return libs;
+	}
+	public void setLibs(Vector<String> libs) {
+		this.libs = libs;
+	}
+	public void addLib(String lib) {
+		this.libs.add(lib);
+	}
+
+	public String getReleaseCategory() {
+		return releaseCategory;
+	}
+	public void setReleaseCategory(String releaseCategory) {
+		this.releaseCategory = releaseCategory;
+	}
+	public boolean isReleaseDeprecated() {
+		return releaseDeprecated;
+	}
+	/**
+	 * Setting this.releaseDeprecatedSince to "" as well
+	 * @param releaseDeprecated
+	 */
+	public void setReleaseDeprecated(boolean releaseDeprecated) {
+		if(!releaseDeprecated){
+			this.releaseDeprecatedSince = NOT_SET;
+		}
+		this.releaseDeprecated = releaseDeprecated;
+	}
+	public String getReleaseDeprecatedSince() {
+		return releaseDeprecatedSince;
+	}
+	/**
+	 * @param releaseDeprecatedSince
+	 * @throws MetadataNotValidException
+	 */
+	public void setReleaseDeprecatedSince(String releaseDeprecatedSince) throws MetadataNotValidException {
+
+		if(isVersionNumberValid(releaseDeprecatedSince)){			
+			this.releaseDeprecatedSince = releaseDeprecatedSince;
+			this.setReleaseDeprecated(true);
+		}
+		else {
+			//Must set to NOT_SET so isValid() will tell that it's not valid
+			this.releaseDeprecatedSince = NOT_SET;
+			this.setReleaseDeprecated(true);
+			throw new MetadataNotValidException("Release deprecated since was not valid, value was: " +dataVersion);
+		}					
+	}
+	public String getReleaseSince() {
+		return releaseSince;
+	}
+	/**
+	 * Sets the Release since version. If release category is "domain" 
+	 * value can be this.NOT_SET or valid version number, if release category
+	 * is "sdk" since must be valid release number. In any case release since
+	 * can be set as this.NOT_SET when this.isValid() will tell that if xml
+	 * is valid or not.
+	 * 
+	 * @param releaseSince
+	 * @throws MetadataNotValidException
+	 */
+	public void setReleaseSince(String releaseSince) throws MetadataNotValidException {
+		if(isVersionNumberValid(releaseSince) || releaseSince.equals(NOT_SET)){
+			this.releaseSince = releaseSince;	
+		}				
+		else {
+			throw new MetadataNotValidException("Release since was not valid, value was: " +releaseSince);
+		}		
+	}
+	public String getSubsystem() {
+		return subsystem;
+	}
+	public void setSubsystem(String subsystem){
+		this.subsystem = removeForbiddenChars(subsystem);
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getFileName() {
+		return fileName;
+	}
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public boolean isExtendedSDKDeprecated() {
+		return extendedSDKDeprecated;
+	}
+
+	/**
+	 * Setting this.extendedSDKDeprecatedSince to "" as well
+	 * @param extendedSDKDeprecated
+	 */
+	public void setExtendedSDKDeprecated(boolean extendedSDKDeprecated) {
+		if(!extendedSDKDeprecated){
+			this.extendedSDKDeprecatedSince = NOT_SET;
+		}
+		this.extendedSDKDeprecated = extendedSDKDeprecated;
+	}
+	
+	public String getYesNo(boolean yes){
+		return yes ? "yes" : "no" ;
+	}
+	public boolean isYes(String yesString){
+		return yesString.equalsIgnoreCase("yes") ? true : false ;
+	}
+	
+	public String toString(){
+		return toXMLString();
+	}
+	
+	/** 
+	 * Get this object as XML String.
+	 * @return a XML String representing this Metadata file
+	 */
+	private String toXMLString(){
+		
+		StringBuffer b = new StringBuffer();
+		
+		b.append("<?xml version=\"1.0\" ?>");
+				
+		String api = "api";
+		
+		if(hasCommentFor(api)){
+			addCommentToBuffer(b, getComment(api) );
+		}
+		
+		b.append("<" + api + " id=\"");
+		b.append(this.getAPIID());
+		b.append("\" dataversion=\"");
+		b.append(this.getDataVersion());
+		b.append("\">");
+		String name = "name";
+		if(hasCommentFor(name)){
+			addCommentToBuffer(b, getComment(name) );
+		}
+		
+		b.append("<" + name + ">");
+		b.append(this.getAPIName());
+		b.append("</" +name +">");
+		
+		
+		String description = "description";
+		if(hasCommentFor(description)){
+			addCommentToBuffer(b, getComment(description) );
+		}		
+		b.append("<" + description + ">");
+		b.append(this.getDescription());
+		b.append("</" +description+">");
+
+		String type = "type";
+		if(hasCommentFor(type)){
+			addCommentToBuffer(b, getComment(type) );
+		}		
+		b.append("<" + type + ">");
+		b.append(this.getType());
+		b.append("</" +type +">");
+
+		//subsystem is subsystem version 1.0 and collection on 2.0 onwards. 
+		String subsystem = getSubsystemString().toLowerCase();
+		if(hasCommentFor(subsystem)){
+			addCommentToBuffer(b, getComment(subsystem) );
+		}		
+		b.append("<");
+		b.append(subsystem);
+		b.append(">");
+		b.append(this.getSubsystem());
+		b.append("</");
+		b.append(subsystem);
+		b.append(">");
+
+		String libs = "libs";
+		if(hasCommentFor(libs)){
+			addCommentToBuffer(b, getComment(libs) );
+		}		
+		b.append("<" + libs + ">");
+		
+		String lib = "lib";
+		//Comments for "lib" cannot be added in loop, because same comments will then be for all "lib" elements
+		//Now all comments for "lib"s will be above first "lib" element
+		if(hasCommentFor(lib)){
+			addCommentToBuffer(b, getComment(lib) );
+		}					
+		for(int i = 0; i< this.getLibs().size(); i++){
+			b.append("<" + lib + " name=\"");
+			b.append(this.getLibs().get(i));
+			b.append("\"/>");
+		}
+		b.append("</" +libs +">");
+		
+		String release = "release";
+		if(hasCommentFor(release)){
+			addCommentToBuffer(b, getComment(release) );
+		}		
+		b.append("<" + release + " category=\"");
+		b.append(this.getReleaseCategory());
+		b.append("\" sinceversion=\"");
+		b.append(this.getReleaseSince());
+		b.append("\"");
+		if(isReleaseDeprecated()){
+			b.append(" deprecatedsince=\"");
+			b.append(this.getReleaseDeprecatedSince());
+			b.append("\"");
+		}
+		b.append("/>");
+		
+		String attributes = "attributes";
+		if(hasCommentFor(attributes)){
+			addCommentToBuffer(b, getComment(attributes) );
+		}		
+		b.append("<" + attributes + ">");		
+		String htmlDoc = "htmldocprovided";
+		if(hasCommentFor(htmlDoc)){
+			addCommentToBuffer(b, getComment(htmlDoc) );
+		}			
+		b.append("<" + htmlDoc + ">");
+		b.append(this.getYesNo(this.isHtmlDocProvided()));
+		b.append("</" +htmlDoc +">");
+		String adaptation = "adaptation";
+		if(hasCommentFor(adaptation)){
+			addCommentToBuffer(b, getComment(adaptation) );
+		}			
+		b.append("<" + adaptation + ">");
+		b.append(this.getYesNo(this.isAdaptation()));
+		b.append("</" + adaptation + ">");
+		
+		//extended SDK occurs only in version 1.0
+		if(getDataVersion().equals(MetadataXML.DATA_VERSION_1_0)){
+		
+			if(isExtendedSDK()){
+				String extendedSDK = "extendedsdk";
+				if(hasCommentFor(extendedSDK)){
+					addCommentToBuffer(b, getComment(extendedSDK) );
+				}				
+				b.append("<" + extendedSDK + " sinceversion=\"");
+				b.append(this.getExtendedSDKSince());
+				b.append("\"");
+				if(isExtendedSDKDeprecated()){
+					b.append(" deprecatedsince=\"");
+					b.append(this.getExtendedSDKDeprecatedSince());
+					b.append("\"");				
+				}
+				b.append("/>");	
+			}
+		
+		}
+		
+		b.append("</" +attributes +">");
+		
+		b.append("</" +api +">");
+	
+		String xmlWithOutIndents = b.toString();
+		
+		String xmlWithIndents;
+		try {
+			xmlWithIndents = XMLIndentor.indentXML(xmlWithOutIndents);
+			return xmlWithIndents;			
+			// If indent fails, dont throw error, just return XML with no indents
+		} catch (UnsupportedEncodingException e) {
+			printIndentErrorMsg(e);
+		} catch (TransformerException e) {
+			printIndentErrorMsg(e);
+		} catch (Exception e) {
+			printIndentErrorMsg(e);
+		}		
+		return xmlWithOutIndents;
+	}
+
+	/**
+	 * Adds comment to buffer
+	 * @param b
+	 * @param comments
+	 */
+	private void addCommentToBuffer(StringBuffer b, Vector<String> comments) {
+		for (String comment : comments) {
+			b.append("<!--");
+			b.append(comment);			
+			b.append("-->");
+		}
+		
+	}
+
+	/**
+	 * Print indent error message
+	 * @param e
+	 */
+	private void printIndentErrorMsg(Exception e) {
+		e.printStackTrace();
+		MetadataEditorConsole.getInstance().println(
+				"Unable to indent Metadata file: '" +getFileName() + "'. Error was: " +e, 
+				MetadataEditorConsole.MSG_ERROR);
+	}
+	
+	
+	
+	
+	/**
+	 * Save this.toString() to file.
+	 * @param fileName
+	 * @throws IOException
+	 */
+	public void toFile( String fileName ) throws IOException {		
+		
+		try {
+			BufferedWriter out = new BufferedWriter(new FileWriter(
+					fileName));
+			out.write(toXMLString());
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw e;
+		}finally{
+			
+		}
+	}		
+	
+	public static boolean isVersionNumberValid(String versionNumber){
+		try {
+			if( !isSet(versionNumber) || 					
+					versionNumber.indexOf('.') == -1 ||
+					versionNumber.length() != 3 ){
+				return false;
+			}
+				Integer.parseInt(versionNumber.substring(0,1));
+				Integer.parseInt(versionNumber.substring(2,3));
+		} catch (Exception e) {
+			//NumberFormatException can occur
+			return false;
+		}
+		
+		return true;
+	}
+	
+	private static boolean isSet(String value){
+		boolean isSet =  true;
+		if(value == null || value.trim().length() == 0 || value.equals(NOT_SET)){
+			isSet = false;
+		}
+		
+		return isSet;
+	}
+	
+	/**
+	 * @return true if this MetadataXML is valid false otherwise
+	 */
+	public boolean isValid(){
+		
+		boolean valid = true;
+		StringBuffer errors = new StringBuffer();
+		
+		if (!isSet(this.getAPIName())) {
+			errors.append("Name is required.\n");
+			valid = false;
+		}
+		if (!isSet(this.getAPIID())) {
+			errors.append("API ID is required.\n");
+			valid = false;
+		}
+		//Can occur if readed from file and not set
+		if (!isSet(this.getDataVersion())) {
+			errors.append("Data version is required.\n");
+			valid = false;
+		}
+		if (!isSet(this.getDescription())) {
+			errors.append("Description is required.\n");
+			valid = false;
+		}
+		if (!isSet(this.getType())) {
+			errors.append("Type is required.\n");
+			valid = false;
+		}
+		if (!isSet(this.getSubsystem())) {
+			errors.append(getSubsystemString()  +" is required.\n");
+			valid = false;
+		}
+		if (!isSet(this.getReleaseCategory())) {
+			errors.append("Category is required.\n");
+			valid = false;
+		}
+
+		
+		//version release since is mandatory if category is "sdk" 
+		//optional if category is "domain"
+		if((	this.getReleaseCategory().equalsIgnoreCase(getSDK_or_PublicString()) ) 
+				&& (!isSet(this.getReleaseSince()) 
+				|| !isVersionNumberValid(this.getReleaseSince())))
+		{
+			errors.append("Release since is required when category is " +getSDK_or_PublicString() +".\n");
+			valid = false;
+		}
+		if(this.isReleaseDeprecated()){
+			if(!isSet(this.getReleaseDeprecatedSince()) 
+					 || !isVersionNumberValid(this.getReleaseDeprecatedSince()))
+			{
+				errors.append("Deprecated since is required if API is deprecated.\n");
+				valid = false;
+			}
+			else if(isSDKDeprecatedBeforeCreated(this.getReleaseSince(), this.getReleaseDeprecatedSince())){
+				errors.append("Release cannot be deprecated before it is released.\n");
+				valid = false;
+			}			
+		}
+		if(this.isExtendedSDK()){
+			if(!isSet(this.getExtendedSDKSince()) 
+					|| !isVersionNumberValid(this.getExtendedSDKSince()) )
+			{
+				errors.append("Extended SDK since version is required if API is part of extended SDK.\n");
+				valid = false;
+			}			
+			
+			if(this.isExtendedSDKDeprecated()){
+				if(!isSet(this.getExtendedSDKDeprecatedSince())
+						|| !isVersionNumberValid(this.getExtendedSDKDeprecatedSince()))
+				{
+					errors.append("Deprecated since is required.\n");
+					valid = false;
+				}
+				if(isSDKDeprecatedBeforeCreated(this.getExtendedSDKSince(), this.getExtendedSDKDeprecatedSince())){
+					errors.append("Extended SDK cannot be deprecated before it is released.\n");
+					valid = false;
+				}
+			}
+		}
+		if(!valid){
+			validityErrors = errors.toString();
+		}else{
+			validityErrors = NOT_SET;
+		}
+		
+		return valid;		
+	}
+
+	public String getSubsystemString() {
+		if(DATA_VERSION_1_0.equals(getDataVersion())){
+			return "Subsystem";
+		}else{
+			return "Collection";
+		}
+
+	}
+
+	public String getSDK_or_PublicString() {
+		if(DATA_VERSION_1_0.equals(getDataVersion())){
+			return "sdk";
+		}else{
+			return "public";
+		}
+	}
+	
+	private boolean isSDKDeprecatedBeforeCreated(String sdkVersion, String deprVersion){
+		
+		boolean deprBeforeCreated = true;
+		try {
+			Double sdk = new Double(sdkVersion);
+			Double depr = new Double(deprVersion);
+			int compare = sdk.compareTo(depr);
+			deprBeforeCreated = compare <= 0 ? false : true ;
+		} catch (Exception e) {
+			//NumberFormatException may occur
+			e.printStackTrace();
+			MetadataEditorConsole.getInstance().println(
+					"Exception on deprecation check: " +e.toString() 
+					+". Values was: '" +sdkVersion +"', '" +deprVersion +"'.");
+		}
+		return deprBeforeCreated;
+		
+	}
+
+	public boolean isNew() {
+		return isNew;
+	}
+
+	public String[] getNoYesValues() {
+		return noYesValues;
+	}
+
+	public String[] getCategoryValues(String SDKVersion) {
+		return MetadataEditorSettings.getInstance().getCategoryValues(SDKVersion);
+	}
+
+	public String[] getSDKVersionValues() {
+		return MetadataEditorSettings.getInstance().getSDKVersionValues();
+	}
+
+	public String[] getTypeValues() {
+		return MetadataEditorSettings.getInstance().getTypeValues();
+	}
+
+	public String getValidityErrors() {
+		//Make sure that errors are set propeply
+		this.isValid();
+		return validityErrors;
+	}
+
+	/**
+	 * Checks that there are no forbidden characters and replaces
+	 * with valid ones if needed.
+	 * @param in String to be checked.
+	 * @return Returns checked and corrected string.
+	 */
+	public static String removeForbiddenChars(String in){
+		
+		String out = new String(in); 
+		for(int i=0; i<FORBIDDEN_CHARS.length; i++){
+			out = out.replace(FORBIDDEN_CHARS[i], "");
+		}
+		
+		return out;		
+	}	
+	
+	/**
+	 * Checks that there are no forbidden characters and replaces
+	 * with valid ones if needed.
+	 * @param in String to be checked.
+	 * @return Returns checked and corrected string.
+	 */
+	public static boolean containForbiddenChars(String in){
+		
+		for(int i=0; i<FORBIDDEN_CHARS.length; i++){
+			if(in.indexOf(FORBIDDEN_CHARS[i]) != -1){
+				return true;
+			}
+		}
+		
+		return false;
+
+	}		
+	
+	public boolean isAPINameChanged(){
+		IPath file = new Path (fileName);		
+		String fileN = file.lastSegment();
+		String genFileN = MetadataFilenameGenerator.createMetadataFilename(APIName);
+		return genFileN.equals(fileN) ? false : true;
+	}
+	
+	/**
+	 * Updates data version to 2.0 and sets {@link MetadataXML#setReleaseCategory(String)} to new version values.
+	 */
+	public void updateToVersion2_0(){
+		this.dataVersion = DATA_VERSION_2_0;
+		String category = getReleaseCategory();
+		if(!NOT_SET.equals(category)){
+			String [] catVal1 = MetadataEditorSettings.getInstance().getCategoryValues(DATA_VERSION_1_0);
+			String [] catVal2 = MetadataEditorSettings.getInstance().getCategoryValues(DATA_VERSION_2_0);
+			if(category.equals(catVal1[0])){
+				setReleaseCategory(catVal2[0]);
+			}else{
+				setReleaseCategory(catVal2[1]);
+			}
+		}
+	}
+
+	/**
+	 * Add comment to XML
+	 * @param string
+	 */
+	public void addComment(String element, String comment) {
+		if(comments.containsKey(element)){
+			Vector<String> existingComments = comments.get(element);
+			existingComments.add(comment);
+			comments.put(element, existingComments);
+		}else{
+			Vector<String> newComments = new Vector<String>();
+			newComments.add(comment);
+			comments.put(element, newComments);
+		}
+	}
+	
+	/**
+	 * Add comment to XML
+	 * @param string
+	 */
+	public void addComments(String element, Vector<String> commentsForOneElement) {
+		if(comments.containsKey(element)){
+			Vector<String> existingComments = comments.get(element);
+			existingComments.addAll(commentsForOneElement);
+			comments.put(element, existingComments);
+		}else{
+			comments.put(element, commentsForOneElement);
+		}		
+	}	
+	
+	/**
+	 * get comments, return empty vector if dont have any
+	 * @return comments
+	 */	 
+	public Collection<Vector<String>> getComments(){
+		return comments.values();
+	}
+	
+	/**
+	 * Check if this XML has comments or not
+	 * @return <code>true</code> if has comments, <code>false</code> otherwise.
+	 */
+	public boolean hasComments(){
+		return !comments.isEmpty();
+	}
+	
+	/**
+	 * Check if this XML has comments or not
+	 * @return <code>true</code> if has comments, <code>false</code> otherwise.
+	 */
+	public boolean hasCommentFor(String elementName){
+		return comments.containsKey(elementName);
+	}	
+	
+	/**
+	 * Check if this XML has comments or not
+	 * @return <code>true</code> if has comments, <code>false</code> otherwise.
+	 */
+	public Vector<String> getComment(String elementName){
+		return comments.get(elementName);
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataeditor/com.nokia.s60tools.metadataeditor/src/com/nokia/s60tools/metadataeditor/xml/MetadataXMLParser.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,313 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+ 
+ 
+package com.nokia.s60tools.metadataeditor.xml;
+
+import java.io.CharArrayWriter;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Vector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.DefaultHandler2;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import com.nokia.s60tools.metadataeditor.util.MetadataEditorConsole;
+
+public class MetadataXMLParser {
+
+	public MetadataXMLParser() {
+	}
+
+	/**
+	 * 
+	 * @param fileName file to be parsed
+	 * @return MetadataXML object with all elements and attributes set
+	 * @throws SAXException
+	 * @throws IOException
+	 * @throws MetadataNotValidException if parsed data was not valid
+	 */
+	public MetadataXML parse(String fileName) throws  MetadataNotValidException  {
+		XMLReader reader;
+		MetadataXML xml = null;
+		MetadataXMLHandler handler = null;
+		try {
+			handler = new MetadataXMLHandler(fileName);
+			reader = XMLReaderFactory.createXMLReader();
+			//tel to parser that Lexical handler (@see http://java.sun.com/j2se/1.5.0/docs/api/org/xml/sax/ext/LexicalHandler.html) 
+			//is in use, if not done, the @link{ MetadataXMLHandler.comment () } wont work.
+			reader.setProperty ("http://xml.org/sax/properties/lexical-handler", handler);	
+			reader.setContentHandler(handler);
+			MetadataXMLErrorHandler errorHandler = new MetadataXMLErrorHandler();
+			reader.setErrorHandler(errorHandler);
+	
+			FileReader r = new FileReader(fileName);
+			reader.parse(new InputSource(r));
+			
+			xml = handler.getMetadataXML();
+			if(xml.isValid()){
+				return xml;
+			}
+			else{
+				throw new MetadataNotValidException(handler.getErrors(), xml);
+			}
+
+		} catch (SAXException e) {
+			e.printStackTrace();
+			MetadataEditorConsole.getInstance().println("SAXException on parsing: " +e.toString() );
+			throw new MetadataNotValidException(e.getMessage());
+		} catch (FileNotFoundException e) {
+			MetadataEditorConsole.getInstance().println("FileNotFoundException on parsing: " +e.toString() );			
+			e.printStackTrace();
+			throw new MetadataNotValidException(e.getMessage());
+		} catch (IOException e) {			
+			MetadataEditorConsole.getInstance().println("IOException on parsing: " +e.toString() );			
+			e.printStackTrace();
+			throw new MetadataNotValidException(e.getMessage());
+		}
+		
+	}
+
+	public class MetadataXMLErrorHandler implements ErrorHandler{
+
+		public void error(SAXParseException e) throws SAXException {
+			MetadataEditorConsole.getInstance().println("SAXParseException (error) on parsing: " +e.toString() );			
+			
+		}
+
+		public void fatalError(SAXParseException e) throws SAXException {
+			MetadataEditorConsole.getInstance().println("SAXParseException (fatal) on parsing: " +e.toString() );			
+		}
+
+		public void warning(SAXParseException e) throws SAXException {
+			MetadataEditorConsole.getInstance().println("SAXParseException (warnig) on parsing: " +e.toString() );			
+		}
+		
+	}
+	
+	
+	////////////////////////////////////////////////////////////////////
+	// Event handlers.
+	////////////////////////////////////////////////////////////////////
+
+	public class MetadataXMLHandler extends DefaultHandler2 {
+
+		public MetadataXMLHandler(String filename) {
+			xml = new MetadataXML(filename);
+		}
+
+		@SuppressWarnings("unused")
+		private MetadataXMLHandler() {
+		}
+
+		//Local variables and flags
+		private CharArrayWriter elementContent = new CharArrayWriter();
+		//writer for comments
+		private CharArrayWriter comments = new CharArrayWriter();	
+		private Vector<String> commentsForOneElement = new Vector<String>();
+		private MetadataXML xml ;
+		private boolean libs;
+		private boolean attributes;
+		private boolean extendedsdk;
+		private StringBuffer errors = new StringBuffer();
+
+		public MetadataXML getMetadataXML() {
+			return xml;
+		}
+
+		public void startDocument() {
+		}
+
+		public void endDocument() {
+		}
+
+		public void startElement(String uri, String name, String qName,
+				Attributes atts) {
+
+			elementContent.reset();
+			//Writing comments for that element
+			writeComments(name);
+			
+			//Setting flags
+			if(name.equalsIgnoreCase("libs")){
+				libs = true;
+			}
+			if(name.equalsIgnoreCase("attributes")){
+				attributes = true;
+			}			
+			if(name.equalsIgnoreCase("extendedsdk")){
+				extendedsdk = true;
+			}			
+			
+			//Setting data from attributes
+			if(name.equalsIgnoreCase("api")){
+				xml.setAPIID(atts.getValue("id"));
+				try {
+					xml.setDataVersion(atts.getValue("dataversion"));
+				} catch (MetadataNotValidException e) {
+					e.printStackTrace();
+					errors.append(e.getMessage());
+					errors.append("\n");
+				}
+			}
+			else if(name.equalsIgnoreCase("release")){
+				xml.setReleaseCategory(atts.getValue("category"));
+				boolean categorySDK = 
+					(atts.getValue("category").equalsIgnoreCase("sdk") 
+							|| atts.getValue("category").equalsIgnoreCase("public") ) 
+							? true : false ;
+				try {
+					if(categorySDK || atts.getIndex("sinceversion") != -1){
+						xml.setReleaseSince(atts.getValue("sinceversion"));
+					}
+				} catch (MetadataNotValidException e) {
+					//If category is "sdk" since is mandatory, optional if "domain"
+					if(categorySDK){
+						e.printStackTrace();
+						errors.append(e.getMessage());
+						errors.append("\n");
+					}
+				}
+				if(atts.getIndex("deprecatedsince") != -1){
+					try {
+						xml.setReleaseDeprecatedSince(atts.getValue("deprecatedsince"));
+					} catch (MetadataNotValidException e) {
+						e.printStackTrace();
+						errors.append(e.getMessage());
+						errors.append("\n");
+					}
+				}				
+
+			}			
+			else if(libs){			
+				if(name.equalsIgnoreCase("lib")){
+					xml.addLib(atts.getValue("name"));
+				}
+			}else if (attributes && extendedsdk){
+				try {
+					xml.setExtendedSDKSince(atts.getValue("sinceversion"));
+				} catch (MetadataNotValidException e) {
+					e.printStackTrace();
+					errors.append(e.getMessage());
+					errors.append("\n");
+				}
+				if(atts.getIndex("deprecatedsince") != -1){
+					try {
+						xml.setExtendedSDKDeprecatedSince(atts.getValue("deprecatedsince"));
+					} catch (MetadataNotValidException e) {
+						e.printStackTrace();
+						errors.append(e.getMessage());
+						errors.append("\n");
+					}
+				}				
+			}
+				
+		}
+
+		/**
+		 * Writing comments to XML
+		 */
+		private void writeComments(String name) {
+			if(!commentsForOneElement.isEmpty()){
+				xml.addComments(name, commentsForOneElement);
+				commentsForOneElement = new Vector<String>();
+			}
+		}
+
+		public void endElement(String uri, String name, String qName) {
+			
+			//Writing comments for that element just in case also when element is closed
+			//reason for doing that is that if theres comments inside element content
+			writeComments(name);
+			
+			//When finding elements, setting data directly to xml
+			if (name.equalsIgnoreCase("name")) {
+				xml.setAPIName(elementContent.toString());
+			}
+			else if (name.equalsIgnoreCase("description")) {
+				xml.setDescription(elementContent.toString());
+			}
+			else if (name.equalsIgnoreCase("type")) {
+				xml.setType(elementContent.toString());
+			}
+			else if (name.equalsIgnoreCase("htmldocprovided")) {
+				if(elementContent.toString().equalsIgnoreCase("yes")){
+					xml.setHtmlDocProvided(true);
+				}else{
+					xml.setHtmlDocProvided(false);
+				}
+			}
+			else if (name.equalsIgnoreCase("adaptation")) {
+				if(elementContent.toString().equalsIgnoreCase("yes")){
+					xml.setAdaptation(true);
+				}else{
+					xml.setAdaptation(false);
+				}				
+			}
+			//when data is as parameters, using flags and setting data in startElement
+			else if(name.equalsIgnoreCase("libs")){
+				libs = false;
+			}
+			else if(name.equalsIgnoreCase("attributes")){
+				attributes = false;
+			}
+			else if(name.equalsIgnoreCase("extendedsdk")){
+				extendedsdk = false;
+			}			
+			else if (name.equalsIgnoreCase("subsystem") || (name.equalsIgnoreCase("collection"))) {
+				//We are not checking the versions when parsing,
+				//but UI will handle it (if there is needed elements missing with DATA versions).
+				//With version 1.0 we must have subsystem, with newer version we must have "collection" as subsystem, 
+				//anyway with xml -object, we are using the same element to store value for that.
+				xml.setSubsystem(elementContent.toString());
+			}			
+
+		}
+		
+
+		/* (non-Javadoc)
+		 * @see org.xml.sax.ext.DefaultHandler2#comment(char[], int, int)
+		 */
+		public void comment(char[] ch,
+                int start,
+                int length)
+         throws SAXException{
+			//Adding comments from XML file to XML object 
+			comments.write(ch, start, length);
+			commentsForOneElement.add(comments.toString());
+			comments.reset();
+		}
+		
+		public void characters(char ch[], int start, int length) {
+			elementContent.write(ch, start, length);
+		}
+
+		public String getErrors() {
+			return errors.toString();
+		}
+
+	}
+
+}
Binary file remotecontrol/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.carbide.extensions.remotecontrol/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.carbide.extensions.remotecontrol/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.remotecontrol"
+      label="Carbide.c++ Extensions - Remote Control"
+      version="1.3.1"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.remotecontrol">
+
+   <description>
+      Remote Control is a tool for using phones remotely by commanding HTI framework in device.
+   </description>
+
+   <copyright>
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License:: "http://www.eclipse.org/legal/epl-v10.html".
+   </copyright>
+
+   <license url="license.txt">
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+      <discovery label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="com.nokia.s60tools.util" version="1.1.11" match="greaterOrEqual"/>
+      <import plugin="com.nokia.s60tools.hticonnection" version="1.2.0" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.remotecontrol"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.remotecontrol.help"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.carbide.extensions.remotecontrol/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Wed Dec 10 09:49:50 EET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Remote Control Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.remotecontrol.help;singleton:=true
+Bundle-Version: 1.3.1
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Bundle-Activator: com.nokia.s60tools.remotecontrol.help.HelpPlugin
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+</head>
+<body>
+
+<h2>About This Content</h2>
+<p>August 10, 2009</p>
+
+<h3>Copyright</h3>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br> 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a></p>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.	
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+/* 	20070523-Removed top margin size to close gap between location breadcrumbs and page title	*/
+html {
+	margin: 0px 10px 10px 10px;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(html/images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               about.html,\
+               book.css
+jars.compile.order = .
+
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/concepts.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Concepts</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Concepts</h2>
+<p>The following concepts provide information on common Carbide.c++ terminology, technologies, and processes:</p>
+
+<ul>
+	<li><a href="screen_capture_mode.htm">Screen Capture mode</a></li>
+	<li><a href="file_transfer_mode.htm">File Transfer mode</a></li>
+	<li><a href="touch_ui.htm">Touch User Interface</a></li>
+	<li><a href="context_menus.htm">Dynamic context menus</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/context_menus.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Dynamic context menus</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Dynamic context menus</h2>
+<p>The Remote Control Carbide.c++ Extension contains dynamic context menus.</p>
+
+<ul>
+<li>In the <b>Screen Capture</b> mode, you can set the zoom level. All zoom levels keep the original proportions.
+<p><img src="images\context_menu_zoom.png"></p></li>
+<li>In the <b>File Transfer</b> mode, you can select file operations.
+<p><img src="images\context_menu_file.png"></p>
+</li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="screen_capture_mode.htm">Screen Capture mode</a></li>
+	<li><a href="file_transfer_mode.htm">File Transfer mode</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/saving_screenshots.htm">Saving screenshots</a></li>
+	<li><a href="../tasks/transferring_files.htm">Transferring files with Remote Control</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/file_transfer_mode.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>File Transfer mode</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>File Transfer mode</h2>
+<p>The Remote Control <b>File Transfer</b> mode provides an easy way of transferring files between a device and a PC. The folder structure of the workspace root of Carbide.c++ is displayed in the File Transfer view after you have started the Datagateway.</p>
+
+<p>For the file transfer mode preferences, see <a href="../tasks/setting_preferences.htm">Setting Remote Control preferences.</a></p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/transferring_files.htm">Transferring files with Remote Control.</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/images/context_menu_file.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/images/context_menu_zoom.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/screen_capture_mode.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Screen Capture mode</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Screen Capture mode</h2>
+<p>The Remote Control <b>Screen Capture</b> mode provides an easy way of sharing a device screen on a PC. The device screen appears in the Carbide.c++ view after you have started the Datagateway.</p>
+
+<p>For the screen capture mode preferences, see <a href="../tasks/setting_preferences.htm">Setting Remote Control preferences.</a></p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/saving_screenshots.htm">Saving screenshots</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/concepts/touch_ui.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Touch User Interface</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+<h2>Touch User Interface</h2>
+<p>The <b>Screen Capture</b> mode supports tapping and dragging the screen with a mouse if you are connected to a device that supports the touch user interface.</p><p>Note that there is a delay in the device screen refresh. If you tap or drag longer than 2 seconds, you will be notified about this.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+ <context id="REMOTE_CONTROL_SCREEN_VIEW">
+  <description>Remote Control's Screen Capture View</description>
+  <topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+  <topic label="Screen capture mode" href="html/concepts/screen_capture_mode.htm" />
+  <topic label="Saving screenshots" href="html/tasks/saving_screenshots.htm" />
+  <topic label="Touch User Interface" href="html/concepts/touch_ui.htm" />
+  <topic label="Using PC keyboard" href="html/tasks/using_pc_keyboard.htm" />
+  <topic label="Setting Remote Control preferences" href="html/tasks/setting_preferences.htm" />
+ </context>
+ 
+ <context id="REMOTE_CONTROL_FTP_VIEW">
+  <description>Remote Control's File Transfer View</description>
+  <topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+  <topic label="File transfer mode" href="html/concepts/file_transfer_mode.htm" />
+  <topic label="Transfering files" href="html/tasks/transferring_files.htm" />
+  <topic label="Setting Remote Control preferences" href="html/tasks/setting_preferences.htm" />
+ </context>
+ 
+ <context id="REMOTE_CONTROL_PREFERENCES">
+  <description>Remote Control's preferences</description>
+  <topic label="Setting Remote Control preferences" href="html/tasks/setting_preferences.htm" />
+ </context>
+
+ <context id="REMOTE_CONTROL_KEYBOARD">
+  <description>Virtual keyboard</description>
+  <topic label="Using virtual keyboard" href="html/tasks/using_virtual_keyboard.htm" />
+ </context>
+   		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/GS_index.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Getting started</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Getting started</h2>
+<p> The information in this section will help you get started quickly using the basic features of the Remote Control Extension for Carbide.c++.</p>
+<p>Topics in this section include: </p>
+<ul>
+<li><a href="overview.htm">Overview</a></li>
+<li><a href="walk_through.htm">Basic walk-through</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/overview.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Overview</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Overview</h2>
+<p>The Remote Control Carbide.c++ Extension provides an easy way of sharing a device screen on a PC and controlling a device with a PC. Remote Control uses the HTI Connection service for communicating between Carbide.c++ and device or an emulator.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/gettingstarted/walk_through.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Basic walk-through</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>Basic walk-through</h3>
+<p>You can start using Remote Control by taking the following steps:</p>
+<ol>
+<li>Start Remote Control by selecting <b>Carbide > Remote Control</b>, or <b>Window > Show View > Other... > Carbide Extensions > Remote Control</b>.</li>
+<li>Start the <b>HTI Connection</b> Carbide.c++ Extension by selecting <b>Carbide</b> > <b>HTI Connection</b>) if it is not already open, and set up an HTI connection. For more instructions on configuring the HTI connection, see the <a href="../../../com.nokia.s60tools.hticonnection.help/html/toc.htm">HTI Connection Help</a>.</li>
+
+<li>Start the connection by clicking <img src="../images/run_exc_arrow.png"> in the <b>HTI Connection</b> toolbar and selecting a connection to use.</li>
+<li><a href="../tasks/saving_screenshots.htm">Save screenshots</a> or <a href="../tasks/transferring_files.htm">transfer files</a>. When the connection is established, the device screen is displayed in the Remote Control view. You can modify the settings of Remote Control view from Remote Control preferences.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/saving_screenshots.htm">Saving screenshots</a></li>
+	<li><a href="../tasks/transferring_files.htm">Transferring files</a></li>
+	<li><a href="../tasks/setting_preferences.htm">Setting Remote Control preferences</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/Thumbs.db has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/green_fade_left_68_165_28.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/run_exc.gif has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/run_exc_arrow.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/stop.gif has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/toolbar.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/images/toolbar_filetransfer.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/index.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.index"?>
+
+	<!-- INDEX INSTRUCTIONS
+	
+	Use the index.xml file to define the index entries for the plugin's 
+	help contents. In Eclipse 3.2 and beyond an Index tab appears in the Help
+	viewer making it possible for user to more easily locate subjects of
+	interest to them.
+		
+	In brief, every file used in the help documentation should have at least one
+	associated index entry for it. Ideally, it's simple to make two entries per
+	page by simply re-wording the subject slightly. For example, a view could
+	be indexed twice like this, 1) Breakpoint view, and 2) Views/Breakpoint.
+	
+	See ??? for details on creating indexes.
+	
+	-->
+
+<index>
+
+	<!-- AAAAAAAA -->
+
+	<!-- BBBBBBBB -->	
+
+	<!-- CCCCCCCC -->	
+
+	<!-- DDDDDDDD -->		
+
+	<!-- EEEEEEEE -->	
+
+	<!-- FFFFFFFF -->
+
+	<!-- GGGGGGGG -->	
+	
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+									<entry keyword="Legal" >
+		<topic href="html/legal.htm" />
+	</entry>
+	
+	<!-- MMMMMMMM -->
+	
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+			<entry keyword="Overview" >
+		<topic href="html/Getting_Started/overview.htm" />
+	</entry>
+	
+	<!-- PPPPPPPP -->
+	
+	<!-- QQQQQQQQ -->
+	
+	<!-- RRRRRRRR -->
+			<entry keyword="Release Notes" >
+		<topic href="html/release_notes.htm" />
+	</entry>
+	
+	<!-- SSSSSSSS -->
+	
+	<!-- TTTTTTTT -->
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+			<entry keyword="Basic walk-through" >
+		<topic href="html/Getting_Started/walk_through.htm" />
+	</entry>
+	
+	<!-- XXXXXXXX -->
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/legal.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>License Information</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>License Information</h3>
+
+<h5>COPYRIGHTS</h5>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0" which accompanies this distribution and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+<p>Initial Contributors:<br>
+Nokia Corporation - initial contribution</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/reference/references.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>References</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>References</h2>
+<p>The following references are available for this tool:</p>
+<ul>
+	<li><a href="toolbar.htm">Toolbar</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/reference/toolbar.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Toolbar</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Toolbar</h2>
+<p>The Remote Control toolbar contains the following options:</p>
+
+<h5>Screen Capture mode</h5>
+<img src="../images/toolbar.png">
+<ul>
+	<li>Start/Stop taking sequential screenshots</li>
+	<li>Save single screenshot</li>
+	<li>Preferences</li>
+</ul>
+
+<h5>File Transfer mode</h5>
+<img src="../images/toolbar_filetransfer.png">
+<ul>
+	<li>Download</li>
+	<li>Download as</li>
+	<li>Upload</li>
+	<li>Preferences</li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/release_notes.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release Notes</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Release Notes</h2>
+<h4>Remote Control &ndash; Version 1.3.1</h4>
+<p>Released 10th August 2009</p>
+<ul>
+	<li><a href="#description">Product description</a></li>
+	<li><a href="#features">Main features</a></li>
+	<li><a href="#newfeatures">What's new</a></li>
+	<li><a href="#installation">Installation notes</a></li>
+	<li><a href="#requirements">System requirements</a></li>
+	<li><a href="#compissues">Compatibility issues</a></li>
+	<li><a href="#issues">Known issues</a></li>
+</ul>
+
+<h3><a name="description"></a>Product description</h3>
+<p>Remote Control provides an easy way of sharing device screen on a PC and controlling a device with a PC. Remote Control uses the HTI Connection service for communicating between Carbide.c++ and an emulator/device.</p>
+<p> Remote Control can be started either by selecting <b>Carbide > Remote Control</b>, or from <b>Window > Show View > Other... > Carbide Extensions > Remote Control.</b></p>
+
+<h3><a name="features"></a>Main features</h3>
+<ul>
+	<li>The File Transfer mode allows to transfer files between PC and a target device.</li>
+	<li>The Screen Capture mode allows to take single screen shots.</li>
+	<li>The File Transfer mode contains Download as, Download and open, and Refresh commands.</li>
+	<li>The user can change the file name when downloading or uploading files.</li>
+	<li>Support for touch user interface.</li>
+	<li>Support for PC keyboard.</li>
+	<li>Support for multiple screenshots.</li>
+	<li>Support for virtual keyboards and key shortcut mappings.</li>
+</ul>
+
+<h3><a name="newfeatures"></a>What's new</h3>
+<ul>
+	<li>Feature: The File Transfer mode contains Copy, Cut, Paste, and Rename commands.</li>
+	<li>Feature: Files and folders can be dragged and dropped to the File Transfer view.</li>
+	<li>Change: Modifications required to support Carbide.c++ 2.2</li>
+</ul>
+
+<h3><a name="installation"></a>Installation notes</h3>
+<ul>
+   <li>N/A</li>
+</ul>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic requirements:</p>
+<ul>
+	<li>Windows 2000 or Windows XP.</li>
+	<li>Minimum Platform/SDK build PC.</li>
+	<li>Normal Platform/SDK build PC.</li>
+</ul>
+<p>Additional requirements:</p>
+<ul>
+	<li>HTI Connection is needed for being able to use Remote Connection.</li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3>Version history</h3>
+
+<h5>Version 1.2.1 &ndash; 18th May 2009</h5>
+<ul>
+	<li>Feature: The File Transfer mode contains Download as, Download and open, and Refresh commands.</li>
+	<li>Feature: The user can change the file name when downloading or uploading files.</li>
+	<li>Feature: Support for multiple screenshots.</li>
+	<li>Feature: Support for virtual keyboards and key shortcut mappings.</li>
+	<li>Feature: Zoom level context menu in the Screen Capture mode</li>
+	<li>Feature: The Path field in the File Transfer menu.</li>
+	<li>Change: The list of existing drives as well as drive, folder, and file sizes can be retrieved from the device if a compatible version of <b>HTI Framework</b> is used (version 1.88, 1.89, 2.1, or newer).</li>
+	<li>Fix: Fixed the issue causing free space field disappear when root-field was emptied.</li>
+</ul>
+
+<h5>Version 1.1.0 &ndash; 17th February 2009</h5>
+<ul>
+	<li>Feature: The File Transfer mode allows to transfer files between PC and a target device.</li>
+	<li>Feature: The Screen Capture mode allows to take single screen shots.</li>
+	<li>Feature: Support for touch user interface.</li>
+	<li>Feature: Support for PC keyboard.</li>
+</ul>
+
+<h5>Version 1.0.0 &ndash; 19th December 2008</h5>
+<p>The first version</p>
+
+<div id="footer">
+Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). <br>
+All rights reserved.<br>
+This component and the accompanying materials are made available <br>
+under the terms of "Eclipse Public License v1.0" <br>
+which accompanies this distribution and is available <br>
+at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+<br><br>
+Initial Contributors:<br>
+Nokia Corporation - initial contribution
+<br><br>
+Contributors:<br>
+Description:
+</div>
+</body>
+</html>
\ No newline at end of file
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_RC_preferences.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Save_single_screenshot.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Show_navi_keys.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Start_multiple_screenshots.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Stop_multiple_screenshots.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/btn_Switch_keyboard_layout.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_2.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_drives.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_RC_preferences_shot.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_file_replace.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/dlg_kb_bindings.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_navi.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_qwerty.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/images/kb_simple.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/saving_screenshots.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Saving screenshots</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Saving screenshots</h2>
+<p>You can take both single screenshots and sequential screenshots at predefined intervals. Before taking screenshots, you can define a file prefix and location in the <a href="setting_preferences.htm">Remote Control preferences</a>. The default file prefix is <i>screenshot</i>. There is no default location for saving screenshots; if you do not define a location in the preferences, you will be asked for a location the first time you save a single screenshot.</p>
+
+<p><b>Note:</b> Screen shots are always saved in the original size, and the zoom level does not affect the screen size.</p>
+
+<h3>Saving a single screenshot</h3>
+<ol>
+<li>In the <b>Screen Capture</b> mode, click <img src="images\btn_Save_single_screenshot.png">.<p>If you do not have an HTI connection to the target device, the button appears dimmed indicating that you cannot save a screenshot.</p></li>
+<li>In the <b>Save As</b> dialog, specify a file name and a location for the screen shot. Screen shots are saved in the Portable Network Graphics (.PNG) file format.</li>
+</ol>
+
+<h3>Saving multiple screenshots</h3>
+<ol>
+<li>In the <b>Screen Capture</b> mode, click <img src="images\btn_Start_multiple_screenshots.png">. The button changes to <img src="images\btn_Stop_multiple_screenshots.png">.<p>If you do not have an HTI connection to the target device, the button appears dimmed indicating that you cannot save multiple screenshots.</p></li>
+<li>If you have not defined a path for saving screenshots, you will get a warning about a missing path. Click <b>OK</b> and set a path. For details, see <a href="setting_preferences.htm">Setting Remote Control preferences</a>.</li>
+<li>Screen shots are saved every time the screen view changes to the defined location in the Portable Network Graphics (.PNG) file format. The Remote Control toolbar shows the message <b>Saving images to &lt;path&gt;</b>.</li>
+<li>To stop taking screenshots, click <img src="images\btn_Stop_multiple_screenshots.png">. The Remote Control toolbar shows the message <b>N images saved to &lt;path&gt;</b>.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="setting_preferences.htm">Setting Remote Control preferences</a></li>
+<li><a href="using_pc_keyboard.htm">Using PC keyboard</a></li>
+<li><a href="using_virtual_keyboard.htm">Using virtual keyboard</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/screen_capture_mode.htm">Screen Capture mode</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/setting_preferences.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Setting Remote Control preferences</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Setting Remote Control preferences</h2>
+<p>To set the Remote Control preferences:</p>
+<ol>
+<li>In the Remote Control Carbide.c++ Extension, click <img src="images\btn_RC_preferences.png">, or select <b>Window > Preferences...> Carbide Extensions > Remote Control Preferences</b>.
+</li>
+<li>In the <b>Screen Capture</b> tab, set preferences for the Screen Capture mode:
+<ul>
+<li>In <b>Delay before next refresh</b>, select the refresh interval of the screen capture in milliseconds.</li>
+<li>In <b>Color mode</b>, select the color mode for the screen capture. The available modes range from grayscale to 16 million colors.
+<p><img src="images\dlg_RC_preferences.png"></p>
+</li>
+<li>In <b>Save Screenshot Options</b>, define a <b>Name prefix</b> and a <b>Path</b> for sequential screenshots. You can also define whether or not you want Remote Control to ask for a file name and location when saving single screenshots. If you clear the option, Remote Control will save single screenshots with the values entered in <b>Name prefix</b> and <b>Path</b>.
+<p><img src="images\dlg_RC_preferences_shot.png"></p>
+</li>
+<li>To configure PC keyboard shortcuts, click the <b>Keys</b> link at the bottom of the <b>Screen Capture</b> tab.</li>
+</ul>
+
+</li>
+<li>In the <b>File Transfer</b> tab, set preferences for the File Transfer mode:
+<ul>
+<li>In <b>Drives Shown</b>, you can define the drives that are shown in the File Transfer view. By default, the drives <i>c:</i>, <i>d:</i>, <i>e:</i>, and <i>z:</i> are shown. To modify the list, use the <b>Add</b> and <b>Remove</b> buttons.</li>
+<li>To view only the actually existing drives, select the option <b>Get drive list from the device, if supported</b>. Note that this feature works with <b>HTI Framework</b> versions 1.88, 1.89, 2.1 and newer.
+<p><img src="images\dlg_RC_preferences_drives.png"></p>
+</li>
+<li>In <b>File Transfer Options</b>, select whether or not you want to confirm a file replacement when uploading or downloading files, and whether or not you want to confirm a file or folder deletion. If you clear all the options, you will not be asked to confirm file replacement or file and folder deletion. Note that you can set this also in a file replacement or delete confirmation dialog.
+<p><img src="images\dlg_RC_preferences_2.png"></p>
+</li>
+</ul>
+</li>
+<li>Click <b>OK</b>.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/screen_capture_mode.htm">Screen Capture mode</a></li>
+<li><a href="../concepts/file_transfer_mode.htm">File Transfer mode</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/tasks.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>Tasks</title>
+<link href="../../book.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Tasks</h2>
+<p>The following tasks are available for this tool:</p>
+<ul>
+	<li><a href="saving_screenshots.htm">Saving screenshots</a></li>
+	<li><a href="transferring_files.htm">Transferring files</a></li>
+	<li><a href="using_virtual_keyboard.htm">Using virtual keyboard</a></li>
+	<li><a href="using_pc_keyboard.htm">Using PC keyboard</a></li>
+	<li><a href="setting_preferences.htm">Setting Remote Control preferences</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/transferring_files.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Transferring files with Remote Control</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Transferring files with Remote Control</h2>
+<p>After you start Carbide.c++ and the Datagateway for the first time, the root folder structure of the target device is displayed. Newer versions of <b>HTI Framework</b> (versions 1.88, 1.89, 2.1 and newer) also support the display of drive, folder, and file sizes.</p>
+
+<p>To navigate to the folder you want to work with, either double-click the folder icons, or enter the folder path in the <b>Path</b> field and press <i>Enter</i> or click <b>Go to directory</b>. You can enter a whole folder path such as <i>C:\Data\Images</i>, and you can use <i>..\</i> to move up in the folder structure.</p>
+
+<p>To transfer files, use the <a href="../reference/toolbar.htm">toolbar buttons</a> or right-click in the File Transfer mode, and select a function from the context menu. The dynamic context menu contains the following functions:</p>
+<ul>
+<li><b>New folder</b> creates a new folder under the selected folder.</li>
+<li><b>Delete</b> deletes the selected file(s) and folder(s).</li>
+<li><b>Download</b> transfers the selected files from the device to the PC. You cannot download folders.</li>
+<li><b>Download as</b> transfer the selected file from the device to the PC and lets you define a name and location for the file. Note that Download as lets you download only a single file. You cannot download folders.</li>
+<li><b>Upload</b> transfers the selected files from the PC to the device. You cannot upload folders.</li>
+<li><b>Open</b> transfers the selected files from the device to the PC and opens them in Carbide.c++. You cannot download folders.</li>
+<li><b>Copy</b> copies the selected files and folders. Copy is supported in HTI Framework versions 1.91, 2.5 or newer.</li>
+<li><b>Cut</b> cuts the selected files and folders. Cut is supported in HTI Framework versions 1.91, 2.5 or newer.</li>
+<li><b>Paste</b> pastes the selected files and folders to the current location. Paste is supported in HTI Framework versions 1.91, 2.5 or newer.</li>
+<li><b>Rename</b> renames the selected file or folder. Rename is supported in HTI Framework versions 1.91, 2.5 or newer.</li>
+<li><b>Preferences</b> open the Remote Control Preferences dialog.</li>
+<li><b>Refresh</b> load the folder structure and contents again.</li>
+</ul>
+<p>Note that the dynamic context menu only contain functions that are allowed for the selected file or folder.</p>
+
+<p><b>Tip</b>: You can also drag and drop files from Windows Explorer to the Remote Control File Transfer view.</p>
+
+<p>When uploading or downloading a file that already exists in the target folder, you are asked to confirm the file replace. In this dialog, you can turn off this warning by selecting <b>Always replace withouth prompt</b>. You can also rename the file by clicking <b>Rename</b>. Note that you can set the replacement options also in the <a href="setting_preferences.htm">Remote Control preferences</a>.</p>
+<p><img src="images\dlg_file_replace.png"></p>
+
+<p>When deleting files or folders, you are asked to confirm the file or folder delete. You can set this confirmation off in the <a href="setting_preferences.htm">Remote Control preferences</a>.</p>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/file_transfer_mode.htm">File Transfer mode</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="setting_preferences.htm">Setting Remote Control preferences</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/using_pc_keyboard.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Using PC keyboard</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Using PC keyboard</h2>
+<p>The RemoteControl Carbide.c++ Extension allows you to enter text and navigate in the <b>Screen Capture</b> mode using your PC keyboard. The PC keyboard is activated when you enter the <b>Screen Capture</b> mode.</p>
+<p>Currently, the following PC keyboard key presses are recognized and sent further to the target device or emulator:</p>
+
+<ul>
+	<li>Text characters: a-z, A-Z, öäå and ÖÄÅ.</li>
+	<li>Numeric characters: 0-9.</li>
+</ul>
+
+<p>Other characters are sent as pure text and are supported depending on the current keyboard layout.</p>
+
+<h2>Customising PC keyboard shortcuts</h2>
+<p>There are no default shortcut mappings for non-textual characters, so you need to configure any hardware key shortcuts manually via Carbide.c++ Preferences.</p> 
+<ol>
+	<li>In Remote Control Carbide.c++ Extension, click <img src="images/btn_RC_preferences.png"> and go to the <b>Screen Capture</b> tab.</li>
+	<li>At the bottom of the tab, click the <b>Keys</b> link. This opens the shortcut key preferences view.<br>
+	You can also get to this view by selecting <b>Window</b> > <b>Preferences</b> > <b>General</b> > <b>Keys</b>.</li>
+	<li>In the <b>Command</b> list, scroll down to the RemoteControl commands, and select a command you want set a shortcut to. You can set a shortcut to the following keys:
+	<ul>
+		<li>Up, down, left, and right navigation keys (North, South, West and East)</li>
+		<li>Selection (Center) key</li>
+		<li>Left software key</li>
+		<li>Right software key</li>
+		<li>Send key</li>
+		<li>End key</li>
+		<li>Application key</li>
+		<li>Clear key</li>
+		<li>Edit key</li>
+		<li>Grip open key</li>
+		<li>Grip closed key</li>
+		<li>Side (Voice) key</li>
+		<li>Power key</li>
+	</ul>
+	</li>
+	<li>In <b>Binding</b>, press the shortcut combination you want to use for the selected command. <br>
+	For example, for the Selection key (<b>Center navi key</b>) emulation, you may want to use the Enter key; place the mouse cursor in the <b>Binding</b> field, and press Enter.</li>
+	<li>In <b>When</b>, select where you want to use the shortcut key combination. To restrict the shortcuts to the Screen Capture view of Remote Control, select <b>In ScreenView</b>.
+	<p><img src="images\dlg_kb_bindings.png"></p></li>
+	<li>Configure the next key shortcut mapping, and when you are done, click <b>OK</b>.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/screen_capture_mode.htm">Screen Capture mode</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/tasks/using_virtual_keyboard.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Using virtual keyboard</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Using virtual keyboard</h2>
+<p>The RemoteControl Carbide.c++ Extension allows you to enter text and navigate in the <b>Screen Capture</b> mode using a virtual keyboard. To open the virtual keyboard, click the main menu of the Screen Capture mode, and select <b>Keyboard</b>.</p>
+
+<p>There are two different keyboard layouts you can use: Simple and QWERTY. To switch between the keyboard layouts, click <img src="images\btn_Switch_keyboard_layout.png"> in the keyboard view toolbar.</p>
+
+<table border="0" cellspacing="0" cellpadding="0">
+<tr>
+	<td><img src="images\kb_simple.png"></td>
+	<td><img src="images\kb_qwerty.png"></td>
+<tr>
+<tr>
+	<td>Simple keyboard</td>
+	<td>QWERTY keyboard</td>
+<tr>
+</table>
+
+<p>In addition, you can use a separate set of navigation keys by clicking <img src="images\btn_Show_navi_keys.png"> in the keyboard view toolbar.<p>
+<p><img src="images\kb_navi.png"></p>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/screen_capture_mode.htm">Screen Capture mode</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/toc.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+
+<body><h1>Remote Control Online Help</h1>
+<p><a href="release_notes.htm">Release notes</a></p>
+
+<p><a href="gettingstarted/GS_index.htm">Getting started</a></p>
+<ul>
+	<li><a href="gettingstarted/overview.htm">Overview</a></li>
+	<li><a href="gettingstarted/walk_through.htm">Basic walk-through</a></li>
+</ul>
+
+<p><a href="concepts/concepts.htm">Concepts</a></p>
+<ul>
+	<li><a href="concepts/screen_capture_mode.htm">Screen Capture mode</a></li>
+	<li><a href="concepts/file_transfer_mode.htm">File Transfer mode</a></li>
+	<li><a href="concepts/touch_ui.htm">Touch User Interface</a></li>
+	<li><a href="concepts/context_menus.htm">Dynamic context menus</a></li>
+</ul>
+
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/saving_screenshots.htm">Saving screenshots</a></li>
+	<li><a href="tasks/transferring_files.htm">Transferring files</a></li>
+	<li><a href="tasks/using_virtual_keyboard.htm">Using virtual keyboard</a></li>
+	<li><a href="tasks/using_pc_keyboard.htm">Using PC keyboard</a></li>
+	<li><a href="tasks/setting_preferences.htm">Setting Remote Control preferences</a></li>
+</ul>
+
+<p><a href="reference/references.htm">References</a></p>
+<ul>
+	<li><a href="reference/toolbar.htm">Toolbar</a></li>
+</ul>
+
+<p><a href="legal.htm">Legal</a></p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/html/toolTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Remote Control" link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+
+	<topic label="Remote Control" href="html/toc.htm" >
+		
+		<topic label="Release Notes" href="html/release_notes.htm" />
+		
+		<topic label="Getting started" href="html/gettingstarted/GS_index.htm">
+			<topic label="Overview" href="html/gettingstarted/overview.htm" />
+			<topic label="Basic walk-through" href="html/gettingstarted/walk_through.htm" />
+		</topic>
+   
+		<topic label="Concepts" href="html/concepts/concepts.htm" >
+			<topic label="Screen Capture mode" href="html/concepts/screen_capture_mode.htm" />
+			<topic label="File Transfer mode" href="html/concepts/file_transfer_mode.htm" />
+			<topic label="Touch User Interface" href="html/concepts/touch_ui.htm" />
+			<topic label="Dynamic context menus" href="html/concepts/context_menus.htm" />
+		</topic>
+			  
+		<topic label="Tasks" href="html/tasks/tasks.htm" >
+			<topic label="Saving screenshots" href="html/tasks/saving_screenshots.htm" />
+			<topic label="Transferring files" href="html/tasks/transferring_files.htm" />
+			<topic label="Using virtual keyboard" href="html/tasks/using_virtual_keyboard.htm" />
+			<topic label="Using PC keyboard" href="html/tasks/using_pc_keyboard.htm" />
+			<topic label="Setting Remote Control preferences" href="html/tasks/setting_preferences.htm" />
+		</topic>
+	   
+		<topic label="Reference" href="html/reference/references.htm" >
+			<topic label="Toolbar" href="html/reference/toolbar.htm" />
+		</topic>
+		   
+		<topic label="Legal" href="html/legal.htm" />
+   		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension point="org.eclipse.help.toc">
+      <toc file="html/toolTOC.xml" primary="true"/>
+   </extension>
+
+	<extension point="org.eclipse.help.index">
+        <index file="html/index.xml"/>
+    </extension>
+
+	<extension point="org.eclipse.help.contexts">
+      <contexts file="html/contexts.xml"
+            plugin="com.nokia.s60tools.remotecontrol.help"/>
+   </extension>
+</plugin>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol.help/src/com/nokia/s60tools/remotecontrol/help/HelpPlugin.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+*
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.help;
+
+import org.eclipse.ui.plugin.*;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HelpPlugin extends AbstractUIPlugin {
+
+	//The shared instance.
+	private static HelpPlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public HelpPlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HelpPlugin getDefault() {
+		return plugin;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/.settings/org.eclipse.jdt.core.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+#Mon Sep 22 13:07:24 EEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Remote Control
+Bundle-SymbolicName: com.nokia.s60tools.remotecontrol;singleton:=true
+Bundle-Version: 1.3.1
+Bundle-Activator: com.nokia.s60tools.remotecontrol.RemoteControlActivator
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.ide,
+ org.eclipse.core.filesystem,
+ com.nokia.s60tools.util;bundle-version="1.1.11",
+ com.nokia.s60tools.hticonnection;bundle-version="1.3.0",
+ com.nokia.s60tools.ui;bundle-version="1.5.0",
+ org.eclipse.core.expressions;bundle-version="3.4.100"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: com.nokia.s60tools.remotecontrol;x-friends:="com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.remotecontrol.ftp.ui.view;x-friends:="com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.remotecontrol.keyboard;x-friends:="com.nokia.s60tools.remotecontrol.tests",
+ com.nokia.s60tools.remotecontrol.preferences;x-friends:="com.nokia.s60tools.remotecontrol.tests";
+  uses:="org.eclipse.jface.util,
+   org.eclipse.jface.preference,
+   org.eclipse.swt.widgets,
+   org.eclipse.ui"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”>
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content=”text/html; charset=ISO-8859-1”>
+</head>
+<body lang=”EN-US”>
+<h2>About This Content</h2>
+ 
+<p>August 10, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,31 @@
+########################################################################################
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+########################################################################################
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,11 @@
+########################################################################################
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.	
+########################################################################################
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+########################################################################################
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+########################################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - Remote Control \n\
+\n\
+Version: 1.3\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.\n\
+License: "http://www.eclipse.org/legal/epl-v10.html".\n\
+\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+javacSource=1.5
+javacTarget=1.5
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               icons/,\
+               about.html,\
+               about.ini,\
+               about.mappings,\
+               about.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/ccbuild.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.remotecontrol" default="cc" basedir=".">
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	
+	<property name="help.project.name" value="${ant.project.name}.help"/>
+	<property name="feature.project.folder" location="../com.nokia.carbide.extensions.remotecontrol"/>
+	<property name="feature.project.name" value="com.nokia.carbide.extensions.remotecontrol"/>
+	<property name="feature.name" value="RemoteControl"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="test.folder" location="../com.nokia.s60tools.remotecontrol.tests"/>
+	<property name="binaries.folder" location="../${feature.name}.binaries"/>
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.dev.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+
+		<delete dir="${temp.folder}/bin"/>
+		<mkdir dir="${temp.folder}/bin"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="${temp.folder}/bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<src path="../com.nokia.s60tools.remotecontrol.help/src/"/>
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/bin" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+		<!-- Copy classes from the temporary folder to bin -->
+		<copy todir="${build.result.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/bin" />
+		</copy>
+		
+		<!-- Delete temporary folder -->
+		<delete dir="${temp.folder}"/>
+	</target>
+	
+	<!-- Clean target -->
+	<target name="clean" description="Clean" depends="clean-test">
+		<delete dir="${build.result.folder}" />
+		<delete>
+			<fileset dir="${binaries.folder}" includes="*.jar"/>
+		</delete>
+	</target>
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${binaries.folder}/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+	
+	<!-- JAR target -->
+	<target name="jar" depends="build" description="Create JAR">
+		
+		<delete dir="binaries"/>
+		<mkdir dir="binaries"/>
+		<delete dir="${help.project.name}/com/nokia/s60tools/remotecontrol/help"/>
+		<mkdir dir="${help.project.name}/com/nokia/s60tools/remotecontrol/help"/>
+		
+		<copy todir="../${help.project.name}/com/nokia/s60tools/remotecontrol/help" failonerror="true" overwrite="true">
+				<fileset dir="${build.result.folder}/com/nokia/s60tools/remotecontrol/help" />
+		</copy>
+		<delete dir="${build.result.folder}/com/nokia/s60tools/remotecontrol/help"/>
+		
+		
+		<copy todir="binaries" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}">
+							<include name="com/**"/>
+					    <include name="icons/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="about.ini"/> 
+					    <include name="about.mappings"/> 
+					    <include name="about.properties"/> 
+				</fileset>
+		</copy>
+		
+		<!-- Create JAR -->
+		<zip destfile="${binaries.folder}/${jar.filename}" basedir="binaries" />
+		
+		<delete dir="binaries"/>
+		<delete dir="com"/>
+	</target>
+
+	<!-- Feature target -->
+	<target name="feature" depends="jar" description="Create feature">
+		<property name="feature.folder" location="${binaries.folder}/feature"/>
+		
+		<mkdir dir="${feature.folder}"/>
+		<mkdir dir="${feature.folder}/plugins"/>
+		<mkdir dir="${feature.folder}/features/${feature.project.name}"/>
+				
+		<!-- Create help JAR -->
+		<zip destfile="${feature.folder}/plugins/${help.jar.filename}" basedir="../${help.project.name}" excludes="src/,.*"/>
+		
+		<!-- Copy feature stuff to the temp folder -->
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/feature.xml"/>
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/license.txt"/>
+		
+		<!-- Copy the actual plug-in to the temp folder -->
+		<copy todir="${feature.folder}/plugins" file="${binaries.folder}/${jar.filename}"/>
+		
+		<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		
+		<!-- Create the feature zip -->
+		<zip destfile="${binaries.folder}/${feature.name}.zip" basedir="${feature.folder}"/>
+		
+		<deltree dir="${feature.folder}"/>
+		
+		<!-- Nightly build -->
+		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp>
+
+		<copy tofile="../../../nightly_builds/${feature.name}/${feature.name}-${timestamp}.zip" file="${binaries.folder}/${feature.name}.zip"/>
+	</target>
+			
+	<!-- Clean tests target -->
+  	<target name="clean-test" description="Clean test">
+    	<delete>
+      		<fileset dir="${test.folder}" includes="**/*.class" />
+    	</delete>
+    	<delete dir="${instr.folder}"/>
+    	<delete dir="${reports.folder}"/>
+  	</target>
+  
+  	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="build_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+		
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="yes">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    	<jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.remotecontrol.tests.AllJUnitPlugInTests" todir="${reports.folder}"/>
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+	
+	<target name="cc" depends="jar, analyze, feature" description="Build, instrument, run unit tests and analyze code"/>
+</project>
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_dimmed.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_external_drives.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/disc_drive_other_types.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/download.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/download_and_open.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/download_as.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/file_transfer.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/folder.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/go_to_directory.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/keyboard_switch_layout.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/keyboard_view.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_down.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_left.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_right.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_key_up.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/navigation_keys_icon.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/new_folder.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/preferences.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/refresh.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/remote_control.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/remotecontrol_tsk.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/s60tools_action_icon.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/save_screenshot.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/screen_capture.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/screenshots_start_taking.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/screenshots_stop_taking.png has changed
Binary file remotecontrol/com.nokia.s60tools.remotecontrol/icons/upload.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="Remote Control Tool&apos;s Actions"
+            id="com.nokia.s60tools.remotecontrol.ui.actionSet"
+            label="Remote Control Tool"
+            visible="true">
+         <menu
+       			id="com.nokia.carbide.cpp.ui.CarbideMenu"
+       			label="&amp;Carbide"
+       			path="additions">
+       			<groupMarker name="additions"/>
+     	 </menu>
+         <action
+               class="com.nokia.s60tools.remotecontrol.actions.MainViewOpenAction"
+               icon="icons/remote_control.png"
+               id="com.nokia.s60tools.remotecontrol.actions.MainViewOpenAction"
+               label="Remote Control"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               style="push"
+               tooltip="Remote Control"/>
+      </actionSet>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <category
+            id="com.nokia.s60tools"
+            name="Carbide Extensions"/>
+      <stickyView
+            closeable="true"
+            id="com.nokia.s60tools.remotecontrol.ui.views.main.MainView"
+            location="LEFT"
+            moveable="true"/>
+      <view
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView"
+            icon="icons/keyboard_view.png"
+            id="com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView"
+            name="Keyboard (Remote Control)"
+            restorable="true">
+      </view>
+      <view
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.remotecontrol.ui.views.main.MainView"
+            icon="icons/remote_control.png"
+            id="com.nokia.s60tools.remotecontrol.ui.views.main.MainView"
+            name="Remote Control"/>
+   </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage"
+            class="com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage"
+            id="com.nokia.s60tools.remotecontrol.RCPreferencePage"
+            name="Remote Control Preferences">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <category
+            description="Commands for hardware key shortcuts"
+            id="com.nokia.s60tools.remotecontrol.screen.category"
+            name="RemoteControl - key emulation">
+      </category>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.AppKeyCommand"
+            name="RemoteControl - Application key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.LeftSoftKeyCommand"
+            name="RemoteControl - Left soft key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.RightSoftKeyCommand"
+            name="RemoteControl - Right soft key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.NaviSouthKeyCommand"
+            name="RemoteControl - South navi key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.NaviNorthKeyCommand"
+            name="RemoteControl - North navi key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.NaviEastKeyCommand"
+            name="RemoteControl - East navi key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.NaviWestKeyCommand"
+            name="RemoteControl - West navi key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.NaviCenterKeyCommand"
+            name="RemoteControl - Center navi key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.SendKeyCommand"
+            name="RemoteControl - Send key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.EndKeyCommand"
+            name="RemoteControl - End key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.ClearKeyCommand"
+            name="RemoteControl - Clear key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.PowerKeyCommand"
+            name="RemoteControl - Power key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.GripOpenKeyCommand"
+            name="RemoteControl - Grip open key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.GripClosedKeyCommand"
+            name="RemoteControl - Grip closed key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.EditKeyCommand"
+            name="RemoteControl - Edit key emulation">
+      </command>
+      <command
+            categoryId="com.nokia.s60tools.remotecontrol.screen.category"
+            id="com.nokia.s60tools.remotecontrol.screen.SideKeyCommand"
+            name="RemoteControl - Side (Voice) key emulation">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.ui.handlers">
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.AppKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.AppKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.LeftSoftKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.LeftSoftKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.RightSoftKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.RightSoftKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.NaviSouthKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.NaviSouthKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.NaviNorthKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.NaviNorthKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.NaviEastKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.NaviEastKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.NaviWestKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.NaviWestKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.NaviCenterKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.NaviCenterKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.SendKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.SendKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.EndKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.EndKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.ClearKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.ClearKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.PowerKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.PowerKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.GripOpenKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.GripOpenKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.GripClosedKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.GripClosedKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.EditKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.EditKeyCommand">
+      </handler>
+      <handler
+            class="com.nokia.s60tools.remotecontrol.screen.ui.commands.SideKeyCommandHandler"
+            commandId="com.nokia.s60tools.remotecontrol.screen.SideKeyCommand">
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.ui.contexts">
+      <context
+            id="com.nokia.s60tools.remotecontrol.SreenView"
+            name="In ScreenView"
+            parentId="org.eclipse.ui.contexts.window">
+      </context>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/RemoteControlActivator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,290 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.remotecontrol.common.ProductInfoRegistry;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.job.RemoteControlJobManager;
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+import com.nokia.s60tools.remotecontrol.keyboard.KeyboardMediator;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class RemoteControlActivator extends AbstractUIPlugin {
+
+	private static final String PLUGIN_ID = "com.nokia.s60tools.remotecontrol.plugin"; //$NON-NLS-1$
+
+	/**
+	 * Shared plugin instance.
+	 */
+	private static RemoteControlActivator plugin;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;
+	
+	/**
+	 * Storing preferences
+	 */
+	private static IPreferenceStore prefsStore;	
+	
+	/**
+	 * Manager for jobs
+	 */
+	private static RemoteControlJobManager pluginJobManager;
+
+	/**
+	 * Keyboard event mediator utility class that is available for whole plug-in life time.
+	 * Though being singleton class, it should be only queried from Activator 
+	 * and used via IKeyboardMediator interface.
+	 */
+	private static IKeyboardMediator keyboardMediator = new KeyboardMediator(RemoteControlConsole.getInstance());
+	
+	/**
+	 * This member variable is only used internally for JUnit testing purposes.
+	 */
+	private String alternatePluginInstallPath = null;
+	
+	/**
+	 * The constructor.
+	 */
+	public RemoteControlActivator() {
+		plugin = this;
+		pluginJobManager = RemoteControlJobManager.getInstance();
+	}
+
+	/**
+	 * Gets plug-in's installation path.
+	 * @return plug-in's installation path.
+	 * @throws IOException
+	 */
+	private String getPluginInstallPath() throws IOException{
+		// Returning alternate install path, if set for JUnit testing purposes.
+		if(alternatePluginInstallPath != null){
+			return alternatePluginInstallPath;
+		}
+		 // URL to the plugin's root ("/")
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		//	Converting into local path
+		URL localURL = FileLocator.toFileURL(relativeURL);
+		//	Getting install location in correct form
+		File f = new File(localURL.getPath());
+		String pluginInstallLocation = f.getAbsolutePath();
+				
+		return pluginInstallLocation;
+	}
+	
+	/**
+	 * Returns runtime workspace directory path for the Remote Control, which
+	 * can be used e.g. to store temporary data.
+	 * @return Workspace directory path for the Remote Control.
+	 */
+	public String getPluginWorkspacePath() {
+		IPath runtimeWorkspacePath = this.getStateLocation();
+		runtimeWorkspacePath.makeAbsolute();		
+		return runtimeWorkspacePath.toOSString();
+	}
+	
+	/**
+	 * Returns directory that is used for opened temporary files.
+	 * @return directory that is used for opened temporary files.
+	 */
+	public String getDownloadTempDir() {
+		String tempDir = getPluginWorkspacePath();
+		tempDir = FtpUtils.addFileSepatorToEnd(tempDir);
+		tempDir = tempDir + "temp" + File.separator; //$NON-NLS-1$
+		return tempDir;
+	}
+	
+	/**
+	 * Gets images path relative to given plug-in install path.
+	 * @return Path were image resources are located.
+	 */
+	private String getImagesPath(){
+		return pluginInstallLocation
+				+ File.separatorChar
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}
+	
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		//This startup debug print has been left into the code in purpose
+		System.out.println(Messages.getString("RemoteControlActivator.Startup_ConsoleMsg"));  //$NON-NLS-1$
+		
+		pluginInstallLocation = getPluginInstallPath();
+
+		//This startup debug print has been left into the code in purpose
+		System.out.println(Messages.getString("RemoteControlActivator.Plugin_Install_Location_ConsoleMsg")  //$NON-NLS-1$
+				+ pluginInstallLocation);
+
+		// Call to getImagesPath requires that getPluginInstallPath() is
+		// called beforehand.
+		String imagesPath = getImagesPath();
+		
+		//This startup debug print has been left into the code in purpose
+		System.out.println(Messages.getString("RemoteControlActivator.Images_Path_ConsoleMsg") //$NON-NLS-1$
+				+ imagesPath);
+		
+		// Loading images required by this plug-in
+		ImageResourceManager.loadImages(imagesPath);
+		
+		// Initialize settings
+		initializeSettings(pluginInstallLocation);
+	}
+
+	/**
+	 * This method is the correct place for initializing plugin-wide settings during start-up.
+	 * @param pluginInstallLocation
+	 */
+	private void initializeSettings(String pluginInstallLocation) {
+		
+		// Initialize default values for preferences
+		RCPreferences.initDefaultValues();
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		// Shutting down registered ongoing background jobs
+		pluginJobManager.shutdown();
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static RemoteControlActivator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 *
+	 * @param path Path to image file
+	 * @return The image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return Currently active workbench page.
+	 */
+	public static IWorkbenchPage getCurrentlyActivePage(){
+		return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+	}
+	
+	/**
+	 * This must be called from UI thread. If called
+	 * from non-ui thread this returns <code>null</code>.
+	 * @return The shell of the currently active workbench window..
+	 */
+	public static Shell getCurrentlyActiveWbWindowShell(){
+		IWorkbenchPage page = getCurrentlyActivePage();
+		if(page != null){
+			return page.getWorkbenchWindow().getShell();
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the PreferenceStore where plugin preferences are stored
+	 * 
+	 * @return the PreferenceStore where plugin preferences are stored
+	 */
+	public static IPreferenceStore getPrefsStore(){
+		if (prefsStore == null){
+			prefsStore = getDefault().getPreferenceStore();
+		}
+		
+		return prefsStore;
+	}	
+	
+	/**
+	 * Gets plug-in ID.
+	 * @return plug-in ID.
+	 */
+	public static String getPluginID() {
+		return PLUGIN_ID;
+	}
+	
+	/**
+	 * Returns reference to keyboard mediator utility.
+	 * @return the keyboardMediator Keyboard mediator.
+	 */
+	public static IKeyboardMediator getKeyboardMediator() {
+		return keyboardMediator;
+	}
+
+	//
+	// Internally used methods.
+	//
+	
+	/**
+	 * This constructor is only used for setting alternate
+	 * plugin install path  just used for JUnit tests.
+	 * @param alternateInstallPath Alternate plug-in install path.
+	 */
+	private RemoteControlActivator(String alternateInstallPath){
+		alternatePluginInstallPath = alternateInstallPath;		
+	}
+
+	/**
+	 * Creates activator instance if not already created, with different plugin install path. 
+	 * This creates always a new instance of the activator, and need to be called 
+	 * only when needed.
+	 * 
+	 * This methods to be used only from JUnit tests
+	 * and can be used to set alternate plugin install path 
+	 * that is just used for JUnit tests.
+	 * 
+	 * @param alternateInstallPath Alternate plugin install path used for testing.
+	 * @return Reference to activator instance
+	 */
+	public static RemoteControlActivator createWithAlternateSettings(String alternateInstallPath){
+		plugin = new RemoteControlActivator(alternateInstallPath);			
+		return plugin;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/RemoteControlHelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol;
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class RemoteControlHelpContextIDs {
+	/**
+     * The plug-in ID.
+     */	 
+    private static final String REMOTE_CONTROL_HELP_PROJECT_PLUGIN_ID = 
+                                        "com.nokia.s60tools.remotecontrol.help"; //$NON-NLS-1$
+	
+    /**
+     * The Screen view ID.
+     */	
+    public static final String REMOTE_CONTROL_SCREEN_VIEW = 
+		  REMOTE_CONTROL_HELP_PROJECT_PLUGIN_ID +".REMOTE_CONTROL_SCREEN_VIEW"; //$NON-NLS-1$
+
+    /**
+     * The Preferences ID.
+     */	
+    public static final String REMOTE_CONTROL_PREFERENCES = 
+		  REMOTE_CONTROL_HELP_PROJECT_PLUGIN_ID +".REMOTE_CONTROL_PREFERENCES"; //$NON-NLS-1$
+    
+    /**
+     * The File transfer ID.
+     */	
+    public static final String REMOTE_CONTROL_FTP_VIEW = 
+		  REMOTE_CONTROL_HELP_PROJECT_PLUGIN_ID +".REMOTE_CONTROL_FTP_VIEW"; //$NON-NLS-1$
+    
+    /**
+     * The Keyboard ID.
+     */	
+    public static final String REMOTE_CONTROL_KEYBOARD = 
+		  REMOTE_CONTROL_HELP_PROJECT_PLUGIN_ID +".REMOTE_CONTROL_KEYBOARD"; //$NON-NLS-1$
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/actions/MainViewOpenAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.hticonnection.services.HTIServices;
+import com.nokia.s60tools.remotecontrol.ui.views.main.MainView;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Activates/creates Screen View.
+ * @see com.nokia.s60tools.remotecontrol.screen.ui.view#ScreenView
+ */
+public class MainViewOpenAction implements IWorkbenchWindowActionDelegate {
+	
+	/**
+	 * Constructor.
+	 */
+	public MainViewOpenAction(){			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			// We only want to activate/create the view and 
+			// do not need to use the instance after it is returned.
+			MainView.getViewInstance(true);
+			// Activating HTI Connection at the same time so that user can start using
+			// Remote Control easily.
+			HTIServices.openHtiConnectionView();
+		} catch (Exception e) {
+			e.printStackTrace();
+			RemoteControlConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+		// Not needed now, but must be implemented anyway		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		// Not needed now, but must be implemented anyway
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/actions/OpenPreferencePageAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.actions;
+
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage.Tabs;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+
+/**
+ * Action for opening Remote control preferences page
+ */
+public class OpenPreferencePageAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Tab in preferences page that will be opened.
+	 */
+	private final Tabs selection;
+
+	//Tabs selection;
+	
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param buttonStyle Style supported
+	 * @param imageKey Image of the image used for the action. 
+	 *                 Can be set to <code>null</code>, if no image is needed.
+	 * @param selection Preference tab that should be be opened.
+	 */
+	public OpenPreferencePageAction(String text, String tooltip,
+			int buttonStyle, String imageKey, Tabs selection) {
+		super(text, tooltip, buttonStyle,
+				ImageResourceManager.getImageDescriptor(imageKey));
+		this.selection = selection;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		openPreferencePage();
+	}
+	
+	/**
+	 * Open Remote control preferences page
+	 */
+	private void openPreferencePage() {
+		
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
+				RemoteControlActivator.getCurrentlyActiveWbWindowShell(),
+				RCPreferencePage.PAGE_ID,
+				null,
+				null);
+		
+		Object object = dialog.getSelectedPage();
+		if(object instanceof RCPreferencePage) {
+			// Selecting correct tab.
+			((RCPreferencePage)object).openTab(selection);
+		}
+		
+		dialog.open();
+	}	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/Product.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.common;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Class for getting properties from product.properties file, located in same package.
+ */
+public class Product {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.remotecontrol.common.Product"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Constructor
+	 */
+	private Product() {
+	}
+
+	/**
+	 * Get string from product.properties
+	 * @param key to product.properties -file
+	 * @return a String from product.properties -file
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/Product.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+
+ProductInfoRegistry.Console=Console
+ProductInfoRegistry.IconsDirectory=icons
+ProductInfoRegistry.ProductName=Remote Control
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/common/ProductInfoRegistry.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.common;
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information in one place.
+ */
+public class ProductInfoRegistry {
+
+	/**
+	 * Name of the product
+	 */
+	private static final String PRODUCT_NAME = Product.getString("ProductInfoRegistry.ProductName"); //$NON-NLS-1$
+	
+	/**
+	 * Name of the console of this product
+	 */
+	private static final String CONSOLE_WINDOW_NAME = PRODUCT_NAME + " " + Product.getString("ProductInfoRegistry.Console");	 //$NON-NLS-1$ //$NON-NLS-2$
+	
+	/**
+	 * Images directory
+	 */
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.IconsDirectory");	 //$NON-NLS-1$
+	
+	/**
+	 * Get console window name
+	 * @return Returns the CONSOLE_WINDOW_NAME.
+	 */
+	public static String getConsoleWindowName() {
+		return CONSOLE_WINDOW_NAME;
+	}
+	/**
+	 * Get product name
+	 * @return Returns the PRODUCT_NAME.
+	 */
+	public static String getProductName() {
+		return PRODUCT_NAME;
+	}
+	/**
+	 * Get images directory
+	 * @return Returns the IMAGES_DIRECTORY.
+	 */
+	public static String getImagesDirectoryName() {
+		return IMAGES_DIRECTORY;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/CopyAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider.OPERATION;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for copying file or folder for paste operation in the device
+ */
+public class CopyAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public CopyAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		
+		super(Messages.getString("CopyAction.Action_Name"), //$NON-NLS-1$
+				Messages.getString("CopyAction.Tooltip_Name"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, 
+				PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+						ISharedImages.IMG_TOOL_COPY));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+		
+		setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
+				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		List<IFtpObject> selectedFiles = FtpUtils.getSelectedObjectNames(viewer, contentProvider);
+		String path = FtpUtils.getCurrentPath(contentProvider);
+		contentProvider.setClipboardFiles(selectedFiles, path, OPERATION.COPY);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/CutAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider.OPERATION;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for cutting file or folder for paste operation in the device
+ */
+public class CutAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public CutAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		
+		super(Messages.getString("CutAction.Action_Name"), //$NON-NLS-1$
+				Messages.getString("CutAction.Tooltip_Name"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, 
+				PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+						ISharedImages.IMG_TOOL_CUT));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+		
+		setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
+				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		List<IFtpObject> selectedFiles = FtpUtils.getSelectedObjectNames(viewer, contentProvider);
+		String path = FtpUtils.getCurrentPath(contentProvider);
+		contentProvider.setClipboardFiles(selectedFiles, path, OPERATION.CUT);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DeleteAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for deleting file or folder from device
+ */
+public class DeleteAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public DeleteAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		
+		super(Messages.getString("DeleteAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("DeleteAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, 
+				PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+						ISharedImages.IMG_TOOL_DELETE));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+		
+		setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
+				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.delete(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for downloading file from device
+ */
+public class DownloadFileAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * @param viewer TableViewer.
+	 * @param contentProvider Content provider.
+	 */
+	public DownloadFileAction(TableViewer viewer, ViewContentProvider contentProvider) {
+		super(Messages.getString("DownloadFileAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("DownloadFileAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_DOWNLOAD));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.downloadFiles(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAndOpenAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for downloading file from device and opening it
+ */
+public class DownloadFileAndOpenAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * @param viewer TableViewer.
+	 * @param contentProvider Content provider.
+	 */
+	public DownloadFileAndOpenAction(TableViewer viewer, ViewContentProvider contentProvider) {
+		super(Messages.getString("DownloadFileAndOpenAction.Action_Name"), //$NON-NLS-1$
+				Messages.getString("DownloadFileAndOpenAction.Tooltip_Name"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_DOWNLOAD_AND_OPEN));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.downloadFileAndOpen(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/DownloadFileAsAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for downloading file from device and renaming it
+ */
+public class DownloadFileAsAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * @param viewer TableViewer.
+	 * @param contentProvider Content provider.
+	 */
+	public DownloadFileAsAction(TableViewer viewer, ViewContentProvider contentProvider) {
+		super(Messages.getString("DownloadFileAsAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("DownloadFileAsAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_DOWNLOAD_AS));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.downloadFileAs(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/MakeDirAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for creating directory to device
+ */
+public class MakeDirAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public MakeDirAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		super(Messages.getString("MakeDirAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("MakeDirAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_NEW_FOLDER));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.makeDir(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/PasteAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for pasting copied or cut file or folder in the device
+ */
+public class PasteAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public PasteAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		
+		super(Messages.getString("PasteAction.Action_Name"), //$NON-NLS-1$
+				Messages.getString("PasteAction.Tooltip_Name"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, 
+				PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+						ISharedImages.IMG_TOOL_PASTE));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+		
+		setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
+				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.pasteFiles(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/RefreshAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpView;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for refreshing FTP view (files and folders)
+ */
+public class RefreshAction extends S60ToolsBaseAction {
+
+	/**
+	 * Instance of FtpView. Used for refreshing view.
+	 */
+	private FtpView ftpView;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param ftpView Instance of FtpView
+	 */
+	public RefreshAction(FtpView ftpView) {
+		super(Messages.getString("RefreshAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("RefreshAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON, 
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_REFRESH));
+		this.ftpView = ftpView;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		ftpView.refreshFolderContent();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/RenameAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for renaming file or folder in the device
+ */
+public class RenameAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * @param viewer Viewer that is target for action.
+	 * @param contentProvider Content provider
+	 */
+	public RenameAction(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		super(Messages.getString("RenameAction.Action_Name"), //$NON-NLS-1$
+				Messages.getString("RenameAction.Tooltip_Name"), //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				null);
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		FtpUtils.rename(viewer, contentProvider);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/actions/UploadFileAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.actions;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for uploading file from device
+ */
+public class UploadFileAction extends S60ToolsBaseAction {
+
+	/**
+	 * Viewer that is target for action.
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Constructor
+	 * @param viewer TableViewer.
+	 * @param contentProvider Content provider.
+	 */
+	public UploadFileAction(TableViewer viewer, ViewContentProvider contentProvider) {
+		super(Messages.getString("UploadFileAction.Action_Name"),  //$NON-NLS-1$
+				Messages.getString("UploadFileAction.Tooltip_Name"),  //$NON-NLS-1$
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_UPLOAD));
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		
+		// Show select files dialog to user
+
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		FileDialog fileDialog = new FileDialog(sh, SWT.MULTI);
+		fileDialog.setText(Messages.getString("UploadFileAction.SelectUploadFiles_DlgText")); //$NON-NLS-1$
+		
+		String uploadFilterPath = RCPreferences.getUploadLocation();
+		if (uploadFilterPath == "") { //$NON-NLS-1$
+			// Workspace root is used as default folder
+			IPath location = ResourcesPlugin.getWorkspace().getRoot().getLocation();
+			fileDialog.setFilterPath(location.toString());
+		} else {
+			// use last used folder
+			fileDialog.setFilterPath(uploadFilterPath);
+		}
+		
+		if (fileDialog.open() == null) {
+			// User is canceled dialog
+			return;
+		}	
+		
+		String[] uploadFiles = fileDialog.getFileNames();
+		String srcDir = fileDialog.getFilterPath();
+		// Remember last used folder
+		RCPreferences.setUploadLocation(srcDir);
+		
+		// Get upload path
+		String uploadDir = FtpUtils.getUploadDirectory(viewer, contentProvider);
+		
+		String[] sourceFiles = getSourceFiles(srcDir, uploadFiles);
+		if(uploadDir != null) {
+			// Uploading files only when not in root.
+			FtpUtils.uploadFiles(uploadDir, sourceFiles);
+		}
+	}
+
+	/**
+	 * Returns list of file names concatenated with path.
+	 * @param srcDir Directory to be concatenated with file names.
+	 * @param uploadFiles List of file names to be concatenated with directory.
+	 * @return List of files with path.
+	 */
+	private String[] getSourceFiles(String srcDir, String[] uploadFiles) {
+		String[] srcFiles = new String[uploadFiles.length];
+		for(int i = 0;i < uploadFiles.length;i++) {
+			srcFiles[i] = FtpUtils.addFileSepatorToEnd(srcDir) + uploadFiles[i];
+		}
+		return srcFiles;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FileDropTargetListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Widget;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+
+/**
+ * Listener for dropping files to File Transfer view.
+ */
+public class FileDropTargetListener implements DropTargetListener {
+
+	/**
+	 * Content provider for the viewer.
+	 */
+	private final ViewContentProvider contentProvider;
+	/**
+	 * Viewer that listens drop events.
+	 */
+	private final TableViewer viewer;
+
+	/**
+	 * Constructor.
+	 * @param viewer Viewer that listens drop events.
+	 * @param contentProvider Content provider for the viewer.
+	 */
+	public FileDropTargetListener(TableViewer viewer, ViewContentProvider contentProvider) {
+		this.viewer = viewer;
+		this.contentProvider = contentProvider;
+	}
+
+	//
+	// Methods from DropTargetListener
+	//
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void dragEnter(DropTargetEvent event) {
+		setEventDetail(event);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#dragLeave(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void dragLeave(DropTargetEvent event) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void dragOperationChanged(DropTargetEvent event) {
+		// Changing back to correct operation, if user tries to change operation.
+		setEventDetail(event);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void dragOver(DropTargetEvent event) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void drop(DropTargetEvent event) {
+		if(FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+			String[] paths = (String[])event.data;
+			
+			// Getting target directory.
+			String uploadDir = FtpUtils.getUploadDirectory(viewer, contentProvider);
+			Widget item = event.item;
+			if(item instanceof TableItem) {
+				TableItem tableItem = (TableItem)item;
+				if(tableItem.getData() instanceof FtpFolderObject) {
+					// Current directory name is added to allow uploading files to selected directory.
+					uploadDir = uploadDir + tableItem.getText();
+					uploadDir = FtpUtils.addFileSepatorToEnd(uploadDir);
+				}
+			}
+			
+			if(uploadDir != null) {
+				// Dropping files only when not in root.
+				String[] filesOnly = getFiles(paths);
+				
+				if(filesOnly.length > 0) {
+					// Uploading files.
+					FtpUtils.uploadFiles(uploadDir, getFiles(filesOnly));
+				} else {
+					// No files found. Showing message to user.
+					String msg = Messages.getString("FileDropTargetListener.TransferFilesOnly_MsgBoxText"); //$NON-NLS-1$
+					RemoteControlMessageBox msgBox = new RemoteControlMessageBox(msg, SWT.OK | SWT.ICON_INFORMATION);
+					msgBox.open();
+					
+					// Operation was not completed successfully. Refusing from drop.
+					event.detail = DND.DROP_NONE;
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.dnd.DropTargetListener#dropAccept(org.eclipse.swt.dnd.DropTargetEvent)
+	 */
+	public void dropAccept(DropTargetEvent event) {
+		// Checking if current path has changed.
+		setEventDetail(event);
+	}
+
+	//
+	// Utility methods.
+	//
+	
+	/**
+	 * Returns supported TransferTypes.
+	 * @return Supported transfer types.
+	 */
+	public Transfer[] getTransferTypes() {
+		Transfer[] transferTypes = { FileTransfer.getInstance() };
+		return transferTypes;
+	}
+
+	/**
+	 * Returns all files from given paths. Other paths are discarded.
+	 * @param paths Paths to be checked.
+	 * @return All files from given paths.
+	 */
+	private String[] getFiles(String[] paths) {
+		// Getting only files from given paths.
+		ArrayList<String> files = new ArrayList<String>();
+		for(String path : paths) {
+			File file = new File(path);
+			if(file.isFile()) {
+				files.add(path);
+			}
+		}
+		
+		return files.toArray(new String[0]);
+	}
+	
+	/**
+	 * Sets correct detail value for given event.
+	 * @param event Event to be checked.
+	 */
+	private void setEventDetail(DropTargetEvent event) {
+		if(contentProvider.getDirectoryPath() == null) {
+			// Can't drag into root.
+			event.detail = DND.DROP_NONE;
+		}
+		else if((event.operations & DND.DROP_COPY) != 0) {
+			// Accepting drags only with copy operations.
+			event.detail = DND.DROP_COPY;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpDriveObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+import com.nokia.s60tools.hticonnection.services.DriveInfo.MediaType;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+
+/**
+ * Object for storing drive information. 
+ */
+public class FtpDriveObject extends FtpNamedObject  implements IFtpObject{
+	
+	/**
+	 * Connection status provider.
+	 */
+	private final IConnectionStatusProvider connectionStatusProvider;
+	
+	/**
+	 * Information of drive
+	 */
+	private final DriveInfo driveInfo;
+
+	/**
+	 * Constructor.
+	 * @param name Name of drive
+	 * @param driveInfo Information of drive
+	 * @param connectionStatusProvider Provides connection status. 
+	 */
+	public FtpDriveObject(String name, DriveInfo driveInfo, IConnectionStatusProvider connectionStatusProvider) {
+		super(name);
+		this.driveInfo = driveInfo;
+		this.connectionStatusProvider = connectionStatusProvider;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject#getImage()
+	 */
+	public Image getImage() {
+		if(connectionStatusProvider.isConnected()) {
+			if(driveInfo == null) {
+				// No drive information. Returning default image.
+				return ImageResourceManager.getImage(ImageKeys.IMG_DISC_DRIVE);
+			}
+			MediaType driveType = driveInfo.getType();
+			
+			// Checking for permanent drive.
+			if(driveType == MediaType.HARD_DISK
+					|| driveType == MediaType.RAM
+					|| driveType == MediaType.FLASH
+					|| driveType == MediaType.ROM) {
+				return ImageResourceManager.getImage(ImageKeys.IMG_DISC_DRIVE);
+			}
+			// Checking for external drive.
+			else if(driveType == MediaType.FLOPPY
+					|| driveType == MediaType.CDROM
+					|| driveType == MediaType.REMOTE
+					|| driveType == MediaType.NAND_FLASH
+					|| driveType == MediaType.ROTATING_MEDIA) {
+				return ImageResourceManager.getImage(ImageKeys.IMG_EXTERNAL_DRIVE);
+			}
+			// Otherwise it is unknown drive.
+			else {
+				return ImageResourceManager.getImage(ImageKeys.IMG_UNKNOWN_DRIVE);
+			}
+		}
+		return ImageResourceManager.getImage(ImageKeys.IMG_DISC_DRIVE_DIMMED);
+	}
+
+	/**
+	 * Get drive information, or <code>null</code> if there is no information for drive.
+	 * @return the driveInfo Information of drive, or <code>null</code> if there is no information.
+	 */
+	public DriveInfo getDriveInfo() {
+		return driveInfo;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpFileObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Object for storing file information. 
+ */
+public class FtpFileObject extends FtpNamedObject  implements IFtpObject{
+	
+	/**
+	 * Size of the file.
+	 */
+	private final long size;
+
+	/**
+	 * Constructor.
+	 * @param name Name of file
+	 * @param size Size of the file.
+	 */
+	public FtpFileObject(String name, long size) {
+		super(name);
+		this.size = size;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject#getImage()
+	 */
+	public Image getImage() {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
+	}
+
+	/**
+	 * Gets size of the file in bytes.
+	 * @return Size of the file in bytes.
+	 */
+	public long getSize() {
+		return size;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpFolderObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.graphics.Image;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+
+/**
+ * Object for storing folder information. 
+ */
+public class FtpFolderObject extends FtpNamedObject  implements IFtpObject{
+	
+	/**
+	 * Constructor.
+	 * @param name Name of folder
+	 */
+	public FtpFolderObject(String name) {
+		super(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject#getImage()
+	 */
+	public Image getImage() {
+		return ImageResourceManager.getImage(ImageKeys.IMG_FOLDER);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpNamedObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+/**
+ * Class for storing general information. 
+ */
+public class FtpNamedObject{
+	
+	private String name;
+
+	/**
+	 * Constructor.
+	 *  @param name Name of object
+	 */
+	public FtpNamedObject(String name) {
+		this.name = name;
+	}
+	
+	/**
+	 * Getter for name.
+	 * @return name
+	 */
+	public String getName() {
+		return name;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpUplinkObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Object for storing information of upper folder. 
+ */
+public class FtpUplinkObject extends FtpNamedObject  implements IFtpObject{
+	
+	/**
+	 * Constructor.
+	 */
+	public FtpUplinkObject() {
+		super(Messages.getString("FtpUplinkObject.Up_One_Level")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ftp.ui.view.IFtpObject#getImage()
+	 */
+	public Image getImage() {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_UP);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpUtils.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,975 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider.OPERATION;
+import com.nokia.s60tools.remotecontrol.job.DeleteDirJob;
+import com.nokia.s60tools.remotecontrol.job.DeleteFileJob;
+import com.nokia.s60tools.remotecontrol.job.FileDownloadJob;
+import com.nokia.s60tools.remotecontrol.job.FileUploadJob;
+import com.nokia.s60tools.remotecontrol.job.MakeDirJob;
+import com.nokia.s60tools.remotecontrol.job.PasteJob;
+import com.nokia.s60tools.remotecontrol.job.RenameJob;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.ConfirmDeleteDialog;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.ConfirmReplaceDialog;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.FolderNameDialog;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RenameDialog;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Utility class for file transfer operations
+ */
+public class FtpUtils {
+	
+	/**
+	 * Name for rename file dialog.
+	 */
+	private static final String RENAME_FILE_DLG_NAME = Messages.getString("FtpUtils.RenameFile_DlgName"); //$NON-NLS-1$
+	/**
+	 * Name for rename folder dialog.
+	 */
+	private static final String RENAME_FOLDER_DLG_NAME = Messages.getString("FtpUtils.RenameFolder_DlgName"); //$NON-NLS-1$
+	
+	/**
+	 * Constant timeout used for listing files/folders.
+	 */
+	private static final int LIST_CONTENTS_TIMEOUT = 3000;
+	
+	/**
+	 * Download file and change it's name
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	static public void downloadFileAs(TableViewer viewer, ViewContentProvider contentProvider) {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+			
+		if(selectedObject == null || !FtpFileObject.class.isInstance(selectedObject)){
+			// Nothing selected or selection is not file
+			return;
+		}
+		
+		FtpFileObject ftpObject = (FtpFileObject)selectedObject;
+		
+		// Show Save as dialog to user
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		FileDialog fileDialog = new FileDialog(sh, SWT.SAVE);
+		fileDialog.setFileName(ftpObject.getName());
+		fileDialog.setText(Messages.getString("FtpUtils.DownloadAs_DialogText")); //$NON-NLS-1$
+		// Get user selected folder
+		String destFile = fileDialog.open();
+		
+		if (destFile == null) {
+			// User is canceled dialog
+			return;
+		}
+		
+		// Full path for remote file
+		String currentDirectory = getCurrentPath(contentProvider);
+		String remoteFile = currentDirectory + ftpObject.getName();
+		String destFileName = destFile.substring(destFile.lastIndexOf(File.separator) + File.separator.length());
+		
+		// Remember last used folder
+		String destFolder = destFile.substring(0, destFile.lastIndexOf(File.separator));
+		RCPreferences.setDownloadLocation(destFolder);
+		destFolder = addFileSepatorToEnd(destFolder);
+		
+		FileDownloadJob job = null;
+		boolean canWrite = true;
+		
+		if (RCPreferences.getDownloadConfirm()) {
+			// Confirm replace from user if file already exists
+			File file = new File(destFile);
+			if (file.exists()) {				
+				// Show confirmation dialog
+				ConfirmReplaceDialog dlg = new ConfirmReplaceDialog(
+						sh, destFileName, false,
+						ConfirmReplaceDialog.Operation.DOWNLOAD);
+				dlg.open();
+
+				int sel = dlg.getSelection();
+				switch (sel) {
+				case ConfirmReplaceDialog.RENAME_ID:
+					// Rename this file
+					RenameDialog renameDlg = new RenameDialog(sh, destFileName, true, RENAME_FILE_DLG_NAME);
+					if (renameDlg.open() == Dialog.CANCEL){
+						// User canceled dialog
+						return;
+					}
+					// Get new file name from dialog. If user canceled dialog the original
+					// filename is returned
+					destFile = destFolder + renameDlg.getFileName();
+					canWrite = true;
+					break;
+				case IDialogConstants.YES_ID:
+					// Replace this file
+					canWrite = true;
+					break;
+				case IDialogConstants.NO_ID:
+					// Do not replace this file
+					canWrite = false;
+					break;
+				case IDialogConstants.CANCEL_ID:
+					// Cancel operation
+					return;
+				default:
+					break;
+				}
+			}
+		}
+		if (canWrite){
+			job = new FileDownloadJob(Messages.getString("FtpUtils.Download_File_Job_Name") +ftpObject.getName(), remoteFile, destFile); //$NON-NLS-1$
+			job.setPriority(Job.DECORATE);
+			job.schedule();
+		}
+		
+	}
+	
+	/**
+	 * Download all selected files
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	@SuppressWarnings("unchecked")
+	static public void downloadFiles(TableViewer viewer, ViewContentProvider contentProvider) {
+		
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+			
+		if(selectedObject == null || !FtpFileObject.class.isInstance(selectedObject)){
+			// Nothing selected or selection is not file
+			return;
+		}
+		
+		// Show select folder dialog to user
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		
+		DirectoryDialog dirDialog = new DirectoryDialog(sh, SWT.OPEN);
+		dirDialog.setText(Messages.getString("FtpUtils.Select_Folder_DlgText"));  //$NON-NLS-1$
+		dirDialog.setMessage(Messages.getString("FtpUtils.Select_Folder_DlgMsg")); 	 //$NON-NLS-1$
+		
+		String downloadFilterPath = RCPreferences.getDownloadLocation();
+		if (downloadFilterPath == "") { //$NON-NLS-1$
+			// Workspace root is used as default folder
+			IPath location = ResourcesPlugin.getWorkspace().getRoot()
+					.getLocation();
+			dirDialog.setFilterPath(location.toString());
+		} else {
+			// use last used folder
+			dirDialog.setFilterPath(downloadFilterPath);
+		}
+		
+		// Get user selected folder
+		String destPath = dirDialog.open();
+		
+		if (destPath == null) {
+			// User is canceled dialog
+			return;
+		}	
+		// Remember last used folder
+		RCPreferences.setDownloadLocation(destPath);
+		destPath = addFileSepatorToEnd(destPath);
+				
+		// Full path for remote file
+		String currentDirectory = getCurrentPath(contentProvider);
+		
+		IFtpObject ftpObject = null;
+		String remoteFile = null;
+		String destFile = null; 
+		FileDownloadJob job = null;
+		
+		// Download files
+		Iterator iter = selection.iterator();
+		boolean canWrite;
+		boolean replaceAll = false;
+		while (iter.hasNext()) {
+			canWrite = true;
+			ftpObject = (IFtpObject) iter.next();
+			if (FtpFileObject.class.isInstance(ftpObject)) {
+				// Folders are not downloaded
+				// Full path for destination file
+				destFile = destPath + ftpObject.getName();
+				remoteFile = currentDirectory + ftpObject.getName();
+				
+				if (RCPreferences.getDownloadConfirm()) {
+					// Confirm replace from user if file already exists
+					File file = new File(destFile);
+					if (file.exists() && !replaceAll) {				
+						// Show confirmation dialog
+						ConfirmReplaceDialog dlg = new ConfirmReplaceDialog(
+								sh, ftpObject.getName(), iter.hasNext(),
+								ConfirmReplaceDialog.Operation.DOWNLOAD);
+						dlg.open();
+
+						int sel = dlg.getSelection();
+						switch (sel) {
+						case ConfirmReplaceDialog.RENAME_ID:
+							// Rename this file
+							RenameDialog renameDlg = new RenameDialog(sh, ftpObject.getName(), true, RENAME_FILE_DLG_NAME);
+							if (renameDlg.open() == Dialog.CANCEL){
+								// User canceled dialog
+								return;
+							}
+							// Get new file name from dialog. If user canceled dialog the original
+							// filename is returned
+							destFile = destPath + renameDlg.getFileName();
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_ID:
+							// Replace this file
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_TO_ALL_ID:
+							// Replace all files
+							replaceAll = true;
+							break;
+						case IDialogConstants.NO_ID:
+							// Do not replace this file
+							canWrite = false;
+							break;
+						case IDialogConstants.CANCEL_ID:
+							// Cancel operation
+							return;
+						default:
+							break;
+						}
+					}
+				}
+				if (canWrite){
+					job = new FileDownloadJob(Messages.getString("FtpUtils.Download_File_Job_Name") +ftpObject.getName(), //$NON-NLS-1$
+							remoteFile, destFile, false); 
+					job.setPriority(Job.DECORATE);
+					job.schedule();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Downloads file and then opens it.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	public static void downloadFileAndOpen(TableViewer viewer, ViewContentProvider contentProvider) {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+			
+		if(selectedObject == null || !FtpFileObject.class.isInstance(selectedObject)){
+			// Nothing selected or selection is not file
+			return;
+		}
+		
+		FtpFileObject ftpObject = (FtpFileObject)selectedObject;
+		
+		String tempFolder = RemoteControlActivator.getDefault().getDownloadTempDir();
+		File destFolder = new File(tempFolder);
+		if(!destFolder.exists()) {
+			if(!destFolder.mkdirs()) {
+				// Failed to get temp directory.
+				RemoteControlConsole.getInstance().println(Messages.getString("FtpUtils.FailedToMakeDir_ConsoleMsg") + //$NON-NLS-1$
+						ftpObject.getName() + "'.", //$NON-NLS-1$
+							IConsolePrintUtility.MSG_ERROR);
+				return;
+			}
+		}
+		
+		// Getting paths for source and destination files.
+		String currentDirectory = getCurrentPath(contentProvider);
+		String remoteFile = currentDirectory + ftpObject.getName();
+		String destFile = tempFolder + ftpObject.getName();
+		
+		// Scheduling download job.
+		FileDownloadJob job = new FileDownloadJob(
+				Messages.getString("FtpUtils.Download_File_Job_Name") + ftpObject.getName(), //$NON-NLS-1$
+				remoteFile,
+				destFile,
+				true);
+		job.setPriority(Job.DECORATE);
+		job.schedule();
+	}
+	
+	/**
+	 * Upload given source files.
+	 * @param uploadDir Directory where files are to be uploaded.
+	 * @param sourceFiles Files with path which are to be uploaded.
+	 */
+	public static void uploadFiles(String uploadDir, String[] sourceFiles) {
+		
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		
+		// Get file list from remote directory for checking
+		// if file already exists
+		String[] files = null;
+		if (RCPreferences.getUploadConfirm()) {
+			IFTPService ftpService = HTIServiceFactory
+					.createFTPService(RemoteControlConsole.getInstance());
+			try {
+				// Get list of files on remote folder
+				files = ftpService.listFiles(uploadDir, LIST_CONTENTS_TIMEOUT);
+			} catch (Exception e) {
+				// Failed to list files. Show message to user and return
+				RemoteControlMessageBox message = new RemoteControlMessageBox(
+						Messages.getString("FtpUtils.Upload_Fail_ConsoleErrorMsg") //$NON-NLS-1$
+						, SWT.ICON_ERROR); 
+				message.open();
+				e.printStackTrace();
+				return;
+			}
+		}
+		
+		boolean replaceAll = false;
+		String destFileName = null;
+			
+		for (int j = 0; j < sourceFiles.length; j++) {
+			boolean canWrite = true;
+			File sourceFile = new File(sourceFiles[j]);
+			destFileName = sourceFile.getName();
+			
+			if (RCPreferences.getUploadConfirm()) {
+				// Ask confirmation for replacing files if already exists on
+				// target directory
+				for (int i = 0; i < files.length; i++) {
+					if (!replaceAll && files[i].equals(destFileName)) {
+						// No need to check other files
+						i = files.length;
+						// File exists on remote folder
+						// Show confirmation dialog
+						ConfirmReplaceDialog dlg = new ConfirmReplaceDialog(
+								sh, destFileName,
+								(j < sourceFiles.length - 1),
+								ConfirmReplaceDialog.Operation.UPLOAD);
+						dlg.open();
+
+						int sel = dlg.getSelection();
+						switch (sel) {
+						case ConfirmReplaceDialog.RENAME_ID:
+							// Rename this file
+							RenameDialog renameDlg = new RenameDialog(sh, destFileName, true, RENAME_FILE_DLG_NAME);
+							if (renameDlg.open() == Dialog.CANCEL){
+								// User canceled dialog
+								return;
+							}
+							// Get new file name from dialog. If user canceled dialog the original
+							// filename is returned
+							destFileName = renameDlg.getFileName();
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_ID:
+							// Replace this file
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_TO_ALL_ID:
+							// Replace all files
+							replaceAll = true;
+							break;
+						case IDialogConstants.NO_ID:
+							// Do not replace this file
+							canWrite = false;
+							break;
+						case IDialogConstants.CANCEL_ID:
+							// Cancel operation
+							return;
+						default:
+							break;
+						}
+					}
+				}
+			}
+			// Upload file
+			if (canWrite) {
+				String srcFile = null;
+				String destFile = null;
+
+				// Full path for destination file
+				destFile = uploadDir + destFileName;
+				srcFile = sourceFiles[j];
+
+				FileUploadJob job = new FileUploadJob(Messages
+						.getString("FtpUtils.Upload_File_Job_Name") //$NON-NLS-1$
+						+ " " //$NON-NLS-1$
+						+ sourceFile.getName(), srcFile, destFile);
+				job.setPriority(Job.DECORATE);
+				job.schedule();
+			}
+		}
+	}
+	
+	/**
+	 * Makes directory
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	static public void makeDir(TableViewer viewer, ViewContentProvider contentProvider) {
+		
+		// Get current folder		
+		String parentDir = getCurrentPath(contentProvider);
+		
+		// Show dialog where user can enter name for the new folder
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		FolderNameDialog folderNameDialog = new FolderNameDialog(sh);
+		if (folderNameDialog.open() == IDialogConstants.CANCEL_ID) {
+			// User is canceled dialog
+			return;
+		}	
+		// Parse new folder path				
+		parentDir = addFileSepatorToEnd(parentDir);
+		String folderPath = parentDir + folderNameDialog.getFolderName();
+		
+		// Start job for making dir
+		MakeDirJob job = new MakeDirJob(Messages.getString("FtpUtils.Make_Dir_Job_Name") +" " +folderPath, folderPath);  //$NON-NLS-1$ //$NON-NLS-2$
+		job.schedule();
+	}
+	
+	/**
+	 * Deletes selected directories and files
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	@SuppressWarnings("unchecked")
+	static public void delete(TableViewer viewer, ViewContentProvider contentProvider) {
+		
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		
+		if(RCPreferences.getDeleteConfirm()) {
+			// Show confirmation dialog to user
+			Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+			ConfirmDeleteDialog dlg = new ConfirmDeleteDialog(sh);
+			dlg.open();
+			if (dlg.getSelection() != IDialogConstants.YES_ID) {
+				// Do not delete
+				return;
+			}
+		}
+		
+		// Get current folder		
+		String path = getCurrentPath(contentProvider);
+		
+		// Delete all selected files and folders
+		IFtpObject ftpObject = null;
+		String dir = null;
+		Iterator iter = selection.iterator();
+		while (iter.hasNext()) {
+			ftpObject = (IFtpObject) iter.next();
+			// Add selected file/folder to path
+			dir = path + ftpObject.getName();
+
+			if (FtpFolderObject.class.isInstance(ftpObject)) {
+				// Start job for deleting folder
+				DeleteDirJob job = new DeleteDirJob(
+						Messages.getString("FtpUtils.Delete_Folder_Job_Name") + " " + dir, dir); //$NON-NLS-1$ //$NON-NLS-2$
+				job.schedule();
+			} else if (FtpFileObject.class.isInstance(ftpObject)) {
+				// Start job for deleting file
+				DeleteFileJob job = new DeleteFileJob(
+						Messages.getString("FtpUtils.Delete_File_Job_Name") + " " + dir, dir); //$NON-NLS-1$ //$NON-NLS-2$
+				job.schedule();
+			}
+		}
+	}
+	
+	/**
+	 * Add file separator to end of path if missing
+	 * @param path Path 
+	 * @return Path with file separator
+	 */
+	public static String addFileSepatorToEnd(String path) {
+		if (path != null && !path.endsWith(File.separator)){
+			path += File.separator;
+		}
+		return path;
+	}
+	
+	
+	/**
+	 * Returns currently selected directory, or null if current directory is root.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 * @return Currently selected directory, or null if current directory is root.
+	 */
+	public static String getUploadDirectory(TableViewer viewer, ViewContentProvider contentProvider) {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+			
+		// Get current folder		
+		// Full path for remote file
+		String uploadDir = getCurrentPath(contentProvider);
+		if(uploadDir == null) {
+			return null;
+		}
+		
+		// If selection is folder is it added to upload path
+		if (FtpFolderObject.class.isInstance(selectedObject)) {
+			FtpFolderObject folderObject = (FtpFolderObject)selectedObject;
+			uploadDir += folderObject.getName();
+		}	
+		uploadDir = addFileSepatorToEnd(uploadDir);
+		
+		return uploadDir;
+	}
+	
+	/**
+	 * Get current path
+	 * @param contentProvider Content provider
+	 * @return Current path ending with file separator
+	 */
+	public static String getCurrentPath(ViewContentProvider contentProvider) {
+		return addFileSepatorToEnd(contentProvider.getDirectoryPath());
+	}
+	
+	/**
+	 * Returns files and folders that are currently selected in viewer.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 * @return All currently selected file and folder names.
+	 */
+	@SuppressWarnings("unchecked")
+	public static List<IFtpObject> getSelectedObjectNames(TableViewer viewer, ViewContentProvider contentProvider) {
+		List<IFtpObject> selectedObjects = new ArrayList<IFtpObject>();
+		
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		
+		// Get all selected files and folders
+		IFtpObject ftpObject;
+		Iterator iter = selection.iterator();
+		while (iter.hasNext()) {
+			ftpObject = (IFtpObject) iter.next();
+			
+			// Adding files and folders to list.
+			if (FtpFileObject.class.isInstance(ftpObject) ||
+					FtpFolderObject.class.isInstance(ftpObject)) {
+				selectedObjects.add(ftpObject);
+			}
+		}
+		
+		return selectedObjects;
+	}
+	
+	/**
+	 * Opens file outside of workspace with Default editor, system editor,
+	 * or default text editor depending on which is available.
+	 * @param filePathName File name and path that is opened.
+	 */
+	public static void openFile(String filePathName) {
+		// Checking that file exists.
+		final File file = new File(filePathName);
+		if(file == null || !file.exists()){
+			RemoteControlConsole.getInstance().println(Messages.getString("FtpUtils.FailedToOpenFile_ErrMsg"), //$NON-NLS-1$
+					IConsolePrintUtility.MSG_ERROR);
+			return;
+		}
+		
+		//Runnable to open file
+		final Runnable runOpen = new Runnable() {
+			public void run() {
+				try {
+					// Getting needed resources and opening file. 
+					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+					IFileStore fileStore = EFS.getLocalFileSystem().getStore(file.toURI());
+					
+					IEditorPart part = IDE.openEditorOnFileStore(page, fileStore);
+
+					// Checking if opening failed and error part was opened.
+					if(part != null && part.getClass().getName().equals("org.eclipse.ui.internal.ErrorEditorPart")) { //$NON-NLS-1$
+						handleErrorOnOpenFile(file, part, page);
+					}
+				} catch (PartInitException e) {
+					RemoteControlConsole.getInstance().println(Messages.getString("FtpUtils.FailedToOpenEditor_ErrMsg") + e.getMessage(), //$NON-NLS-1$
+							IConsolePrintUtility.MSG_ERROR);
+				}
+			}
+		};
+		// File needs to be opened from UI thread.
+		Display.getDefault().asyncExec(runOpen);
+	}
+	
+	/**
+	 * Handles errors when opening a file.
+	 * @param file File to be opened.
+	 * @param editorPart Editor that was opened instead of correct editor.
+	 * @param page Workbenchpage used to open editorPart.
+	 * @throws PartInitException Thrown when editor couldn't be initialized correctly.
+	 */
+	private static void handleErrorOnOpenFile(File file, IEditorPart editorPart, IWorkbenchPage page)
+			throws PartInitException {
+		String errorText = Messages.getString("FtpUtils.FailedToOpenDefaultEditor_ErrMsg1") + file.getName() +  //$NON-NLS-1$
+							Messages.getString("FtpUtils.FailedToOpenDefaultEditor_ErrMsg2"); //$NON-NLS-1$
+		RemoteControlMessageBox errorDlg =
+			new RemoteControlMessageBox(errorText, SWT.YES | SWT.NO | SWT.ERROR);
+		
+		int result = errorDlg.open();
+		if(result == SWT.YES) {
+			// Existing error page needs to be closed or page wont open correctly.
+			page.closeEditor(editorPart, false);
+			
+			// Opening file in text editor.
+			IDE.openEditor(page, file.toURI(), "org.eclipse.ui.DefaultTextEditor", true); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Renames currently selected file.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	public static void rename(TableViewer viewer, ViewContentProvider contentProvider) {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+			
+		if(selectedObject == null || !FtpNamedObject.class.isInstance(selectedObject)){
+			// Nothing selected or selection is not file
+			return;
+		}
+		
+		FtpNamedObject ftpObject = (FtpNamedObject)selectedObject;
+		
+		// Getting paths for source and destination files.
+		String currentDirectory = getCurrentPath(contentProvider);
+		String remoteFile = currentDirectory + ftpObject.getName();
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		String dialogName;
+		// Get dialog name.
+		if(ftpObject instanceof FtpFileObject) {
+			dialogName = RENAME_FILE_DLG_NAME;
+		} else if(ftpObject instanceof FtpFolderObject) {
+			dialogName =RENAME_FOLDER_DLG_NAME; 
+		} else {
+			// Not supported type.
+			return;
+		}
+		
+		RenameDialog renameDlg = new RenameDialog(sh, ftpObject.getName(), false, dialogName);
+		if (renameDlg.open() == Dialog.CANCEL){
+			// User canceled dialog
+			return;
+		}
+		// Get new file name from dialog.
+		String targetFile = currentDirectory + renameDlg.getFileName();
+		
+		RenameJob job = new RenameJob(Messages.getString("FtpUtils.RenameJob_Name") + //$NON-NLS-1$
+						ftpObject.getName(),
+				remoteFile,
+				targetFile);
+		job.schedule();
+	}
+	
+	/**
+	 * Gets currently selected path. This adds single folder to the path, if one folder is selected.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 * @return Currently selected path, or <code>null</code> if root is shown.  
+	 */
+	private static String getSelectedPath(TableViewer viewer,
+			ViewContentProvider contentProvider) {
+		// Getting required information.
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		String targetPath = getCurrentPath(contentProvider);
+		
+		if(targetPath == null){
+			// Can't get selected path from root.
+			return null;
+		}
+		
+		if(selection.size() == 1) {
+			Object selectedObject = selection.getFirstElement();
+			if(FtpFolderObject.class.isInstance(selectedObject)) {
+				// Selection is a folder. Adding currently selected single folder to path.
+				targetPath = targetPath + ((FtpFolderObject)selectedObject).getName();
+			}
+		}
+		
+		return targetPath;
+	}
+	
+	/**
+	 * Returns all files and folders in target directory.
+	 * @param targetDir Listing is got for this directory.
+	 * @return Contents of target directory.
+	 */
+	private static String[] getFilesAndFolders(String targetDir) {
+		// Get file and folder list from remote directory for checking
+		// if file already exists
+		String[] files = null;
+		String[] folders = null;
+		if (RCPreferences.getUploadConfirm()) {
+			IFTPService ftpService = HTIServiceFactory
+					.createFTPService(RemoteControlConsole.getInstance());
+			try {
+				// Get list of files on remote folder
+				files = ftpService.listFiles(targetDir, LIST_CONTENTS_TIMEOUT);
+				folders = ftpService.listDirs(targetDir, LIST_CONTENTS_TIMEOUT);
+			} catch (Exception e) {
+				// Failed to list contents of directory.
+				e.printStackTrace();
+				return null;
+			}
+		}
+		
+		// Creating single array that contains all files and folders.
+		String[] filesAndFolders = new String[files.length + folders.length];
+		int place = 0;
+		for(int i = 0;i < files.length;i++) {
+			filesAndFolders[place] = files[i];
+			place++;
+		}
+		for(int i = 0;i < folders.length;i++) {
+			filesAndFolders[place] = folders[i];
+			place++;
+		}
+		
+		return filesAndFolders;
+	}
+	
+	/**
+	 * Pastes previously selected files to target folder.
+	 * @param viewer Viewer
+	 * @param contentProvider Content provider
+	 */
+	public static void pasteFiles(TableViewer viewer, ViewContentProvider contentProvider) {
+		// Getting required information.
+		List<IFtpObject> selectedFiles = contentProvider.getSelectedFiles();
+		IFtpObject[] sourceFiles = selectedFiles.toArray(new IFtpObject[0]);
+		String sourcePath = contentProvider.getSelectedPath();
+		String destFilePath = getSelectedPath(viewer, contentProvider);
+		if(destFilePath == null) {
+			// Can't paste to root.
+			return;
+		}
+		
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		
+		// Getting files and folders.
+		String filesAndFolders[] = getFilesAndFolders(destFilePath);
+		if(filesAndFolders == null) {
+			// Gettings list failed.
+			// Failed to list files. Show message to user and return
+			RemoteControlMessageBox message = new RemoteControlMessageBox(
+					Messages.getString("FtpUtils.FailedToPaste_ErrMsg") //$NON-NLS-1$
+					, SWT.ICON_ERROR); 
+			message.open();
+			return;
+		}
+		
+		boolean replaceAll = false;
+			
+		for (int j = 0; j < sourceFiles.length; j++) {
+			
+			if(isSubFolder(sourceFiles[j], sourcePath, destFilePath)) {
+				// Can't copy folder to its subfolder.
+				break;
+			}
+			
+			boolean canWrite = true;
+			String sourceFile = sourceFiles[j].getName();
+			String destFileName = sourceFiles[j].getName();
+			if (RCPreferences.getPasteConfirm()) {
+				// Ask confirmation for replacing files if already exists on
+				// target directory
+				for (int i = 0; i < filesAndFolders.length; i++) {
+					if (!replaceAll && filesAndFolders[i].equals(destFileName)) {
+						// No need to check other files
+						i = filesAndFolders.length;
+						// File exists on remote folder
+						// Show confirmation dialog
+						ConfirmReplaceDialog dlg = new ConfirmReplaceDialog(
+								sh, destFileName,
+								(j < sourceFiles.length - 1),
+								ConfirmReplaceDialog.Operation.PASTE);
+						dlg.open();
+
+						int sel = dlg.getSelection();
+						switch (sel) {
+						case ConfirmReplaceDialog.RENAME_ID:
+							// Rename this file
+							RenameDialog renameDlg = new RenameDialog(sh, destFileName, true, RENAME_FILE_DLG_NAME);
+							if (renameDlg.open() == Dialog.CANCEL){
+								// User canceled dialog
+								return;
+							}
+							// Get new file name from dialog. If user canceled dialog the original
+							// filename is returned
+							destFileName = renameDlg.getFileName();
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_ID:
+							// Replace this file
+							canWrite = true;
+							break;
+						case IDialogConstants.YES_TO_ALL_ID:
+							// Replace all files
+							replaceAll = true;
+							break;
+						case IDialogConstants.NO_ID:
+							// Do not replace this file
+							canWrite = false;
+							break;
+						case IDialogConstants.CANCEL_ID:
+							// Cancel operation
+							return;
+						default:
+							break;
+						}
+					}
+				}
+			}
+
+			if(canWrite) {
+				if(contentProvider.getFileOperation() == OPERATION.COPY &&
+						sourceFiles[j] instanceof FtpFolderObject) {
+					// Copy operation for empty folders needs to be handled specially because
+					// ftp copy copies contents of folder to target folder. If there is nothing in
+					// source folder, then copying fails. This is handled user friendly by
+					// creating new empty folder if necessary.
+					pasteCopiedFolder(contentProvider, sourcePath, sourceFile, destFilePath, destFileName, filesAndFolders);
+				} else {
+					// Paste file.
+					PasteJob job = new PasteJob(Messages.getString("FtpUtils.PasteFileJob_Name") + sourceFile, //$NON-NLS-1$
+							sourceFile,
+							sourcePath,
+							destFileName,
+							destFilePath,
+							contentProvider.getFileOperation());
+					job.schedule();
+				}
+			}
+		}
+		
+		// If files are moved, then clipboard needs to be cleared.
+		if(contentProvider.getFileOperation() == OPERATION.CUT) {	
+			contentProvider.setClipboardFiles(new ArrayList<IFtpObject>(), "", OPERATION.NONE); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Checks if destFilePath is subfolder to sourcePath or they are same..
+	 * @param sourceFtpObject Source object.
+	 * @param sourcePath Path for source folder.
+	 * @param destFilePath Path for destination folder.
+	 * @return True if destFilePath is subfolder or same. False otherwise.
+	 */
+	private static boolean isSubFolder(IFtpObject sourceFtpObject, String sourcePath, String destFilePath) {
+		if(!(sourceFtpObject instanceof FtpFolderObject)) {
+			return false;
+		}
+		String source = addFileSepatorToEnd(sourcePath) + sourceFtpObject.getName() + File.separator;
+		String dest = addFileSepatorToEnd(destFilePath);
+		
+		if(dest.startsWith(source)) {
+			if(source.length() == dest.length()) {
+				// Source is same as destination. Show message to user.
+				RemoteControlMessageBox message = new RemoteControlMessageBox(
+						Messages.getString("FtpUtils.SourceSameAsDestination_ErrMsg1") + //$NON-NLS-1$
+						sourceFtpObject.getName() + Messages.getString("FtpUtils.SourceSameAsDestination_ErrMsg2"), //$NON-NLS-1$
+						SWT.ICON_ERROR); 
+				message.open();
+				return true;
+			}
+			else if (source.length() < dest.length()) {
+				// Destination folder is subfolder.. Show message to user.
+				RemoteControlMessageBox message = new RemoteControlMessageBox(
+						Messages.getString("FtpUtils.DestinationIsSubfolder_ErrMsg1") + //$NON-NLS-1$
+						sourceFtpObject.getName() + Messages.getString("FtpUtils.DestinationIsSubfolder_ErrMsg2"), //$NON-NLS-1$
+						SWT.ICON_ERROR); 
+				message.open();
+				return true;
+			}
+		}
+		
+		return false;
+	}
+
+	/**
+	 * Handles copy/pasting folders correctly. Empty source folders are created
+	 * instead of copying.
+	 * @param contentProvider Content provider
+	 * @param sourcePath Path for source file.
+	 * @param sourceFile Source file name.
+	 * @param destFilePath Path for target file.
+	 * @param destFileName Target file name.
+	 * @param destFilesAndFolders File and folder names in target path.
+	 */
+	private static void pasteCopiedFolder(ViewContentProvider contentProvider, String sourcePath,
+			String sourceFile, String destFilePath, String destFileName, String[] destFilesAndFolders) {
+		String sourceFilePath = addFileSepatorToEnd(sourcePath) + sourceFile;
+		String[] sourceFilesAndFolders = getFilesAndFolders(sourceFilePath);
+		
+		if(sourceFilesAndFolders == null) {
+			// Failed to list files. Show message to user.
+			RemoteControlMessageBox message = new RemoteControlMessageBox(
+					Messages.getString("FtpUtils.FailedToPaste_ErrMsg") //$NON-NLS-1$
+					, SWT.ICON_ERROR); 
+			message.open();
+			
+		} else if(sourceFilesAndFolders.length == 0) {
+			// Empty source folder. Checking if target folder already exists.
+			for(String str : destFilesAndFolders) {
+				if(str.equalsIgnoreCase(destFileName)) {
+					// Trying to copy empty folder over existing folder, nothing to do.
+					return;
+				}
+			}
+
+			// Existing folder was not found. Need to create a new folder. Copying empty folder would fail.
+			String targetFilePath = addFileSepatorToEnd(destFilePath) + destFileName;
+			// Start job for making dir.
+			MakeDirJob job = new MakeDirJob(Messages.getString("FtpUtils.Make_Dir_Job_Name") + " " + //$NON-NLS-1$ //$NON-NLS-2$
+					targetFilePath, targetFilePath);
+			job.schedule();
+			
+		} else {
+			// Paste file.
+			PasteJob job = new PasteJob(Messages.getString("FtpUtils.PasteFileJob_Name") + sourceFile, //$NON-NLS-1$
+					sourceFile,
+					sourcePath,
+					destFileName,
+					destFilePath,
+					contentProvider.getFileOperation());
+			job.schedule();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/FtpView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,956 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import java.io.File;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+
+import com.nokia.s60tools.hticonnection.listener.HtiConnectionManager;
+import com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.CopyAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.CutAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.DeleteAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.DownloadFileAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.DownloadFileAndOpenAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.DownloadFileAsAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.MakeDirAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.PasteAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.RefreshAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.RenameAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.actions.UploadFileAction;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.TableViewerComparator.Columns;
+import com.nokia.s60tools.remotecontrol.job.DeleteDirJob;
+import com.nokia.s60tools.remotecontrol.job.DeleteFileJob;
+import com.nokia.s60tools.remotecontrol.job.FileUploadJob;
+import com.nokia.s60tools.remotecontrol.job.IJobCompletionListener;
+import com.nokia.s60tools.remotecontrol.job.IManageableJob;
+import com.nokia.s60tools.remotecontrol.job.MakeDirJob;
+import com.nokia.s60tools.remotecontrol.job.PasteJob;
+import com.nokia.s60tools.remotecontrol.job.RemoteControlJobManager;
+import com.nokia.s60tools.remotecontrol.job.RenameJob;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.remotecontrol.ui.views.main.MainView;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * This view is for listing files for FTP transfer.
+ */
+public class FtpView extends AbstractUiFractionComposite implements
+				IHtiConnectionListener, IJobCompletionListener, IConnectionStatusProvider, SelectionListener {
+	 
+	/**
+	 * We can get view ID at runtime once the view is instantiated, but we
+	 * also need static access to ID in order to be able to invoke the view.
+	 */
+	public static final String ID = "com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpView"; //$NON-NLS-1$
+	/**
+	 * Default column width for sizes.
+	 */
+	private static final int SIZE_COLUMN_DEFAULT_WIDTH = 90;
+	/**
+	 * Column width for free space.
+	 */
+	private int freeSpaceColumnWidth = SIZE_COLUMN_DEFAULT_WIDTH;
+	/**
+	 * Default column width for name.
+	 */
+	private static final int NAME_COLUMN_DEFAULT_WIDTH = 200;
+	/**
+	 * Name for size column.
+	 */
+	public static final String SIZE_COLUMN_NAME = Messages.getString("FtpView.Size_ColumnTitle"); //$NON-NLS-1$
+	/**
+	 * Name for name column.
+	 */
+	public static final String NAME_COLUMN_NAME = Messages.getString("FtpView.Name_ColumnTitle"); //$NON-NLS-1$
+	/**
+	 * Name for free space column.
+	 */
+	public static final String FREE_SPACE_COLUMN_NAME = Messages.getString("FtpView.FreeSpace_ColumnTitle"); //$NON-NLS-1$
+	
+	/**
+	 * Open preferences action
+	 */
+	private Action preferencesAction;
+	
+	/**
+	 * Download action
+	 */
+	private Action downloadAction;
+	
+	/**
+	 * Download as action
+	 */
+	private Action downloadAsAction;
+	
+	/**
+	 * Download and open
+	 */
+	private Action downloadAndOpenAction;
+	
+	/**
+	 * Upload action
+	 */
+	private Action uploadAction;
+	
+	/**
+	 * Make directory action
+	 */
+	private Action makeDirAction;
+	
+	/**
+	 * Delete action
+	 */
+	private Action deleteAction;
+	
+	private Action copyAction;
+	private Action cutAction;
+	private Action pasteAction;
+	private Action renameAction;
+	
+	/**
+	 * Refresh action
+	 */
+	private Action refreshAction;
+	
+	/**
+	 * Table viewer 
+	 */
+	private TableViewer viewer;
+
+	/**
+	 * Content provider
+	 */
+	private ViewContentProvider contentProvider;
+
+	/**
+	 * Main view
+	 */
+	private final MainView mainView;
+	
+	/**
+	 * Is HTI connected to target
+	 */
+	private boolean isConnected = false;
+
+	/**
+	 * Keeps track if Remote Control has been connected after start.
+	 * This is needed to determine if temp directory needs to be cleaned.
+	 */	
+	private boolean isFirstConnection = true;
+
+	/**
+	 * Selection changed listener
+	 */
+	private TableViewerSelectionChangedListener selectionChangedListener;
+	
+	/**
+	 * Double click listener
+	 */
+	private TableViewerDoubleClickListener doubleClickListener;
+
+	/**
+	 * Path composite
+	 */
+	private PathComposite pathComposite;
+
+	/**
+	 * Property change listener
+	 */
+	private IPropertyChangeListener listener = null;
+
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 * @param mainView			Instance of MainView
+	 */
+	public FtpView(Composite parentComposite, int style, MainView mainView) {
+		super(parentComposite, style);
+		this.mainView = mainView;
+		HtiConnectionManager.getInstance().addListener(this);
+		RemoteControlJobManager.getInstance().addListener(this);
+		createPropertyChangeListener();
+	}
+
+	/**
+	 * Create change listener to prefstore preferences 
+	 */
+	private void createPropertyChangeListener() {
+		
+		// Folders need to be refreshed when prefstore values are changed
+		listener =
+			   new IPropertyChangeListener() {
+			      public void propertyChange(PropertyChangeEvent event) {
+			    	  refreshFolderContent();
+			      }
+			   };
+			   
+			   RCPreferences.addPropertyChangeListener(listener);
+	}
+	
+	/**
+	 * Getter for default grid layout.
+	 * @return Default grid data layout.
+	 */
+	private GridData getDefaultGridData(){				
+		GridData gridData = new GridData();
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalAlignment = SWT.FILL;
+		gridData.verticalAlignment = SWT.FILL;
+		return gridData;
+	}
+	
+	/**
+	 * Creates table viewer for viewing file listing.
+	 * @parent Parent composite
+	 */
+	private void createViewContents(Composite parent) {
+		
+		// Creating path field.
+		
+		pathComposite = new PathComposite(parent, this);
+
+		// Creating file view.
+		
+		viewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
+		viewer.getControl().setLayoutData(getDefaultGridData());		
+		contentProvider = new ViewContentProvider(this);
+		viewer.setContentProvider(contentProvider);
+		viewer.setLabelProvider(new ViewLabelProvider(viewer.getTable()));
+		viewer.setInput(contentProvider.getInput());
+		
+		configureTable();
+		viewer.setComparator(new TableViewerComparator(Columns.NAME, SWT.UP));
+		
+		// Adding drop support.
+		FileDropTargetListener fileDropTargetListener = new FileDropTargetListener(viewer, contentProvider);
+		viewer.addDropSupport(DND.DROP_COPY, fileDropTargetListener.getTransferTypes(), fileDropTargetListener);
+	}
+	
+	/**
+	 * Configures table in the viewer and creates columns for it. 
+	 */
+	private void configureTable() {
+		Table table = viewer.getTable();
+		table.setHeaderVisible(true);
+		
+		// Name column.
+		TableColumn column = new TableColumn(table, SWT.NONE, 0);
+		column.setText(NAME_COLUMN_NAME);
+		column.setWidth(NAME_COLUMN_DEFAULT_WIDTH);
+		column.addSelectionListener(this);
+		// Name column is used as default sorting column.
+		table.setSortColumn(column);
+		table.setSortDirection(SWT.UP);
+		
+		// Free space column.
+		column = new TableColumn(table, SWT.NONE, 1);
+		column.setText(FREE_SPACE_COLUMN_NAME);
+		column.setAlignment(SWT.RIGHT);
+		column.setWidth(SIZE_COLUMN_DEFAULT_WIDTH);
+		column.addSelectionListener(this);
+		
+		// Size column.
+		column = new TableColumn(table, SWT.NONE, 2);
+		column.setText(SIZE_COLUMN_NAME);
+		column.setAlignment(SWT.RIGHT);
+		column.setWidth(SIZE_COLUMN_DEFAULT_WIDTH);
+		column.addSelectionListener(this);
+	}
+
+	/**
+	 * Create main menu actions in here. The same actions
+	 * can be also used to populate context menus, if needed.
+	 */
+	private void createMainMenuActions() {
+		preferencesAction = new OpenPreferencePageAction(Messages.getString("FtpView.Preferences_MenuItem"),  //$NON-NLS-1$
+				Messages.getString("FtpView.Open_Preferences_Tooltip"), IAction.AS_PUSH_BUTTON,  //$NON-NLS-1$
+				ImageKeys.IMG_PREFERENCES, RCPreferencePage.Tabs.FTP);
+		downloadAction = new DownloadFileAction(viewer, contentProvider);
+		downloadAsAction = new DownloadFileAsAction(viewer, contentProvider);
+		downloadAndOpenAction = new DownloadFileAndOpenAction(viewer, contentProvider);
+		uploadAction = new UploadFileAction(viewer, contentProvider);
+		makeDirAction = new MakeDirAction(viewer, contentProvider);
+		deleteAction = new DeleteAction(viewer, contentProvider);
+		copyAction = new CopyAction(viewer, contentProvider);
+		cutAction = new CutAction(viewer, contentProvider);
+		pasteAction = new PasteAction(viewer, contentProvider);
+		renameAction = new RenameAction(viewer, contentProvider);
+		refreshAction = new RefreshAction(this);
+	}
+
+	/**
+	 * This method fills action bars (no need for further modifications).
+	 */
+	protected void fillViewActionBars() {
+		IActionBars bars = mainView.getActionBars();
+		fillViewMainMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * View's main menu is populated in here.
+	 * @param manager Menu manager instance.
+	 */
+	private void fillViewMainMenu(IMenuManager manager) {
+		manager.removeAll();
+		manager.add(downloadAction);
+		manager.add(downloadAsAction);
+		manager.add(uploadAction);
+		manager.add(preferencesAction);
+		manager.add(refreshAction);
+		updateActionStates();
+		manager.update(true);
+	}
+
+	/**
+	 * View's tool bar is populated in here.
+	 * @param manager Tool bar instance.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {	
+		manager.removeAll();
+		manager.add(downloadAction);
+		manager.add(downloadAsAction);
+		manager.add(uploadAction);
+		manager.add(preferencesAction);
+		updateActionStates();
+		manager.update(true);
+	}
+
+	/**
+	 * Updates action button states.
+	 */
+	private void updateActionStates() {
+		
+		
+		if (isSelectionFile() || isSelectionFolder()) {
+			deleteAction.setEnabled(true);
+			copyAction.setEnabled(true);
+			cutAction.setEnabled(true);
+		} else {
+			deleteAction.setEnabled(false);
+			copyAction.setEnabled(false);
+			cutAction.setEnabled(false);
+		}
+		if (!isSelectionUpLink() && contentProvider.getDirectoryPath() != null) {
+			makeDirAction.setEnabled(true);
+		} else {
+			makeDirAction.setEnabled(false);
+		}
+		if (isSelectionFile()) {
+			downloadAction.setEnabled(true);
+		} else {
+			downloadAction.setEnabled(false);
+		}
+		if (isSelectionSingleFile()) {
+			downloadAsAction.setEnabled(true);
+			downloadAndOpenAction.setEnabled(true);
+		} else {
+			downloadAsAction.setEnabled(false);
+			downloadAndOpenAction.setEnabled(false);
+		}
+		if (isSelectionSingleFile() || isSelectionSingleFolder()) {
+			renameAction.setEnabled(true);
+		} else {
+			renameAction.setEnabled(false);
+		}
+		if (!isSelectionUpLink() && contentProvider.getDirectoryPath() != null) {
+			uploadAction.setEnabled(true);
+		} else {
+			uploadAction.setEnabled(false);
+		}
+		if (!isSelectionUpLink() &&
+				!isSelectionMultiFolder() &&
+				contentProvider.getDirectoryPath() != null &&
+				contentProvider.getFileOperation() != ViewContentProvider.OPERATION.NONE) {
+			pasteAction.setEnabled(true);
+		} else {
+			pasteAction.setEnabled(false);
+		}
+		
+		// refresh is disabled on root view
+		if (contentProvider.getDirectoryPath() != null) {
+			refreshAction.setEnabled(true);
+		} else {
+			refreshAction.setEnabled(false);
+		}
+	}
+	
+	/**
+	 * Fills context menu.
+	 * @param manager used to fill menu.
+	 */
+	private void fillContextMenu(IMenuManager manager) {
+		manager.removeAll();
+		manager.add(makeDirAction);
+		manager.add(deleteAction);
+		manager.add(downloadAction);
+		manager.add(downloadAsAction);
+		manager.add(uploadAction);
+		manager.add(downloadAndOpenAction);
+		
+		manager.add(new Separator());
+		
+		// Copy, cut, paste, and rename are shown only if they are supported in the device.
+		if(contentProvider.supportsCopyMoveRename()) {
+			manager.add(copyAction);
+			manager.add(cutAction);
+			manager.add(pasteAction);
+			manager.add(renameAction);
+			
+			manager.add(new Separator());
+		}
+		
+		manager.add(preferencesAction);
+		manager.add(refreshAction);
+		updateActionStates();
+
+		manager.update(true);
+	}
+	
+	/**
+	 * Allows other classes to update content description.
+	 * @param newContentDescription New description.
+	 */
+	public void updateDescription(String newContentDescription){
+		mainView.updateDescription(newContentDescription);
+	}
+
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	public void refresh(){
+		viewer.refresh();
+		pathComposite.setConnected(isConnected);
+		String currentPath = contentProvider.getDirectoryPath();
+		if(currentPath != null) {
+			pathComposite.setPath(currentPath);
+		} else {
+			pathComposite.setPath(""); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Updates contents of viewer with files and dirs in current directory 
+	 * and then refreshes viewer.
+	 */
+	public void refreshFolderContent() {
+		updatePathThenRefresh(contentProvider.getDirectoryPath());
+	}
+	
+	/**
+	 * Updates contents of viewer with files and dirs with given directory and 
+	 * then refreshes viewer.
+	 * @param directoryPath Path to device directory which contents are to be updated.
+	 */
+	public void updatePathThenRefresh(String directoryPath) {
+		// Creating thread for updating so that called doesn't have to wait if there is long queue.
+		UpdateViewerThread thread = new UpdateViewerThread(directoryPath);
+		thread.start();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		RemoteControlJobManager.getInstance().removeListener(this);
+		HtiConnectionManager.getInstance().removeListener(this);
+		viewer.removeDoubleClickListener(doubleClickListener);
+		viewer.removeSelectionChangedListener(selectionChangedListener);
+		// Remove property listener
+		if(listener != null){
+			RCPreferences.removePropertyChangeListener(listener);
+		}
+	}
+
+	/**
+	 * Makes necessary changes to context menu and action bars.
+	 */
+	public void setAsActiveView(){
+		hookContextMenu();
+		fillViewActionBars();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setFocus()
+	 */
+	@Override
+	public boolean setFocus() {
+		return pathComposite.setFocus() ? true : super.setFocus();
+	}
+	
+	/**
+	 * Hooks context menu to the current view.
+	 */
+	protected void hookContextMenu() {
+		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				FtpView.this.fillContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(viewer.getControl());
+		viewer.getControl().setMenu(menu);
+		mainView.registerContextMenu(menuMgr, viewer);
+	}
+	
+	/**
+	 * Is selected item(s) a file(s)
+	 * @return True if file else false
+	 */
+	private boolean isSelectionFile() {
+		boolean retVal = false;
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object[] selectionArray = selection.toArray();
+		
+		if (selection.size() > 0) {
+			// Checking that all selected items are files.
+			for(Object selectedObject : selectionArray) {
+				if (FtpFileObject.class.isInstance(selectedObject)) {
+					retVal = true;
+				} else {
+					retVal = false;
+					break;
+				}
+			}
+		}
+
+		return retVal;
+	}
+	
+	/**
+	 * Is size of selection bigger than 1 and does it contain folder(s).
+	 * @return True if size is bigger than 1 and contains one or more folders, false otherwise.
+	 */
+	private boolean isSelectionMultiFolder() {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object[] selectionArray = selection.toArray();
+		
+		if (selection.size() > 1) {
+			// Checking if there is is folder in selection.
+			for(Object selectedObject : selectionArray) {
+				if (FtpFolderObject.class.isInstance(selectedObject)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+	
+	/**
+	 * Is selected item a single file
+	 * @return True if single file else false
+	 */
+	private boolean isSelectionSingleFile() {
+		boolean retVal = false;
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+		
+		if (selection.size() == 1){
+			if (selectedObject != null) {
+				if (FtpFileObject.class.isInstance(selectedObject)) {
+					retVal = true;
+				}
+			}
+		}
+		return retVal;
+	}
+	
+	/**
+	 * Is selected item a single folder
+	 * @return True if single folder else false
+	 */
+	private boolean isSelectionSingleFolder() {
+		boolean retVal = false;
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+		
+		if (selection.size() == 1){
+			if (selectedObject != null) {
+				if (FtpFolderObject.class.isInstance(selectedObject)) {
+					retVal = true;
+				}
+			}
+		}
+		return retVal;
+	}
+	
+	/**
+	 * Is selected item a folder
+	 * @return True if folder else false
+	 */
+	private boolean isSelectionFolder() {
+		boolean retVal = false;
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+		if (selectedObject != null) {
+			if (FtpFolderObject.class.isInstance(selectedObject)) {
+				retVal = true;
+			}
+		}
+		return retVal;
+	}
+		
+	/**
+	 * Is selected item a Up link
+	 * @return True if Up link else false
+	 */
+	private boolean isSelectionUpLink() {
+		boolean retVal = false;
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+		if (selectedObject != null) {
+			if (FtpUplinkObject.class.isInstance(selectedObject)) {
+				retVal = true;
+			}
+		}
+		return retVal;
+	}
+	
+	/**
+	 * Hooks double click action to view. 
+	 */
+	private void hookDoubleClickAction() {
+		doubleClickListener = new TableViewerDoubleClickListener(viewer, contentProvider, this);
+		viewer.addDoubleClickListener(doubleClickListener);
+	}
+	
+	/**
+	 * Hooks selection action to view. 
+	 */
+	private void hookSelectionAction() {
+		selectionChangedListener = new TableViewerSelectionChangedListener(this);
+		viewer.addSelectionChangedListener(selectionChangedListener);
+	}
+	
+	/**
+	 * Updates toolbar and menu depending of selection
+	 */
+	public void selectionChanged() {
+		updateActionStates();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		try {
+			//
+			// Creating controls
+			//
+			createViewContents(this);
+			
+			//
+			// Actions invoked by content providers may set enable/disable
+			// states for the actions, therefore all the action has to be
+			// created before creating the controls. This makes sure that
+			// it is safe to refer to all the actions after this point.
+			//
+			createMainMenuActions();
+
+			//
+			// Doing other initializations that may refer to the component
+			// that has been created above.
+			//
+
+			hookDoubleClickAction();
+			hookSelectionAction();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			RemoteControlConsole.getInstance().println(Messages.getString("FtpView.Failed_To_Create_File_Transfer_View_ConsoleMsg") + e  //$NON-NLS-1$
+					, RemoteControlConsole.MSG_ERROR);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	@Override
+	protected Layout createLayout() {
+		GridLayout gridLayout = new GridLayout(1, false);
+		return gridLayout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayoutData()
+	 */
+	@Override
+	protected Object createLayoutData() {
+		return getDefaultGridData();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionTerminated()
+	 */
+	public void connectionTerminated() {
+		isConnected = false;
+		updatePathThenRefresh(null);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionStarted()
+	 */
+	public void connectionStarted() {
+		isConnected = true;
+		updatePathThenRefresh(null);
+		if(isFirstConnection) {
+			// Temporary directory is cleaned when connection is estabilished
+			// at the first time.
+			isFirstConnection = false;
+			Thread thread = new TempDirCleaner();
+			Display.getDefault().asyncExec(thread);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ftp.ui.view.IConnectionStatusProvider#isConnected()
+	 */
+	public boolean isConnected() {
+		return isConnected;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IJobCompletionListener#backgroundJobCompleted(com.nokia.s60tools.remotecontrol.job.IManageableJob)
+	 */
+	public void backgroundJobCompleted(IManageableJob jobObject) {
+		if (FileUploadJob.class.isInstance(jobObject)
+				|| MakeDirJob.class.isInstance(jobObject)
+				|| DeleteDirJob.class.isInstance(jobObject)
+				|| DeleteFileJob.class.isInstance(jobObject)
+				|| RenameJob.class.isInstance(jobObject)
+				|| PasteJob.class.isInstance(jobObject)) {
+			
+			// Ui need to be updated for showing updated files in file view
+			updatePathThenRefresh(contentProvider.getDirectoryPath());
+		}
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		// Handling events from columns.
+		if(e.getSource() instanceof TableColumn) {
+			TableColumn column = (TableColumn)e.getSource();
+			Table table = column.getParent();
+
+			// Getting sorting information.
+			
+			int sortDirection;
+			if(table.getSortColumn() == column) {
+				sortDirection = (table.getSortDirection() == SWT.UP) ? SWT.DOWN : SWT.UP;
+			} else {
+				sortDirection = SWT.UP;
+			}
+			table.setSortColumn(column);
+			table.setSortDirection(sortDirection);
+			
+			// Comparator will sort rows after it has been set.
+			viewer.setComparator(new TableViewerComparator(Columns.values()[table.indexOf(column)], sortDirection));
+		}
+	}
+
+	/**
+	 * Updates columns in table.
+	 */
+	private void updateColumns(boolean isRoot) {
+		Table table = viewer.getTable();
+		
+		if(isRoot) {
+			// Adding free space column when browsing root
+			if(table.getColumnCount() == 2) {
+				TableColumn column = new TableColumn(table, SWT.NONE, 1);
+				column.setText(FREE_SPACE_COLUMN_NAME);
+				column.setAlignment(SWT.RIGHT);
+				column.setWidth(freeSpaceColumnWidth);
+				column.addSelectionListener(this);
+			}
+		}
+		else {
+			// Removing free space column when browsing directory
+			if(table.getColumnCount() == 3) {
+				if(table.getSortColumn() == table.getColumn(1)) {
+					// Have to set new sort column.
+					table.setSortColumn(table.getColumn(0));
+					table.setSortDirection(SWT.UP);
+					viewer.setComparator(new TableViewerComparator(Columns.NAME, SWT.UP));
+				}
+				freeSpaceColumnWidth = table.getColumn(1).getWidth();
+				table.getColumn(1).dispose();
+			}
+		}
+	}
+	
+	/**
+	 * Thread that is created to update file listing in view.
+	 * First listing needs to be updated in normal thread to prevent
+	 * UI hanging up. Then viewer needs to be refreshed from UI thread.
+	 * This must be run as normal thread.
+	 */
+	private class UpdateViewerThread extends Thread {
+		
+		// Path to be updated.
+		private final String directoryPath;
+
+		/**
+		 * Constructor.
+		 * @param directoryPath Path that will be updated.
+		 */
+		public UpdateViewerThread(String directoryPath) {
+			this.directoryPath = directoryPath;
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run() {
+			// Updating directory listing.
+			final String updatedPath = contentProvider.updatePath(directoryPath);
+			
+			// Runnable for updating UI
+			Runnable updateView = new Runnable() {
+				public void run() {
+					boolean isRoot = (updatedPath == null || updatedPath.equals(""));  //$NON-NLS-1$
+					updateColumns(isRoot);
+					refresh();
+				}
+			};
+
+			// UI updates from background. Threads has to be queued
+			// into UI thread in order not to cause invalid thread access
+			Display.getDefault().asyncExec(updateView);
+		}
+	}
+	
+	/**
+	 * Thread for cleaning temporary directory from unnecessary files.
+	 */
+	private class TempDirCleaner extends Thread {
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		@Override
+		public void run() {
+			cleanTempDir(RemoteControlActivator.getDefault().getDownloadTempDir());
+		}
+		
+		/**
+		 * Goes through files in temporary folder and deletes those that are currently not open.
+		 * @param path temporary directory to be cleaned.
+		 */
+		public void cleanTempDir(String path) {
+			File root = new File(path);
+			if(!root.exists()) {
+				root.mkdirs();
+			}
+			if(root.exists()) {
+				File[] files = root.listFiles();
+				for(File file : files) {
+					if(!isFileOpen(file)) {
+						// If file fails to be deleted, it might be open in system editor.
+						// No need to check if operation failed.
+						file.delete();
+					}
+				}
+			}
+		}
+	
+		/**
+		 * Checks if file has been opened in File store editor.
+		 * @param file File that is to be checked.
+		 * @return True if file is open in an editor. False otherwise.
+		 */
+		private boolean isFileOpen(File file) {
+			
+			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+			
+			// Windows
+			for(IWorkbenchWindow window : windows) {
+				IWorkbenchPage[] pages = window.getPages();
+				// Pages
+				for(IWorkbenchPage page : pages) {
+					IEditorReference[] references = page.getEditorReferences();
+					// Editors
+					for(IEditorReference reference : references) {
+						// Editor needs to be restored, otherwise it can null.
+						IEditorPart part = reference.getEditor(true);
+						// All files are opened in FileStoreEditors, because they are external files.
+						if(part != null && part.getEditorInput() instanceof FileStoreEditorInput) {
+							FileStoreEditorInput input = (FileStoreEditorInput)part.getEditorInput();
+							if(input.getURI().compareTo(file.toURI()) == 0) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/IConnectionStatusProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+/**
+ * This interfaces provides connection status of current HTI Connection.
+ */
+public interface IConnectionStatusProvider {
+	
+	/**
+	 * Gets if HTI Connection is connected to the device.
+	 * @return Is HTI Connection connected to the device.
+	 */
+	public boolean isConnected();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/IFtpObject.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Interface for data items.
+ */
+public interface IFtpObject{
+	
+	/**
+	 * Returns name of the object.
+	 * @return Name of the object.
+	 */
+	public String getName();
+	/**
+	 * Returns image for the object.
+	 * @return image for the object.
+	 */
+	public Image getImage();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/PathComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite;
+
+/**
+ * Composite for displaying and editing current file path.
+ */
+public class PathComposite extends AbstractUiFractionComposite
+			implements KeyListener, SelectionListener {
+
+	/**
+	 * Editable text field containing path.
+	 */
+	private Text pathText;
+
+	/**
+	 * Button for going to current path.
+	 */
+	private Button goPathButton;
+
+	/**
+	 * Owner of this component.
+	 */
+	private final FtpView ftpView;
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite Parent composite for the created composite.
+	 * @param ftpView Owner of this composite.
+	 */
+	public PathComposite(Composite parentComposite, FtpView ftpView) {
+		super(parentComposite, SWT.NONE);
+		this.ftpView = ftpView;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		// Path label.
+		Label pathLabel = new Label(this, SWT.HORIZONTAL);		
+		pathLabel.setText(Messages.getString("PathComposite.directoryPath_LabelText")); //$NON-NLS-1$
+		
+		// Text field containing path.
+		final int textFieldStyleBits = SWT.LEFT | SWT.SINGLE | SWT.BACKGROUND | SWT.BORDER;
+		pathText = new Text(this, textFieldStyleBits);
+		pathText.setEditable(true);
+		pathText.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));
+		
+		// Go button.
+		goPathButton = new Button(this, SWT.NONE);
+		goPathButton.setImage(ImageResourceManager.getImage(ImageKeys.IMG_GO_TO_DIRECTORY));
+		goPathButton.setToolTipText(Messages.getString("PathComposite.goButton_TooltipText")); //$NON-NLS-1$
+		
+		// Adding listeners.
+		pathText.addKeyListener(this);
+		goPathButton.addSelectionListener(this);
+		
+		goPathButton.setEnabled(false);
+		pathText.setEnabled(false);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+		gridLayout.makeColumnsEqualWidth = false;
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		return gridLayout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		return new GridData(GridData.FILL_HORIZONTAL);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		pathText.removeKeyListener(this);
+		goPathButton.removeSelectionListener(this);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Composite#setFocus()
+	 */
+	@Override
+	public boolean setFocus() {
+		return pathText.setFocus();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyPressed(KeyEvent e) {
+		if(e.keyCode == SWT.CR) {
+			// Updating directory listing when Return is pressed.
+			e.doit = false;
+			ftpView.updatePathThenRefresh(pathText.getText());
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent e) {
+		// Not implemented.
+	}
+
+	/**
+	 * Changes text in text field to path.
+	 * @param path New path.
+	 */
+	public void setPath(String path) {
+		pathText.setText(path);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		if(e.widget == goPathButton) {
+			ftpView.updatePathThenRefresh(pathText.getText());
+		}
+	}
+
+	/**
+	 * Changes controls to enabled/disabled based on connection status.
+	 * @param connected True if connection is up, false if connection is down.
+	 */
+	public void setConnected(boolean connected) {
+		goPathButton.setEnabled(connected);
+		pathText.setEnabled(connected);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerComparator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,219 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+
+/**
+ * Comparator that is used to sort rows in File Transfer view.
+ */
+public class TableViewerComparator extends ViewerComparator {
+
+	/**
+	 * Columns used in File Transfer view.
+	 */
+	public enum Columns {
+		NAME,
+		SIZE,
+		FREE
+	}
+
+	/**
+	 * Column that is used to sort data.
+	 */
+	private Columns sortColumn;
+	/**
+	 * Direction to which rows are sorted. Value should be either SWT.UP or SWT.DOWN.
+	 */
+	private final int sortDirection;
+
+	// Results result.
+	private final int COMPARE_FIRST_BIGGER = 1;
+	private final int COMPARE_FIRST_SMALLER = -1;
+	private final int COMPARE_EQUALS = 0;
+	
+	
+	/**
+	 * Constructor.
+	 * @param sortColumn Column that is used to sort data.
+	 * @param sortDirection Direction to which rows are sorted. Value should be SWT.UP or SWT.DOWN.
+	 */
+	public TableViewerComparator(Columns sortColumn, int sortDirection) {
+		this.sortColumn = sortColumn;
+		this.sortDirection = sortDirection;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	@Override
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		switch (sortColumn) {
+		case NAME:
+			return compareNames(e1, e2);
+		case SIZE:
+			return compareSizes(e1, e2);
+		case FREE:
+			return compareFreeSpace(e1, e2);
+		default:
+			return COMPARE_EQUALS;
+		}
+	}
+
+	/**
+	 * Compares objects in free space column.
+	 * @param e1 First element to be compared.
+	 * @param e2 Second element to be compared.
+	 * @return Negative number if first object should be before second object. Positive number if
+	 * first object should be after second object. Zero if order doesn't matter.
+	 */
+	private int compareFreeSpace(Object e1, Object e2) {
+		// Checking for uplink object.
+		if(e1 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_SMALLER;
+		}
+		if(e2 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_BIGGER;
+		}
+		
+		// Comparing free space for drives.
+		if(e1 instanceof FtpDriveObject && e2 instanceof FtpDriveObject) {
+			DriveInfo driveInfo1 = ((FtpDriveObject)e1).getDriveInfo();
+			DriveInfo driveInfo2 = ((FtpDriveObject)e2).getDriveInfo();
+			if(driveInfo1 != null && driveInfo2 != null) {
+				long size1 = driveInfo1.getFreeSpace();
+				long size2 = driveInfo2.getFreeSpace();
+				
+				return compareValues(size1, size2);
+			}
+		}
+		
+		return COMPARE_EQUALS;
+	}
+
+	/**
+	 * Compares objects in size column.
+	 * @param e1 First element to be compared.
+	 * @param e2 Second element to be compared.
+	 * @return Negative number if first object should be before second object. Positive number if
+	 * first object should be after second object. Zero if order doesn't matter.
+	 */
+	private int compareSizes(Object e1, Object e2) {
+		// Checking for uplink object.
+		if(e1 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_SMALLER;
+		}
+		if(e2 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_BIGGER;
+		}
+		
+		// Comparing size of drives.
+		if(e1 instanceof FtpDriveObject && e2 instanceof FtpDriveObject) {
+			DriveInfo driveInfo1 = ((FtpDriveObject)e1).getDriveInfo();
+			DriveInfo driveInfo2 = ((FtpDriveObject)e2).getDriveInfo();
+			if(driveInfo1 != null && driveInfo2 != null) {
+				long size1 = driveInfo1.getSize();
+				long size2 = driveInfo2.getSize();
+				
+				return compareValues(size1, size2);
+			}
+		}
+		
+		// Comparing size of files.
+		if(e1 instanceof FtpFileObject && e2 instanceof FtpFileObject) {
+			long size1 = ((FtpFileObject)e1).getSize();
+			long size2 = ((FtpFileObject)e2).getSize();
+			
+			return compareValues(size1, size2);
+		}
+		
+		// Checking if objects are file and folder.
+		if(e1 instanceof FtpFolderObject && e2 instanceof FtpFileObject) {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_SMALLER : COMPARE_FIRST_BIGGER;
+		}
+		if(e1 instanceof FtpFileObject && e2 instanceof FtpFolderObject) {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_BIGGER : COMPARE_FIRST_SMALLER;
+		}
+		
+		// Checking for folders.
+		if(e1 instanceof FtpFolderObject && e2 instanceof FtpFolderObject) {
+			return compareNames(e1, e2);
+		}
+		
+		return COMPARE_EQUALS;
+	}
+
+	/**
+	 * Compares two long numbers.
+	 * @param e1 First number to be compared.
+	 * @param e2 Second number to be compared.
+	 * @return Negative number if first number should be before second number. Positive number if
+	 * first number should be after second number. Zero if order doesn't matter.
+	 */
+	private int compareValues(long size1, long size2) {
+		if(size1 == size2) {
+			return COMPARE_EQUALS;
+		}
+		
+		if(size1 > size2) {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_BIGGER : COMPARE_FIRST_SMALLER;
+		} else {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_SMALLER : COMPARE_FIRST_BIGGER;
+		}
+	}
+
+	/**
+	 * Compares objects in name column.
+	 * @param e1 First element to be compared.
+	 * @param e2 Second element to be compared.
+	 * @return Negative number if first object should be before second object. Positive number if
+	 * first object should be after second object. Zero if order doesn't matter.
+	 */
+	private int compareNames(Object e1, Object e2) {
+		// Checking for uplink object.
+		if(e1 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_SMALLER;
+		}
+		if(e2 instanceof FtpUplinkObject) {
+			return COMPARE_FIRST_BIGGER;
+		}
+		
+		// Checking if objects are file and folder.
+		if(e1 instanceof FtpFolderObject && e2 instanceof FtpFileObject) {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_SMALLER : COMPARE_FIRST_BIGGER;
+		}
+		if(e1 instanceof FtpFileObject && e2 instanceof FtpFolderObject) {
+			return (sortDirection == SWT.UP) ? COMPARE_FIRST_BIGGER : COMPARE_FIRST_SMALLER;
+		}
+		
+		// Comparing names.
+		if(e1 instanceof FtpNamedObject && e2 instanceof FtpNamedObject) {
+			String name1 = ((FtpNamedObject)e1).getName();
+			String name2 = ((FtpNamedObject)e2).getName();
+			return (sortDirection == SWT.UP) ? name1.compareToIgnoreCase(name2)
+											: name2.compareToIgnoreCase(name1);
+		}
+		
+		return COMPARE_EQUALS;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerDoubleClickListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import java.io.File;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+
+/**
+ * Handles double click events in ftp table viewer.
+ */
+public class TableViewerDoubleClickListener implements IDoubleClickListener {
+
+	/**
+	 * Content provider
+	 */
+	private final ViewContentProvider contentProvider;
+	
+	/**
+	 * Table viewer
+	 */
+	private final TableViewer viewer;
+	
+	/**
+	 * FTP view composite
+	 */
+	private final FtpView ftpView;
+	
+	/**
+	 * Constructor.
+	 * @param viewer TableViever
+	 * @param contentProvider Content provider for viewer.
+	 * @param ftpView Owner of viewer and contentProvider.
+	 */
+	public TableViewerDoubleClickListener(TableViewer viewer,
+			ViewContentProvider contentProvider, FtpView ftpView) {
+				this.viewer = viewer;
+				this.contentProvider = contentProvider;
+				this.ftpView = ftpView;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+	 */
+	public void doubleClick(DoubleClickEvent event) {
+		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+		Object selectedObject = selection.getFirstElement();
+		
+		// Nothing selected.
+		if(selectedObject == null){
+			return;
+		}
+		
+		IFtpObject ftpObject = (IFtpObject) selectedObject;
+
+		// Handling if object is a folder or a drive.
+		if(FtpFolderObject.class.isInstance(selectedObject) || FtpDriveObject.class.isInstance(selectedObject)){
+			String currentDirectory = contentProvider.getDirectoryPath();
+			String targetDirectory;
+			if(currentDirectory == null){
+				// If current directory doesn't exist, then using plain name.
+				targetDirectory = ftpObject.getName();
+			}
+			else if(currentDirectory.substring(currentDirectory.length() - 1).equals(File.separator)){
+				// Current directory contains already separator at the end and second separator causes problems.
+				targetDirectory = currentDirectory.concat(ftpObject.getName());
+			}
+			else{
+				// Adding directory name with file separator.
+				targetDirectory = currentDirectory + File.separator + ftpObject.getName();
+			}
+			ftpView.updatePathThenRefresh(targetDirectory);
+		}
+		
+		// Handling if object is file. Files are opened when double clicked.
+		if(FtpFileObject.class.isInstance(selectedObject)) {
+			FtpUtils.downloadFileAndOpen(viewer, contentProvider);
+		}
+		
+		// Handling if object is a uplink.
+		if(FtpUplinkObject.class.isInstance(selectedObject)){
+			String currentDirectory = contentProvider.getDirectoryPath();
+			File currentDir = new File(currentDirectory);
+			String targetDirectory = currentDir.getParent();
+			ftpView.updatePathThenRefresh(targetDirectory);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/TableViewerSelectionChangedListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * Handles selection events in ftp table viewer.
+ */
+public class TableViewerSelectionChangedListener implements
+		ISelectionChangedListener {
+	
+	/**
+	 * FtpView instance
+	 */
+	private FtpView view;
+	
+	/**
+	 * Constructor
+	 * @param view FtpView
+	 */
+	public TableViewerSelectionChangedListener(FtpView view) {
+		this.view = view;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent arg0) {
+		// Update toolbar and menu
+		view.selectionChanged();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/ViewContentProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,442 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+import com.nokia.s60tools.hticonnection.services.FileInfo;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.HTIVersion;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Handles elements elements in tableviewer.
+ */
+public class ViewContentProvider implements IStructuredContentProvider {
+	
+	/**
+	 * Stores currently shown folder. Null if showing root.
+	 */
+	private String directoryPath = null;
+	
+	/**
+	 * File separator which is used in Symbian.
+	 */
+	private String symbianFileSeparator = "\\"; //$NON-NLS-1$
+	
+	/**
+	 * String that is used at the beginning of path to mean upper level.
+	 */
+	private final String UPLEVEL = "..\\"; //$NON-NLS-1$
+	
+	/**
+	 * Stores list of directories and files in current directory.
+	 */
+	private Object[] currentDirListing;
+	
+	/**
+	 * Timeout for FTP service requests
+	 */
+	private static int timeoutTime = 2000;
+	
+	/**
+	 * Connection status provider.
+	 */
+	private final IConnectionStatusProvider connectionStatusProvider;
+
+	/**
+	 * Contains files that are copied or cutted and are waiting for paste operation.
+	 */
+	private List<IFtpObject> selectedFiles;
+	/**
+	 * Path where selected files are located.
+	 */
+	private String selectedPath;
+	
+	/**
+	 * Possible operations that can be done for selected files.
+	 */
+	public enum OPERATION {
+		NONE,
+		COPY,
+		CUT
+	};
+
+	/**
+	 * Operation which is going to be done for selected files.
+	 */
+	private OPERATION fileOperation;
+	
+	/**
+	 * Constructor.
+	 * @param connectionStatusProvider Connection status provider.
+	 */
+	public ViewContentProvider(IConnectionStatusProvider connectionStatusProvider) {
+		this.connectionStatusProvider = connectionStatusProvider;
+		currentDirListing = getDefaultRoot();
+		fileOperation = OPERATION.NONE;
+	}
+	
+	/**
+	 * Gets current path.
+	 * @return the directoryPath
+	 */
+	public synchronized String getDirectoryPath() {
+		return directoryPath;
+	}
+
+	/**
+	 * Sets current path.
+	 * @param directoryPath the directoryPath to set
+	 */
+	public synchronized void setDirectoryPath(String directoryPath) {
+		this.directoryPath = directoryPath;
+	}
+
+	/**
+	 * Updates directory list with given directoryPath.
+	 * @param newPath Path of directory which contents are updated.
+	 * @return Path that is set after update.
+	 */
+	public String updatePath(String newPath) {
+		// Getting directories and files.
+		
+		if(newPath == null || newPath.trim().equals("")){ //$NON-NLS-1$
+			// Using default root only if directory path is null or empty string.
+			currentDirListing = getRoot();
+			setDirectoryPath(null);
+			return null;
+		} else {
+			final String convertedPath = convertPath(newPath, getDirectoryPath());
+			if(convertedPath == null) {
+				// Failed to convert path. Showing message from UI thread.
+				String message = Messages.getString("ViewContentProvider.ViewContentProvider.InvalidPath_ErrMsg1")  //$NON-NLS-1$
+						+ newPath + Messages.getString("ViewContentProvider.ViewContentProvider.InvalidPath_ErrMsg2"); //$NON-NLS-1$
+				MessageBoxRunnable runnable = new MessageBoxRunnable(message);
+				// Creating message box from UI thread.
+				Display.getDefault().syncExec(runnable);
+				
+				return getDirectoryPath();
+			}
+			
+			IFTPService ftpService = HTIServiceFactory.createFTPService(RemoteControlConsole.getInstance());
+			List<IFtpObject> ftpObjects = new ArrayList<IFtpObject>(); 
+			try {
+				// Adding link to upper folder.
+				ftpObjects.add(new FtpUplinkObject());
+				
+				// Getting directories.
+				String[] dirs = ftpService.listDirs(convertedPath, timeoutTime);
+				for(String dir : dirs){
+					ftpObjects.add(new FtpFolderObject(dir));
+				}
+
+				// Getting files.
+				
+				FileInfo[] files = ftpService.listFilesAndDetails(convertedPath, 3000);
+				for(FileInfo file : files){
+					ftpObjects.add(new FtpFileObject(file.getName(), file.getSize()));
+				}
+
+				// Listing succeeded. Updating settings.
+				Object[] objects = ftpObjects.toArray();
+				currentDirListing = objects;
+				setDirectoryPath(convertedPath);
+				return convertedPath;
+			} catch (ServiceShutdownException e){
+				// Service is not online. No errors in transfer.
+			} catch (Exception e) {
+				// Failed to download contents. Showing message from UI thread.
+				Runnable updateFailed = new Runnable() {
+					public void run() {
+						RemoteControlMessageBox message = new RemoteControlMessageBox(
+								Messages.getString("ViewContentProvider.Failed_List_Content_ConsoleMsg") //$NON-NLS-1$
+								+ convertedPath + "'.", SWT.ICON_ERROR); //$NON-NLS-1$
+						message.open();
+					}
+				};
+				// Creating message box from UI thread.
+				Display.getDefault().syncExec(updateFailed);
+				
+				e.printStackTrace();
+			}
+		}
+		// Setting path failed. Returning current path.
+		return getDirectoryPath();
+	}
+
+	/**
+	 * Converts path to be used in device.
+	 * This method also checks if there is one or multiple '..\' in
+	 * the beginning of path and merges path with current path. Shows
+	 * error message if merge fails and returns null.
+	 * @param newPath to be converted.
+	 * @param oldPath Old path that might be needed during conversion. Can be null.
+	 * @return Converted path or null if path couldn't be converted.
+	 */
+	public String convertPath(final String newPath, final String oldPath) {
+
+		String newConvertedPath = newPath.replace("/", symbianFileSeparator); //$NON-NLS-1$
+		int dirCount = 0;
+
+		// Checking how many ..\ there are in new path and modifies path.
+		while(newConvertedPath.startsWith(UPLEVEL)) {
+			newConvertedPath = newConvertedPath.substring(3, newConvertedPath.length());
+			dirCount++;
+		}
+
+		// Paths need to be merged, because there was ..\ in input path.
+		if(dirCount > 0) {
+			if(oldPath == null) {
+				// Cannot get upper directory from root.
+				return null;
+			}
+
+			String oldConvertedPath = oldPath;
+			
+			if(oldPath.endsWith(symbianFileSeparator)) {
+				oldConvertedPath = oldPath.substring(0, oldPath.length() - 1);
+			}
+
+			// Converts current path matching the amount of found ..\ in input path.
+			for(int i = 0;i < dirCount;i++) {
+				if(oldConvertedPath.lastIndexOf(symbianFileSeparator) >= 0) {
+					oldConvertedPath = oldConvertedPath.substring(0, oldConvertedPath.lastIndexOf(symbianFileSeparator));
+				} else {
+					// More up directories than in old path.
+					return null;
+				}
+			}
+			
+			return oldConvertedPath + symbianFileSeparator + newConvertedPath;
+		}
+
+		return newConvertedPath;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	//	Not needed
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/**
+	 * Returns input object.
+	 * @return Input object.
+	 */
+	public Object getInput(){
+		return new Object();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		return currentDirListing;
+	}
+	
+	/**
+	 * Returns list of drives that are used in root.
+	 * @return List of drives that are used in root.
+	 */
+	public Object[] getRoot() {
+		
+		// Getting root from the device if possible.
+		if(RCPreferences.getGetDriveList()
+				&& connectionStatusProvider.isConnected()
+				&& supportsDriveListing()) {
+			Object[] root = getRootFromDevice();
+			if(root != null) {
+				return root;
+			}
+		}
+		
+		// Couldn't get root from the device. Returning default root.
+		return getDefaultRoot();
+	}
+	
+	/**
+	 * Checks if drive listing is supported in current HTI agent.
+	 * @return True if drive listing is supported. False otherwise.
+	 */
+	private boolean supportsDriveListing() {
+		// Drive listing is supported in 1.88-> and 2.1->
+		if(isSupportedVersion(new HTIVersion(1, 88)) ||
+				isSupportedVersion(new HTIVersion(2, 1))) {
+			return true;
+		}
+		
+		return false;
+	}
+	
+	/**
+	 * Checks if copy, move, and rename operations are supported in current HTI agent.
+	 * @return True if drive listing is supported. False otherwise.
+	 */
+	public boolean supportsCopyMoveRename() {
+		// Copy, move, and rename are supported in 1.91-> and 2.5-> versions.
+		if(isSupportedVersion(new HTIVersion(1, 91)) ||
+				isSupportedVersion(new HTIVersion(2, 5))) {
+			return true;
+		}
+		
+		return false;
+	}
+	
+	/**
+	 * Checks if current version is same or newer than given version.
+	 * @return True if current version is newer or same as given version. False otherwise.
+	 */
+	private boolean isSupportedVersion(HTIVersion comparedVersion) {
+		HTIVersion currentVersion = HTIServiceFactory.getCurrentHTIVersion();
+		
+		if(currentVersion != null &&
+				currentVersion.getMajor() == comparedVersion.getMajor() &&
+				currentVersion.getMinor() >= comparedVersion.getMinor()) {
+			
+			return true;
+		}
+		
+		return false;
+	}
+
+	/**
+	 * Returns list of drives that are used in root.
+	 * @return List of directories that are used in root. Or null if couldn't get list
+	 * from the device.
+	 */
+	private Object[] getRootFromDevice() {
+		try {
+			// Creating needed variables.
+			IFTPService ftpService = HTIServiceFactory.createFTPService(RemoteControlConsole.getInstance());
+			List<IFtpObject> ftpObjects = new ArrayList<IFtpObject>();
+			
+			// Getting drive list from the device.
+			DriveInfo[] drives = ftpService.listDrives(timeoutTime);
+			for(DriveInfo info : drives) {
+				ftpObjects.add(new FtpDriveObject(info.getRootPath(), info, connectionStatusProvider));
+			}
+			
+			return ftpObjects.toArray();
+		} catch (Exception e) {
+			// No need to report. Default drives are shown instead.
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Returns list of drives that are used in root.
+	 * @return List of drives that are used in root.
+	 */
+	private Object[] getDefaultRoot() {
+		// Getting drives from preferences.
+		String[] drives = RCPreferences.getShownDrives();
+		IFtpObject[] objects = new IFtpObject[drives.length];
+		
+		// Creating drive objects.
+		for(int i = 0;i < drives.length;i++) {
+			objects[i] = new FtpDriveObject(drives[i], null, connectionStatusProvider);
+		}
+		
+		return objects;
+	}
+	
+	/**
+	 * Sets files that are waiting for paste operation.
+	 * @param selectedFiles Files that are waiting for paste.
+	 * @param selectedPath Path where files are located.
+	 * @param fileOperation Copy or cut operation.
+	 */
+	public void setClipboardFiles(List<IFtpObject> selectedFiles, String selectedPath, OPERATION fileOperation) {
+		this.selectedFiles = selectedFiles;
+		this.selectedPath = selectedPath;
+		this.fileOperation = fileOperation;
+	}
+
+	/**
+	 * Returns list of files which are waiting for paste.
+	 * @return selectedFiles List of files which are waiting for paste.
+	 */
+	public List<IFtpObject> getSelectedFiles() {
+		return selectedFiles;
+	}
+
+	/**
+	 * Returns current operation for selected files.
+	 * @return Current operation for selected files.
+	 */
+	public OPERATION getFileOperation() {
+		return fileOperation;
+	}
+
+	/**
+	 * Returns path where files were selected.
+	 * @return Path where files were selected.
+	 */
+	public String getSelectedPath() {
+		return selectedPath;
+	}
+
+	/**
+	 * Runnable that can be used to show message to user.
+	 */
+	private class MessageBoxRunnable implements Runnable {
+
+		/**
+		 * Message to be shown to user.
+		 */
+		private final String message;
+
+		/**
+		 * Constructor.
+		 * @param message to be shown to user in message box.
+		 */
+		public MessageBoxRunnable(final String message) {
+			this.message = message;
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			RemoteControlMessageBox msgBox = new RemoteControlMessageBox(
+					message, SWT.ICON_ERROR);
+			msgBox.open();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ftp/ui/view/ViewLabelProvider.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,207 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ftp.ui.view;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+
+import com.nokia.s60tools.hticonnection.services.DriveInfo;
+
+/**
+ * Provides data to elements in tableviewer.
+ */
+class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
+	
+	/**
+	 * Table for which labels are provided.
+	 */
+	private final Table table;
+	
+	/**
+	 * Length of the free space image, that is created dynamically.
+	 */
+	private static final int IMAGE_LENGTH = 16;
+	/**
+	 * Height of the free space image, that is created dynamically.
+	 */
+	private static final int IMAGE_HEIGHT = 16;
+	
+	/**
+	 * Images that are used to show currently available space.
+	 * Free space images are created when label provider is created and disposed at the end.
+	 * This is done to guarantee correct image disposal.
+	 */
+	private Image[] freeSpaceImages;
+	
+	/**
+	 * Constructor.
+	 * @param table Labels are provided for this table.
+	 */
+	public ViewLabelProvider(Table table) {
+		this.table = table;
+		createImages();
+	}
+
+	/**
+	 * Creates images that are used to show currently available space on drive.
+	 */
+	private void createImages() {
+		// Creating images.
+		freeSpaceImages = new Image[IMAGE_LENGTH + 1];
+		
+		for(int i = 0;i < IMAGE_LENGTH + 1;i++) {
+					
+			// Creating image.
+			Image freeImage = new Image(Display.getDefault(), IMAGE_LENGTH, IMAGE_HEIGHT);
+			GC gc = new GC(freeImage);
+			
+			// Drawing image.
+			gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
+			gc.fillRectangle(0, 0, i, IMAGE_HEIGHT);
+			gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+			gc.fillRectangle(i, 0, IMAGE_LENGTH - i, IMAGE_HEIGHT);
+			
+			gc.dispose();
+			
+			freeSpaceImages[i] = freeImage;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+	 */
+	public void dispose() {
+		for(Image image : freeSpaceImages) {
+			image.dispose();
+		}
+		super.dispose();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object obj, int index) {
+		if(index >= table.getColumnCount()) {
+			// No such column.
+			return null;
+		}
+		
+		String columnText = table.getColumn(index).getText();
+		
+		if(columnText.equals(FtpView.NAME_COLUMN_NAME)) {
+			// Name
+			IFtpObject ftpObj = (IFtpObject) obj;
+			return ftpObj.getName();
+		}
+		else if(columnText.equals(FtpView.SIZE_COLUMN_NAME) && obj instanceof FtpDriveObject) {
+			// Size for drive
+			FtpDriveObject ftpObj = (FtpDriveObject) obj;
+			if(ftpObj.getDriveInfo() != null) {
+				return convertSize(ftpObj.getDriveInfo().getSize());
+			}
+		}
+		else if(columnText.equals(FtpView.FREE_SPACE_COLUMN_NAME) && obj instanceof FtpDriveObject) {
+			// Free space for drive
+			FtpDriveObject ftpObj = (FtpDriveObject) obj;
+			if(ftpObj.getDriveInfo() != null) {
+				return convertSize(ftpObj.getDriveInfo().getFreeSpace());
+			}
+		}
+		else if(columnText.equals(FtpView.SIZE_COLUMN_NAME) && obj instanceof FtpFileObject) {
+			// Size for file
+			FtpFileObject ftpObj = (FtpFileObject) obj;
+			return convertSize(ftpObj.getSize());
+		}
+		
+		// No text for other fields.
+		return null;
+	}
+	
+	/**
+	 * Converts size to proper value and returns it as a string.
+	 * @param size Size to be converted.
+	 * @return Converted size as a string.
+	 */
+	private String convertSize(long size) {
+		if(size >= 1024) {
+			// Converting to kilobytes.
+			return "" + (size / 1024) + " kB"; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		
+		// Returning as bytes.
+		return "" + size + " B"; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object obj, int index) {
+		
+		if(index >= table.getColumnCount()) {
+			// No such column.
+			return null;
+		}
+		
+		String columnText = table.getColumn(index).getText();
+		
+		if(columnText.equals(FtpView.NAME_COLUMN_NAME)) {
+			// Only first column objects have images.
+			IFtpObject ftpObj = (IFtpObject) obj;
+			return ftpObj.getImage();
+		}
+		else if(columnText.equals(FtpView.FREE_SPACE_COLUMN_NAME) && obj instanceof FtpDriveObject) {
+			// Getting free space for drive, if information image is available. Can also return null.
+			FtpDriveObject ftpObj = (FtpDriveObject) obj;
+			return getFreeSpaceImage(ftpObj.getDriveInfo());
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Returns image based on the free and used space in the drive.
+	 * @param driveInfo Drive information.
+	 * @return Image based on the free and used space in the drive. Or null if
+	 * there is no size/free space information.
+	 */
+	private Image getFreeSpaceImage(DriveInfo driveInfo) {
+		// Returning null if there is no drive information.
+		if(driveInfo == null) {
+			return null;
+		}
+		
+		// Getting needed variables.
+		long freeSpace = driveInfo.getFreeSpace();
+		long size = driveInfo.getSize();
+		double free = 0;
+		if(size != 0) {
+			free = (double)freeSpace/size;
+		}
+		
+		// Calculating which image should be used.
+		
+		int freeSpaceSize = (int)Math.round(IMAGE_LENGTH * free);
+		
+		return freeSpaceImages[freeSpaceSize];
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/DeleteDirJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for deleting directory
+ */
+public class DeleteDirJob extends Job implements IManageableJob {
+	
+	/**
+	 * Remote directory
+	 */
+	private String remoteDir;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; //Infinite
+
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteDir Directory to be deleted
+	 */
+	public DeleteDirJob(String name, String remoteDir) {
+		super(name);
+		this.remoteDir = remoteDir;
+		setUser(true);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("DeleteDirJob.Delete_Dir_Task_Name"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			service.deleteDir(remoteDir, timeout);
+		} catch (Exception e) {
+			RemoteControlConsole.getInstance().println(
+					Messages.getString("DeleteDirJob.DeleteDir_Failed_ConsoleErrorMsg"), //$NON-NLS-1$
+					RemoteControlConsole.MSG_ERROR); 
+			e.printStackTrace();
+			return new Status(Status.ERROR, RemoteControlActivator
+					.getPluginID(), Messages
+					.getString("DeleteDirJob.DeleteDir_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} finally {
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		// Short operation. No need to cancel specifically.
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/DeleteFileJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for deleting file
+ */
+public class DeleteFileJob extends Job implements IManageableJob {
+	
+	/**
+	 * Remote file
+	 */
+	private String remoteFile;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; //Infinite
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteFile File to be deleted
+	 */
+	public DeleteFileJob(String name, String remoteFile) {
+		super(name);
+		this.remoteFile = remoteFile;
+		setUser(true);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("DeleteFileJob.Delete_File_Task_Name"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			service.deleteFile(remoteFile, timeout);
+		} catch (Exception e) {
+			RemoteControlConsole.getInstance().println(
+					Messages.getString("DeleteFileJob.DeleteFile_Failed_ConsoleErrorMsg"), //$NON-NLS-1$
+					RemoteControlConsole.MSG_ERROR); 
+			e.printStackTrace();
+			return new Status(Status.ERROR, RemoteControlActivator
+					.getPluginID(), Messages
+					.getString("DeleteFileJob.DeleteFile_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} finally {
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		// Short operation. No need to cancel specifically.
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/FileDownloadJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+import com.nokia.s60tools.hticonnection.services.IFTPRequestManager;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for downloading files
+ */
+public class FileDownloadJob extends Job implements IManageableJob, IFTPListener {
+	
+	/**
+	 * Remote file
+	 */
+	private String remoteFile;
+	
+	/**
+	 * Destinaton directory
+	 */
+	private String destinationDir;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; // Infinite
+	
+	/**
+	 * Output stream for file
+	 */
+	private FileOutputStream out;
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+	
+	/**
+	 * FTP request manager
+	 */
+	private IFTPRequestManager FTPRequestManager;
+	
+	/**
+	 * Thread for checking status
+	 */
+	private StatusCheckerThread statusChecker = null;
+
+	/**
+	 * Boolean if file should be opened after download is complete.
+	 */
+	private final boolean openFile;
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteFile Remote file path
+	 * @param destinationDir Destination dir
+	 */
+	public FileDownloadJob(String name, String remoteFile, String destinationDir ) {
+		super(name);
+		this.remoteFile = remoteFile;
+		this.destinationDir = destinationDir;
+		this.openFile = false;
+		setUser(true);
+	}
+	
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteFile Remote file path
+	 * @param destinationDir Destination dir
+	 * @param openFile Boolean if file should be opened after download is complete.
+	 */
+	public FileDownloadJob(String name, String remoteFile, String destinationDir, boolean openFile) {
+		super(name);
+		this.remoteFile = remoteFile;
+		this.destinationDir = destinationDir;
+		this.openFile = openFile;
+		setUser(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("FileDownloadJob.Download_File_TaskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			monitor.subTask(Messages.getString("FileDownloadJob.Download_File_SubTaskName")); //$NON-NLS-1$
+			
+			// Starting thread that checks status of the monitor regularly.
+			statusChecker = new StatusCheckerThread(monitor, this);
+			statusChecker.start();
+
+			// Starting long running download file operation.
+			byte[] bytes = service.downloadFile(remoteFile, this, timeout);
+			
+			statusChecker.stopThread();
+			
+			// Check is canceled
+			if (monitor.isCanceled()) {
+				return Status.CANCEL_STATUS;
+			}
+
+			if (bytes.length > 0) {
+				monitor.subTask(Messages.getString("FileDownloadJob.Write_File_To_Disk_SubTaskName")); //$NON-NLS-1$
+				// Write file to disk
+				File file = new File(destinationDir);
+				out = new FileOutputStream(file);
+				out.write(bytes);
+				out.close();
+			}
+			
+			if(openFile) {
+				FtpUtils.openFile(destinationDir);
+			}
+		} catch (HTIException e) {
+			if(e.isHtiRequestCanceled()) {
+				// Uploading was canceled. No need to inform about it.
+				return Status.CANCEL_STATUS;
+			}
+			RemoteControlConsole.getInstance().println(
+						Messages.getString("FileDownloadJob.Download_Failed_ConsoleErrorMsg"), RemoteControlConsole.MSG_ERROR); //$NON-NLS-1$
+				e.printStackTrace();
+				return new Status(
+						Status.ERROR,
+						RemoteControlActivator.getPluginID(),
+						Messages.getString("FileDownloadJob.Download_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} catch (Exception e) {
+			RemoteControlConsole.getInstance().println(
+					Messages.getString("FileDownloadJob.Download_Failed_ConsoleErrorMsg"), RemoteControlConsole.MSG_ERROR); //$NON-NLS-1$
+			e.printStackTrace();
+			return new Status(Status.ERROR, RemoteControlActivator
+					.getPluginID(), Messages.getString("FileDownloadJob.Download_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} finally {
+			if(statusChecker != null) {
+				statusChecker.stopThread();
+			}
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		try {
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestEnded(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestEnded(IFTPRequestManager manager) {
+		monitor.subTask(Messages.getString("FileDownloadJob.DownloadEnded_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestInQueue(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestInQueue(IFTPRequestManager manager) {
+		FTPRequestManager = manager;
+		monitor.subTask(Messages.getString("FileDownloadJob.DownloadInQueue_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestStarted(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestStarted(IFTPRequestManager manager) {
+		monitor.subTask(Messages.getString("FileDownloadJob.DownloadStarted_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		if(FTPRequestManager != null) {
+			// Sending cancel request.
+			FTPRequestManager.cancel();
+			monitor.subTask(Messages.getString("FileDownloadJob.CancelingDownload_SubTaskName")); //$NON-NLS-1$
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/FileUploadJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import java.io.File;
+import java.io.FileInputStream;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.exceptions.HTIException;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPListener;
+import com.nokia.s60tools.hticonnection.services.IFTPRequestManager;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for uploading files
+ */
+public class FileUploadJob extends Job implements IManageableJob, IFTPListener {
+	
+	/**
+	 * Source file
+	 */
+	private String srcFile;
+	
+	/**
+	 * Destination file
+	 */
+	private String destFile;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; // Infinite
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+	
+	/**
+	 * FTP request manager
+	 */
+	private IFTPRequestManager FTPRequestManager = null;
+	
+	/**
+	 * Thread for checking status
+	 */
+	private StatusCheckerThread statusChecker = null;
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param srcFile Source file path
+	 * @param destFile Destination file path
+	 */
+	public FileUploadJob(String name, String srcFile, String destFile ) {
+		super(name);
+		this.srcFile = srcFile;
+		this.destFile = destFile;
+		setUser(true);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("FileUploadJob.Upload_File_TaskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			monitor.subTask(Messages.getString("FileUploadJob.Read_File_From_Disk_SubTaskName")); //$NON-NLS-1$
+
+			// Loading data from file.
+			File file = new File(srcFile);
+			FileInputStream inputStream = new FileInputStream(file);
+			byte[] contents = new byte[(int)file.length()];
+			inputStream.read(contents);
+			inputStream.close();
+
+			// Check is canceled
+			if (monitor.isCanceled()) {
+				return Status.CANCEL_STATUS;
+			}
+
+			// Starting thread that checks status of the monitor regularly.
+			statusChecker = new StatusCheckerThread(monitor, this);
+			statusChecker.start();
+			
+			// Sending long running upload request.
+			monitor.subTask(Messages.getString("FileUploadJob.Upload_File_SubTaskName")); //$NON-NLS-1$
+			service.uploadFile(contents, destFile, this, timeout);
+		} catch (HTIException e) {
+			if(e.isHtiRequestCanceled()) {
+				// Uploading was canceled. No need to inform about it.
+				return Status.CANCEL_STATUS;
+			}
+			
+			RemoteControlConsole.getInstance().println(
+						Messages.getString("FileUploadJob.Upload_Failed_ConsoleErrorMsg"), RemoteControlConsole.MSG_ERROR); //$NON-NLS-1$
+				e.printStackTrace();
+				return new Status(
+						Status.ERROR,
+						RemoteControlActivator.getPluginID(),
+						Messages.getString("FileUploadJob.Upload_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} catch (Exception e) {
+			RemoteControlConsole.getInstance().println(
+					Messages.getString("FileUploadJob.Upload_Failed_ConsoleErrorMsg"), RemoteControlConsole.MSG_ERROR); //$NON-NLS-1$
+			e.printStackTrace();
+			return new Status(
+					Status.ERROR,
+					RemoteControlActivator.getPluginID(),
+					Messages.getString("FileUploadJob.Upload_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} finally {
+			if(statusChecker != null) {
+				statusChecker.stopThread();
+			}
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+
+		}
+		
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestEnded(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestEnded(IFTPRequestManager manager) {
+		monitor.subTask(Messages.getString("FileUploadJob.UploadEnded_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestInQueue(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestInQueue(IFTPRequestManager manager) {
+		FTPRequestManager = manager;
+		monitor.subTask(Messages.getString("FileUploadJob.UploadInQueue_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.services.IFTPListener#requestStarted(com.nokia.s60tools.hticonnection.services.IFTPRequestManager)
+	 */
+	public void requestStarted(IFTPRequestManager manager) {
+		monitor.subTask(Messages.getString("FileUploadJob.UploadStarted_SubTaskName")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		if(FTPRequestManager != null) {
+			// Sending cancel request.
+			FTPRequestManager.cancel();
+			monitor.subTask(Messages.getString("FileUploadJob.CancelingUpload_SubTaskName")); //$NON-NLS-1$
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/IJobCompletionListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+/**
+ * Listener interface for object requiring information
+ * about successful cache creation.
+ */
+public interface IJobCompletionListener {
+	
+	/**
+	 * Informs the listener that job is completed
+	 * @param cacheIndexObj Cache index that was just created.
+	 */
+	public void backgroundJobCompleted(IManageableJob jobObject);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/IManageableJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+/**
+ * Jobs that implement this interface can be asked to 
+ * shutdown themselves during their execution. For example,
+ * when a plugin is disposed it is a good idea to request
+ * for all the managed jobs to also interrupt their
+ * execution.
+ */
+public interface IManageableJob {
+	
+	/**
+	 * Called when job needs to be shutdown
+	 */
+	public void forcedShutdown();
+	
+	/**
+	 * Called when job needs to be canceled.
+	 */
+	public void cancelJob();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/MakeDirJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for making directory
+ */
+public class MakeDirJob extends Job implements IManageableJob {
+	
+	/**
+	 * Remote directory
+	 */
+	private String remoteDir;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 10000;
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteDir Directory to be created
+	 */
+	public MakeDirJob(String name, String remoteDir) {
+		super(name);
+		this.remoteDir = remoteDir;
+		setUser(true);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("MakeDirJob.Make_Dir_Task_Name"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			service.makeDir(remoteDir, timeout);
+		} catch (Exception e) {
+			RemoteControlConsole.getInstance().println(
+					Messages.getString("MakeDirJob.MakeDir_Failed_ConsoleErrorMsg"), //$NON-NLS-1$
+					RemoteControlConsole.MSG_ERROR); 
+			e.printStackTrace();
+			return new Status(Status.ERROR, RemoteControlActivator
+					.getPluginID(), Messages
+					.getString("MakeDirJob.MakeDir_Failed_ConsoleErrorMsg"), e); //$NON-NLS-1$
+		} finally {
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		// Short operation. No need to cancel specifically.
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/PasteJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpUtils;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.ViewContentProvider.OPERATION;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for pasting files
+ */
+public class PasteJob extends Job implements IManageableJob {
+	
+	/**
+	 * Path where selected files are located.
+	 */
+	private final String selectedPath;
+	/**
+	 * Path where files should be pasted.
+	 */
+	private final String targetPath;
+	/**
+	 * File that was selected.
+	 */
+	private final String selectedFile;
+	/**
+	 * File/directory name where paste will occur.
+	 */
+	private final String targetFile;
+	
+	/**
+	 * Operation to be done for selected files.
+	 */
+	private final OPERATION fileOperation;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; //Infinite
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+
+	/**
+	 * Constructor
+	 * @param jobName Name for job.
+	 * @param selectedFile Files that were selected.
+	 * @param selectedPath Path where selected files are located.
+	 * @param targetPath Path where files are to be pasted.
+	 * @param fileOperation Operation to be done for selected files.
+	 */
+	public PasteJob(String jobName, String selectedFile,
+			String selectedPath, String targetFile, String targetPath, OPERATION fileOperation) {
+		super(jobName);
+		this.selectedPath = selectedPath;
+		this.selectedFile = selectedFile;
+		this.targetFile = targetFile;
+		this.targetPath = targetPath;
+		this.fileOperation = fileOperation;
+		setUser(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("PasteJob.Task_Name") + selectedFile, //$NON-NLS-1$
+					IProgressMonitor.UNKNOWN);
+			
+			String sourceFile = FtpUtils.addFileSepatorToEnd(selectedPath) + selectedFile;
+			String destFile = FtpUtils.addFileSepatorToEnd(targetPath) + targetFile;
+			
+			// Running correct HTI operation.
+			switch(fileOperation) {
+			case COPY:
+				service.copyFileDir(sourceFile, destFile, timeout);
+				break;
+			case CUT:
+				if(selectedFile.equals(targetFile)) {
+					// File take directory as parameter when it is moved.
+					service.moveFileDir(sourceFile, targetPath, timeout);	
+				} else if(selectedPath.equals(targetPath)){
+					// File name changed, but folder is same. Just renaming it, as
+					// file can not be moved to be different name.
+					service.renameFileDir(sourceFile, destFile, timeout);
+				} else {
+					// File name changed. Has to copy file and then delete old file, as
+					// file can not be moved to be different name.
+					service.copyFileDir(sourceFile, destFile, timeout);
+					service.deleteFile(sourceFile, timeout);
+				}
+				
+				break;
+			case NONE:
+				// Nothing to do.
+				break;
+			default:
+				// Nothing to do.
+				break;
+			}
+			
+		} catch (Exception e) {
+			String errMsg = Messages.getString("PasteJob.FailedPaste_ErrMsg") //$NON-NLS-1$
+					+ FtpUtils.addFileSepatorToEnd(selectedPath) + selectedFile + Messages.getString("PasteJob.FailedPaste_ErrMsg2") + //$NON-NLS-1$
+					FtpUtils.addFileSepatorToEnd(targetPath) + targetFile;
+			RemoteControlConsole.getInstance().println(
+					errMsg,
+					RemoteControlConsole.MSG_ERROR); 
+			e.printStackTrace();
+			return new Status(Status.ERROR,
+					RemoteControlActivator.getPluginID(),
+					errMsg,
+					e);
+		} finally {
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		// Short operation. No need to cancel specifically.
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/RemoteControlJobManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.ListenerList;
+
+/**
+ * Singleton class that is created on plugin
+ * startup, and is kept active as long as plugin is active.
+ * 
+ * The purpose of this class is to enable shutdown of all
+ * ongoing jobs on forced shutdown. All the jobs implementing
+ * <code>IManageableJob</code> should register itself to 
+ * this class and unregister when completed.
+ */
+public class RemoteControlJobManager {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private RemoteControlJobManager instance = null;
+
+	/**
+	 * List of registered jobs.
+	 */
+	private ArrayList<IManageableJob> registeredJobs = null;
+
+	/**
+	 * Listeners interested in job completions operations.
+	 */
+	private ListenerList listeners = null;
+	
+	/**
+	 * Public Singleton instance accessor.
+	 * @return Returns instance of this singleton class-
+	 */
+	public static RemoteControlJobManager getInstance(){
+		if( instance == null ){
+			instance = new RemoteControlJobManager();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private RemoteControlJobManager() {
+		registeredJobs = new ArrayList<IManageableJob>();
+		listeners = new ListenerList();
+	}
+	
+	/**
+	 * Register job
+	 * @param job Job
+	 */
+	public void registerJob(IManageableJob job){
+		registeredJobs.add(job);
+	}
+
+	/**
+	 * Unregister job
+	 * @param job Job
+	 */
+	public void unregisterJob(IManageableJob job){
+		registeredJobs.remove(job);
+		Object[] listenerArray = listeners.getListeners();
+		for (int i = 0; i < listenerArray.length; i++) {
+			IJobCompletionListener listenerObj 
+								= (IJobCompletionListener) listenerArray[i];
+			listenerObj.backgroundJobCompleted(job);
+		}
+	}
+	
+	/**
+	 * Shutdown registered jobs
+	 */
+	public void shutdown(){
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = iter.next();
+			job.forcedShutdown();			
+		}
+		registeredJobs.clear();
+		// Giving a moment for processes to really shutdown
+		try {
+			Thread.sleep(500);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Add listener 
+	 * @param obj Listener
+	 */
+	public void addListener(IJobCompletionListener obj){
+		listeners.add(obj);
+	}
+	
+	/**
+	 * Remove listener
+	 * @param obj Listener
+	 */
+	public void removeListener(IJobCompletionListener obj){
+		listeners.remove(obj);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/RenameJob.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IFTPService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Job for renaming file
+ */
+public class RenameJob extends Job implements IManageableJob {
+	
+	/**
+	 * Remote file
+	 */
+	private final String remoteFile;
+	/**
+	 * New file name.
+	 */
+	private final String targetFile;
+	
+	/**
+	 * Timeout for request
+	 */
+	private static int timeout = 0; //Infinite
+	
+	/**
+	 * Progress monitor
+	 */
+	private IProgressMonitor monitor;
+	
+	/**
+	 * Constructor
+	 * @param name Name for job
+	 * @param remoteFile File to be renamed.
+	 * @param targetFile New file name.
+	 */
+	public RenameJob(String name, String remoteFile, String targetFile) {
+		super(name);
+		this.remoteFile = remoteFile;
+		this.targetFile = targetFile;
+		setUser(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor arg0) {
+		this.monitor = arg0;
+
+		IFTPService service = HTIServiceFactory
+				.createFTPService(RemoteControlConsole.getInstance());
+
+		try {
+			RemoteControlJobManager.getInstance().registerJob(this);
+			monitor.beginTask(Messages.getString("RenameJob.Task_Name"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+			service.renameFileDir(remoteFile, targetFile, timeout);
+		} catch (Exception e) {
+			String errMsg = Messages.getString("RenameJob.FailedToRename_ErrMsg") + remoteFile + //$NON-NLS-1$
+					Messages.getString("RenameJob.FailedToRename_ErrMsg2") + targetFile;  //$NON-NLS-1$
+			RemoteControlConsole.getInstance().println(
+					errMsg,
+					RemoteControlConsole.MSG_ERROR); 
+			e.printStackTrace();
+			return new Status(Status.ERROR,
+					RemoteControlActivator.getPluginID(),
+					errMsg,
+					e);
+		} finally {
+			monitor.done();
+			RemoteControlJobManager.getInstance().unregisterJob(this);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		cancel();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.job.IManageableJob#cancelJob()
+	 */
+	public void cancelJob() {
+		// Short operation. No need to cancel specifically.
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/job/StatusCheckerThread.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,82 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.job;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Thread that checks if job has been canceled and then cancels it.
+ * This is needed in long running file transfer operation where original thread
+ * can not check status of the operation.
+ */
+public class StatusCheckerThread extends Thread {
+	
+	/**
+	 * True while there is need to monitor current status.
+	 */
+	private boolean monitoring = true;
+	/**
+	 * Monitor that contains current status.
+	 */
+	private final IProgressMonitor monitor;
+	/**
+	 * Job that needs to be canceled upon cancel status.
+	 */
+	private final IManageableJob manageableJob;
+	/**
+	 * Constructor.
+	 * @param monitor Status of this monitor is checked.
+	 * @param manageableJob This job needs to be informed if cancel has been requested.
+	 */
+	public StatusCheckerThread(IProgressMonitor monitor, IManageableJob manageableJob) {
+		this.monitor = monitor;
+		this.manageableJob = manageableJob;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Thread#run()
+	 */
+	public void run() {
+		
+		while(monitoring){
+			try {
+				if(monitor.isCanceled()) {
+					manageableJob.cancelJob();
+					// Stopping this thread as it is necessary to cancel each operation only once.
+					monitoring = false;
+				}
+				
+				Thread.sleep(100);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+				RemoteControlConsole.getInstance().println(Messages.getString("StatusCheckerThread.CancelThreadInterrupted_ConsoleMsg") //$NON-NLS-1$
+						, RemoteControlConsole.MSG_ERROR);
+			}
+		}
+	}
+	
+	/**
+	 * Stops this thread from monitoring the job.
+	 */
+	public void stopThread() {
+		monitoring = false;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/BufKeyEvent.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard;
+
+/**
+ * This class holds required information about key events.
+ */
+public class BufKeyEvent {
+	
+	/**
+	 * Character content for this event.
+	 */
+	private char charKey;
+	/**
+	 * Scan code for this event.
+	 */
+	private int scanCode;
+	/**
+	 * How long key is hold down. Only with scan codes.
+	 */
+	private int holdTime;
+	/**
+	 * Type of this event.
+	 */
+	private EventType eventType;
+
+	/**
+	 * Key event types that can be sent to the device.
+	 * It is recommended to use charKeyPressed, scanCodeKeyPressed, and
+	 * scanCodeKeyPressAndHold because it is impossible to predict how long
+	 * it will be between hold and release key events that are sent to the
+	 * device. This because there can be multiple other long events between them.
+	 */
+	public enum EventType {
+		charKeyPressed,
+		scanCodeKeyPressed,
+		scanCodeKeyPressAndHold,
+		scanCodeKeyHold,
+		scanCodeKeyReleased
+	}
+	
+	/**
+	 * Constructor for single character events.
+	 * @param charKey Character for this event.
+	 */
+	public BufKeyEvent(char charKey) {
+		this.charKey = charKey;
+		this.eventType = EventType.charKeyPressed;
+	}
+	
+	/**
+	 * Constructor for press, hold, and release key event.
+	 * @param scanCode Scan code for this event.
+	 * @param eventType Type of event. This should be
+	 * scanCodeKeyPressed, scanCodeKeyHold, or scanCodeKeyReleased.
+	 */
+	public BufKeyEvent(int scanCode, EventType eventType) {
+		this.scanCode = scanCode;
+		this.eventType = eventType;
+	}
+
+	/**
+	 * Constructor for pressing and holding key for certain time.
+	 * @param scanCode Scan code for this event.
+	 * @param holdTime Key is pressed this long in ms.
+	 */
+	public BufKeyEvent(int scanCode, int holdTime) {
+		this.scanCode = scanCode;
+		this.holdTime = holdTime;
+		this.eventType = EventType.scanCodeKeyPressAndHold;
+	}
+
+	/**
+	 * Getter for charKey.
+	 * @return the charKey
+	 */
+	public char getCharKey() {
+		return charKey;
+	}
+
+	/**
+	 * Getter for scanCode.
+	 * @return the scanCode
+	 */
+	public int getScanCode() {
+		return scanCode;
+	}
+
+	/**
+	 * Getter for holdTime.
+	 * @return the holdTime in ms.
+	 */
+	public int getHoldTime() {
+		return holdTime;
+	}
+
+	/**
+	 * Getter for eventType.
+	 * @return the eventType
+	 */
+	public EventType getEventType() {
+		return eventType;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/IKeyboardMediator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard;
+
+/**
+ * Interface for mediator class implementations that act between keyboard requests from UI 
+ * and services that send key requests further to key services. 
+ */
+public interface IKeyboardMediator{
+	
+	/**
+	 * Register for keyboard mediator services.
+	 * @param mediatorClient Client registering mediator services.
+	 */
+	public void registerKeyboardMediatorClient(Object mediatorClient);
+	
+	/**
+	 * Unregister for keyboard mediator services.
+	 * @param mediatorClient Client registering mediator services.
+	 */
+	public void unregisterKeyboardMediatorClient(Object mediatorClient);
+	
+	/**
+	 * Called whenever a normal character key press event is received.
+	 * @param mediatorClient Client registered to the mediator.
+	 * @param charKey Character key pressed.
+	 */
+	public void characterKeyPressed(Object mediatorClient, char charKey);
+
+	/**
+	 * Called whenever client want to send a specific scan code key event.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * @param mediatorClient Client registered to the mediator.
+	 * @param scanCode Scan code for the special key used.
+	 */
+	public void scanCodeKeyPressed(Object mediatorClient, int scanCode);
+
+	/**
+	 * Called whenever client want to send a specific scan code key event, where key is hold down for defined time.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * @param mediatorClient Client registered to the mediator.
+	 * @param scanCode Scan code for the special key used.
+	 * @param holdTime Time that key is hold down in ms.
+	 */
+	public void scanCodeKeyPressedAndHold(Object mediatorClient, int scanCode, int holdTime);
+
+	/**
+	 * Called whenever client want to hold a specific scan code key.
+	 * Call should be always be matched with corresponding <code>scanCodeKeyReleased</code> call.
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * @param mediatorClient Client registered to the mediator.
+	 * @param scanCode Scan code for the special key used.
+	 */
+	public void scanCodeKeyHold(Object mediatorClient, int scanCode);
+
+	/**
+	 * Called whenever client when a previously hold scan code key is released.
+	 * Call should always have corresponding hold event executed beforehand by calling <code>scanCodeKeyHold</code> 
+	 * Used only for special keys with scan code defined in <code>e32keys.h</code> header file. 
+	 * @param mediatorClient Client registered to the mediator.
+	 * @param scanCode Scan code for the special key used.
+	 */
+	public void scanCodeKeyReleased(Object mediatorClient, int scanCode);
+
+	/**
+	 * Returns information about if mediator is currently idle and doing nothing.
+	 * @param mediatorClient Client registered to the mediator.
+	 * @return True if mediator is doing nothing, or false if there are events in the queue. 
+	 */
+	public boolean isMediatorIdle(Object mediatorClient);
+	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/KeyboardMediator.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,582 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.keyboard.BufKeyEvent.EventType;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * This class is mediator between keyboard requests from UI 
+ * and services that send key requests further to key services.
+ * This class is created during plug-in start-up therefore should 
+ * be accessible during plug-in.
+ * 
+ * The mediator instance should be always queried via 
+ * method <code>RemoteControlActivator..getKeyboardMediator()</code>
+ * life time.
+ * 
+ * Mediator instance buffers pure textual input and sends buffer contents
+ * further in pre-defined intervals which enables some kind of feedback
+ * for user about the written text. Without buffering no data is shown to the
+ * writer before all the text is written and the writer waits for some time
+ * for screen refresh.
+ * 
+ * @see RemoteControlActivator#getKeyboardMediator
+ */
+public class KeyboardMediator implements IKeyboardMediator {
+		
+	//
+	// Constants and members for keyboard mediator class
+	//
+	
+	/**
+	 * Error message shown whenever trying to send events from unregistered client object.
+	 */
+	private static final String UNREGISTERED_INSTANCE_ERR_MSG = Messages.getString("KeyboardMediator.TriedToReferUnregisteredClientObject_ErrMsg"); //$NON-NLS-1$
+	
+	/**
+	 * Maximum amount of characters that are sent to device in single send text request.
+	 * There needs to be maximum amount so that timeout can be prevented with fixed timeout.
+	 * It was decided against using dynamic timeout to prevent requests that would take very
+	 * long time to complete.
+	 */
+	private static final int MAX_CHARS_IN_MESSAGE = 30;
+
+	/**
+	 * Character key events are buffered amount of milliseconds set in here, before sending them further.
+	 * The value can be overridden by calling appropriate constructor.
+	 */
+	private int bufferFlushTimeOutMillisec = 1000;
+	
+	/**
+	 * Map storing key press sequence data per client.
+	 */
+	private Map<Object, KeyPressSequenceData> clientMap;
+	
+	/**
+	 * Console to report warnings, errors, and info message.
+	 */
+	private IConsolePrintUtility console;
+
+	//
+	// Private nested classes
+	//
+	
+	/**
+	 * Stores information about currently ongoing key press sequences
+	 * and does buffering for textual character sequences.
+	 */
+	private class KeyPressSequenceData{
+		
+		/**
+		 * Time-out used for sending key events.
+		 */
+		private static final long DEFAULT_KEY_EVENT_TIME_OUT = 3000;
+		/**
+		 * Key event service instance.
+		 */
+		private IKeyEventService service;
+		/**
+		 * Queue that holds key events.
+		 */
+		private ConcurrentLinkedQueue<BufKeyEvent> keyEventQueue;
+		/**
+		 * Flusher thread for
+		 */
+		private Thread bufFlusher;
+		
+		/**
+		 * Synchronization object used to wait/signal flusher thread.
+		 */
+		private Object flusherWaitEvent = new Object();
+		/**
+		 * Synchronization object used to wait/signal flusher thread when buffering characters.
+		 */
+		private Object flusherWaitCharsEvent = new Object();
+		/**
+		 * Flusher flag telling for thread to shutdown.
+		 */
+		private boolean isShutdown = false;
+		
+		/**
+		 * Scan code count used to track scan code amount in queue.
+		 * This is important for deciding if flusher should wait for more text
+		 * or flush next text.
+		 * Flusher can wait for more text, if there are no scan codes in queue.
+		 */
+		private Integer scanCodeCount = 0;
+		
+		/**
+		 * Information about if thread is being idle and doing nothing.
+		 * True if there are no events to be handled. False otherwise.
+		 */
+		private boolean isIdle;
+		
+		//
+		// Private methods
+		//
+
+		/**
+		 * Checks if there are scan codes in queue.
+		 * @return True if there are scan codes in queue. Else false
+		 */
+		private synchronized boolean hasScanCodes() {
+			synchronized(scanCodeCount){
+				return scanCodeCount.intValue() > 0;
+			}
+		}
+
+		/**
+		 * Increases scan code amount by one.
+		 */
+		private synchronized void incScanCodeCount() {
+			synchronized(scanCodeCount){
+				scanCodeCount++;
+			}
+		}
+
+		/**
+		 * Decreases scan code amount by one.
+		 */
+		private synchronized void decrScanCodeCount() {
+			synchronized(scanCodeCount){
+				scanCodeCount--;
+			}
+		}
+
+		/**
+		 * Called by flusher itself to start waiting for wake-up event.
+		 * @throws InterruptedException
+		 */
+		private void flusherWaitInfinite() throws InterruptedException{
+			synchronized(flusherWaitEvent){
+				isIdle = true;
+				flusherWaitEvent.wait();
+			}
+		}
+		
+		/**
+		 * Called by flusher itself to start waiting for more characters until timeout
+		 * expires or for wake-up event.
+		 * @param timeout Timeout
+		 * @throws InterruptedException
+		 */
+		private void flusherWaitForChars(long timeout) throws InterruptedException{
+			synchronized(flusherWaitCharsEvent){
+				flusherWaitCharsEvent.wait(timeout);
+			}
+		}
+		
+		/**
+		 * Called by client to wake-up flusher from wait.
+		 */
+		private void wakeUpFlusher(){
+			synchronized(flusherWaitEvent){
+				isIdle = false;
+				flusherWaitEvent.notifyAll();
+			}
+		}
+		
+		/**
+		 * Flushes any previous textual data stored in buffer.
+		 * @throws InterruptedException 
+		 */
+		private void forceFlush() {
+			wakeUpFlusher();
+			synchronized(flusherWaitCharsEvent){
+				flusherWaitCharsEvent.notifyAll();
+			}
+		}
+		
+		/**
+		 * Gets next event from queue and sends request to the device.
+		 * Buffers events of same type together if possible to improve event handling.
+		 */
+		private void flushBuffer() {
+			
+			if(keyEventQueue.peek() == null) {
+				// Queue is empty, nothing to flush.
+				return;
+			}
+			
+			BufKeyEvent event = keyEventQueue.poll();
+
+			try {
+				// Sending next data from queue. It can be either next X amount of characters or next scan code.
+				
+				if(event.getEventType() == EventType.charKeyPressed) {
+					StringBuffer eventBuf = new StringBuffer();
+					eventBuf.append(event.getCharKey());
+					
+					// Buffering all characters to one buffer, so that they can be sent at the same time.
+					for(int i = 0;i < MAX_CHARS_IN_MESSAGE;i++) {
+						if(keyEventQueue.isEmpty() || 
+								keyEventQueue.peek().getEventType() != EventType.charKeyPressed) {
+							// Breaking because next event is not character event.
+							break;
+						}
+						
+						eventBuf.append(keyEventQueue.poll().getCharKey());
+					}
+					service.typeText(eventBuf.toString(), DEFAULT_KEY_EVENT_TIME_OUT);
+				}
+				else if(event.getEventType() == EventType.scanCodeKeyPressed) {
+					service.pressKey(event.getScanCode(), DEFAULT_KEY_EVENT_TIME_OUT);
+					decrScanCodeCount();
+				}
+				else if(event.getEventType() == EventType.scanCodeKeyPressAndHold) {
+					// Adding hold time to default timeout to prevent service timeout.
+					service.pressKeyLong(event.getScanCode(), event.getHoldTime(),
+							event.getHoldTime() + DEFAULT_KEY_EVENT_TIME_OUT);
+					decrScanCodeCount();
+				}
+				else if(event.getEventType() == EventType.scanCodeKeyHold) {
+					service.holdKey(event.getScanCode(), DEFAULT_KEY_EVENT_TIME_OUT);
+					decrScanCodeCount();
+				}
+				else if(event.getEventType() == EventType.scanCodeKeyReleased) {
+					service.releaseKey(event.getScanCode(), DEFAULT_KEY_EVENT_TIME_OUT);
+					decrScanCodeCount();
+				}
+			} catch (ServiceShutdownException e) {
+				// Services have been purposely shut down. No need to report error.
+			} catch (Exception e) {
+				e.printStackTrace();
+				String detailedErrMsg = Messages.getString("KeyboardMediator.FailedToForwardKeyEvent_ErrMsg"); //$NON-NLS-1$
+				reportErrorToConsole(e, detailedErrMsg);
+			}
+		}
+		
+		/**
+		 * Creates and starts flusher thread.
+		 */
+		private void createAndStartFlusherThread() {
+			bufFlusher = new Thread(){
+				public void run(){
+					while(!isShutdown){
+						
+						try {
+							if(keyEventQueue.isEmpty()) {
+								// Waiting for signal informing that key event has been added to queue. 
+								flusherWaitInfinite();
+							}
+							
+							if(!hasScanCodes() && !keyEventQueue.isEmpty()) {
+								// Waiting pre-defined time before buffer flush, or notify that scan code has been added to queue.
+								// This wait is done so that text can be buffered and sent as one long text, instead of
+								// sending text char by char.
+								// Scan code in line forces flush, because they are sent one by one and there is no need to wait
+								// for more characters when there are scan codes in queue.
+								flusherWaitForChars(bufferFlushTimeOutMillisec);
+							}
+							
+							flushBuffer();
+
+						} catch (Exception e) {
+							e.printStackTrace();
+							String detailedErrMsg = Messages.getString("KeyboardMediator.FailedToFlushBuffer_ErrMsg");  //$NON-NLS-1$
+							reportErrorToConsole(e, detailedErrMsg);
+						}
+						
+					} // while
+				} // run
+
+			};
+			bufFlusher.start();					
+		}
+
+		//
+		// Public methods
+		//
+		
+		/**
+		 * Constructor.
+		 */
+		public KeyPressSequenceData(){			
+			service = HTIServiceFactory.createKeyEventService(console);		
+			keyEventQueue = new ConcurrentLinkedQueue<BufKeyEvent>();
+			createAndStartFlusherThread();
+		}
+
+		/**
+		 * Stops flusher thread.
+		 */
+		public void stopFlusherThread() {
+			isShutdown = true;			
+			forceFlush();
+		}
+		
+		/**
+		 * Character key pressed event.
+		 * @param charKey Character key.
+		 */
+		public void characterKeyPressed(char charKey) {
+			keyEventQueue.add(new BufKeyEvent(charKey));
+			wakeUpFlusher();
+		}
+
+		/**
+		 * Scan code key pressed event.
+		 * @param scanCode Scan code.
+		 */
+		public void scanCodeKeyPressed(int scanCode) {
+			keyEventQueue.add(new BufKeyEvent(scanCode, EventType.scanCodeKeyPressed));
+			incScanCodeCount();
+			forceFlush();
+		}
+		
+		/**
+		 * Scan code key pressed and hold down event.
+		 * @param scanCode Scan code.
+		 * @param holdTime Time that key is hold down.
+		 */
+		public void scanCodeKeyPressedAndHold(int scanCode, int holdTime) {
+			keyEventQueue.add(new BufKeyEvent(scanCode, holdTime));
+			incScanCodeCount();
+			forceFlush();
+		}
+
+		/**
+		 * Scan code key hold event.
+		 * @param scanCode Scan code.
+		 */
+		public void scanCodeKeyHold(int scanCode) {
+			keyEventQueue.add(new BufKeyEvent(scanCode, EventType.scanCodeKeyHold));
+			incScanCodeCount();
+			forceFlush();
+		}
+
+		/**
+		 * Scan code key released event.
+		 * @param scanCode Scan code.
+		 */
+		public void scanCodeKeyReleased(int scanCode) {
+			keyEventQueue.add(new BufKeyEvent(scanCode, EventType.scanCodeKeyReleased));
+			incScanCodeCount();
+			forceFlush();
+		}
+
+		/**
+		 * Returns information about if flusher thread is waiting for new events.
+		 * @return True if event thread is doing nothing, or false if there are events to be handled. 
+		 */
+		public boolean isIdle() {
+			return isIdle;
+		}
+		
+	} // end of KeyPressSequenceData class
+	
+	//
+	// Methods for keyboard mediator class
+	//
+	
+	/**
+	 * Constructor. 
+	 * @param console Reference to console to direct error, warning, and info message to.
+	 */
+	public KeyboardMediator(IConsolePrintUtility console){
+		this.console = console;
+		clientMap = Collections.synchronizedMap(new HashMap<Object, KeyPressSequenceData>());
+	}
+	
+	/**
+	 * Constructor. 
+	 * @param console Reference to console to direct error, warning, and info message to.
+	 * @param bufferFlushTimeOutMillisec Keyboard mediator buffers the key events before sending them further.
+	 *                           By using this constructor one is able to change the default buffering time.
+	 *                           This is especially useful for testing when the input data is entered instantly.
+	 */
+	public KeyboardMediator(IConsolePrintUtility console, int bufferFlushTimeOutMillisec){
+		this.console = console;
+		this.bufferFlushTimeOutMillisec = bufferFlushTimeOutMillisec;
+		clientMap = Collections.synchronizedMap(new HashMap<Object, KeyPressSequenceData>());
+	}
+	
+	/**
+	 * Reports errors to console.
+	 * @param e Exception encountered.
+	 * @param detailedErrMsg Error message describing the error context.
+	 */
+	private void reportErrorToConsole(Exception e, String detailedErrMsg) {
+		String errMsg = detailedErrMsg
+						+ " ("  //$NON-NLS-1$
+						+ Messages.getString("KeyboardMediator.Exception_Str") //$NON-NLS-1$
+						+ "="  //$NON-NLS-1$
+						+ e.getClass().getSimpleName() 
+						+ ")." //$NON-NLS-1$
+						+ Messages.getString("KeyboardMediator.ErrorDetails_Msg") //$NON-NLS-1$
+						+ e.getMessage();
+		console.println(errMsg , IConsolePrintUtility.MSG_ERROR);
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#registerKeyboardMediatorClient(java.lang.Object)
+	 */
+	public void registerKeyboardMediatorClient(Object mediatorClient) {
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData != null){
+		    	String errMsg = Messages.getString("KeyboardMediator.TriedToRegisterAlreadyRegisteredClientObject_ErrMsg"); //$NON-NLS-1$
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+		    clientMap.put(mediatorClient, new KeyPressSequenceData());
+		} // synchronized
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#unregisterKeyboardMediatorClient(java.lang.Object)
+	 */
+	public void unregisterKeyboardMediatorClient(Object mediatorClient) {
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData != null){
+		    	keyPressSequenceData.stopFlusherThread();
+			    clientMap.remove(mediatorClient);
+		    }
+		    else{
+		    	String errMsg = Messages.getString("KeyboardMediator.TriedToUnregisterNonExistingClientObject_ErrMsg"); //$NON-NLS-1$
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+				throw new RuntimeException(errMsg);		    	
+		    }
+		} // synchronized
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#keyPressed(java.lang.Object, org.eclipse.swt.events.KeyEvent)
+	 */
+	public void characterKeyPressed(Object mediatorClient, char charKey) {		
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+		    // Forwarding key press
+		    keyPressSequenceData.characterKeyPressed(charKey);
+		} // synchronized				
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#scanCodeKeyPressed(java.lang.Object, int)
+	 */
+	public void scanCodeKeyPressed(Object mediatorClient, int scanCode) {		
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+			// Sending scan code further
+		    keyPressSequenceData.scanCodeKeyPressed(scanCode);
+		} // synchronized
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#scanCodeKeyPressedAndHold(java.lang.Object, int, int)
+	 */
+	public void scanCodeKeyPressedAndHold(Object mediatorClient, int scanCode, int holdTime) {
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+			// Sending scan code further
+		    keyPressSequenceData.scanCodeKeyPressedAndHold(scanCode, holdTime);
+		} // synchronized
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#scanCodeKeyHold(java.lang.Object, int)
+	 */
+	public void scanCodeKeyHold(Object mediatorClient, int scanCode) {				
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+			// Sending scan code further
+		    keyPressSequenceData.scanCodeKeyHold(scanCode);
+		} // synchronized				
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#keyReleased(java.lang.Object, org.eclipse.swt.events.KeyEvent)
+	 */
+	public void scanCodeKeyReleased(Object mediatorClient, int scanCode) {
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+			// Sending scan code further
+		    keyPressSequenceData.scanCodeKeyReleased(scanCode);
+		} // synchronized				
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator#isMediatorIdle(java.lang.Object)
+	 */
+	public boolean isMediatorIdle(Object mediatorClient) {
+		//We needs to synchronize the map of already found components during check 
+		// and add operation for enabling safe multithread access into the map.
+		synchronized(clientMap){
+		    KeyPressSequenceData keyPressSequenceData = clientMap.get(mediatorClient);
+		    if(keyPressSequenceData == null){
+		    	String errMsg = UNREGISTERED_INSTANCE_ERR_MSG;
+		    	console.println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		    	throw new RuntimeException(errMsg);
+		    }
+			// Sending size of the queue.
+		    return keyPressSequenceData.isIdle();
+		} // synchronized	
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/KeyboardViewOpenAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Activates/creates Screen View.
+ * @see com.nokia.s60tools.remotecontrol.screen.ui.view#ScreenView
+ */
+public class KeyboardViewOpenAction implements IWorkbenchWindowActionDelegate {
+	
+	/**
+	 * Constructor.
+	 */
+	public KeyboardViewOpenAction(){			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			// We only want to activate/create the view and 
+			// do not need to use the instance after it is returned.
+			KeyboardView.getViewInstance();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			RemoteControlConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+		// Not needed now, but must be implemented anyway		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		// Not needed now, but must be implemented anyway
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/NaviPaneAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+
+/**
+ * Action for show/hide Navi pane
+ */
+public class NaviPaneAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Instance of KeyboardView. Used for showing/hiding navi pane 
+	 */
+	private KeyboardView keyboardView;
+	
+	/**
+	 * Constructor
+	  */
+	public NaviPaneAction(KeyboardView keyboardView) {
+		super(Messages.getString("NaviPaneAction.Navikeys_Action_Text"), Messages.getString("NaviPaneAction.Navikeys_Action_Tooltip"), //$NON-NLS-1$ //$NON-NLS-2$
+				IAction.AS_CHECK_BOX,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_NAVI_KEYS));
+		
+		this.keyboardView = keyboardView;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		//Show pane when button is selected. Hide when unselected.
+		keyboardView.showNaviPane(isChecked());
+	}	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/actions/SwitchKeyboardAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferenceConstants.KeyboardLayout;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for switching keyboard layout
+ */
+public class SwitchKeyboardAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Text used for switch to qwerty keyboard action.
+	 */
+	private final String QWERTY_ACTION_TEXT = Messages.getString("SwitchKeyboardAction.SwitchToQwerty_Text"); //$NON-NLS-1$
+	/**
+	 * Text used for switch to simple keyboard action.
+	 */
+	private final String SIMPLE_ACTION_TEXT = Messages.getString("SwitchKeyboardAction.SwitchToSimple_Text"); //$NON-NLS-1$
+	
+	/**
+	 * Instance of KeyboardView. Used for switching keyboard layout
+	 */
+	private KeyboardView keyboardView;
+	
+	/**
+	 * Constructor
+	 * @param keyboardView Instance of KeyboardView
+	 */
+	public SwitchKeyboardAction(KeyboardView keyboardView) {
+		// Initializing action with empty strings.
+		super("", "", IAction.AS_PUSH_BUTTON, //$NON-NLS-1$ //$NON-NLS-2$
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_SWITCH_KEYBOARD_MODE));
+		this.keyboardView = keyboardView;
+		
+		// Adding correct text.
+		if(RCPreferences.getKeyboardLayout() == KeyboardLayout.SIMPLE) {
+			this.setText(QWERTY_ACTION_TEXT);
+			this.setToolTipText(QWERTY_ACTION_TEXT);
+		} else {
+			this.setText(SIMPLE_ACTION_TEXT);
+			this.setToolTipText(SIMPLE_ACTION_TEXT);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		//Switch keyboard layout when button is selected
+		if(RCPreferences.getKeyboardLayout() == KeyboardLayout.QWERTY) {
+			this.setText(QWERTY_ACTION_TEXT);
+			this.setToolTipText(QWERTY_ACTION_TEXT);
+			keyboardView.switchKeyboardLayout(KeyboardLayout.SIMPLE);
+		} else {
+			this.setText(SIMPLE_ACTION_TEXT);
+			this.setToolTipText(SIMPLE_ACTION_TEXT);
+			keyboardView.switchKeyboardLayout(KeyboardLayout.QWERTY);
+		}
+	}	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/BaseKeyboardComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite;
+
+/**
+ * Base class for keyboards 
+ */
+public class BaseKeyboardComposite extends AbstractUiFractionComposite {
+
+	/**
+	 * Minimum width for button.
+	 */
+	private static final int MINIMUN_KB_WIDTH = 20;
+	
+	/**
+	 * Key list for accessing key functionalities.
+	 */
+	protected Map<Button, KbKey> keyMap;
+	
+	/**
+	 * Keyboard mediator to delegate events to.
+	 */
+	private IKeyboardMediator keyboardMediator;
+	
+	/**
+	 * Constructor. Supports only <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 * @see SWT#NONE
+	 */
+	public BaseKeyboardComposite(Composite parent, int style) {
+		super(parent, style);
+		keyboardMediator = RemoteControlActivator.getKeyboardMediator();
+		keyboardMediator.registerKeyboardMediatorClient(this);
+		
+		// Buttons are initialized after IKeyboardMediator because IKeyboardMediator 
+		// is needed on listeners.
+		// Key map has to be created before calling create method.
+		keyMap = new HashMap<Button, KbKey>();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		keyboardMediator.unregisterKeyboardMediatorClient(this);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		// NOT USED
+	}
+
+	/**
+	 * Initializes GridLayout
+	 * @param numColums Number of columns
+	 * @return Layout
+	 */
+	protected Layout createLayout(int numColums) {
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = numColums;
+		gridLayout.marginWidth = 1;
+		gridLayout.marginHeight = 1;
+		gridLayout.horizontalSpacing = 1;
+		gridLayout.verticalSpacing = 1;
+		gridLayout.makeColumnsEqualWidth = true;
+		return gridLayout;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		return null;
+	}
+	
+	/**
+	 * Creating keyboard buttons.
+	 * @param keyboard Keyboard composite
+	 * @param keys Keys to create
+	 */
+	protected void createKeyboardButtons(Composite keyboard, KbKey[] keys) {
+		for (int i = 0; i < keys.length; i++) {
+			KbKey key = keys[i];
+			if (key == null) {
+				// Null key represents empty cell. Let's create space for it
+				createSpace(keyboard);
+			} else {
+				Button btn = createButton(keyboard, key);	
+				keyMap.put(btn, key);
+			}
+		}
+	}
+	
+	/**
+	 * Creating single button with listener that sends key press events to service.
+	 * @param parent Parent component
+	 * @param key Key data for this button
+	 */
+	protected Button createButton(Composite parent, KbKey key){
+		
+		int style = SWT.PUSH;
+		if(key.isToggle()){
+			style = SWT.TOGGLE;
+		}
+		
+		final Button button = new Button(parent, style);
+		
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.minimumWidth = MINIMUN_KB_WIDTH;
+		
+		if(key.getHorizontalSpan() > 1){
+			gridData.horizontalSpan = key.getHorizontalSpan();			
+		}	
+		if(key.getVerticalSpan() > 1){
+			gridData.verticalSpan = key.getVerticalSpan();	
+		}
+		button.setLayoutData(gridData);
+		if(key.getImageKey() != null){
+			Image img = ImageResourceManager.getImage(key.getImageKey());
+			button.setImage(img);
+		}
+		else{
+			button.setText(key.getLabel());			
+		}
+		
+		// Add listeners for this key
+		// Keyboard can be used by mouse or PC keyboard
+		button.addKeyListener(new KeyboardKeyListener(key, this, keyboardMediator));
+		button.addMouseListener(new KeyboardMouseListener(key, this, keyboardMediator));
+		return button;
+	}
+	
+	/**
+	 * Creating empty space
+	 * @param parent Parent component
+	 */
+	protected void createSpace(Composite parent){
+		
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.minimumWidth = MINIMUN_KB_WIDTH;
+		
+		// Label without text reserves space from grid.
+		// Looks like there is not any component
+		Label label = new Label(parent, SWT.SIMPLE);
+		gridData.horizontalSpan = 1;
+		gridData.verticalSpan = 1;
+		label.setLayoutData(gridData);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KbKey.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,236 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+/**
+ * Represents a single keyboard key.
+ */
+public class KbKey{
+
+	/**
+	 * Supported non-character key functionalities.
+	 */
+	public enum KbKeyFunc{
+		SHIFT, 
+		CTRL, 
+		SPACE,
+		DEL, 
+		ENTER,
+		CHR
+	}	
+	
+	/**
+	 * Default label of the key
+	 */
+	private final String label;
+	
+	/**
+	 * Image for the key
+	 */
+	private final String imageKey;
+	
+	/**
+	 * Scancode
+	 */
+	private int scancode = -1;
+	
+	/**
+	 * How many columns this key uses horizontally
+	 */
+	private int horizontalSpan = 1;
+	
+	/**
+	 * How many rows this key uses vertically
+	 */
+	private int verticalSpan = 1;
+	
+	/**
+	 * Label when shift button is pressed
+	 */
+	private String shiftKeyLabel = null;
+	
+	/**
+	 * Key functionality for non-character keys
+	 */
+	private KbKeyFunc keyFunc = null;
+	
+	/**
+	 * Is toggle button
+	 */
+	private boolean isToggle = false;	
+
+	
+	/**
+	 * Is toggle button
+	 * @return True if is toggle button
+	 */
+	public boolean isToggle() {
+		return isToggle;
+	}
+
+	/**
+	 * Get non-character key functionality
+	 * @return Non-character key functionality
+	 */
+	public KbKeyFunc getKeyFunc() {
+		return keyFunc;
+	}
+
+	/**
+	 * Get label for key when shift is on
+	 * @return Label for key when shift is on
+	 */
+	public String getShiftKeyLabel() {
+		return shiftKeyLabel;
+	}
+	
+	/**
+	 * Get scancode
+	 * @return scancode
+	 */
+	public int getScancode() {
+		return scancode;
+	}
+
+	/**
+	 * Get vertical span
+	 * @return Vertical span
+	 */
+	public int getVerticalSpan() {
+		return verticalSpan;
+	}
+
+	/**
+	 * Get horizontal span
+	 * @return Horizontal span
+	 */
+	public int getHorizontalSpan() {
+		return horizontalSpan;
+	}
+
+	/**
+	 * Get label
+	 * @return Label
+	 */
+	public String getLabel() {
+		return label;
+	}
+
+	/**
+	 * Get image for the key
+	 * @return Image for the key
+	 */
+	public String getImageKey() {
+		return imageKey;
+	}
+	
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param scancode Scanc ode for the key
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 */
+	public KbKey(String label, String imageKey, int scancode, int horizontalSpan){
+		this.label = label;
+		this.imageKey = imageKey;
+		this.scancode = scancode;
+		this.horizontalSpan = horizontalSpan;
+	}
+	
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param scancode Scanc ode for the key
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 *  * @param verticalSpan How many rows this key uses vertically.
+	 */
+	public KbKey(String label, String imageKey, int scancode, int horizontalSpan, int verticalSpan){
+		this(label, imageKey, scancode, horizontalSpan);
+		this.verticalSpan = verticalSpan;
+	}
+
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param shifKeyLabel Label when shift button is pressed, set to <code>null</code> when shift functionality is same that default non-shift functionality.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 */
+	public KbKey(String label, String shifKeyLabel, String imageKey){
+		this.label = label;
+		this.shiftKeyLabel = shifKeyLabel;
+		this.imageKey = imageKey;			
+	}
+
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param shifKeyLabel Label when shift button is pressed, set to <code>null</code> when shift functionality is same that default non-shift functionality.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 */
+	public KbKey(String label, String shifKeyLabel, String imageKey, int horizontalSpan){
+		this(label, shifKeyLabel, imageKey);
+		this.horizontalSpan = horizontalSpan;		
+	}
+
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param shifKeyLabel Label when shift button is pressed, set to <code>null</code> when shift functionality is same that default non-shift functionality.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 * @param verticalSpan How many rows this key uses vertically.
+	 */
+	public KbKey(String label, String shifKeyLabel, String imageKey, int horizontalSpan, int verticalSpan){
+		this(label, shifKeyLabel, imageKey,horizontalSpan);
+		this.verticalSpan  = verticalSpan;		
+	}
+	
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param shifKeyLabel Label when shift button is pressed, set to <code>null</code> when shift functionality is same that default non-shift functionality.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 * @param verticalSpan How many rows this key uses vertically.
+	 * @param keyFunc Key functionality for non-character keys.
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.ui.view.KbKey.KbKeyFunc
+	 */
+	public KbKey(String label, String shifKeyLabel, String imageKey, int horizontalSpan, int verticalSpan, KbKeyFunc keyFunc){
+		this(label, shifKeyLabel, imageKey,horizontalSpan, verticalSpan);
+		this.keyFunc = keyFunc;		
+	}
+
+	/**
+	 * Constructor
+	 * @param label Default label of the key, cannot be <code>null</code> but can be empty string.
+	 * @param shifKeyLabel Label when shift button is pressed, set to <code>null</code> when shift functionality is same that default non-shift functionality.
+	 * @param imageKey Image for the key, if not <code>null</code> then image is used instead of labels.
+	 * @param horizontalSpan How many columns this key uses horizontally.
+	 * @param verticalSpan How many rows this key uses vertically.
+	 * @param keyFunc Key functionality for non-character keys.
+	 * @param isToggle Is toggle button
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.ui.view.KbKey.KbKeyFunc
+	 */
+	public KbKey(String label, String shifKeyLabel, String imageKey, int horizontalSpan, int verticalSpan, KbKeyFunc keyFunc, boolean isToggle){
+		this(label, shifKeyLabel, imageKey,horizontalSpan, verticalSpan, keyFunc);
+		this.isToggle = isToggle;		
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardKeyListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.widgets.Button;
+
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+
+/**
+ * Key listener for keyboard buttons. Listen space button of PC keyboard.
+ */
+class KeyboardKeyListener implements KeyListener {
+	
+	/**
+	 * Timestamp when space button is pressed
+	 */
+	private int keyDownTimestamp = 0;
+	
+	/**
+	 * True if space is pressed down but not released yet
+	 */
+	private boolean keyDown = false;
+	
+	/**
+	 * ASCII code for space character
+	 */
+	static final char SPACE = 32;
+	
+	/**
+	 * Key data
+	 */
+	private KbKey key;
+	
+	/**
+	 * Instance of the keyboard which is registered the keyboard mediator
+	 */
+	private Object keyboard;
+	
+	/**
+	 * Keyboard mediator to delegate events to.
+	 */
+	private IKeyboardMediator keyboardMediator;
+	
+	/**
+	 * Keeping  button down more than 500 ms is handled as long press
+	 */
+	private static final long LONG_PRESS_TIME = 500;
+
+	/**
+	 * Constructor
+	 * @param key Key data
+	 * @param keyboard Instance of the keyboard which is registered the keyboard mediator
+	 * @param keyboardMediator Keyboard mediator to delegate events to
+	 */
+	public KeyboardKeyListener(KbKey key, Object keyboard, IKeyboardMediator keyboardMediator) {
+		super();
+		this.key = key;
+		this.keyboard = keyboard;
+		this.keyboardMediator = keyboardMediator;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyPressed(KeyEvent e) {
+		// Several events are received when key is hold down.
+		// Only first event is handled
+		if (e.character == SPACE && !keyDown) {
+			if (key.getScancode() >= 0) {
+				// Scancode is mapped to button. Scancodes are sent after button is released.
+				// Wait for button release.
+				keyDown = true;
+				keyDownTimestamp = e.time;
+			} else {
+				// Shift key(on QWERTY keyboard) press is not send to target. 
+				// It only changes button labels to shift labels.
+				if (key.getKeyFunc() != KbKey.KbKeyFunc.SHIFT) {
+					// Character is mapped to button. Send character event.
+					keyboardMediator.characterKeyPressed(keyboard, ((Button)e.widget).getText().charAt(0));
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent e) {
+		if (e.character == SPACE) {
+			// Space released
+			if (key.getScancode() >= 0) {
+				// Calculate time that button is kept down
+				int holdTime = e.time - keyDownTimestamp;
+				if (holdTime > LONG_PRESS_TIME) {
+					// Button is hold. Send press and hold key event.
+					keyboardMediator.scanCodeKeyPressedAndHold(keyboard, key.getScancode(), holdTime);
+				} else {
+					// Button is pressed. Send press key event.
+					keyboardMediator.scanCodeKeyPressed(keyboard, key.getScancode());
+				}
+			}
+			keyDown = false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardMouseListener.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Button;
+
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+
+/**
+ * Mouse listener for keyboard buttons. Listens left mouse button.
+ */
+class KeyboardMouseListener implements MouseListener {
+	
+	/**
+	 * Timestamp when left mouse button is pressed over the button
+	 */
+	private int mouseDownTimestamp = 0;
+	
+	/**
+	 * Constant for left mouse button
+	 */
+	private final int LEFT_MOUSE_BUTTON = 1;
+	
+	/**
+	 * Key data
+	 */
+	private KbKey key;
+	
+	/**
+	 * Instance of the keyboard which is registered the keyboard mediator
+	 */
+	private Object keyboard;
+	
+	/**
+	 * Keyboard mediator to delegate events to.
+	 */
+	private IKeyboardMediator keyboardMediator;
+	
+	/**
+	 * Keeping  button down more than 500 ms is handled as long press
+	 */
+	private static final long LONG_PRESS_TIME = 500;
+
+	/**
+	 * Constructor
+	 * @param key Key data
+	 * @param keyboard Instance of the keyboard which is registered the keyboard mediator
+	 * @param keyboardMediator Keyboard mediator to delegate events to
+	 */
+	public KeyboardMouseListener(KbKey key, Object keyboard, IKeyboardMediator keyboardMediator) {
+		super();
+		this.key = key;
+		this.keyboard = keyboard;
+		this.keyboardMediator = keyboardMediator;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDoubleClick(MouseEvent e) {
+		// NOT USED
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDown(MouseEvent e) {
+		if (key.getScancode() >= 0) {
+			// Scancode is mapped to button. Scancodes are sent after button is released.
+			// Wait for button release.
+			if (e.button == LEFT_MOUSE_BUTTON) {
+				//Left mouse button pressed
+				mouseDownTimestamp = e.time;
+			}
+		} else {
+			// Shift key(on QWERTY keyboard) press is not send to target. 
+			// It only changes button labels to shift labels.
+			if (key.getKeyFunc() != KbKey.KbKeyFunc.SHIFT) {
+				// Character is mapped to button. Send character event.
+				keyboardMediator.characterKeyPressed(keyboard, ((Button)e.widget).getText().charAt(0));
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseUp(MouseEvent e) {
+		if (key.getScancode() >= 0) {
+			if (e.button == LEFT_MOUSE_BUTTON) {
+				// Left button released
+				// Calculate time button is kept down
+				int holdTime = e.time - mouseDownTimestamp;
+				if (holdTime > LONG_PRESS_TIME) {
+					// Button is hold. Send press and hold key event.
+					keyboardMediator.scanCodeKeyPressedAndHold(keyboard, key.getScancode(), holdTime);
+				} else {
+					// Button is pressed. Send press key event.
+					keyboardMediator.scanCodeKeyPressed(keyboard, key.getScancode());
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/KeyboardView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,340 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.RemoteControlHelpContextIDs;
+import com.nokia.s60tools.remotecontrol.keyboard.ui.actions.NaviPaneAction;
+import com.nokia.s60tools.remotecontrol.keyboard.ui.actions.SwitchKeyboardAction;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferenceConstants.KeyboardLayout;
+
+/**
+ * This class comprises the Main View of the AppDep
+ * application.
+ * 
+ * This example main view demonstrated the creation of a 
+ * view with two tabbed view. The second tab also demonstrated
+ * how context menus can be attached to some control
+ */
+public class KeyboardView extends ViewPart {
+	 
+	/**
+	 * We can get view ID at runtime once the view is instantiated, but we
+	 * also need static access to ID in order to be able to invoke the view.
+	 */
+	public static final String ID = "com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView"; //$NON-NLS-1$
+		
+	//
+	// Actions
+	//
+	
+	/**
+	 * Navi pane action
+	 */
+	private Action naviPaneAction;
+	
+	/**
+	 * Switch keyboard action
+	 */
+	private Action switchKeyboardAction;
+	
+	//
+	// Controls and related classes (providers etc.)
+	// 
+	
+	private Composite container = null;
+	/**
+	 * Navi pane composite
+	 */
+	private NaviPaneComposite naviPane = null;	
+	
+	/**
+	 * Simple keyboard composite
+	 */
+	private SimpleKeyboardComposite simpleKeyboard = null;					
+	
+	/**
+	 * QWERTY keyboard composite
+	 */
+	private QwertyKeyboardComposite qwertyKeyboard = null;	
+	
+	/**
+	 * Parent composite
+	 */
+	private Composite parent;
+
+	/**
+	 * The constructor.
+	 */
+	public KeyboardView() {
+	}
+
+	/**
+	 * This is called by framework when the controls for
+	 * the view should be created.
+	 */
+	public void createPartControl(Composite parent) {
+		this.parent = parent;
+		
+		try {
+			//
+			// Actions invoked by content providers may set enable/disable
+			// states for the actions, therefore all the action has to be
+			// created before creating the controls. This makes sure that
+			// it is safe to refer to all the actions after this point.
+			//
+			createMainMenuActions();
+			
+			//
+			// Creating controls
+			//
+			createLayouts();
+			
+			//
+			// Doing other initializations that may refer to the component
+			// that has been created above.
+			//
+			fillViewActionBars();
+			
+			// Setting context help IDs	
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, 
+		    		RemoteControlHelpContextIDs.REMOTE_CONTROL_KEYBOARD);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Create keyboard layouts. 
+	 */
+	private void createLayouts() {
+		// Dispose container and layouts if exists and create new ones 
+		if (container != null) {
+			container.dispose();
+		}
+		if (naviPane != null) {
+			naviPane.dispose();
+			naviPane = null;
+		}
+		if (simpleKeyboard != null) {
+			simpleKeyboard.dispose();
+			simpleKeyboard = null;
+		}
+		if (qwertyKeyboard != null) {
+			qwertyKeyboard.dispose();
+			qwertyKeyboard = null;
+		}
+		
+		container = new Composite(parent, SWT.SIMPLE);
+		container.setLayout(new GridLayout(1, false));
+		
+		// Check from preferences which layouts are selected to be shown
+		// and create them
+		if (RCPreferences.getShowNaviPane()) {
+			naviPane = new NaviPaneComposite(container, SWT.NONE);
+			naviPane.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER));
+		}
+		if (RCPreferences.getKeyboardLayout() == KeyboardLayout.SIMPLE) {
+			simpleKeyboard = new SimpleKeyboardComposite(container, SWT.NONE);
+			simpleKeyboard.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER));
+		} else {
+			qwertyKeyboard = new QwertyKeyboardComposite(container, SWT.NONE);
+			qwertyKeyboard.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER));
+		}
+		
+		// Draw components
+		parent.layout(true);
+	}
+
+	/**
+	 * Create main menu actions in here. The same actions
+	 * can be also used to populate context menus, if needed.
+	 */
+	private void createMainMenuActions() {
+		// Create actions
+		naviPaneAction = new NaviPaneAction(this);
+		switchKeyboardAction = new SwitchKeyboardAction(this);
+		
+		// Set action states according to preferences
+		naviPaneAction.setChecked(RCPreferences.getShowNaviPane());
+	}
+
+	/**
+	 * This method fills action bars (no need for further modifications).
+	 */
+	private void fillViewActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillViewMainMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * View's main menu is populated in here.
+	 * @param manager Menu manager instance.
+	 */
+	private void fillViewMainMenu(IMenuManager manager) {
+		manager.add(naviPaneAction);
+		manager.add(new Separator());
+		manager.add(switchKeyboardAction);
+		manager.add(new Separator());
+	}
+
+	/**
+	 * View's tool bar is populated in here.
+	 * @param manager Tool bar instance.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {
+		
+		manager.add(naviPaneAction);
+		manager.add(new Separator());
+		manager.add(switchKeyboardAction);
+	}
+	
+	/**
+	 * Focus request should be passed to the view's primary control.
+	 */
+	public void setFocus() {
+		parent.setFocus();
+	}
+	
+	/**
+	 * Allows other classes to update content description.
+	 * @param newContentDescription New description.
+	 */
+	public void updateDescription(String newContentDescription){
+		setContentDescription(newContentDescription);
+		IToolBarManager tbManager = getViewSite().getActionBars().getToolBarManager();
+		tbManager.update(true);
+	}
+
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	public void refresh(){
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		if (naviPane != null) {
+			naviPane.dispose();
+			naviPane = null;
+		}
+		if (simpleKeyboard != null) {
+			simpleKeyboard.dispose();
+			simpleKeyboard = null;
+		}
+		if (qwertyKeyboard != null) {
+			qwertyKeyboard.dispose();
+			qwertyKeyboard = null;
+		}
+	}
+
+	/**
+	 * Enables to get reference of the main view
+	 * from the classes that do not actually
+	 * have reference to the main view instance.
+	 * This method opens activates/opens up the 
+	 * view if it was not visible.
+	 * @throws PartInitException 
+	 */
+	public static KeyboardView getViewInstance() throws PartInitException{
+		
+		IWorkbenchPage page = RemoteControlActivator.getCurrentlyActivePage();
+		
+		boolean viewAlreadyVisible = false;
+		IViewPart viewPart = null;
+		
+		// Checking if view is already open
+		IViewReference[] viewRefs = page.getViewReferences();
+		for (int i = 0; i < viewRefs.length; i++) {
+			IViewReference reference = viewRefs[i];
+			String id = reference.getId();
+			if(id.equalsIgnoreCase(KeyboardView.ID)){
+				viewAlreadyVisible = true;
+				// Found, restoring the view
+				viewPart = reference.getView(true);
+				page.activate(viewPart);
+			}
+		}
+		// View was not opened
+		if(! viewAlreadyVisible){
+			viewPart = page.showView(KeyboardView.ID);							
+		}	
+		return ((KeyboardView) viewPart);
+	}
+
+	/**
+	 * Enables update request for the main view
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 */
+	public static void update(){
+		try {		
+			getViewInstance().inputUpdated();
+			
+		} catch (PartInitException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	private void inputUpdated() {		
+	}
+	
+	/** 
+	 * Show/hide navi pane
+	 * @param show Shows navi pane if true, else hides it
+	 */
+	public void showNaviPane(boolean show) {
+		RCPreferences.setShowNaviPane(show);
+		createLayouts();
+	}
+	
+	/** 
+	 * Switch keyboard layout between simple and qwerty
+	 * @param layout layout to be shown
+	*/
+	public void switchKeyboardLayout(KeyboardLayout layout) {
+		RCPreferences.setKeyboardLayout(layout);
+		createLayouts();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/NaviPaneComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Layout;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Navi keys pane 
+ */
+public class NaviPaneComposite extends BaseKeyboardComposite {
+
+	/**
+	 * Number of colums
+	 */
+	private static final int COLUMN_NUM = 9;
+	
+	/**
+	 * Layout for keys.
+	 */
+	private static final KbKey NAVI_LAYOUT[] = {
+		new KbKey(Messages.getString("NaviPaneComposite.Key_LeftSof"), null, IKeyEventService.SCANCODE_SOFTLEFT, 3), new KbKey(Messages.getString("NaviPaneComposite.Key_RightSoft"), null, IKeyEventService.SCANCODE_SOFTRIGHT, 3), null, new KbKey(Messages.getString("NaviPaneComposite.Key_Power"), null, IKeyEventService.SCANCODE_POWER, 2), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		new KbKey(Messages.getString("NaviPaneComposite.Key_Send"), null, IKeyEventService.SCANCODE_SEND, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_NaviNorth"), ImageKeys.IMG_NAVI_UP, IKeyEventService.SCANCODE_NAVI_NORTH, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_End"), null, IKeyEventService.SCANCODE_END, 2), null, new KbKey(Messages.getString("NaviPaneComposite.Key_Edit"), null, IKeyEventService.SCANCODE_EDIT, 2), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		new KbKey(Messages.getString("NaviPaneComposite.Key_NaviWest"), ImageKeys.IMG_NAVI_LEFT, IKeyEventService.SCANCODE_NAVI_WEST, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_Select"), null, IKeyEventService.SCANCODE_NAVI_CENTERPUSH, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_NaviEast"), ImageKeys.IMG_NAVI_RIGHT, IKeyEventService.SCANCODE_NAVI_EAST, 2), null, new KbKey(Messages.getString("NaviPaneComposite.Key_Voice"), null, IKeyEventService.SCANCODE_NAVI_VOICE, 2), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		new KbKey(Messages.getString("NaviPaneComposite.Key_App"), null, IKeyEventService.SCANCODE_APP, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_NaviSouth"), ImageKeys.IMG_NAVI_DOWN, IKeyEventService.SCANCODE_NAVI_SOUTH, 2), new KbKey(Messages.getString("NaviPaneComposite.Key_Clear"), null, IKeyEventService.SCANCODE_CLEAR, 2), null, new KbKey(Messages.getString("NaviPaneComposite.Key_Camera"), null, IKeyEventService.SCANCODE_NAVI_CAMERA, 2) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		};
+	
+	/**
+	 * Constructor. Supports only <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 * @see SWT#NONE
+	 */
+	public NaviPaneComposite(Composite parent, int style) {
+		super(parent, style);
+		
+		createKeyboardButtons(this, NAVI_LAYOUT);
+	}
+
+	/**
+	 * Constructor. Uses <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public NaviPaneComposite(Composite parent) {
+		this(parent, SWT.NONE);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		// NOT USED
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return createLayout(COLUMN_NUM);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/QwertyKeyboardComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import java.util.Set;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.keyboard.ui.view.KbKey.KbKeyFunc;
+
+/**
+ * Qwerty keyboard
+ */
+public class QwertyKeyboardComposite extends BaseKeyboardComposite {
+
+	/**
+	 * Number of colums
+	 */
+	private static final int COLUMN_NUM = 12;
+	
+	/**
+	 * Is shift pressed down. Affects to button's label.
+	 */
+	boolean shiftMode = false;
+	
+	/**
+	 * Layout for keys.
+	 */
+	private static final KbKey  QWERTY_LAYOUT[] = { 
+		new KbKey("1", "!", null), new KbKey("2", "\"", null), new KbKey("3", "£", null), new KbKey("4", "$", null), new KbKey("5", "€", null), new KbKey("6", "%", null), new KbKey("7", "&&", null), new KbKey("8", "*", null), new KbKey("9", "(", null), new KbKey("0", ")", null), new KbKey("BS", null, IKeyEventService.SCANCODE_CLEAR, 2, 1), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$ //$NON-NLS-21$
+		new KbKey("q", "Q", null), new KbKey("w", "W", null), new KbKey("e", "E", null), new KbKey("r", "R", null), new KbKey("t", "T", null), new KbKey("y", "Y", null), new KbKey("u", "U", null), new KbKey("i", "I", null), new KbKey("o", "O", null), new KbKey("p", "P", null), new KbKey("Enter", null, IKeyEventService.SCANCODE_ENTER, 2, 2), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$ //$NON-NLS-21$
+		new KbKey("a", "A", null), new KbKey("s", "S", null), new KbKey("d", "D", null), new KbKey("f", "F", null), new KbKey("g", "G", null), new KbKey("h", "H", null), new KbKey("j", "J", null), new KbKey("k", "K", null), new KbKey("l", "L", null), new KbKey("m", "M", null),  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$
+		new KbKey("z", "Z", null), new KbKey("x", "X", null), new KbKey("c", "C", null), new KbKey("v", "V", null), new KbKey("b", "B", null), new KbKey("n", "N", null), new KbKey("m", "M", null), new KbKey(",", "<", null), new KbKey(".", ">", null), new KbKey("/", "?", null), new KbKey("Shift", null, null, 2, 1, KbKeyFunc.SHIFT, true), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$ //$NON-NLS-21$
+		new KbKey("Chr", null, IKeyEventService.SCANCODE_CHR, 2), new KbKey("+", "=", null), new KbKey("#", "~", null), new KbKey("", null, IKeyEventService.SCANCODE_SPACE, 6, 1), new KbKey("-", "_", null), new KbKey("´", "@", null)   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+		};
+	
+	/**
+	 * Constructor. Supports only <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 * @see SWT#NONE
+	 */
+	public QwertyKeyboardComposite(Composite parent, int style) {
+		super(parent, style);
+		
+		createKeyboardButtons(this, QWERTY_LAYOUT);
+	}
+
+	/**
+	 * Constructor. Uses <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public QwertyKeyboardComposite(Composite parent) {
+		this(parent, SWT.NONE);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		// NOT USED
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return createLayout(COLUMN_NUM);
+	}	
+
+	/**
+	 * Toggles shift mode, and adjusts keyboard accordingly.
+	 */
+	private void toggleShiftMode(){
+		shiftMode = !(shiftMode);
+		Set<Button> keySet = keyMap.keySet();
+		for (Button button : keySet) {
+			KbKey kbKey = keyMap.get(button);
+			if(kbKey.getKeyFunc() != null){
+				// Labels are not adjusted func btns
+				continue;
+			}
+			if(shiftMode){
+				String shifKeyLabel = kbKey.getShiftKeyLabel();
+				if(shifKeyLabel != null){
+					button.setText(shifKeyLabel);					
+				}
+			}
+			else{
+				button.setText(kbKey.getLabel());				
+			}			
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.keyboard.ui.view.BaseKeyboardComposite#createButton(org.eclipse.swt.widgets.Composite, com.nokia.s60tools.remotecontrol.keyboard.ui.view.KbKey)
+	 */
+	protected Button createButton(Composite parent, KbKey key){
+		
+		Button button = super.createButton(this, key);		
+		
+		// Shift key needs own key listener because it changes button's layout
+		if(key.getKeyFunc() == KbKeyFunc.SHIFT){
+			Listener keyPressListener = new Listener(){
+				public void handleEvent(Event event) {				
+					toggleShiftMode();
+				}
+			};
+			button.addListener(SWT.Selection, keyPressListener);
+		}
+		
+		return button;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/keyboard/ui/view/SimpleKeyboardComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.keyboard.ui.view;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Layout;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Simple keyboard 
+ */
+public class SimpleKeyboardComposite extends BaseKeyboardComposite {
+
+	/**
+	 * Number of colums
+	 */
+	private static final int COLUMN_NUM = 9;
+	
+	/**
+	 * Layout for keys.
+	 */
+	private static final KbKey  SIMPLE_LAYOUT[] = { 
+		new KbKey(Messages.getString("SimpleKeyboardComposite.Key_1"), null, IKeyEventService.SCANCODE_NUMPAD_1, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_2"), null, IKeyEventService.SCANCODE_NUMPAD_2, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_3"), null, IKeyEventService.SCANCODE_NUMPAD_3, 3),  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		new KbKey(Messages.getString("SimpleKeyboardComposite.Key_4"), null, IKeyEventService.SCANCODE_NUMPAD_4, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_5"), null, IKeyEventService.SCANCODE_NUMPAD_5, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_6"), null, IKeyEventService.SCANCODE_NUMPAD_6, 3),  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		new KbKey(Messages.getString("SimpleKeyboardComposite.Key_7"), null, IKeyEventService.SCANCODE_NUMPAD_7, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_8"), null, IKeyEventService.SCANCODE_NUMPAD_8, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_9"), null, IKeyEventService.SCANCODE_NUMPAD_9, 3),  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		new KbKey(Messages.getString("SimpleKeyboardComposite.Key_Asterix"), null, IKeyEventService.SCANCODE_NUMPAD_ASTERISK, 3/*, 1, KbKeyFunc.CHR*/), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_0"), null, IKeyEventService.SCANCODE_NUMPAD_0, 3), new KbKey(Messages.getString("SimpleKeyboardComposite.Key_Hash"), null, IKeyEventService.SCANCODE_NUMPAD_HASH, 3/*, 1, KbKeyFunc.SHIFT*/), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$  
+		};
+	
+	/**
+	 * Constructor. Supports only <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 * @see SWT#NONE
+	 */
+	public SimpleKeyboardComposite(Composite parent, int style) {
+		super(parent, style);
+		
+		createKeyboardButtons(this, SIMPLE_LAYOUT);
+	}
+
+	/**
+	 * Constructor. Uses <code>SWT.NONE</code> style.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public SimpleKeyboardComposite(Composite parent) {
+		this(parent, SWT.NONE);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		// NOT USED
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return createLayout(COLUMN_NUM);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/AddButtonSelectionAdapter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.DriveNameDialog;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+
+/**
+ * Listener for add button events.
+ */
+public class AddButtonSelectionAdapter extends SelectionAdapter {
+	
+	/**
+	 * List of all possible drives that can be shown.
+	 */
+	private static final String[] ALL_DRIVES = { "a:", "b:", "c:", "d:", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			"e:", "f:", "g:", "h:", "i:", "j:",	"k:", "l:", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+			"m:", "n:", "o:", "p:", "q:", "r:", "s:", "t:", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+			"u:", "v:", "w", "x:", "y:", "z:" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+	
+	/**
+	 * Control containing list of drives.
+	 */
+	private List drivesList;
+
+	/**
+	 * Constructor.
+	 * @param drivesList List of drives that is handled.
+	 */
+	public AddButtonSelectionAdapter(List drivesList) {
+		this.drivesList = drivesList;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		
+		String[] possibleDrives = getPossibleDrives();
+		if(possibleDrives.length == 0) {
+			// No new drives available. Showing error message.
+			RemoteControlMessageBox msgBox =
+				new RemoteControlMessageBox(Messages.getString("AddButtonSelectionAdapter.AllDrivesShown_MsgText"), SWT.ICON_INFORMATION); //$NON-NLS-1$
+			msgBox.open();
+		}
+		
+		// Showing select drive dialog.
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		DriveNameDialog driveNameDialog = new DriveNameDialog(sh, possibleDrives);
+		int result = driveNameDialog.open();
+		
+		if (result == IDialogConstants.OK_ID && driveNameDialog.getDriveName() != null) {
+			// Adding drive that was selected to drivesList.
+			String newName = driveNameDialog.getDriveName();
+			
+			for(int i = 0;i < drivesList.getItemCount();i++) {
+				if(newName.compareTo(drivesList.getItem(i)) < 0) {
+					// Found drive that should be later in the list. Adding new drive before it.
+					drivesList.add(newName, i);
+					return;
+				}
+			}
+			
+			// Adding drive to the last position in list.
+			drivesList.add(driveNameDialog.getDriveName());
+		}	
+	}
+	
+	/**
+	 * Gets list of drives that aren't already set in preferences.
+	 * @return List of drives.
+	 */
+	private String[] getPossibleDrives() {
+		
+		String[] currentDrives = drivesList.getItems();
+		// Creating new array, because array generated with .asList() doesn't support remove operation.
+		ArrayList<String> possibleDrives = new ArrayList<String>(Arrays.asList(ALL_DRIVES));
+
+		// Removing currently set drives from possible drives list.
+		for(String drive : currentDrives) {
+			if(possibleDrives.contains(drive)) {
+				possibleDrives.remove(drive);
+			}
+		}
+		
+		return possibleDrives.toArray(new String[0]);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/BrowseButtonSelectionAdapter.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,73 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Listener for Browse button events.
+ */
+public class BrowseButtonSelectionAdapter extends SelectionAdapter {
+
+	/**
+	 * Text field that contains directory.
+	 */
+	private final Text locationText;
+
+	/**
+	 * Constructor.
+	 * @param locationText 
+	 */
+	public BrowseButtonSelectionAdapter(Text locationText) {
+		this.locationText = locationText;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		// Show select folder dialog to user
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		
+		DirectoryDialog dirDialog = new DirectoryDialog(sh, SWT.OPEN);
+		dirDialog.setText(Messages.getString("BrowseButtonSelectionAdapter.DirectoryDialog_Title")); //$NON-NLS-1$
+		dirDialog.setMessage(Messages.getString("BrowseButtonSelectionAdapter.DirectoryDialog_Message")); //$NON-NLS-1$
+		
+		// Using last used folder as default path.
+		String saveLocationPath = RCPreferences.getScreenShotSaveLocation();
+		dirDialog.setFilterPath(saveLocationPath);
+		
+		// Get user selected folder
+		String destPath = dirDialog.open();
+		
+		if (destPath == null) {
+			// User has canceled dialog
+			return;
+		}
+		
+		RCPreferences.setScreenShotSaveLocation(destPath);
+		locationText.setText(destPath);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/FtpPreferencesUI.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.List;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Class for Ftp preferences UI
+ */
+public class FtpPreferencesUI extends Composite {
+
+	/**
+	 * Height hint for drive list
+	 */
+	private static final int DRIVES_LIST_ITEMS_HEIGHT_HINT = 6;
+	
+	/**
+	 * Drive list widget
+	 */
+	private List drivesList;
+	
+	/**
+	 * Add button
+	 */
+	private Button addButton;
+	
+	/**
+	 * Remove button
+	 */
+	private Button removeButton;
+	
+	// Controls for file transfer options.
+	private Button downloadConfirmCB = null;
+	private Button uploadConfirmCB = null;
+	private Button pasteConfirmCB = null;
+	private Button deleteConfirmCB = null;
+	private Button getDriveListCB = null;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parent
+	 *            Parent widget
+	 * @param style
+	 *            Style parameters
+	 */
+	public FtpPreferencesUI(Composite parent, int style) {
+		super(parent, style);
+
+		// Create shown drives group
+		Group shownDrivesGroup = new Group(this, SWT.SHADOW_ETCHED_IN);
+		shownDrivesGroup.setText(Messages.getString("FtpPreferencesUI.Ftp_Drives_Groupname")); //$NON-NLS-1$
+		shownDrivesGroup.setLayout(new GridLayout(2, false));
+		shownDrivesGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		createShownDrives(shownDrivesGroup);
+		
+		// Create file transfer options group
+		Group ftpGroup = new Group(this, SWT.SHADOW_ETCHED_IN);
+		ftpGroup.setText(Messages.getString("RCPreferencePage.Ftp_Options_Groupname")); //$NON-NLS-1$
+		ftpGroup.setLayout(new GridLayout(1, false));
+		ftpGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		downloadConfirmCB  = new Button(ftpGroup, SWT.CHECK);
+		downloadConfirmCB.setText(Messages.getString("FtpPreferencesUI.Download_Confirm_CheckButton_Text")); //$NON-NLS-1$
+		uploadConfirmCB  = new Button(ftpGroup, SWT.CHECK);
+		uploadConfirmCB.setText(Messages.getString("FtpPreferencesUI.Upload_Confirm_CheckButton_Text")); //$NON-NLS-1$
+		pasteConfirmCB  = new Button(ftpGroup, SWT.CHECK);
+		pasteConfirmCB.setText(Messages.getString("FtpPreferencesUI.Paste_Confirm_CheckButton_Text")); //$NON-NLS-1$
+		deleteConfirmCB  = new Button(ftpGroup, SWT.CHECK);
+		deleteConfirmCB.setText(Messages.getString("FtpPreferencesUI.Delete_Confirm_CheckButton_Text")); //$NON-NLS-1$
+		
+		getPrefsStoreValues();
+	}
+
+	/**
+	 * Creates contents for shown drives group.
+	 * @param parent Parent control.
+	 */
+	private void createShownDrives(Composite parent) {
+		// Creating drives list.
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL;
+		drivesList = new List(parent, listBoxStyleBits);
+		drivesList.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		// Grid data for composite.
+		int listHeight = drivesList.getItemHeight() * DRIVES_LIST_ITEMS_HEIGHT_HINT;
+		Rectangle trim = drivesList.computeTrim(0, 0, 0, listHeight);
+		GridData listData = new GridData(GridData.FILL_BOTH);
+		listData.heightHint = trim.height;				
+		drivesList.setLayoutData(listData);	
+		
+		// Creating composite for buttons
+		Composite btnComp = new Composite(parent, SWT.NONE);
+		GridLayout btnCompLayout = new GridLayout(1, true);
+		btnComp.setLayout(btnCompLayout);	
+		
+		GridData btnData = new GridData();
+		btnData.horizontalAlignment = SWT.FILL;
+		btnData.grabExcessVerticalSpace = true;
+
+		// Add button.
+		addButton = new Button(btnComp, SWT.NONE);
+		addButton.setText(Messages.getString("FtpPreferencesUI.AddDrive_Button_Text")); //$NON-NLS-1$
+		addButton.setLayoutData(btnData);
+		
+		//listener for add button
+		AddButtonSelectionAdapter addButtonListener = new AddButtonSelectionAdapter(drivesList);
+		addButton.addSelectionListener(addButtonListener);
+		
+		// Remove button.
+		removeButton = new Button(btnComp, SWT.NONE);
+		removeButton.setText(Messages.getString("FtpPreferencesUI.RemoveDrive_Button_Text")); //$NON-NLS-1$
+		removeButton.setLayoutData(btnData);
+		
+		//listener for remove button
+		removeButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				drivesList.remove(drivesList.getSelectionIndices());
+			}
+		});
+		
+		// Get drives from the device check box
+		getDriveListCB  = new Button(parent, SWT.CHECK);
+		getDriveListCB.setText(Messages.getString("FtpPreferencesUI.GetDriveListFromDevice_CheckBoxText")); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Sets default values to UI components
+	 */
+	public void setDefaults() {
+		downloadConfirmCB.setSelection(RCPreferenceConstants.defaultDownloadConfirmation);
+		uploadConfirmCB.setSelection(RCPreferenceConstants.defaultUploadConfirmation);
+		pasteConfirmCB.setSelection(RCPreferenceConstants.defaultPasteConfirmation);
+		deleteConfirmCB.setSelection(RCPreferenceConstants.defaultDeleteConfirmation);
+		drivesList.setItems(RCPreferenceConstants.defaultShownDrivesArray);
+		getDriveListCB.setSelection(RCPreferenceConstants.defaultGetDriveList);
+	}
+
+	/**
+	 * Saves values to prefstore
+	 */
+	public void savePrefStoreValues() {
+		RCPreferences.setDownloadConfirm(downloadConfirmCB.getSelection());
+		RCPreferences.setUploadConfirm(uploadConfirmCB.getSelection());
+		RCPreferences.setPasteConfirm(pasteConfirmCB.getSelection());
+		RCPreferences.setDeleteConfirm(deleteConfirmCB.getSelection());
+		RCPreferences.setShownDrives(drivesList.getItems());
+		RCPreferences.setGetDriveList(getDriveListCB.getSelection());
+	}
+
+	/**
+	 * Sets old values to components
+	 */
+	private void getPrefsStoreValues() {
+		downloadConfirmCB.setSelection(RCPreferences.getDownloadConfirm());
+		uploadConfirmCB.setSelection(RCPreferences.getUploadConfirm());
+		pasteConfirmCB.setSelection(RCPreferences.getPasteConfirm());
+		deleteConfirmCB.setSelection(RCPreferences.getDeleteConfirm());
+		drivesList.setItems(RCPreferences.getShownDrives());
+		getDriveListCB.setSelection(RCPreferences.getGetDriveList());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferenceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.preferences;
+
+
+/**
+ * Class for storing keys to preferences.
+ */
+public class RCPreferenceConstants {
+
+	//
+	// CONSTANTS FOR SCREENCAPTURE
+	//
+	
+	/**
+	 * Color modes. Enum ordinals are mapped to indexes of colorCodes table 
+	 */
+	public enum ColorMode {
+		GRAYSCALE, 
+		COLOR16, 
+		COLOR256, 
+		COLORS64K, 
+		COLORS16M
+		}
+
+	/**
+	 * Color codes                                                  
+	 */									         	 
+	public static final byte[] colorCodes = new byte[]{(byte)0x04, (byte)0x05, (byte)0x06,  (byte)0x07,  (byte)0x08};
+	                                                 //"EGray256", "EColor16", "EColor256", "EColor64K", "EColor16M"
+	
+	/**
+	 * Default refresh delay is 1 second
+	 */
+	public static final String defaultRefreshDelay = "1000"; //$NON-NLS-1$
+
+	/**
+	 * Default color mode is 0x07 64k colors. Its index is 3
+	 */
+	public static final int defaultColorMode = 3;
+	
+	/**
+	 * Default ask confirmation when saving screenshot.
+	 */
+	public static final boolean DEFAULT_ASK_LOCATION_ALWAYS = true;
+	
+	/**
+	 * Default name for saving screenshot.
+	 */
+	public static final String DEFAULT_FILE_NAME = "screenshot"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for capture delay
+	 */
+	public static final String REFRESH_DELAY = "captureDelay"; //$NON-NLS-1$
+
+	/**
+	 * Constant for color mode
+	 */
+	public static final String COLOR_MODE = "colorMode"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for asking location always when taking screenshot.
+	 */
+	public static final String SCREENSHOT_ASK_LOCATION_ALWAYS = "askLocationAlways"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for default file name
+	 */
+	public static final String SAVE_FILE_NAME = "saveFileName"; //$NON-NLS-1$
+
+	/**
+	 * Constant for default location
+	 */
+	public static final String SAVE_LOCATION = "saveLocation"; //$NON-NLS-1$
+	
+	//
+	// CONSTANTS FOR FTP
+	//
+	
+	/**
+	 * Default ask confirmation on download is true
+	 */
+	public static final boolean defaultDownloadConfirmation = true;
+	
+	/**
+	 * Default ask confirmation on upload is true
+	 */
+	public static final boolean defaultUploadConfirmation = true;
+	
+	/**
+	 * Default ask confirmation on paste is true
+	 */
+	public static final boolean defaultPasteConfirmation = true;
+	
+	/**
+	 * Default ask confirmation on delete is true
+	 */
+	public static final boolean defaultDeleteConfirmation = true;
+	
+	/**
+	 * Default get drive list is true
+	 */
+	public static final boolean defaultGetDriveList = true;
+	
+	/**
+	 * Constant for file replace confirmation on file download
+	 */
+	public static final String DOWNLOAD_FILE_ASK_REPLACE_CONFIRMATION = "downloadConfirm"; //$NON-NLS-1$
+
+	/**
+	 * Constant for file replace confirmation on file upload
+	 */
+	public static final String UPLOAD_FILE_ASK_REPLACE_CONFIRMATION = "uploadConfirm"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for replace confirmation on paste operation
+	 */
+	public static final String PASTE_ASK_REPLACE_CONFIRMATION = "pasteConfirm"; //$NON-NLS-1$	
+	
+	/**
+	 * Constant for delete file/folder confirmation on file/folder delete
+	 */
+	public static final String DELETE_FILE_ASK_CONFIRMATION = "deleteConfirm"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for getting drive list from the device
+	 */
+	public static final String GET_DRIVE_LIST_VALUE = "getDriveListValue"; //$NON-NLS-1$
+	
+	/**
+	 * Separator used when shown drives is saved.
+	 */
+	public static final String SHOWN_DRIVES_SEPARATOR = "@"; //$NON-NLS-1$
+
+	/**
+	 * Drives that are shown as default.
+	 */
+	public static final String defaultShownDrives = "c:" + SHOWN_DRIVES_SEPARATOR + //$NON-NLS-1$
+													"d:" + SHOWN_DRIVES_SEPARATOR +  //$NON-NLS-1$
+													"e:" + SHOWN_DRIVES_SEPARATOR +  //$NON-NLS-1$
+													"z:"; //$NON-NLS-1$
+
+	/**
+	 * Array of drives that is shown as default.
+	 */
+	public static final String[] defaultShownDrivesArray = { "c:", "d:", "e:", "z:" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+	
+	/**
+	 * Constant for shown drives.
+	 */
+	public static final String SHOWN_DRIVES = "shownDrives"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for upload folder on file download
+	 */
+	public static final String DOWNLOAD_FOLDER = "downloadFolder"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for upload folder on file upload
+	 */
+	public static final String UPLOAD_FOLDER = "uploadFolder"; //$NON-NLS-1$
+
+	//
+	// Internal and non-user visible preferences
+	//
+	
+	/**
+	 * Non-visible preference for screen shot save location
+	 */
+	public static final String SCREEN_SHOT_SAVE_LOCATION = "RcScreenShotSaveLocation"; //$NON-NLS-1$
+
+	
+	// Keyboard
+	
+	/**
+	 * Keyboard layouts
+	 */
+	public enum KeyboardLayout {
+		SIMPLE, 
+		QWERTY
+	}
+	
+	/**
+	 * Constant for showing Navi pane
+	 */
+	public static final String SHOW_NAVIPANE = "showNaviPane"; //$NON-NLS-1$
+	
+	/**
+	 * Constant for keyboard layout
+	 */
+	public static final String KEYBORD_LAYOUT = "KeyboardLayout"; //$NON-NLS-1$
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferencePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlHelpContextIDs;
+import com.nokia.s60tools.remotecontrol.common.ProductInfoRegistry;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Reference page for Remote control
+ */
+public class RCPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage {
+
+	/**
+	 * ID for Remote Control preferences page.
+	 */
+	public static final String PAGE_ID = "com.nokia.s60tools.remotecontrol.RCPreferencePage"; //$NON-NLS-1$
+	
+	/**
+	 * Enumeration of possible tabs in the page.
+	 */
+	public enum Tabs {
+		SCREENCAPTURE,
+		FTP
+	}
+	
+	/**
+	 *  Screen capture preference UI
+	 */
+	private ScreenCapturePreferencesUI scPrefUI;
+	/**
+	 *  Ftp preference UI
+	 */
+	private FtpPreferencesUI ftpPrefUI;
+	/**
+	 * Folder containing tabs in the page.
+	 */
+	private TabFolder tabFolder;
+	
+	/**
+	 * General constructor for opening default page.
+	 */
+	public RCPreferencePage() {
+		super(ProductInfoRegistry.getProductName() + Messages.getString("RCPreferencePage.Preferences")); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse
+	 * .swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite parent) {
+
+		Composite container = new Composite(parent, SWT.SIMPLE);
+		container.setLayout(new GridLayout(1, false));
+		container.setLayoutData(new GridData(GridData.FILL_BOTH));
+				
+		// Create tab folder
+		tabFolder = new TabFolder(container, SWT.TOP | SWT.FILL);
+		tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		// Create tabs
+		createScreenCaptureTab(tabFolder);
+		createFtpTab(tabFolder);
+		
+		// Setting context help IDs	
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, 
+	    		RemoteControlHelpContextIDs.REMOTE_CONTROL_PREFERENCES);
+		
+		return container;
+	}
+
+	/**
+	 * Opens specified tab in preferences page.
+	 * @param tab to be opened.
+	 */
+	public void openTab(Tabs tab) {
+		// Opening correct tab.
+		if (tab == Tabs.SCREENCAPTURE) {
+			tabFolder.setSelection(0);
+		} else if (tab == Tabs.FTP) {
+			tabFolder.setSelection(1);
+		}
+	}
+	
+	/**
+	 * Creates Ftp tab
+	 * @param tabFolder Tab folder where tab should be added
+	 */
+	private void createFtpTab(TabFolder tabFolder) {
+		TabItem ftpTab = new TabItem(tabFolder, SWT.FILL);
+		ftpTab.setText(Messages.getString("RCPreferencePage.Ftp_Tabname")); //$NON-NLS-1$
+
+		// Create tab content
+		ftpPrefUI = new FtpPreferencesUI(tabFolder, SWT.NONE);
+		ftpPrefUI.setLayout(new GridLayout(1, false));
+		ftpPrefUI.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		ftpTab.setControl(ftpPrefUI);
+	}
+
+	/**
+	 * Creates Screen Capture tab
+	 * @param tabFolder Tab folder where tab should be added
+	 */
+	private void createScreenCaptureTab(TabFolder tabFolder) {
+		TabItem screenCaptureTab = new TabItem(tabFolder, SWT.FILL);
+		screenCaptureTab.setText(Messages.getString("RCPreferencePage.Screencapture_Tabname")); //$NON-NLS-1$
+
+		// Create screen capture tab content
+		scPrefUI = new ScreenCapturePreferencesUI(tabFolder, SWT.NONE);
+		scPrefUI.setLayout(new GridLayout(1, false));
+		scPrefUI.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		screenCaptureTab.setControl(scPrefUI);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		// Set default values
+		scPrefUI.setDefaults();
+		ftpPrefUI.setDefaults();
+
+		super.performDefaults();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		// Save preferences
+		scPrefUI.savePrefStoreValues();
+		ftpPrefUI.savePrefStoreValues();
+
+		return super.performOk();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+		// Not needed
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/RCPreferences.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,524 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+
+/**
+ * Helper class to use Remote control preferences. Use this class for accessing
+ * RC preferences instead of accessing directly through
+ * {@link org.eclipse.jface.util.IPropertyChangeListener.IPreferenceStore}.
+ */
+public class RCPreferences {
+
+	
+	/**
+	 * Initializes default values for preferences if not initialized before.
+	 */
+	public static void initDefaultValues() {
+		// Refresh delay
+		if(!RemoteControlActivator.getPrefsStore().getDefaultString(RCPreferenceConstants.REFRESH_DELAY).
+				equals(RCPreferenceConstants.defaultRefreshDelay)){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.REFRESH_DELAY, 
+																RCPreferenceConstants.defaultRefreshDelay);
+		}
+		
+		// Color mode
+		if(RemoteControlActivator.getPrefsStore().getDefaultInt(RCPreferenceConstants.COLOR_MODE) 
+				!= RCPreferenceConstants.defaultColorMode){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.COLOR_MODE, 
+																RCPreferenceConstants.defaultColorMode);
+		}
+		
+		// Save screenshot location confirmation
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.SCREENSHOT_ASK_LOCATION_ALWAYS) 
+				!= RCPreferenceConstants.DEFAULT_ASK_LOCATION_ALWAYS){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.SCREENSHOT_ASK_LOCATION_ALWAYS, 
+																RCPreferenceConstants.DEFAULT_ASK_LOCATION_ALWAYS);
+		}
+		
+		// Save screenshot file name
+		if(!RemoteControlActivator.getPrefsStore().getDefaultString(RCPreferenceConstants.SAVE_FILE_NAME).equals(
+				RCPreferenceConstants.DEFAULT_FILE_NAME)){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.SAVE_FILE_NAME, 
+																RCPreferenceConstants.DEFAULT_FILE_NAME);
+		}
+		
+		// Download confirmation
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.DOWNLOAD_FILE_ASK_REPLACE_CONFIRMATION) 
+				!= RCPreferenceConstants.defaultDownloadConfirmation){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.DOWNLOAD_FILE_ASK_REPLACE_CONFIRMATION, 
+																RCPreferenceConstants.defaultDownloadConfirmation);
+		}
+		
+		// Upload confirmation
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.UPLOAD_FILE_ASK_REPLACE_CONFIRMATION) 
+				!= RCPreferenceConstants.defaultUploadConfirmation){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.UPLOAD_FILE_ASK_REPLACE_CONFIRMATION, 
+																RCPreferenceConstants.defaultUploadConfirmation);
+		}
+		
+		// Paste confirmation
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.PASTE_ASK_REPLACE_CONFIRMATION) 
+				!= RCPreferenceConstants.defaultPasteConfirmation){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.PASTE_ASK_REPLACE_CONFIRMATION, 
+																RCPreferenceConstants.defaultPasteConfirmation);
+		}
+		
+		// Delete confirmation
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.DELETE_FILE_ASK_CONFIRMATION) 
+				!= RCPreferenceConstants.defaultDeleteConfirmation){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.DELETE_FILE_ASK_CONFIRMATION, 
+																RCPreferenceConstants.defaultDeleteConfirmation);
+		}
+		
+		// Get drive list from the device value
+		if(RemoteControlActivator.getPrefsStore().getDefaultBoolean(RCPreferenceConstants.GET_DRIVE_LIST_VALUE) 
+				!= RCPreferenceConstants.defaultGetDriveList){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.GET_DRIVE_LIST_VALUE, 
+																RCPreferenceConstants.defaultGetDriveList);
+		}
+		
+		// Shown drives list
+		if(RemoteControlActivator.getPrefsStore().getDefaultString(RCPreferenceConstants.SHOWN_DRIVES) 
+				!= RCPreferenceConstants.defaultShownDrives){
+			
+			RemoteControlActivator.getPrefsStore().setDefault(RCPreferenceConstants.SHOWN_DRIVES, 
+																RCPreferenceConstants.defaultShownDrives);
+		}
+	}
+	
+	
+	/**
+	 * Adds a property change listener to this preference store
+	 * 
+	 * @param listener A property change listener
+	 */
+	public static void addPropertyChangeListener(IPropertyChangeListener listener) {
+		RemoteControlActivator.getPrefsStore().addPropertyChangeListener(listener);
+	}
+	
+	/**
+	 * Removes a property change listener from this preference store
+	 * 
+	 * @param listener A property change listener
+	 */
+	public static void removePropertyChangeListener(IPropertyChangeListener listener) {
+		RemoteControlActivator.getPrefsStore().removePropertyChangeListener(listener);
+	}
+	
+	/**
+	 * Gets screen capture delay
+	 * 
+	 * @return Delay for refresh or empty string if not set
+	 */
+	public static String getRefreshDelay() {
+
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.REFRESH_DELAY);
+	}
+	
+	/**
+	 * Gets screen capture delay as int value
+	 * 
+	 * @return Delay for refresh or 0 if not set
+	 */
+	public static int getRefreshDelayInt() {
+		int retval = 0;
+		String delay = getRefreshDelay();
+		
+		if(delay != null && !delay.trim().equals("")) { //$NON-NLS-1$
+			retval = new Integer(delay).intValue();
+		}
+		return retval;
+	}
+
+	/**
+	 * Sets screen capture delay
+	 * 
+	 * @param refreshDelay
+	 *            refresh delay value
+	 */
+	public static void setRefreshDelay(String refreshDelay) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.REFRESH_DELAY, refreshDelay);
+	}
+	
+	/**
+	 * Gets color mode byte value
+	 * 
+	 * @return Color mode byte value
+	 */
+	public static byte getColorModeByte() {
+		return RCPreferenceConstants.colorCodes[getColorModeInt()];
+	}
+	
+	/**
+	 * Gets color mode int value
+	 * 
+	 * @return Color mode int value
+	 */
+	public static int getColorModeInt() {
+		return RemoteControlActivator.getPrefsStore().getInt(
+				RCPreferenceConstants.COLOR_MODE);
+	}
+	
+	/**
+	 * Sets color mode
+	 * 
+	 * @param colorMode
+	 *            Color mode value
+	 */
+	public static void setColorMode(int colorMode) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.COLOR_MODE, colorMode);
+	}
+	
+	/**
+	 * Gets location is asked always when saving screenshot. 
+	 * 
+	 * @return Ask location boolean value
+	 */
+	public static boolean getAskLocationAlways() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.SCREENSHOT_ASK_LOCATION_ALWAYS);
+	}
+	
+	/**
+	 * Sets location is asked always when saving screenshot.
+	 * 
+	 * @param askLocationAlways Ask location boolean value
+	 */
+	public static void setAskLocationAlways(boolean askLocationAlways) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.SCREENSHOT_ASK_LOCATION_ALWAYS, askLocationAlways);
+	}
+	
+	/**
+	 * Gets file name that is used to save screen shots.
+	 * Used for sequential and single screen shots.
+	 * 
+	 * @return File name for screen shots.
+	 */
+	public static String getScreenshotFileName() {
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.SAVE_FILE_NAME);
+	}
+	
+	/**
+	 * Sets file name that is used to save screen shots.
+	 * Used for sequential and single screen shots.
+	 * 
+	 * @param File name for screen shots.
+	 */
+	public static void setScreenshotFileName(String FileName) {
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.SAVE_FILE_NAME, FileName);
+	}
+	
+	/**
+	 * Gets path where screen shots are saved.
+	 * Used for sequential and single screen shots.
+	 * 
+	 * @return Path for screen shots.
+	 */
+	public static String getScreenShotSaveLocation() {
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.SAVE_LOCATION);
+	}
+	
+	/**
+	 * Sets path where screen shots are saved.
+	 * Used for sequential and single screen shots.
+	 * 
+	 * @param Path for screen shots.
+	 */
+	public static void setScreenShotSaveLocation(String path) {
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.SAVE_LOCATION, path);
+	}
+	
+	/**
+	 * Gets ask replace confirmation on download boolean value
+	 * 
+	 * @return Ask confirmation boolean value
+	 */
+	public static boolean getDownloadConfirm() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.DOWNLOAD_FILE_ASK_REPLACE_CONFIRMATION);
+	}
+	
+	/**
+	 * Sets ask replace confirmation on download
+	 * 
+	 * @param askConfirmation
+	 *            Ask confirmation boolean value
+	 */
+	public static void setDownloadConfirm(boolean askConfirmation) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.DOWNLOAD_FILE_ASK_REPLACE_CONFIRMATION, askConfirmation);
+	}
+	
+	/**
+	 * Gets ask replace confirmation on upload boolean value
+	 * 
+	 * @return Ask confirmation boolean value
+	 */
+	public static boolean getUploadConfirm() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.UPLOAD_FILE_ASK_REPLACE_CONFIRMATION);
+	}
+	
+	/**
+	 * Sets ask replace confirmation on upload
+	 * 
+	 * @param askConfirmation
+	 *            Ask confirmation boolean value
+	 */
+	public static void setUploadConfirm(boolean askConfirmation) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.UPLOAD_FILE_ASK_REPLACE_CONFIRMATION, askConfirmation);
+	}
+
+	/**
+	 * Gets ask replace confirmation on paste boolean value
+	 * 
+	 * @return Ask confirmation boolean value
+	 */
+	public static boolean getPasteConfirm() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.PASTE_ASK_REPLACE_CONFIRMATION);
+	}
+
+	/**
+	 * Sets ask replace confirmation on paste
+	 * 
+	 * @param askConfirmation
+	 *            Ask confirmation boolean value
+	 */
+	public static void setPasteConfirm(boolean askConfirmation) {
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.PASTE_ASK_REPLACE_CONFIRMATION, askConfirmation);
+	}
+	
+	/**
+	 * Gets ask confirmation on delete file/folder boolean value
+	 * 
+	 * @return Ask confirmation boolean value
+	 */
+	public static boolean getDeleteConfirm() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.DELETE_FILE_ASK_CONFIRMATION);
+	}
+	
+	/**
+	 * Sets ask confirmation on delete file/folder
+	 * 
+	 * @param askConfirmation Ask confirmation boolean value
+	 */
+	public static void setDeleteConfirm(boolean askConfirmation) {
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.DELETE_FILE_ASK_CONFIRMATION, askConfirmation);
+	}
+
+	/**
+	 * Gets get drive list boolean value
+	 * 
+	 * @return Get drive list boolean value
+	 */
+	public static boolean getGetDriveList() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.GET_DRIVE_LIST_VALUE);
+	}
+	
+	/**
+	 * Sets get drive list
+	 * 
+	 * @param getDriveList GetDriveList boolean value
+	 */
+	public static void setGetDriveList(boolean getDriveList) {
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.GET_DRIVE_LIST_VALUE, getDriveList);
+	}
+	
+	/**
+	 * Gets array of drives that are shown in File Transfer view.
+	 *  
+	 * @return Array of drives to be shown.
+	 */
+	public static String[] getShownDrives() {
+	
+		// Get shown drives
+		String drives = RemoteControlActivator.getPrefsStore().getString(RCPreferenceConstants.SHOWN_DRIVES);
+		if(drives != null && drives.trim().length() > 0){
+			return drives.split(RCPreferenceConstants.SHOWN_DRIVES_SEPARATOR);
+		}
+		return new String[0];
+	}
+	
+	/**
+	 * Sets array of drives that are shown in File Transfer view.
+	 * 
+	 * @param drives Shown drives.
+	 */
+	public static void setShownDrives(String[] drives) {
+		
+		StringBuffer drivesList = new StringBuffer();
+		
+		// Separating drives with separator to prevent mixing them.
+		for (int i = 0; i < drives.length; i++) {
+			drivesList.append(drives[i]);
+			if(i < (drives.length-1)){
+				drivesList.append(RCPreferenceConstants.SHOWN_DRIVES_SEPARATOR); //Separator
+			}
+		}
+		
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.SHOWN_DRIVES, drivesList.toString());
+	}
+	
+	/**
+	 * Gets screen shot save location. Used when screen shot location is always asked.
+	 * Gets internal, non-user visible preference.
+	 * 
+	 * @return Absolute path name to directory to save screen shots, or empty string ("") if not set previously
+	 */
+	public static String getInternalScreenShotSaveLocation() {		
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.SCREEN_SHOT_SAVE_LOCATION);
+	}
+	
+	/**
+	 * Sets screen shot save location. Used when screen shot location is always asked.
+	 * Sets internal, non-user visible preference.
+	 * 
+	 * @param screenShotSaveLocationAbsPath Absolute path name to directory to save screenshots in next sessions.
+	 */
+	public static void setInternalScreenShotSaveLocation(String screenShotSaveLocationAbsPath) {
+		// Storing internal preference => no need to invoke preference listeners => using putValue
+		RemoteControlActivator.getPrefsStore().putValue(
+				RCPreferenceConstants.SCREEN_SHOT_SAVE_LOCATION, screenShotSaveLocationAbsPath);
+	}
+	
+	/**
+	 * Gets location where to download files.
+	 * Gets internal, non-user visible preference.
+	 * 
+	 * @return Absolute path name to directory to download files, or empty string ("") if not set previously
+	 */
+	public static String getDownloadLocation() {		
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.DOWNLOAD_FOLDER);
+	}
+	
+	/**
+	 * Sets location where to download files.
+	 * Sets internal, non-user visible preference.
+	 * 
+	 * @param downloadLocation Absolute path name to directory to download files.
+	 */
+	public static void setDownloadLocation(String downloadLocation) {
+		RemoteControlActivator.getPrefsStore().putValue(
+				RCPreferenceConstants.DOWNLOAD_FOLDER, downloadLocation);
+	}
+	
+	/**
+	 * Gets location to upload files from.
+	 * Gets internal, non-user visible preference.
+	 * 
+	 * @return Absolute path name to directory to upload files from, or empty string ("") if not set previously
+	 */
+	public static String getUploadLocation() {		
+		return RemoteControlActivator.getPrefsStore().getString(
+				RCPreferenceConstants.UPLOAD_FOLDER);
+	}
+	
+	/**
+	 * Sets location to upload files from.
+	 * Sets internal, non-user visible preference.
+	 * 
+	 * @param uploadLocation Absolute path name to directory to upload files from.
+	 */
+	public static void setUploadLocation(String uploadLocation) {
+		RemoteControlActivator.getPrefsStore().putValue(
+				RCPreferenceConstants.UPLOAD_FOLDER, uploadLocation);
+	}
+	
+	/**
+	 * Gets show Navi pane boolean value
+	 * 
+	 * @return Show Navi pane boolean value
+	 */
+	public static boolean getShowNaviPane() {
+		return RemoteControlActivator.getPrefsStore().getBoolean(
+				RCPreferenceConstants.SHOW_NAVIPANE);
+	}
+	
+	/**
+	 * Sets show Navi pane
+	 * 
+	 * @param show
+	 *            Show Navi pane boolean value
+	 */
+	public static void setShowNaviPane(boolean show) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.SHOW_NAVIPANE, show);
+	}
+	
+	/**
+	 * Gets keyboard layout
+	 * 
+	 * @return Keyboard layout
+	 */
+	public static RCPreferenceConstants.KeyboardLayout getKeyboardLayout() {
+		int value = RemoteControlActivator.getPrefsStore().getInt(
+				RCPreferenceConstants.KEYBORD_LAYOUT);
+		if (value == 0) {
+			return RCPreferenceConstants.KeyboardLayout.SIMPLE;
+		} else {
+			return RCPreferenceConstants.KeyboardLayout.QWERTY;
+		}
+	}
+	
+	/**
+	 * Sets keyboard layout
+	 * 
+	 * @param layout Keyboard layout
+	 */
+	public static void setKeyboardLayout(RCPreferenceConstants.KeyboardLayout layout) {
+
+		RemoteControlActivator.getPrefsStore().setValue(
+				RCPreferenceConstants.KEYBORD_LAYOUT, layout.ordinal());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/preferences/ScreenCapturePreferencesUI.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,333 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.preferences;
+
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferenceConstants.ColorMode;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Class for Screen capture preferences UI
+ */
+public class ScreenCapturePreferencesUI extends Composite {
+
+	/**
+	 * Screen capture delay values
+	 */
+	private static final String DELAYS[] = 
+		{"10", "20", "30", "40", "50", "100", "200", "500", "1000"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+	
+	/**
+	 *  Color mode radio buttons
+	 */
+	private Button grayscaleRB;
+	private Button color16RB;
+	private Button color256RB;
+	private Button color64kRB;
+	private Button color16MRB;
+
+	/**
+	 * Refresh delay combobox
+	 */
+	private Combo delayCombo;
+
+	/**
+	 * Text field containing file name prefix for screen shot.
+	 */
+	private Text fileNameText;
+
+	/**
+	 * Text field containing path where screen shots are saved.
+	 */
+	private Text pathText;
+
+	/**
+	 * Checkbox if single screen shot filename and path should be asked always.
+	 */
+	private Button askLocationAlways;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param parent Parent widget
+	 * @param style Style parameters
+	 */
+	public ScreenCapturePreferencesUI(Composite parent, int style) {
+		super(parent, style);
+
+		// Create capture options group
+		Group screenCaptureGroup = new Group(this, SWT.SHADOW_ETCHED_IN);
+		screenCaptureGroup.setText(Messages.getString("ScreenCapturePreferencesUI.CaptureOptionGroup_Title")); //$NON-NLS-1$
+		screenCaptureGroup.setLayout(new GridLayout(1, false));
+		screenCaptureGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		createCaptureOptions(screenCaptureGroup);
+		
+		// Create save screenshot group
+		Group saveScreenshotGroup = new Group(this, SWT.SHADOW_ETCHED_IN);
+		saveScreenshotGroup.setText(Messages.getString("ScreenCapturePreferencesUI.SaveScreenshotGroup_Title")); //$NON-NLS-1$
+		saveScreenshotGroup.setLayout(new GridLayout(1, false));
+		saveScreenshotGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		createSaveScreenshot(saveScreenshotGroup);
+		
+		// Create link to Carbide's Keys preferences page.
+		Link configureKeysLink = new Link(this, SWT.NULL);
+		configureKeysLink.setText(Messages.getString("ScreenCapturePreferencesUI.CarbideKeysLink_Text")); //$NON-NLS-1$
+		configureKeysLink.setToolTipText(Messages.getString("ScreenCapturePreferencesUI.CarbideKeysLink_Tooltip")); //$NON-NLS-1$
+		
+		//listener for configure keys link
+		configureKeysLink.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				// Opens Carbide's Keys preferences page when selected.
+				PreferenceDialog dialog = org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(
+						RemoteControlActivator.getCurrentlyActiveWbWindowShell(),
+						"org.eclipse.ui.preferencePages.Keys", //$NON-NLS-1$
+						null,
+						null);
+				dialog.open();
+			}
+		});
+		
+		getPrefsStoreValues();
+	}
+
+	/**
+	 * Creates contents for capture options group.
+	 * @param parent Parent widget.
+	 */
+	private void createCaptureOptions(Composite parent) {
+		
+		// Create delay label
+		Label delayLabel = new Label(parent, SWT.SIMPLE);
+		delayLabel.setText(Messages.getString("ScreenCapturePreferencesUI.Delay_Label")); //$NON-NLS-1$
+
+		// Create two column layout for delay combobox and label
+		Composite delayContainer = new Composite(parent, SWT.SIMPLE);
+		delayContainer.setLayout(new GridLayout(2, false));
+		delayContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		// Create delay combobox
+		delayCombo = new Combo(delayContainer, SWT.DROP_DOWN | SWT.READ_ONLY);
+		// Add values
+		for (int i = 0; i < DELAYS.length; i++) {
+			delayCombo.add(DELAYS[i]);
+		}	
+		delayCombo.setVisibleItemCount(20);
+
+		// Create milliseconds label for delay combobox
+		Label msLabel = new Label(delayContainer, SWT.SIMPLE);
+		msLabel.setText(Messages.getString("ScreenCapturePreferencesUI.Delay_Label_msPostfix")); //$NON-NLS-1$
+
+		// Create color mode label
+		Label colorModeLabel = new Label(parent, SWT.SIMPLE);
+		colorModeLabel.setText(Messages.getString("ScreenCapturePreferencesUI.Color_Mode_Label")); //$NON-NLS-1$
+
+		// Create color mode radio buttons
+		grayscaleRB = new Button(parent, SWT.RADIO);
+		grayscaleRB.setText(Messages.getString("ScreenCapturePreferencesUI.Grayscale")); //$NON-NLS-1$
+		color16RB = new Button(parent, SWT.RADIO);
+		color16RB.setText(Messages.getString("ScreenCapturePreferencesUI.16_Colors")); //$NON-NLS-1$
+		color256RB = new Button(parent, SWT.RADIO);
+		color256RB.setText(Messages.getString("ScreenCapturePreferencesUI.256_Colors")); //$NON-NLS-1$
+		color64kRB = new Button(parent, SWT.RADIO);
+		color64kRB.setText(Messages.getString("ScreenCapturePreferencesUI.64k_Colors")); //$NON-NLS-1$
+		color16MRB = new Button(parent, SWT.RADIO);
+		color16MRB.setText(Messages.getString("ScreenCapturePreferencesUI.16M_Colors")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Creates contents for save screenshot options group.
+	 * @param parent Parent widget.
+	 */
+	private void createSaveScreenshot(Composite parent) {
+		
+		// Ask always
+		askLocationAlways = new Button(parent, SWT.CHECK);
+		askLocationAlways.setText(Messages.getString("ScreenCapturePreferencesUI.AskLocationAlvays_CheckBox_Text")); //$NON-NLS-1$
+		
+		// Separator.
+		Label separatorLine = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
+		separatorLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+		
+		// File name and location subgroup.
+		
+		Label infoLabel = new Label(parent, SWT.NONE);
+		infoLabel.setText(Messages.getString("ScreenCapturePreferencesUI.FileNamePrefix_Label")); //$NON-NLS-1$
+		
+		Composite locationComposite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout(3, false);
+		locationComposite.setLayout(layout);
+		locationComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		// File name row.
+		Label fileNameLabel = new Label(locationComposite, SWT.NONE);
+		fileNameLabel.setText(Messages.getString("ScreenCapturePreferencesUI.NamePrefix_Label")); //$NON-NLS-1$
+		fileNameText = new Text(locationComposite, SWT.BORDER | SWT.FILL | SWT.CLIP_CHILDREN);
+		GridData data = new GridData(SWT.FILL);
+		data.horizontalSpan = 2;
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		fileNameText.setLayoutData(data);
+		
+		// Path row.
+		Label pathLabel = new Label(locationComposite, SWT.NONE);
+		pathLabel.setText(Messages.getString("ScreenCapturePreferencesUI.PathLabel_Label")); //$NON-NLS-1$
+		pathText = new Text(locationComposite, SWT.BORDER | SWT.FILL);
+		data = new GridData(SWT.FILL);
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		pathText.setLayoutData(data);
+		Button browseButton = new Button(locationComposite, SWT.NONE);
+		browseButton.setText(Messages.getString("ScreenCapturePreferencesUI.BrowseButton_Text")); //$NON-NLS-1$
+		
+		//listener for Browse button
+		BrowseButtonSelectionAdapter browseButtonListener = new BrowseButtonSelectionAdapter(pathText);
+		browseButton.addSelectionListener(browseButtonListener);
+	}
+	
+	/**
+	 * Sets default values to UI components
+	 */
+	public void setDefaults() {
+		setDefaultColorMode();
+		setDefaultRefreshDelay();
+		setDefaultScreenshotLocation();
+	}
+
+	/**
+	 * Sets default color mode to radio buttons
+	 */
+	private void setDefaultColorMode() {
+		grayscaleRB.setSelection(false);
+		color16RB.setSelection(false);
+		color256RB.setSelection(false);
+		color64kRB.setSelection(true);
+		color16MRB.setSelection(false);
+	}
+
+	/**
+	 * Sets default refresh delay to combobox
+	 */
+	private void setDefaultRefreshDelay() {
+		delayCombo.select(delayCombo.indexOf(RCPreferenceConstants.defaultRefreshDelay));
+	}
+
+	/**
+	 * Sets default screenshot location.
+	 */
+	private void setDefaultScreenshotLocation() {
+		askLocationAlways.setSelection(RCPreferenceConstants.DEFAULT_ASK_LOCATION_ALWAYS);
+		fileNameText.setText(RCPreferenceConstants.DEFAULT_FILE_NAME);
+		// Path is empty as default.
+		pathText.setText(""); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Saves values to prefstore
+	 */
+	public void savePrefStoreValues() {
+		// Save refresh delay value
+		int index = delayCombo.getSelectionIndex();
+		if (index >= 0) {
+			String delay = delayCombo.getItem(index);
+			if (delay != null) {
+				RCPreferences.setRefreshDelay(delay);
+			}
+		}
+
+		// Save color mode value
+		if (grayscaleRB.getSelection()) {
+			RCPreferences.setColorMode(ColorMode.GRAYSCALE.ordinal());
+		} else if (color16RB.getSelection()) {
+			RCPreferences.setColorMode(ColorMode.COLOR16.ordinal());
+		} else if (color256RB.getSelection()) {
+			RCPreferences.setColorMode(ColorMode.COLOR256.ordinal());
+		} else if (color64kRB.getSelection()) {
+			RCPreferences.setColorMode(ColorMode.COLORS64K.ordinal());
+		} else if (color16MRB.getSelection()) {
+			RCPreferences.setColorMode(ColorMode.COLORS16M.ordinal());
+		}
+		
+		// Save screenshot location preferences.
+		RCPreferences.setAskLocationAlways(askLocationAlways.getSelection());
+		RCPreferences.setScreenshotFileName(fileNameText.getText());
+		RCPreferences.setScreenShotSaveLocation(pathText.getText());
+	}
+
+	/**
+	 * Sets old values to components
+	 */
+	private void getPrefsStoreValues() {
+
+		// Get refresh delay and set value selected on the combobox
+		String delay = RCPreferences.getRefreshDelay();
+		int index = delayCombo.indexOf(delay);
+		if (index >= 0) {
+			delayCombo.select(index);
+		} else {
+			// Use default
+			setDefaultRefreshDelay();
+		}
+				
+		// Get color mode value and set current radio button selected
+		int colorMode = RCPreferences.getColorModeInt();
+		switch (colorMode) {
+			case 0:
+				grayscaleRB.setSelection(true);
+				break;
+			case 1:
+				color16RB.setSelection(true);
+				break;
+			case 2:
+				color256RB.setSelection(true);
+				break;
+			case 3:
+				color64kRB.setSelection(true);
+				break;
+			case 4:
+				color16MRB.setSelection(true);
+				break;
+
+			default:
+				// Use default
+				setDefaultColorMode();
+				break;
+		}
+
+		// Get save screenshot location preferences.
+		askLocationAlways.setSelection(RCPreferences.getAskLocationAlways());
+		fileNameText.setText(RCPreferences.getScreenshotFileName());
+		pathText.setText(RCPreferences.getScreenShotSaveLocation());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/ImageKeys.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.resources;
+
+public class ImageKeys {
+	
+	/**
+	 * Image key for default S60 tools action icon
+	 */
+	public final static String S60TOOLS_ACTION_ICON = "S60TOOLS_ACTION_ICON"; //$NON-NLS-1$	
+
+	/**
+	 * Image key for Remote control icon
+	 */
+	public final static String IMG_APP_ICON = "REMOTECONTROL_IMG_APP_ICON"; //$NON-NLS-1$	
+	/**
+	 * Image key for Screen capture icon
+	 */
+	public final static String IMG_SCREEN_CAPTURE_MODE = "REMOTECONTROL_IMG_SCREEN_CAPTURE_MODE"; //$NON-NLS-1$	
+	/**
+	 * Image key for File Transfer icon
+	 */
+	public final static String IMG_FILE_TRANSFER_MODE = "REMOTECONTROL_IMG_FILE_TRANSFER_MODE"; //$NON-NLS-1$	
+	/**
+	 * Image key for Preferences icon
+	 */
+	public final static String IMG_PREFERENCES = "REMOTECONTROL_IMG_PREFERENCES"; //$NON-NLS-1$	
+	/**
+	 * Image key for save screenshot icon
+	 */
+	public final static String IMG_SAVE_SCREENSHOT = "REMOTECONTROL_IMG_SAVE_SCREENSHOT_BUTTON"; //$NON-NLS-1$
+	
+	/**
+	 * Image key for download action icon
+	 */
+	public final static String IMG_DOWNLOAD = "REMOTECONTROL_IMG_DOWNLOAD"; //$NON-NLS-1$
+	
+	/**
+	 * Image key for upload action icon
+	 */
+	public final static String IMG_UPLOAD = "REMOTECONTROL_IMG_UPLOAD"; //$NON-NLS-1$
+	
+	/**
+	 * Image key for new folder action icon
+	 */
+	public final static String IMG_NEW_FOLDER = "REMOTECONTROL_IMG_NEW_FOLDER"; //$NON-NLS-1$
+	
+	/**
+	 * Image key for disk drive icon
+	 */
+	public final static String IMG_DISC_DRIVE = "REMOTECONTROL_IMG_DISK_DRIVE"; //$NON-NLS-1$
+
+	/**
+	 * Image key for dimmed disk drive icon
+	 */
+	public final static String IMG_DISC_DRIVE_DIMMED = "REMOTECONTROL_IMG_DISK_DRIVE_DIMMED"; //$NON-NLS-1$
+	
+	/**
+	 * Image key for folder icon
+	 */
+	public final static String IMG_FOLDER = "REMOTECONTROL_IMG_FOLDER"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Start multi screenshot icon
+	 */
+	public static final String IMG_START_MULTI_SCREENSHOT = "REMOTECONTROL_IMG_START_MULTI_SCREENSHOT"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Stop multi screenshot icon
+	 */
+	public static final String IMG_STOP_MULTI_SCREENSHOT = "REMOTECONTROL_IMG_STOP_MULTI_SCREENSHOT"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Go to directory icon
+	 */
+	public static final String IMG_GO_TO_DIRECTORY = "REMOTECONTROL_IMG_GO_TO_DIRECTORY"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Refresh icon
+	 */
+	public static final String IMG_REFRESH = "REMOTECONTROL_IMG_REFRESH"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Download as icon
+	 */
+	public static final String IMG_DOWNLOAD_AS = "REMOTECONTROL_IMG_DOWNLOAD_AS"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Download and open icon
+	 */
+	public static final String IMG_DOWNLOAD_AND_OPEN = "REMOTECONTROL_IMG_DOWNLOAD_AND_OPEN"; //$NON-NLS-1$
+
+	/**
+	 * Image key for External drive icon
+	 */
+	public static final String IMG_EXTERNAL_DRIVE = "REMOTECONTROL_IMG_EXTERNAL_DRIVE"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Unknown drive icon
+	 */
+	public static final String IMG_UNKNOWN_DRIVE = "REMOTECONTROL_IMG_UNKNOWN_DRIVE"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Keyboard view icon
+	 */
+	public static final String IMG_KEYBOARD_VIEW = "REMOTECONTROL_IMG_KEYBOARD_VIEW"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Switch keyboard mode icon
+	 */
+	public static final String IMG_SWITCH_KEYBOARD_MODE = "REMOTECONTROL_IMG_SWITCH_KEYBOARD_MODE"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Navigation keys icon
+	 */
+	public static final String IMG_NAVI_KEYS = "REMOTECONTROL_IMG_NAVI_KEYS"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Navigation key Up icon
+	 */
+	public static final String IMG_NAVI_UP = "REMOTECONTROL_IMG_NAVI_UP"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Navigation key Down icon
+	 */
+	public static final String IMG_NAVI_DOWN = "REMOTECONTROL_IMG_NAVI_DOWN"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Navigation key Left icon
+	 */
+	public static final String IMG_NAVI_LEFT = "REMOTECONTROL_IMG_NAVI_LEFT"; //$NON-NLS-1$
+
+	/**
+	 * Image key for Navigation key Right icon
+	 */
+	public static final String IMG_NAVI_RIGHT = "REMOTECONTROL_IMG_NAVI_RIGHT"; //$NON-NLS-1$
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/ImageResourceManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,154 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.resources;
+
+import java.io.File;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+
+/**
+ * This class manages images that are used in Remote Control project.
+ */
+public class ImageResourceManager {
+	
+	/**
+	 * Loads images to image registry.
+	 * @param imagesPath Path of image directory.
+	 */
+	public static void loadImages(String imagesPath){
+		
+    	Display disp = Display.getCurrent();
+    	ImageRegistry imgReg = RemoteControlActivator.getDefault().getImageRegistry();
+
+    	//
+    	// Storing images to image registry.
+    	//
+    	
+    	Image img = new Image( disp, imagesPath + File.separator + "s60tools_action_icon.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.S60TOOLS_ACTION_ICON, img );
+
+    	// Remote Control specific images
+    	img = new Image( disp, imagesPath + File.separator + "remote_control.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_APP_ICON, img );
+    	        
+    	img = new Image( disp, imagesPath + File.separator + "screen_capture.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_SCREEN_CAPTURE_MODE, img );
+
+    	img = new Image( disp, imagesPath + File.separator + "file_transfer.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_FILE_TRANSFER_MODE, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "preferences.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_PREFERENCES, img );        
+
+    	img = new Image( disp, imagesPath + File.separator + "save_screenshot.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_SAVE_SCREENSHOT, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "download.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_DOWNLOAD, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "upload.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_UPLOAD, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "new_folder.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NEW_FOLDER, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "disc_drive.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_DISC_DRIVE, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "disc_drive_dimmed.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_DISC_DRIVE_DIMMED, img );
+        
+        img = new Image( disp, imagesPath + File.separator + "folder.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_FOLDER, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "screenshots_start_taking.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_START_MULTI_SCREENSHOT, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "screenshots_stop_taking.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_STOP_MULTI_SCREENSHOT, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "go_to_directory.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_GO_TO_DIRECTORY, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "refresh.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_REFRESH, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "download_as.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_DOWNLOAD_AS, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "download_and_open.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_DOWNLOAD_AND_OPEN, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "disc_drive_external_drives.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_EXTERNAL_DRIVE, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "disc_drive_other_types.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_UNKNOWN_DRIVE, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "keyboard_view.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_KEYBOARD_VIEW, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "keyboard_switch_layout.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_SWITCH_KEYBOARD_MODE, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "navigation_keys_icon.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NAVI_KEYS, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "navigation_key_up.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NAVI_UP, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "navigation_key_down.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NAVI_DOWN, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "navigation_key_left.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NAVI_LEFT, img );
+        
+    	img = new Image( disp, imagesPath + File.separator + "navigation_key_right.png" ); //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_NAVI_RIGHT, img );
+        
+        
+        
+        
+	}
+	
+	/**
+	 * Gets image descriptor for given key from plugin's image registry.
+	 * @param key Key for image.
+	 * @return ImageDescriptor for given image key.
+	 */
+	public static ImageDescriptor getImageDescriptor( String key ){
+    	ImageRegistry imgReg = RemoteControlActivator.getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}	
+
+	/**
+	 * Gets image for given key from plugin's image registry.
+	 * @param key Key for image.
+	 * @return Image for given key.
+	 */
+	public static Image getImage( String key ){
+    	ImageRegistry imgReg = RemoteControlActivator.getDefault().getImageRegistry();
+    	return  imgReg.get(key);		
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Class for getting strings from resource bundle
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.remotecontrol.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Constructor
+	 */
+	private Messages() {
+	}
+
+	/**
+	 * Get string from resource bundle
+	 * @param key Key for string to get
+	 * @return Resource string
+	 */
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/resources/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,235 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+
+AbstractUiFractionComposite.AbstractUiFractionComposite.ParentDisplayNULL_ErrMsg=INTERNAL ERROR: Parent's display is NULL\!
+AddButtonSelectionAdapter.AllDrivesShown_MsgText=All possible drives are shown already.
+BrowseButtonSelectionAdapter.DirectoryDialog_Message=Select folder where to save taken screenshots.
+BrowseButtonSelectionAdapter.DirectoryDialog_Title=Select folder
+ConfirmDeleteDialog.ConfirmAlwaysCheck_Text=Always delete without prompt
+ConfirmDeleteDialog.ConfirmDelete_Text=Are you sure you want to delete selected file(s) and folder(s)?
+ConfirmDeleteDialog.ConfirmDelete_Title=Confirm delete
+ConfirmReplaceDialog.Confirm_Replace_CheckButton_Text=Always replace without prompt
+ConfirmReplaceDialog.Rename_Button_Label=Rename
+CopyAction.Action_Name=Copy
+CopyAction.Tooltip_Name=Copy
+CutAction.Action_Name=Cut
+CutAction.Tooltip_Name=Cut
+MainView.Connected_DescText=Connected
+MainView.Ftp_Tabname=File Transfer
+MainView.NotConnected_DescText=Not connected
+MainView.Screencapture_Tabname=Screen Capture
+RemoteControlActivator.Images_Path_ConsoleMsg=images path: 
+RemoteControlActivator.Plugin_Install_Location_ConsoleMsg=Plugin installation location: 
+RemoteControlActivator.Startup_ConsoleMsg=RemoteControl Plugin STARTUP...
+SaveMultiScreenshotsAction.ImagesSavedTo_DescMsg=\ images saved to 
+SaveMultiScreenshotsAction.SaveScreenshots_Text=Save all screenshots
+SaveMultiScreenshotsAction.SaveScreenshots_Tooltip=Start taking sequential screenshots
+SaveMultiScreenshotsAction.SavingImages_DescMsg=Saving images to 
+SaveMultiScreenshotsAction.StopSavingScreenshots_Text=Stop saving screenshots
+SaveMultiScreenshotsAction.StopSavingScreenshots_Tooltip=Stop taking sequential screenshots
+SaveSingleScreenshotAction.DefaultScreenShotFileName_Postfix=_Screenshot.png
+SaveSingleScreenshotAction.ScreenImageNotAvailable_InfoMsg=Screen image not available for capture\!
+ScreenView.Failed_Create_Screen_View_ConsoleMsg=Failed to create screen view: 
+ScreenView.FirstTimeUse_Help_Text1=Connection needs to be started from HTI Connection.
+ScreenView.FirstTimeUse_Help_Text2=Before first time use, connection needs to be configured
+ScreenView.FirstTimeUse_Help_Text3=from HTI Connection's preferences.
+ScreenView.Open_Preferences_Action=Preferences
+ScreenView.Open_Preferences_Tooltip=Open Preferences page dialog
+ScreenView.Save_Screenshot_Action=Save Screenshot
+ScreenView.Save_Screenshot_Action_Tooltip=Save Single Screenshot
+ScreenView.Zoom_100%_Action=100%
+ScreenView.Zoom_100%_Tooltip=Zoom to 100%
+ScreenView.Zoom_200%_Action=200%
+ScreenView.Zoom_200%_Tooltip=Zoom to 200%
+ScreenView.Zoom_400%_Action=400%
+ScreenView.Zoom_400%_Tooltip=Zoom to 400%
+ScreenView.Zoom_50%_Action=50%
+ScreenView.Zoom_50%_Tooltip=Zoom to 50%
+ScreenView.Zoom_To_Fit_Action=Zoom to Fit
+ScreenView.Zoom_To_Fit_Tooltip=Zoom to fit view
+ScreenView.Zoom_To_Height_Action=Zoom to Height
+ScreenView.Zoom_To_Height_Tooltip=Zoom to height
+ScreenView.Zoom_To_Width_Action=Zoom to Width
+ScreenView.Zoom_To_Width_Tooltip=Zoom to width
+RCPreferencePage.Ftp_Options_Groupname=File Transfer Options
+RCPreferencePage.Preferences=\ Preferences
+RCPreferencePage.Screencapture_Tabname=Screen Capture
+RCPreferencePage.Ftp_Tabname=File Transfer
+ScreenCapturePreferencesUI.16_Colors=16 colors
+ScreenCapturePreferencesUI.16M_Colors=16M colors
+ScreenCapturePreferencesUI.256_Colors=256 colors
+ScreenCapturePreferencesUI.64k_Colors=64k colors
+ScreenCapturePreferencesUI.AskLocationAlvays_CheckBox_Text=Ask file name and path for single screenshots
+ScreenCapturePreferencesUI.BrowseButton_Text=Browse...
+ScreenCapturePreferencesUI.CaptureOptionGroup_Title=Capture Options
+ScreenCapturePreferencesUI.CarbideKeysLink_Text=See <a>'Keys'</a> to configure shortcuts to Screen Capture view
+ScreenCapturePreferencesUI.CarbideKeysLink_Tooltip=Opens 'Keys' preferences page.\nSee Remote Control help for more information.
+ScreenCapturePreferencesUI.Color_Mode_Label=Color mode:
+ScreenCapturePreferencesUI.Delay_Label=Delay before next refresh:
+ScreenCapturePreferencesUI.Delay_Label_msPostfix=milliseconds
+ScreenCapturePreferencesUI.FileNamePrefix_Label=File name prefix and path for sequential and single screenshots
+ScreenCapturePreferencesUI.Grayscale=grayscale
+ScreenCapturePreferencesUI.NamePrefix_Label=Name prefix
+ScreenCapturePreferencesUI.PathLabel_Label=Path
+ScreenCapturePreferencesUI.SaveScreenshotGroup_Title=Save Screenshot Options
+ScreenSaverThread.FailedToSaveImage_ErrorMsg1=Failed to save image to '
+ScreenSaverThread.FailedToSaveImage_ErrorMsg2=' cause - 
+ScreenSaverThread.InvalidPath_ErrorMsg=Path for screenshots is not set.\nDo you want to open preferences page and set path?
+ScreenSaverThread.SaveAllScreenshotsConfirmation_MessageText=\ screenshots has been saved.\n Do you want to continue saving images?
+DownloadFileAction.Action_Name=Download
+DownloadFileAction.Tooltip_Name=Download
+DownloadFileAndOpenAction.Action_Name=Open
+DownloadFileAndOpenAction.Tooltip_Name=Open
+DownloadFileAsAction.Action_Name=Download as..
+DownloadFileAsAction.Tooltip_Name=Download as
+UploadFileAction.Action_Name=Upload
+UploadFileAction.SelectUploadFiles_DlgText=Select files
+UploadFileAction.Tooltip_Name=Upload
+MakeDirAction.Action_Name=New folder
+MakeDirAction.Tooltip_Name=New folder
+DeleteAction.Action_Name=Delete
+DeleteAction.Tooltip_Name=Delete
+RefreshAction.Action_Name=Refresh
+RefreshAction.Tooltip_Name=Refresh
+RenameAction.Action_Name=Rename
+RenameAction.Tooltip_Name=Rename
+RenameDialog.label=Enter new name
+RenameJob.FailedToRename_ErrMsg=Failed to rename file 
+RenameJob.FailedToRename_ErrMsg2=\ to 
+RenameJob.Task_Name=Renaming file
+KeyboardMediator.ErrorDetails_Msg=error details: 
+KeyboardMediator.Exception_Str=exception
+KeyboardMediator.FailedToFlushBuffer_ErrMsg=Failed to flush buffered character data
+KeyboardMediator.FailedToForwardKeyEvent_ErrMsg=Failed to forward key event to the device.
+KeyboardMediator.TriedToReferUnregisteredClientObject_ErrMsg=Tried to refer to unregistered object instance in keyboard mediator.
+KeyboardMediator.TriedToRegisterAlreadyRegisteredClientObject_ErrMsg=Tried to register already registered object instance to keyboard mediator.
+KeyboardMediator.TriedToUnregisterNonExistingClientObject_ErrMsg=Tried to unregister non-existing object instance from keyboard mediator.
+KeyCommandHandler.FailedToSendEvent_ErrorMsg=Failed to send key pressed event to target.
+SimpleKeyboardComposite.Key_Asterix=*+
+SimpleKeyboardComposite.Key_0=0 (Space)
+SimpleKeyboardComposite.Key_1=1
+SimpleKeyboardComposite.Key_2=2 (abc)
+SimpleKeyboardComposite.Key_3=3 (def)
+SimpleKeyboardComposite.Key_4=4 (ghi)
+SimpleKeyboardComposite.Key_5=5 (jkl)
+SimpleKeyboardComposite.Key_6=6 (mno)
+SimpleKeyboardComposite.Key_7=7 (pqrs)
+SimpleKeyboardComposite.Key_8=8 (tuv)
+SimpleKeyboardComposite.Key_9=9 (wxyz)
+SimpleKeyboardComposite.Key_Hash=Shift (\#)
+StatusCheckerThread.CancelThreadInterrupted_ConsoleMsg=Cancel monitoring stopped. Cancellation of current operation can fail.
+FtpUplinkObject.Up_One_Level=..
+FtpUtils.Confirm_Replace_DlgMsg_Postfix=Would you like to replace it?
+FtpUtils.Confirm_Replace_DlgMsg_Prefix=This folder already contains 
+FtpUtils.Confirm_Replace_DlgLabel=Confirm Replace
+FtpUtils.Download_File_Job_Name=Downloading file 
+FtpUtils.DownloadAs_DialogText=Download As
+FtpUtils.Upload_Fail_ConsoleErrorMsg=Failed to upload file.
+FtpUtils.Make_Dir_Job_Name=Creating folder
+FtpUtils.Delete_Folder_Job_Name=Deleting folder
+FtpUtils.Delete_File_Job_Name=Deleting file
+FtpUtils.FailedToMakeDir_ConsoleMsg=Failed to create temporary directory. Can not download file '
+FtpUtils.FailedToOpenDefaultEditor_ErrMsg1=Failed to open default editor for file '
+FtpUtils.FailedToOpenDefaultEditor_ErrMsg2='.\nDo you want to open it as plain text?
+FtpUtils.FailedToOpenEditor_ErrMsg=Failed to open editor for file. Reason was 
+FtpUtils.FailedToOpenFile_ErrMsg=Failed to open file, because it was not found from file system.
+FtpUtils.FailedToPaste_ErrMsg=Failed to paste files and folders.
+FtpUtils.PasteFileJob_Name=Pasting file 
+FtpUtils.RenameFile_DlgName=Rename file
+FtpUtils.RenameFolder_DlgName=Rename folder
+FtpUtils.RenameJob_Name=Renaming file 
+FtpUtils.Select_Folder_DlgMsg=Select folder where to save downloaded file.
+FtpUtils.Select_Folder_DlgText=Select folder
+FtpUtils.DestinationIsSubfolder_ErrMsg1=Cannot copy '
+FtpUtils.DestinationIsSubfolder_ErrMsg2=' to it's subfolder.
+FtpUtils.SourceSameAsDestination_ErrMsg1=Cannot copy '
+FtpUtils.SourceSameAsDestination_ErrMsg2=' because destination is same as source folder.
+FtpView.Failed_To_Create_File_Transfer_View_ConsoleMsg=Failed to create file transfer view: 
+FtpView.FreeSpace_ColumnTitle=Free
+FtpView.Name_ColumnTitle=Name
+FtpView.Open_Preferences_Tooltip=Open Preferences page dialog
+FtpView.Preferences_MenuItem=Preferences
+FtpView.Size_ColumnTitle=Size
+ViewContentProvider.Failed_List_Content_ConsoleMsg=Failed to list contents from directory '
+ViewContentProvider.ViewContentProvider.InvalidPath_ErrMsg1=Can not get '
+ViewContentProvider.ViewContentProvider.InvalidPath_ErrMsg2=' directory from current folder.
+FileDownloadJob.CancelingDownload_SubTaskName=Canceling download. It will take for a while before cancellation is complete.
+FileDownloadJob.Download_Failed_ConsoleErrorMsg=Failed to download file.
+FileDownloadJob.Download_File_SubTaskName=Downloading file from device
+FileDownloadJob.Download_File_TaskName=Download file
+FileDownloadJob.DownloadEnded_SubTaskName=Downloading ended.
+FileDownloadJob.DownloadInQueue_SubTaskName=Download waiting in queue.
+FileDownloadJob.DownloadStarted_SubTaskName=Downloading started.
+FileDownloadJob.Write_File_To_Disk_SubTaskName=Writing file to disk
+FileDropTargetListener.TransferFilesOnly_MsgBoxText=Only files can be transfered to the device.
+FtpUtils.Upload_File_Job_Name=Uploading file
+FileUploadJob.CancelingUpload_SubTaskName=Canceling upload.
+FileUploadJob.Upload_File_TaskName=Upload file
+FileUploadJob.Upload_File_SubTaskName=Uploading file to device
+FileUploadJob.Read_File_From_Disk_SubTaskName=Reading file from disk
+FileUploadJob.Upload_Failed_ConsoleErrorMsg=Failed to upload file.
+FileUploadJob.UploadEnded_SubTaskName=Uploading ended.
+FileUploadJob.UploadInQueue_SubTaskName=Upload waiting in queue.
+FileUploadJob.UploadStarted_SubTaskName=Uploading started.
+FolderNameDialog.Dialog_Label=New Folder
+FolderNameDialog.Folder_Name_Label=Enter name for the new folder
+MakeDirJob.Make_Dir_Task_Name=Creating directory
+MakeDirJob.MakeDir_Failed_ConsoleErrorMsg=Failed to make directory
+DeleteDirJob.Delete_Dir_Task_Name=Deleting directory
+DeleteDirJob.DeleteDir_Failed_ConsoleErrorMsg=Failed to delete directory
+DeleteFileJob.Delete_File_Task_Name=Deleting file
+DeleteFileJob.DeleteFile_Failed_ConsoleErrorMsg=Failed to delete file
+DriveNameDialog.SelectDrive_DialogText=Select drive
+DriveNameDialog.ShowDrive_DlgTitle=Show Drive
+FtpPreferencesUI.AddDrive_Button_Text=Add
+FtpPreferencesUI.Delete_Confirm_CheckButton_Text=Confirm deleting file or folder
+FtpPreferencesUI.Download_Confirm_CheckButton_Text=Confirm file replacement for download
+FtpPreferencesUI.Ftp_Drives_Groupname=Drives Shown
+FtpPreferencesUI.GetDriveListFromDevice_CheckBoxText=Get drive list from the device, if supported.
+FtpPreferencesUI.Paste_Confirm_CheckButton_Text=Confirm replacement for paste
+FtpPreferencesUI.RemoveDrive_Button_Text=Remove
+FtpPreferencesUI.Upload_Confirm_CheckButton_Text=Confirm file replacement for upload
+NaviPaneAction.Navikeys_Action_Text=Navi keys
+NaviPaneAction.Navikeys_Action_Tooltip=Show navi keys
+NaviPaneComposite.Key_App=App
+NaviPaneComposite.Key_Camera=CAM
+NaviPaneComposite.Key_Clear=Clear
+NaviPaneComposite.Key_Edit=EDIT
+NaviPaneComposite.Key_End=End
+NaviPaneComposite.Key_LeftSof=LSoft
+NaviPaneComposite.Key_NaviEast=Right
+NaviPaneComposite.Key_NaviNorth=Up
+NaviPaneComposite.Key_NaviSouth=Down
+NaviPaneComposite.Key_NaviWest=Left
+NaviPaneComposite.Key_Power=PWR
+NaviPaneComposite.Key_RightSoft=RSoft
+NaviPaneComposite.Key_Select=Select
+NaviPaneComposite.Key_Send=Send
+NaviPaneComposite.Key_Voice=VOI
+PasteAction.Action_Name=Paste
+PasteAction.Tooltip_Name=Paste
+PasteJob.FailedPaste_ErrMsg=Failed to paste 
+PasteJob.FailedPaste_ErrMsg2=\ to 
+PasteJob.Task_Name=Pasting file 
+PathComposite.directoryPath_LabelText=Path
+PathComposite.goButton_TooltipText=Go to directory
+
+TouchScreenHandler.TapScreenToolBar_Msg=Tapping screen in the device
+ScreenView.Open_Keyboard_Action=Keyboard
+ScreenView.Open_Keyboard_Action_Tooltip=Show keyboard view
+SwitchKeyboardAction.SwitchToQwerty_Text=Switch to QWERTY Keyboard
+SwitchKeyboardAction.SwitchToSimple_Text=Switch to Simple Keyboard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/OpenKeyboardAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.s60tools.remotecontrol.keyboard.ui.view.KeyboardView;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+
+/**
+ * Action for opening Keyboard view
+ */
+public class OpenKeyboardAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 */
+	public OpenKeyboardAction(String text, String tooltip) {
+		super(text,	tooltip, IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_KEYBOARD_VIEW));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		try {
+			KeyboardView.getViewInstance();
+		} catch (PartInitException e) {
+			e.printStackTrace();
+			RemoteControlConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/SaveMultiScreenshotsAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenView;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+/**
+ * Action for saving current image and all future images.
+ */
+public class SaveMultiScreenshotsAction extends S60ToolsBaseAction {
+	/**
+	 * Text for start action.
+	 */
+	private static final String startText = Messages.getString("SaveMultiScreenshotsAction.SaveScreenshots_Text"); //$NON-NLS-1$
+	/**
+	 * Text for stop action.
+	 */
+	private static final String stopText = Messages.getString("SaveMultiScreenshotsAction.StopSavingScreenshots_Text"); //$NON-NLS-1$
+	/**
+	 *  Tooltip for start action.
+	 */
+	private static final String startTooltip = Messages.getString("SaveMultiScreenshotsAction.SaveScreenshots_Tooltip"); //$NON-NLS-1$
+	/**
+	 *  Tooltip for stop action.
+	 */
+	private static final String stopTooltip = Messages.getString("SaveMultiScreenshotsAction.StopSavingScreenshots_Tooltip"); //$NON-NLS-1$
+	
+	/**
+	 * Boolean if all screenshots are saved.
+	 */
+	private boolean saveScreenshots = false;
+	
+	/**
+	 * Owner of this action.
+	 */
+	private final ScreenView screenView;
+
+	/**
+	 * Constructor
+	 * @param screenView Owner of this action.
+	 */
+	public SaveMultiScreenshotsAction(ScreenView screenView) {
+		super(startText, startTooltip,
+				IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_START_MULTI_SCREENSHOT));
+		this.screenView = screenView;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		saveScreenshots = !saveScreenshots;
+		screenView.getScreenSettings().setSavingAllScreenshots(saveScreenshots);
+
+		if(saveScreenshots) {
+			showSavingMessage();
+			screenView.saveCurrentScreenDefaultValues();
+		} else {
+			showSaveCount();
+		}
+		
+		updateImage();
+		screenView.updateActionButtonStates();
+	}
+	
+	/**
+	 * Set status for saving all screenshots. This can be used to change
+	 * state from outside. Needed when there comes error when saving images.
+	 * @param saveScreenshots True if all screenshots are saved. False otherwise.
+	 */
+	public void setSaving(boolean saveScreenshots) {
+		if(this.saveScreenshots && !saveScreenshots) {
+			showSaveCount();
+		}
+		else if(!this.saveScreenshots && saveScreenshots) {
+			showSavingMessage();
+		}
+		
+		this.saveScreenshots = saveScreenshots;
+		screenView.getScreenSettings().setSavingAllScreenshots(saveScreenshots);
+		// Updating image.
+		updateImage();
+	}
+	
+	/**
+	 * Sets description to inform user that images are being saved.
+	 */
+	private void showSavingMessage() {
+		String location = RCPreferences.getScreenShotSaveLocation();
+		screenView.updateDescription(Messages.getString("SaveMultiScreenshotsAction.SavingImages_DescMsg") + location); //$NON-NLS-1$
+	}
+
+	/**
+	 * Updates description to show how many images were saved and to where.
+	 */
+	private void showSaveCount() {
+		// Showing information about saved images to the user in description field.
+		int imagesSaved = screenView.getScreenSettings().getImagesSaved();
+		String location = RCPreferences.getScreenShotSaveLocation();
+		screenView.updateDescription(imagesSaved + Messages.getString("SaveMultiScreenshotsAction.ImagesSavedTo_DescMsg") + location); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Updates correct image to action depending on status.
+	 */
+	private void updateImage(){
+		if(saveScreenshots){
+			setImageDescriptor(ImageResourceManager.
+					getImageDescriptor(ImageKeys.IMG_STOP_MULTI_SCREENSHOT));
+			setText(stopText);
+			setToolTipText(stopTooltip);
+		} else {
+			setImageDescriptor(ImageResourceManager.
+					getImageDescriptor(ImageKeys.IMG_START_MULTI_SCREENSHOT));
+			setText(startText);
+			setToolTipText(startTooltip);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/SaveSingleScreenshotAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,153 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.screen.ui.actions;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.widgets.FileDialog;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.common.ProductInfoRegistry;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenSettings;
+import com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenView;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+import com.nokia.s60tools.ui.actions.S60ToolsBaseAction;
+
+
+/**
+ * Action for saving current screen.
+ */
+public class SaveSingleScreenshotAction extends S60ToolsBaseAction {
+	
+	/**
+	 * Owner of this action.
+	 */
+	private final ScreenView screenView;
+
+	/**
+	 * Constructor
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 * @param screenView Owner of this action.
+	 */
+	public SaveSingleScreenshotAction(String text, String tooltip, ScreenView screenView) {
+		super(text,	tooltip, IAction.AS_PUSH_BUTTON,
+				ImageResourceManager.getImageDescriptor(ImageKeys.IMG_SAVE_SCREENSHOT));
+		this.screenView = screenView;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		Image screenShot = null;
+		try {
+			screenShot = ScreenSettings.getScreenShotCopy();
+		} catch (Exception e) {
+			showScreenNotAvailableError();
+			return;
+		}
+		if(screenShot == null){
+			showScreenNotAvailableError();
+			return;
+		}
+		// We have valid image => saving it
+		if(RCPreferences.getAskLocationAlways()) {
+			saveScreenShot(screenShot);
+		} else {
+			screenView.saveCurrentScreenDefaultValues();
+		}
+		
+		screenShot.dispose();
+	}
+
+
+	/**
+	 * Ask save location from user and stores the image.
+	 * @param screenShot Screen shot to be saved.
+	 */
+	private void saveScreenShot(Image screenShot) {
+		//
+		// Creating save dialog
+		//
+		FileDialog saveDialog = new FileDialog(RemoteControlActivator.getCurrentlyActiveWbWindowShell(), SWT.SAVE);
+		
+		//
+		// Setting save dialog parameters
+		//
+		try {
+			// Setting default save location
+			String screenShotSaveLocation = RCPreferences.getInternalScreenShotSaveLocation();
+			File saveLocFile = new File(screenShotSaveLocation);
+			if(saveLocFile.exists() && saveLocFile.isDirectory()){
+				// Just making sure that we really have a valid absolute path at hand
+				screenShotSaveLocation = saveLocFile.getAbsolutePath(); 
+			}
+			else{
+				// Otherwise using workspace root location as default
+				IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
+				screenShotSaveLocation = wsRoot.getLocation().toString();				
+			}			
+			saveDialog.setFilterPath(screenShotSaveLocation);
+		} catch (Exception e) {
+			// Could not resolve/set default save location then not setting one, and continuing
+		}
+		// Setting supported extensions
+		saveDialog.setFilterExtensions(new String[]{"*.png", "*.*"});//$NON-NLS-1$ //$NON-NLS-2$
+		// Setting default file name
+		saveDialog.setFileName(ProductInfoRegistry.getProductName() + Messages.getString("SaveSingleScreenshotAction.DefaultScreenShotFileName_Postfix"));  //$NON-NLS-1$
+		// Setting overwrite mode
+		saveDialog.setOverwrite(true); // Confirming possible overwrite from user
+		
+		//
+		// Running save dialog
+		//
+		String destinationFileAbsolutePath = saveDialog.open();
+		if(destinationFileAbsolutePath != null){
+			// Doing actual save if got valid path as result (not pressed Cancel)
+			ImageLoader imgLoader = new ImageLoader();
+			imgLoader.data = new ImageData[]{screenShot.getImageData()};
+			imgLoader.save(destinationFileAbsolutePath, SWT.IMAGE_PNG);
+			// Storing parent directory path for future use in next usage/sessions
+			RCPreferences.setInternalScreenShotSaveLocation(new File(destinationFileAbsolutePath).getParent());
+		}
+	}
+
+	/**
+	 * Shows error message to user in case there was no image available. 
+	 */
+	private void showScreenNotAvailableError() {
+		RemoteControlMessageBox infoMsg = new RemoteControlMessageBox(Messages.getString("SaveSingleScreenshotAction.ScreenImageNotAvailable_InfoMsg"), SWT.OK | SWT.ICON_INFORMATION); //$NON-NLS-1$
+		infoMsg.open();
+	}
+	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/actions/ZoomAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+import com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenView;
+
+/**
+ * Action that toggles full screen mode on and off.
+ */
+public class ZoomAction  extends Action {
+
+	/**
+	 * Reference to screen view.
+	 */
+	private ScreenView screenView;
+	/**
+	 * Zoom factor for the action.
+	 */
+	private final ZoomFactor zoomFactor;
+	
+	/**
+	 * Zoom factors supported by Zoom functionality.
+	 * All zoom factors keep the original picture ratio.
+	 */
+	public enum ZoomFactor{
+		ZOOM_TO_FIT, 
+		ZOOM_TO_HEIGHT, 
+		ZOOM_TO_WIDTH, 
+		ZOOM_TO_50_PERCENT, 
+		ZOOM_TO_100_PERCENT, 
+		ZOOM_TO_200_PERCENT, 
+		ZOOM_TO_400_PERCENT 
+	}
+
+	/**
+	 * Constructor
+	 * @param view View object that owns the action.
+	 * @param text Action's visible text.
+	 * @param tooltip Action's tooltip text.
+	 */
+	public ZoomAction(ScreenView screenView, String text, String tooltip, ZoomFactor zoomFactor){
+		super(text, IAction.AS_CHECK_BOX);
+		this.zoomFactor = zoomFactor;
+		setToolTipText(tooltip);
+		this.screenView = screenView;
+		if(zoomFactor == screenView.getScreenSettings().getZoomFactor()){
+			setChecked(true);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.Action#run()
+	 */
+	public void run() {
+		screenView.getScreenSettings().setZoomFactor(zoomFactor);
+		screenView.updateZoom();
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/AppKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * Command handler for App key
+ */
+public class AppKeyCommandHandler extends BaseCommandHandler {
+
+	/**
+	 * Timestamp when first key press has occured.
+	 * Adjusted to zero after key press event is sent to keyboard mediator.
+	 */
+	private long firstPressTime = 0;
+	
+	/**
+	 * Timestamp when latest key press has occured
+	 * Adjusted to zero after key press event is sent to keyboard mediator.
+	 */
+	private long latestPressTime = 0;
+	
+	/**
+	 * Is handler capable to receive events.
+	 */
+	private boolean isEnabled = true;
+	
+	/**
+	 * Keeping home button down more than 700 ms is handled as long press
+	 */
+	private static final int HOME_LONG_PRESS_TIME = 700;
+	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// Take timestamp
+		long time = System.currentTimeMillis();
+		
+		if (firstPressTime == 0) {
+			// Save timestamp when key is first time pressed down. We need this
+			// value for solving is this long key press or normal key press. 
+			firstPressTime = time;
+			latestPressTime = time;
+			
+			// Start thread for waiting more events
+			Thread thread = new LongPressThread();
+			thread.start();
+			
+		} else {
+			// Save timestamp of latest event
+			latestPressTime = time;
+		}
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#isEnabled()
+	 */
+	public boolean isEnabled() {
+		return isEnabled;
+	}
+
+	/**
+	 * Thread for sending key events. Solves is user is kept key down
+	 * or just pressed it.
+	 */
+	private class LongPressThread extends Thread {
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run(){
+			try {
+				// Sleep time specified for long press. 
+				sleep(HOME_LONG_PRESS_TIME);
+				
+				if (firstPressTime == latestPressTime ) {
+					// There has not came second press event so button was not kept down
+					// Send key pressed event
+					scanCodeKeyPressed(IKeyEventService.SCANCODE_APP);
+				}
+				else {
+					// Long press
+					// Disable receiveing events while sending event
+					isEnabled = false;
+					// Send key pressed and hold event
+					scanCodeKeyPressedAndHold(IKeyEventService.SCANCODE_APP, HOME_LONG_PRESS_TIME);
+					// Wait a moment before registering new events. This is because user may keep
+					// key down longer that 600ms and without this sleep we will be received some
+					// extra key events.
+					sleep(1000);
+					isEnabled = true;
+				}
+				
+				// Reset timestamps
+				firstPressTime = 0;
+				latestPressTime = 0;
+				
+			} catch (InterruptedException e) {
+				RemoteControlConsole.getInstance().println(Messages.getString("KeyCommandHandler.FailedToSendEvent_ErrorMsg") //$NON-NLS-1$
+						+ e.getMessage(), RemoteControlConsole.MSG_ERROR);
+				e.printStackTrace();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/BaseCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.commands.IHandlerListener;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+
+/**
+ * Base class for command handlers
+ */
+public class BaseCommandHandler implements IHandler{
+
+	/**
+	 * Keyboard mediator to delegate events to.
+	 */
+	private IKeyboardMediator keyboardMediator;
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// Implemented in child classes
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#addHandlerListener(org.eclipse.core.commands.IHandlerListener)
+	 */
+	public void addHandlerListener(IHandlerListener handlerListener) {
+		// Register keyboard mediator
+		keyboardMediator = RemoteControlActivator.getKeyboardMediator();
+		keyboardMediator.registerKeyboardMediatorClient(this);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#dispose()
+	 */
+	public void dispose() {
+		//Not used
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#isEnabled()
+	 */
+	public boolean isEnabled() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#isHandled()
+	 */
+	public boolean isHandled() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.IHandler#removeHandlerListener(org.eclipse.core.commands.IHandlerListener)
+	 */
+	public void removeHandlerListener(IHandlerListener handlerListener) {
+		// Unregister keyboard mediator
+		keyboardMediator.unregisterKeyboardMediatorClient(this);
+	}
+	
+	/**
+	 * Sends scancode
+	 * @param scanCode Scan code
+	 */
+	protected void scanCodeKeyPressed(int scanCode) {
+		keyboardMediator.scanCodeKeyPressed(this, scanCode);
+	}
+	
+	protected void scanCodeKeyPressedAndHold(int scanCode, int delay) {
+		keyboardMediator.scanCodeKeyPressedAndHold(this, scanCode, delay);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/ClearKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Clear soft key
+ */
+public class ClearKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_CLEAR);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/EditKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Edit soft key
+ */
+public class EditKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_EDIT);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/EndKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for End soft key
+ */
+public class EndKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_END);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/GripClosedKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Grip closed soft key
+ */
+public class GripClosedKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_GRIP_CLOSED);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/GripOpenKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Grip open soft key
+ */
+public class GripOpenKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_GRIP_OPEN);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/LeftSoftKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Left soft key
+ */
+public class LeftSoftKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_SOFTLEFT);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviCenterKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Center navi key
+ */
+public class NaviCenterKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_CENTERPUSH);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviEastKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for East navi key
+ */
+public class NaviEastKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_EAST);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviNorthKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for North navi key
+ */
+public class NaviNorthKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_NORTH);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviSouthKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for South navi key
+ */
+public class NaviSouthKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_SOUTH);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/NaviWestKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for West navi key
+ */
+public class NaviWestKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_WEST);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/PowerKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Power soft key
+ */
+public class PowerKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_POWER);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/RightSoftKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Right soft key
+ */
+public class RightSoftKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_SOFTRIGHT);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/SendKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Send soft key
+ */
+public class SendKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_SEND);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/commands/SideKeyCommandHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+
+/**
+ * Command handler for Side (Voice) soft key
+ */
+public class SideKeyCommandHandler extends BaseCommandHandler {
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.screen.ui.commands.BaseCommandHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		scanCodeKeyPressed(IKeyEventService.SCANCODE_NAVI_VOICE);
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenSaverThread.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,333 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.view;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.ui.dialogs.RemoteControlMessageBox;
+
+/**
+ * This class is used for saving screen shots based on preferences.
+ * Stores images to queue and saves them sequentially with correct file name.
+ */
+public class ScreenSaverThread extends Thread {
+	
+	/**
+	 * Queue keeping images track on images that need to be saved later.
+	 */
+	private LinkedBlockingQueue<byte[]> imageQueue;
+
+	/**
+	 * Boolean if this thread should be running.
+	 */
+	private boolean running = true;
+
+	/**
+	 * Screen view.
+	 */
+	private final ScreenView screenView;
+	
+	/**
+	 * Amount if images that will be saved before asking if user wants to continue
+	 * saving more images.
+	 */
+	private final int IMAGES_SAVED_BEFORE_NOTE = 1000;
+	
+	/**
+	 * Constructor.
+	 * @param screenView Screen view.
+	 */
+	public ScreenSaverThread(ScreenView screenView) {
+		this.screenView = screenView;
+		imageQueue = new LinkedBlockingQueue<byte[]>();
+	}
+	
+	/**
+	 * Adds image to the queue from which it will be saved to file system later.
+	 * @param image to be saved.
+	 */
+	public synchronized void addImageToQueue(byte[] image) {
+		if(running) {
+			imageQueue.add(image);
+		}
+	}
+	
+	/**
+	 * Stops the thread.
+	 */
+	public void stopThread() {
+		running = false;
+		
+		imageQueue.clear();
+	}
+
+	/**
+	 * Saves image to file system using values that are in preferences.
+	 * @param image Image to be saved.
+	 * @return True if save succeeded. False otherwise.
+	 */
+	private boolean saveImageDefaultValues(byte[] image) throws IOException {
+		
+		// Checking the path in preferences.
+		File filePath = new File(RCPreferences.getScreenShotSaveLocation());
+		if(filePath.isDirectory()) {
+			// Image can be saved, because folder is ok.
+			File fileNameWithPath = getNextFileName(filePath);
+			saveImage(fileNameWithPath, image);
+			return true;
+		} else {
+			// Image cannot be saved, because folder was not found.
+			String msg = Messages.getString("ScreenSaverThread.InvalidPath_ErrorMsg"); //$NON-NLS-1$
+			
+			errorMsgBoxRunnable msgBoxRunnable = new errorMsgBoxRunnable(msg);
+			
+			Display.getDefault().asyncExec(msgBoxRunnable);
+		}
+		return false;
+	}
+	
+	/**
+	 * Open Remote control preferences page
+	 */
+	private void openPreferencePage() {
+		
+		PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
+				RemoteControlActivator.getCurrentlyActiveWbWindowShell(),
+				RCPreferencePage.PAGE_ID,
+				null,
+				null);
+
+		dialog.open();
+	}	
+	
+	/**
+	 * Gets next valid file name that can be used to save image.
+	 * Checks given directory if it already contains files with same name
+	 * and then creates new file name that doesn't exist.
+	 * @param directory Directory to be checked.
+	 * @return File name that can be used to save image.
+	 */
+	private File getNextFileName(File directory) {
+		String fileName = RCPreferences.getScreenshotFileName();
+		
+		// Getting files that have matching file name.
+		FileFilter filter = new FileFilter(directory, fileName);
+		String[] files = directory.list(filter);
+		
+		// Checking if there is already file with bigger index.
+		int index = 0;
+		for(String tmpFileName : files) {
+			// Index can be extracted because only files which contain index get through filter.
+			String fileIndex = tmpFileName.substring(tmpFileName.lastIndexOf('(') + 1, tmpFileName.lastIndexOf(')'));
+			int tmpIndex = Integer.parseInt(fileIndex);
+			if(tmpIndex > index) {
+				index = tmpIndex;
+			}
+		}
+		
+		// Making sure that file does not exist already.
+		File nextFile;
+		do {
+			// Updating index to prevent using existing index. 
+			index++;
+			nextFile = new File(directory.getPath() + File.separator + fileName + "(" + index  + ").png"); //$NON-NLS-1$ //$NON-NLS-2$
+		} while(nextFile.exists());
+		
+		return nextFile;
+	}
+	
+	/**
+	 * Saves given image with given file name/path.
+	 * @param fileName Name and path of file where image is saved.
+	 * @param imageData Image to be saved.
+	 */
+	private void saveImage(File fileName, byte[] imageData) throws IOException {
+		// Write file to disk
+		
+		OutputStream out = new FileOutputStream(fileName);
+		out.write(imageData);
+		out.close();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Thread#run()
+	 */
+	public void run() {
+
+		byte[] image = null;
+		while(running) {
+			try {
+				image = imageQueue.poll(50, TimeUnit.MILLISECONDS);
+
+				if(image != null) {
+					// New image was found from queue, saving it.
+					if(saveImageDefaultValues(image)) {
+						screenView.getScreenSettings().imageSaved();
+						if(screenView.getScreenSettings().getImagesSaved() == IMAGES_SAVED_BEFORE_NOTE) {
+							// Pre-defined amount of images saved since starting saving.
+							// Showing error message from UI thread.
+							Runnable showErrorMessage = new Runnable(){
+								public void run() {
+									String msg = IMAGES_SAVED_BEFORE_NOTE + Messages.getString("ScreenSaverThread.SaveAllScreenshotsConfirmation_MessageText"); //$NON-NLS-1$
+									RemoteControlMessageBox msgBox = new RemoteControlMessageBox(
+											msg, SWT.YES | SWT.NO | SWT.ICON_QUESTION);
+
+									int result = msgBox.open();
+									if(result == SWT.NO) {
+										stopSavingScreenshots();
+									}
+								}
+							};
+							Display.getDefault().asyncExec(showErrorMessage);
+						}
+					}
+				}
+
+				image = null;
+
+			} catch (final Exception e) {
+				
+				// Showing error message from UI thread.
+				Runnable showErrorMessage = new Runnable(){
+					public void run() {
+						// Preventing more images to cause same error message.
+						stopSavingScreenshots();
+						
+						String msg = Messages.getString("ScreenSaverThread.FailedToSaveImage_ErrorMsg1") //$NON-NLS-1$
+							+ RCPreferences.getScreenShotSaveLocation() + 
+							Messages.getString("ScreenSaverThread.FailedToSaveImage_ErrorMsg2") + e.getMessage(); //$NON-NLS-1$
+						RemoteControlMessageBox msgBox = new RemoteControlMessageBox(
+								msg, SWT.ICON_ERROR);
+
+						msgBox.open();
+					}
+				};
+				Display.getDefault().asyncExec(showErrorMessage);
+
+			}
+		}
+	}
+
+	/**
+	 * Stops the save all screenshots action.
+	 */
+	private void stopSavingScreenshots() {
+		// Preventing more images to cause same error message.
+		screenView.getScreenSettings().setSavingAllScreenshots(false);
+		screenView.updateActionButtonStates();
+		imageQueue.clear();
+	}
+	
+	/**
+	 * Runnable for showing error message with option to show preferences page.
+	 */
+	private class errorMsgBoxRunnable implements Runnable {
+
+		/**
+		 * Message to be shown.
+		 */
+		private final String msg;
+
+		/**
+		 * Constructor.
+		 * @param msg Message that is shown to user.
+		 */
+		public errorMsgBoxRunnable(String msg) {
+			this.msg = msg;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.lang.Runnable#run()
+		 */
+		public void run() {
+			// Preventing more images to cause same error message.
+			stopSavingScreenshots();
+			
+			RemoteControlMessageBox msgBox = new RemoteControlMessageBox(
+					msg, SWT.YES | SWT.NO | SWT.ICON_ERROR);
+			
+			int result = msgBox.open();
+
+			// Opening preferences if Yes is selected.
+			if(result == SWT.YES){
+				openPreferencePage();
+			}
+		}
+	}
+	
+	/**
+	 * Filter that can be used to for getting indexed image files with
+	 * given name prefix.
+	 */
+	private class FileFilter implements FilenameFilter {
+
+		/**
+		 * Directory that is used to compare.
+		 */
+		private final File defaultDir;
+		/**
+		 * File name that is used to compare.
+		 */
+		private final String defaultName;
+
+		/**
+		 * Constructor.
+		 * @param defaultDir Directory that is used to compare.
+		 * @param defaultName File name that is used to compare.
+		 */
+		public FileFilter(File defaultDir, String defaultName) {
+			this.defaultDir = defaultDir;
+			this.defaultName = defaultName;
+		}
+
+		/* (non-Javadoc)
+		 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
+		 */
+		public boolean accept(File dir, String name) {
+			if(dir != defaultDir) {
+				return false;
+			}
+			
+			// Matches to e.g. defaultName(123).png
+			String regex = "\\A" + defaultName + "\\([0-9]+\\)\\.png\\z"; //$NON-NLS-1$ //$NON-NLS-2$
+			Pattern pattern = Pattern.compile(regex);
+			Matcher matcher = pattern.matcher(name);
+			if(matcher.find()) {
+				return true;
+			}
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenSettings.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.view;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferenceConstants;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.ZoomAction;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.ZoomAction.ZoomFactor;
+
+/**
+ * This class stores current settings for the screen view.
+ */
+public class ScreenSettings {
+
+	/**
+	 * Screen image should be accessed only via synchronized getters and setters!
+	 */
+	private static Image screenImage = null;
+	
+	/**
+	 * Screen image as bytes.
+	 */
+	private static byte[] imageData = null;
+
+	/**
+	 * Percentage of how much screenImage is currently resized on screen.
+	 */
+	private double zoomPercent = 1.0;
+	
+	/**
+	 * Contains currently used zoom factor. Using 100% at default.
+	 */
+	private ZoomAction.ZoomFactor zoomFactor = ZoomFactor.ZOOM_TO_100_PERCENT;
+
+	/**
+	 * Screen mode
+	 */
+	private HTIScreenMode screenMode = null;
+	
+	/**
+	 * Screen capture refresh time
+	 */
+	private int refreshTime = 1000;
+	
+	/**
+	 * Timeout for request
+	 */
+	private int timeoutTime = 2000;
+	
+	/**
+	 * Color mode
+	 */
+	private byte colorChoice = RCPreferenceConstants.colorCodes[0];
+	
+	/**
+	 * Flag keeping track if all screenshots should be saved.
+	 */
+	private boolean savingAllScreenshots = false;
+	
+	/**
+	 * Keeps track on how many images have been saved since starting to save all
+	 * screenshots.
+	 */
+	private int imagesSaved;
+	
+	/**
+	 * Constructor.
+	 */
+	public ScreenSettings() {
+		imagesSaved = 0;
+	}
+	
+	/**
+	 * Get refresh time and color choice values from prefstore
+	 */
+	public void getPreferences() {
+		refreshTime = RCPreferences.getRefreshDelayInt();
+		colorChoice = RCPreferences.getColorModeByte();
+	}
+	
+	/**
+	 * Synchronized getter for screen image.
+	 * @return the screenImage
+	 */
+	public static synchronized Image getScreenImage(){
+		return screenImage;
+	}
+
+	/**
+	 * @param imageData the imageData to set
+	 */
+	public static synchronized void setImageData(byte[] imageData) {
+		ScreenSettings.imageData = imageData;
+	}
+	
+	/**
+	 * Synchronized getter for screen data.
+	 * @return the imageData
+	 */
+	public static synchronized byte[] getImageData() {
+		return imageData;
+	}
+	
+	/**
+	 * Synchronized setter for screen image.
+	 * This method handles disposing earlier image, if it exists.
+	 * @param screenImage the screenImage to set
+	 * @param imageData the data for image.
+	 */
+	public static synchronized void setScreenImage(Image screenImage, byte[] imageData) {
+		
+		ScreenSettings.setImageData(imageData);
+		
+		// Old Image needs to be disposed, so that it won't use resources. 
+		if(ScreenSettings.screenImage != null) {
+			ScreenSettings.screenImage.dispose();
+		}
+		
+		ScreenSettings.screenImage = screenImage;
+	}
+
+	/**
+	 * Copies the current screen image and returns it as new image instance.
+	 * Caller of this method needs to dispose image after it is not needed.
+	 * @return Copy instance of the current screen image.
+	 */
+	public static Image getScreenShotCopy(){
+		return new Image(Display.getCurrent(), getScreenImage(), SWT.IMAGE_COPY);
+	}
+	
+	/**
+	 * Synchronized getter for screen mode.
+	 * @return the screenMode
+	 */
+	public synchronized HTIScreenMode getScreenMode(){
+		return screenMode;
+	}
+
+	/**
+	 * Synchronized setter for screen mode.
+	 * @param screenMode the screenMode to set
+	 */
+	public synchronized void setScreenMode(HTIScreenMode screenMode) {
+		this.screenMode = screenMode;
+	}
+	
+	/**
+	 * Sets zoom percent used for current screen.
+	 * @param zoomPercent The zoomPercent used for current screen.
+	 */
+	public synchronized void setZoomPercent(double zoomPercent) {
+		this.zoomPercent = zoomPercent;
+	}
+
+	/**
+	 * Gets zoom percent used for current screen.
+	 * @return The zoomPercent used for current screen.
+	 */
+	public synchronized double getZoomPercent() {
+		return zoomPercent;
+	}
+	
+	/**
+	 * Sets zoom factor for current screen.
+	 * @param zoomFactor The zoomFactor to set.
+	 */
+	public synchronized void setZoomFactor(ZoomAction.ZoomFactor zoomFactor) {
+		this.zoomFactor = zoomFactor;
+	}
+
+	/**
+	 * Gets zoom factor for current screen.
+	 * @return The zoomFactor.
+	 */
+	public synchronized ZoomAction.ZoomFactor getZoomFactor() {
+		return zoomFactor;
+	}
+
+	/**
+	 * Getter for refresh time.
+	 * @return Delay between capturing new screen.
+	 */
+	public int getRefreshTime() {
+		return refreshTime;
+	}
+
+	/**
+	 * Getter for timeout time.
+	 * @return Current timeout for screen capture.
+	 */
+	public int getTimeoutTime() {
+		return timeoutTime;
+	}
+
+	/**
+	 * Getter for color choice.
+	 * @return Currently selected color choice.
+	 */
+	public byte getColorChoice() {
+		return colorChoice;
+	}
+
+	/**
+	 * Sets if all screenshots should be saved.
+	 * @param savingAllScreenshots True if all screens should be saved. False otherwise.
+	 */
+	public void setSavingAllScreenshots(boolean savingAllScreenshots) {
+		if(!this.savingAllScreenshots && savingAllScreenshots) {
+			// Starting to save all screenshots. Resetting save count.
+			imagesSaved = 0;
+		}
+		this.savingAllScreenshots = savingAllScreenshots;
+	}
+
+	/**
+	 * Gets if all screenshots should be saved.
+	 * @return True if all screens should be saved. False otherwise.
+	 */
+	public boolean isSavingAllScreenshots() {
+		return savingAllScreenshots;
+	}
+
+	/**
+	 * Updates amount of images saved.
+	 */
+	public void imageSaved() {
+		imagesSaved++;
+	}
+
+	/**
+	 * Returns amount of images saved since starting saving all screenshots.
+	 * @return the imagesSaved
+	 */
+	public int getImagesSaved() {
+		return imagesSaved;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/ScreenView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,869 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.remotecontrol.screen.ui.view;
+
+import java.io.ByteArrayInputStream;
+import java.util.Arrays;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
+
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IScreenCaptureService;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.actions.OpenPreferencePageAction;
+import com.nokia.s60tools.remotecontrol.keyboard.IKeyboardMediator;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferencePage;
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.OpenKeyboardAction;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.SaveMultiScreenshotsAction;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.SaveSingleScreenshotAction;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.ZoomAction;
+import com.nokia.s60tools.remotecontrol.screen.ui.actions.ZoomAction.ZoomFactor;
+import com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.remotecontrol.ui.views.main.MainView;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * This class comprises the screen view of the Remote Control
+ * application.
+ */ 
+public class ScreenView extends AbstractUiFractionComposite implements PaintListener {
+	 
+	/**
+	 * We can get view ID at runtime once the view is instantiated, but we
+	 * also need static access to ID in order to be able to invoke the view.
+	 */
+	public static final String ID = "com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenView"; //$NON-NLS-1$
+		
+	//
+	// Actions
+	//	
+	
+	/**
+	 * Open preferences action
+	 */
+	private static Action preferencesAction;
+	
+	/**
+	 * Save single screenshot action
+	 */
+	private static Action saveSingleScreenshotAction;
+	
+	/**
+	 * Save multiple sequential screenshots action
+	 */
+	private static SaveMultiScreenshotsAction saveMultiScreenshotsAction;
+	
+	/**
+	 * Show keyboard view action
+	 */
+	private static Action keyboardAction;
+	
+	//
+	// Members.
+	//
+	
+	/**
+	 * Screen canvas
+	 */ 
+	private Canvas screenCanvas;
+	
+	/**
+	 * Default scroll bars for screen canvas.
+	 */
+	private ScrolledComposite screenScrollBarDefault;
+	
+	/**
+	 * Scroll bars for screen canvas.
+	 * Used with ZOOM_TO_WIDTH zoom factor.
+	 */
+	private ScrolledComposite screenScrollBarVertical;
+
+	/**
+	 * Scroll bars for screen canvas. 
+	 * Used with ZOOM_TO_HEIGHT zoom factor.
+	 */
+	private ScrolledComposite screenScrollBarHorizontal;
+
+	/**
+	 * Layout used to change between different scroll bars.
+	 */
+	private StackLayout scrollBarLayout;
+		
+	/**
+	 * Thread for capturing screen
+	 */
+	private volatile Thread screenCaptureThread;
+
+	/**
+	 * Thread for saving screenshots.
+	 */
+	private ScreenSaverThread screenSaverThread;
+
+	/**
+	 * Main view
+	 */
+	private final MainView mainView;
+	
+	/**
+	 * Property change listener
+	 */
+	private IPropertyChangeListener listener = null;
+	
+	/**
+	 * Listener for resize events.
+	 */
+	private ControlListener resizeListener = null;
+	
+	/**
+	 * Touch screen handler
+	 */
+	private TouchScreenHandler touchScreenHandler = null;
+	
+	/**
+	 * Keyboard mediator to delegate events to.
+	 */
+	private IKeyboardMediator keyboardMediator;
+	
+	/**
+	 * Instance of this class. Used for sending key events
+	 * to keyboard mediator.
+	 */
+	private ScreenView instance;
+	
+	//
+	// Constants
+	//
+	
+	/**
+	 * Screen is captured in png format.
+	 */
+	private static final String IMAGE_TYPE = "image/png"; //$NON-NLS-1$
+
+	/**
+	 * Amount that scroll bars are incremented by default.
+	 */
+	private static final int DEFAULT_SCROLL_INCREMENT = 100;
+
+	/**
+	 * Settings for current screen.
+	 */
+	private ScreenSettings screenSettings;
+	
+	/**
+	 * The constructor.
+	 * @param parentComposite Parent
+	 * @param style Style bits
+	 * @param mainView MainView
+	 */
+	public ScreenView(Composite parentComposite, int style, MainView mainView) {
+		super(parentComposite, style);
+		this.mainView = mainView;
+		this.instance = this;
+		screenSettings = new ScreenSettings();
+		screenSettings.getPreferences();
+		createPropertyChangeListener();
+		// Dummy screen mode, so that valid value is returned before first screen capture.
+		screenSettings.setScreenMode(new HTIScreenMode(0, 0, 0, 0, 0, 0));
+		
+		// Starting thread to capture screens from the device.
+		screenSaverThread = new ScreenSaverThread(this);
+		screenSaverThread.start();
+		screenCaptureThread = new screenCaptureThread();
+		screenCaptureThread.start();
+		
+		// Action button states needs to be updated after all resources have been created.
+		updateActionButtonStates();
+		createResizeListener();
+		
+		// Register to keyboard mediator
+		keyboardMediator = RemoteControlActivator.getKeyboardMediator();
+		keyboardMediator.registerKeyboardMediatorClient(this);
+	}
+	
+	/**
+	 * Create listener to listen screen resize messages. 
+	 */
+	private void createResizeListener() {
+		
+		resizeListener = new ControlAdapter() {
+			public void controlResized(ControlEvent e) {
+				// ScreenCanvas needs to be redrawn to keep screen zoomed.
+				screenCanvas.redraw();
+			}
+		};
+		
+		addControlListener(resizeListener);
+	}
+	
+	/**
+	 * Create change listener to prefstore preferences 
+	 */
+	private void createPropertyChangeListener() {
+		
+		// Call getPreferences() when prefstore values are changed
+		listener =
+			   new IPropertyChangeListener() {
+			      public void propertyChange(PropertyChangeEvent event) {
+			    	  screenSettings.getPreferences();
+			      }
+			   };
+			   
+			   RCPreferences.addPropertyChangeListener(listener);
+	}
+	
+	/**
+	 * Create main menu actions in here. The same actions
+	 * can be also used to populate context menus, if needed.
+	 */
+	private void createMainMenuActions() {
+		preferencesAction = new OpenPreferencePageAction(Messages.getString("ScreenView.Open_Preferences_Action"),  //$NON-NLS-1$
+				Messages.getString("ScreenView.Open_Preferences_Tooltip"), IAction.AS_PUSH_BUTTON,  //$NON-NLS-1$
+				ImageKeys.IMG_PREFERENCES, RCPreferencePage.Tabs.SCREENCAPTURE);
+		saveMultiScreenshotsAction = new SaveMultiScreenshotsAction(this);
+		saveSingleScreenshotAction = new SaveSingleScreenshotAction(Messages.getString("ScreenView.Save_Screenshot_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Save_Screenshot_Action_Tooltip"), this);  //$NON-NLS-1$
+		keyboardAction = new OpenKeyboardAction(Messages.getString("ScreenView.Open_Keyboard_Action"), Messages.getString("ScreenView.Open_Keyboard_Action_Tooltip"));  //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/**
+	 * This method fills action bars (no need for further modifications).
+	 */
+	protected void fillViewActionBars() {
+		IActionBars bars = mainView.getActionBars();
+		fillViewMainMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * View's main menu is populated in here.
+	 * @param manager Menu manager instance.
+	 */
+	private void fillViewMainMenu(IMenuManager manager) {
+		manager.removeAll();
+		manager.add(saveMultiScreenshotsAction);
+		manager.add(saveSingleScreenshotAction);
+		manager.add(keyboardAction);
+		manager.add(preferencesAction);		
+		manager.update(true);
+	}
+
+	/**
+	 * View's tool bar is populated in here.
+	 * @param manager Tool bar instance.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {
+		manager.removeAll();
+		manager.add(saveMultiScreenshotsAction);
+		manager.add(saveSingleScreenshotAction);
+		manager.add(preferencesAction);
+		manager.update(true);
+	}
+
+	/**
+	 * Hooks context menu to the current view.
+	 */
+	protected void hookContextMenu() {
+		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				ScreenView.this.fillContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(screenCanvas);
+		screenCanvas.setMenu(menu);
+		screenScrollBarDefault.setMenu(menu);
+		screenScrollBarHorizontal.setMenu(menu);
+		screenScrollBarVertical.setMenu(menu);
+		mainView.registerContextMenu(menuMgr, 
+				new ISelectionProvider() {
+						public void addSelectionChangedListener(ISelectionChangedListener listener) {
+						}
+						public ISelection getSelection() {
+							return new StructuredSelection(screenCanvas);
+						}
+						public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+						}
+						public void setSelection(ISelection selection) {
+						}
+					}
+				);
+	}
+
+	/**
+	 * Fills context menu.
+	 * @param manager used to fill menu.
+	 */
+	private void fillContextMenu(IMenuManager manager) {
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_To_Fit_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_To_Fit_Tooltip"), ZoomFactor.ZOOM_TO_FIT)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_To_Height_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_To_Height_Tooltip"), ZoomFactor.ZOOM_TO_HEIGHT)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_To_Width_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_To_Width_Tooltip"), ZoomFactor.ZOOM_TO_WIDTH)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_50%_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_50%_Tooltip"), ZoomFactor.ZOOM_TO_50_PERCENT)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_100%_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_100%_Tooltip"), ZoomFactor.ZOOM_TO_100_PERCENT)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_200%_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_200%_Tooltip"), ZoomFactor.ZOOM_TO_200_PERCENT)); //$NON-NLS-1$
+		manager.add(new ZoomAction(this, Messages.getString("ScreenView.Zoom_400%_Action"), //$NON-NLS-1$
+				Messages.getString("ScreenView.Zoom_400%_Tooltip"), ZoomFactor.ZOOM_TO_400_PERCENT)); //$NON-NLS-1$
+		// Other plug-ins can contribute actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+	
+	/**
+	 * Allows other classes to update content description.
+	 * @param newContentDescription New description.
+	 */
+	public void updateDescription(String newContentDescription){
+		mainView.updateDescription(newContentDescription);
+	}
+	
+	/**
+	 * Allows other classes to set default content description.
+	 */
+	public void setDefaultDescription() {
+		mainView.setDefaultDescription();
+	}
+
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	public void refresh(){
+		// Currently there is no need for refresh, because no data model views.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {		
+		super.dispose();
+
+		// Stopping screensaver thread
+		screenSaverThread.stopThread();
+		
+		// Ending capture thread.
+		screenCaptureThread = null;
+
+		// Images need to be disposed.
+		if(ScreenSettings.getScreenImage() != null){
+			ScreenSettings.setScreenImage(null, null);
+		}
+		// Remove property listener
+		if(listener != null){
+			RCPreferences.removePropertyChangeListener(listener);
+		}
+		
+		// Remove touch screen handler.
+		if(touchScreenHandler != null) {
+			screenCanvas.removeMouseListener(touchScreenHandler);
+			touchScreenHandler.dispose();
+		}
+		
+		// Unregister from keyboard mediator
+		keyboardMediator.unregisterKeyboardMediatorClient(this);
+	}
+
+	/**
+	 * Makes necessary changes to context menu and action bars.
+	 */
+	public void setAsActiveView(){
+		hookContextMenu();
+		fillViewActionBars();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
+	 */
+	public void paintControl(PaintEvent e) {
+		if(ScreenSettings.getScreenImage() != null){
+			
+			// Getting necessary variables.
+			Color backgroundColor = e.gc.getBackground();
+			Rectangle clientArea = screenCanvas.getClientArea();
+			Image image = new Image(Display.getCurrent(), clientArea.width, clientArea.height);
+			GC gc = new GC(image);
+			
+			// Drawing background with original color for image.
+			// Background and image is drawn to different GC to prevent flickering.
+			gc.setBackground(backgroundColor);
+			gc.fillRectangle(clientArea);
+			drawScreenImage(gc);
+			
+			// Drawing image with its correct size to screen.
+			e.gc.drawImage(image, 0, 0);
+			
+			// Disposing created objects.
+			gc.dispose();
+			image.dispose();
+		}
+		else{
+			// Filling screen with background color.
+			Rectangle clientArea = screenCanvas.getClientArea();
+			e.gc.fillRectangle(clientArea);
+
+			drawFirstScreenHelp(e);
+		}
+	}
+
+	/**
+	 * Draws current screen shot to given GC object.
+	 * @param gc Graphics object where current screen image is drawn.
+	 */
+	private void drawScreenImage(GC gc) {
+		
+		Image screenShot = ScreenSettings.getScreenShotCopy();
+		Rectangle screenSize = screenShot.getBounds();
+		Rectangle clientArea = ((ScrolledComposite)scrollBarLayout.topControl).getClientArea();
+
+		// Calculating destination width and height based on zoom factor. 
+		
+		double zoomPercent = getZoomPercent(screenSize, clientArea);
+		screenSettings.setZoomPercent(zoomPercent);
+		
+		int destWidth = (int) (screenSize.width * zoomPercent);
+		int destHeight = (int) (screenSize.height * zoomPercent);
+		
+		// Drawing the image.
+		gc.drawImage(screenShot, 0, 0, screenSize.width, screenSize.height, 0, 0, destWidth, destHeight);
+		screenShot.dispose();
+		
+		// Setting screenCanvas size to make scroll bars show correctly.
+		screenCanvas.setSize(destWidth, destHeight);
+	}
+
+	/**
+	 * Calculates percentage that screen image needs to be zoomed based on
+	 * currently selected zoom factor.
+	 * @param screenSize Size of the screen image.
+	 * @param clientArea Size of the are where image is drawn.
+	 * @return Percentage of how much image needs to be zoomed.
+	 */
+	private double getZoomPercent(Rectangle screenSize, Rectangle clientArea) {
+		
+		// Calculating how much screen is zoomed. 
+		
+		double zoomPercent;
+		
+		switch(screenSettings.getZoomFactor()){
+		case ZOOM_TO_FIT:
+			double maxWidthFactor = (double)clientArea.width / screenSize.width;
+			double maxHeightFactor = (double)clientArea.height / screenSize.height;
+			if(maxHeightFactor < maxWidthFactor) {
+				// Height factor is smaller, so height limits zooming.
+				zoomPercent = maxHeightFactor;
+			} else {
+				// Width factor is smaller, so width limits zooming.
+				zoomPercent = maxWidthFactor;
+			}
+			break;
+		case ZOOM_TO_HEIGHT:
+			zoomPercent = (double)clientArea.height / screenSize.height;
+			break;
+		case ZOOM_TO_WIDTH:
+			zoomPercent = (double)clientArea.width / screenSize.width;
+			break;
+		case ZOOM_TO_50_PERCENT:
+			zoomPercent = 0.5;
+			break;
+		case ZOOM_TO_100_PERCENT:
+			zoomPercent = 1.0;
+			break;
+		case ZOOM_TO_200_PERCENT:
+			zoomPercent = 2.0;
+			break;
+		case ZOOM_TO_400_PERCENT:
+			zoomPercent = 4.0;
+			break;
+		default:
+			// Using normal size as default.
+			zoomPercent = 1.0;
+			break;
+		}
+		
+		return zoomPercent;
+	}
+	
+	/**
+	 * Draws start-up information text for user.
+	 * @param event Event that contains control for painting to screen.
+	 */
+	private void drawFirstScreenHelp(PaintEvent event) {
+		event.gc.drawString(Messages.getString("ScreenView.FirstTimeUse_Help_Text1"), 10, 10); //$NON-NLS-1$
+		event.gc.drawString(Messages.getString("ScreenView.FirstTimeUse_Help_Text2"), 10,50); //$NON-NLS-1$
+		event.gc.drawString(Messages.getString("ScreenView.FirstTimeUse_Help_Text3"), 10, 70); //$NON-NLS-1$
+		
+		// Setting size to screen canvas, so that scroll bars are shown if necessary.
+		final int helpTextLength = 300;
+		final int helpTextHeight = 100;
+		screenCanvas.setSize(helpTextLength, helpTextHeight);
+	}
+	
+	/**
+	 * Captures image from phone and saves it to screenImage.
+	 */
+	private boolean captureImage(){
+		IScreenCaptureService service = HTIServiceFactory.createScreenCaptureService(RemoteControlConsole.getInstance());
+		
+		try {
+			// Capturing the image.
+			byte[] imagedata = service.captureFullScreen(IMAGE_TYPE, screenSettings.getColorChoice(), screenSettings.getTimeoutTime());
+
+			// Converting bytes to image.
+			ByteArrayInputStream is = new ByteArrayInputStream(imagedata);
+			Image image = new Image(Display.getCurrent(), is);
+			
+			byte[] previousImageData = ScreenSettings.getImageData();
+			
+			// Setting new image in use.
+			ScreenSettings.setScreenImage(image, imagedata);
+			
+			if(screenSettings.isSavingAllScreenshots()) {
+				if(screenSettings.getImagesSaved() == 0 || !Arrays.equals(imagedata, previousImageData)) {
+					// Only first and new images are saved.
+					saveCurrentScreenDefaultValues();
+				}
+			}
+			
+			updateActionButtonStates();
+			
+			// Getting the current screen mode.
+			HTIScreenMode screenMode = service.getScreenMode(screenSettings.getTimeoutTime());
+			screenSettings.setScreenMode(screenMode);
+			
+			// Screen captured successfully.
+			return true;
+			
+		} catch (ServiceShutdownException e) {
+			// Services have been purposely shut down. No need to report error.
+			return false;
+		} catch (Exception e) {
+			// Problem is reported already via RemoteControlConsole given as parameter to service.
+			return false;
+		}
+	}
+	
+	/**
+	 * Thread that takes care of updating screen.
+	 */
+	private class screenCaptureThread extends Thread {
+		
+		public void run() {
+			Thread thisThread = Thread.currentThread();
+			boolean isScreenCaptured;
+			
+			while(thisThread == screenCaptureThread){
+				try {
+					isScreenCaptured = captureImage();
+
+					// Updating image only if one was successfully captured.
+					if(isScreenCaptured){
+						Runnable updateScreenImage = new Runnable(){
+							public void run() {
+								// Testing that screenImage is still there and it is possible to redraw.
+								if(ScreenSettings.getScreenImage() != null){
+									try{
+										screenCanvas.redraw();
+									} catch (SWTException e) {
+										// Catching exceptions that arise when plug-in is being
+										// disposed and thread is not yet stopped.
+									}
+								}
+							}							
+						};
+						// UI updates from background threads has to be queued
+						// into UI thread in order not to cause invalid thread access
+						Display.getDefault().asyncExec(updateScreenImage);
+					}
+					
+					Thread.sleep(screenSettings.getRefreshTime());
+
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+					RemoteControlConsole.getInstance().println("screenCaptureThread.run() InterruptedException: " + e.getMessage()  //$NON-NLS-1$
+							, RemoteControlConsole.MSG_ERROR);
+				} catch (Exception e) {
+					e.printStackTrace();
+					RemoteControlConsole.getInstance().println("screenCaptureThread.run() Error: " + e.getMessage()  //$NON-NLS-1$
+							, RemoteControlConsole.MSG_ERROR);
+				}
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseUp(MouseEvent e) {
+		// Not needed.
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createControls()
+	 */
+	@Override
+	protected void createControls() {
+		try {
+			//
+			// Actions invoked by content providers may set enable/disable
+			// states for the actions, therefore all the action has to be
+			// created before creating the controls. This makes sure that
+			// it is safe to refer to all the actions after this point.
+			//
+			createMainMenuActions();
+
+			//
+			// Creating controls
+			//
+			
+			// Creating layout data
+			GridData gridData = new GridData();
+			gridData.grabExcessHorizontalSpace = true;
+			gridData.grabExcessVerticalSpace = true;
+			gridData.horizontalAlignment = SWT.FILL;
+			gridData.verticalAlignment = SWT.FILL;
+
+			scrollBarLayout = new StackLayout();
+			this.setLayout(scrollBarLayout);
+			
+			// Creating scroll bars for different zoom types.
+			screenScrollBarDefault = new ScrolledComposite(this, SWT.H_SCROLL | SWT.V_SCROLL);
+			screenScrollBarDefault.setSize(screenScrollBarDefault.computeSize(getClientArea().width, getClientArea().height));
+			screenScrollBarVertical = new ScrolledComposite(this, SWT.V_SCROLL);
+			screenScrollBarHorizontal = new ScrolledComposite(this, SWT.H_SCROLL);
+			
+			// NO_BACKGROUND is used to reduce flickering.
+			// Because of this, it is needed to draw whole image before drawing it to screen.
+			screenCanvas = new Canvas(screenScrollBarDefault, SWT.NO_BACKGROUND);
+			screenCanvas.setSize(screenScrollBarDefault.getSize());
+			touchScreenHandler = new TouchScreenHandler(this);
+			screenCanvas.addMouseListener(touchScreenHandler);
+			screenCanvas.addPaintListener(this);
+			screenCanvas.setLayoutData(gridData);
+			
+			// Scroll bars need to be configured after screenCanvas has been created.
+			configureScrollBars();
+
+			//
+			// Doing other initializations that may refer to the component
+			// that has been created above.
+			//		
+			
+			// Listening key events coming from keyboard
+			KeyListener pcKeyboardListener = new KeyListener() {
+				public void keyPressed(KeyEvent e) {		
+					// Non character (e.g. Alt, Ctrl) key events are not forwarded
+					if (e.character != '\0') {
+						if (keyboardMediator != null) {
+							keyboardMediator.characterKeyPressed(instance, e.character);
+						}
+					}
+				}
+				
+				public void keyReleased(KeyEvent e) {
+					// Not used
+				}
+			};
+			screenCanvas.addKeyListener(pcKeyboardListener);
+				
+		} catch (Exception e) {
+			e.printStackTrace();
+			RemoteControlConsole.getInstance().println(Messages.getString("ScreenView.Failed_Create_Screen_View_ConsoleMsg") + e.getMessage()  //$NON-NLS-1$
+					, RemoteControlConsole.MSG_ERROR);
+		}
+	}
+	
+	/**
+	 * Configures scroll bars used around screenCanvas.
+	 */
+	private void configureScrollBars() {
+		scrollBarLayout.topControl = screenScrollBarDefault;
+		
+		screenScrollBarVertical.setContent(screenCanvas);
+		screenScrollBarVertical.setAlwaysShowScrollBars(true);
+		screenScrollBarVertical.getVerticalBar().setPageIncrement(DEFAULT_SCROLL_INCREMENT);
+		screenScrollBarVertical.getVerticalBar().setIncrement(DEFAULT_SCROLL_INCREMENT);
+		
+		screenScrollBarHorizontal.setContent(screenCanvas);
+		screenScrollBarHorizontal.setAlwaysShowScrollBars(true);
+		screenScrollBarHorizontal.getHorizontalBar().setPageIncrement(DEFAULT_SCROLL_INCREMENT);
+		screenScrollBarHorizontal.getHorizontalBar().setIncrement(DEFAULT_SCROLL_INCREMENT);
+		
+		screenScrollBarDefault.setContent(screenCanvas);
+		screenScrollBarDefault.getVerticalBar().setPageIncrement(DEFAULT_SCROLL_INCREMENT);
+		screenScrollBarDefault.getVerticalBar().setIncrement(DEFAULT_SCROLL_INCREMENT);
+		screenScrollBarDefault.getHorizontalBar().setPageIncrement(DEFAULT_SCROLL_INCREMENT);
+		screenScrollBarDefault.getHorizontalBar().setIncrement(DEFAULT_SCROLL_INCREMENT);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 2;
+		return gridLayout;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.remotecontrol.ui.AbstractUiFractionComposite#createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		// No default layout data.
+		return null;
+	}
+	
+	/**
+	 * Sets enabled/disabled states for actions commands
+	 * on this view, based on the current application state.
+	 * This method should be called whenever an operation is
+	 * started or stopped that might have effect on action 
+	 * button states.
+	 */
+	public void updateActionButtonStates(){
+		if(!screenSettings.isSavingAllScreenshots()) {
+			saveMultiScreenshotsAction.setSaving(false);
+		}
+		
+		// Setting save single screenshot action.
+		if(ScreenSettings.getScreenImage() == null || screenSettings.isSavingAllScreenshots()) {
+			saveSingleScreenshotAction.setEnabled(false);
+		} else {
+			saveSingleScreenshotAction.setEnabled(true);
+		}
+		
+		// Setting save multi screenshot action.
+		saveMultiScreenshotsAction.setEnabled(ScreenSettings.getScreenImage() != null);
+	}
+	
+	/**
+	 * Updates zooming for current screen.
+	 */
+	public void updateZoom() {
+		
+		// Setting correct scroll bars for new zoom factor.
+		
+		switch(screenSettings.getZoomFactor()){
+		case ZOOM_TO_HEIGHT:
+			if(!screenCanvas.setParent(screenScrollBarHorizontal)) {
+				// Set parent not supported. Using default scroll bars.
+				break;
+			}
+			scrollBarLayout.topControl = screenScrollBarHorizontal;
+			this.layout();
+			break;
+		case ZOOM_TO_WIDTH:
+			if(!screenCanvas.setParent(screenScrollBarVertical)) {
+				// Set parent not supported. Using default scroll bars. 
+				break;
+			}
+			scrollBarLayout.topControl = screenScrollBarVertical;
+			this.layout();
+			break;
+		default:
+			if(!screenCanvas.setParent(screenScrollBarDefault)) {
+				// Set parent not supported. Using default scroll bars. 
+				break;
+			}
+			scrollBarLayout.topControl = screenScrollBarDefault;
+			this.layout();
+			break;
+		}
+		
+		// Updating screen image
+		
+		if(ScreenSettings.getScreenImage() != null) {
+			Runnable updateScreenImage = new Runnable(){
+				public void run() {
+					// Testing that screenImage is still there and it is possible to redraw.
+					if(ScreenSettings.getScreenImage() != null){
+						try{
+							screenCanvas.redraw();
+						} catch (SWTException e) {
+							// Catching exceptions that arise when plug-in is being
+							// disposed and thread is not yet stopped.
+						}
+					}
+				}
+			};
+			// UI updates from background threads has to be queued
+			// into UI thread in order not to cause invalid thread access
+			Display.getDefault().asyncExec(updateScreenImage);
+		}
+	}
+	
+	/**
+	 * Saves current screen with values defined preferences.
+	 */
+	public void saveCurrentScreenDefaultValues() {
+		screenSaverThread.addImageToQueue(ScreenSettings.getImageData());
+	}
+
+	/**
+	 * Returns current settings for showing the screen.
+	 * @return Current settings for the screen.
+	 */
+	public ScreenSettings getScreenSettings() {
+		return screenSettings;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/screen/ui/view/TouchScreenHandler.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,297 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.screen.ui.view;
+
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.hticonnection.exceptions.ServiceShutdownException;
+import com.nokia.s60tools.hticonnection.listener.HtiConnectionManager;
+import com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener;
+import com.nokia.s60tools.hticonnection.services.HTIScreenMode;
+import com.nokia.s60tools.hticonnection.services.HTIServiceFactory;
+import com.nokia.s60tools.hticonnection.services.IKeyEventService;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+
+/**
+ * This class implements mouse handling over the screen.
+ */
+public class TouchScreenHandler implements MouseListener, IHtiConnectionListener {
+
+	/**
+	 * View which uses this handler.
+	 */
+	private final ScreenView screenView;
+	
+	/**
+	 * Last mouse down event location.
+	 */
+	private Point mouseDownPoint;
+
+	/**
+	 * Time when last mouse down event happened.
+	 */
+	private long mouseDownTime;
+	
+	/**
+	 * This value used in addition to event length, when tap screen events are sent to the device.
+	 */
+	private final int TIMEOUT_TIME_ADDITION = 3000;
+	
+	/**
+	 * User is informed about the tap screen event only if time of the tap event
+	 * is greater than this time limit(ms).
+	 */
+	private final int SHOW_NOTIFICATION_TIME_LIMIT = 2000;
+
+	/**
+	 * This is used to keep track if mouse down event was inside the image.
+	 */
+	private boolean outOfBoundary;
+	
+	/**
+	 * Contains status of connection.
+	 */
+	private boolean isConnected = false;
+	
+	/**
+	 * Constructor.
+	 * @param screenView View which uses this handler.
+	 */
+	public TouchScreenHandler(ScreenView screenView) {
+		this.screenView = screenView;
+		mouseDownPoint = new Point(0, 0);
+		mouseDownTime = System.currentTimeMillis();
+		HtiConnectionManager.getInstance().addListener(this);
+	}
+
+	/**
+	 * Disposes this listener.
+	 */
+	public void dispose() {
+		HtiConnectionManager.getInstance().removeListener(this);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDoubleClick(MouseEvent event) {
+		// Double click event is not used.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDown(MouseEvent event) {
+		// Storing and converting event location based on screen orientation.
+		if(event.button != 1) {
+			// Only first button can cause tap screen events.
+			return;
+		}
+		mouseDownPoint = getZoomedPoint(event);
+		HTIScreenMode screenMode = screenView.getScreenSettings().getScreenMode();
+		outOfBoundary = isOutOfBoundary(mouseDownPoint, screenMode);
+		
+		mouseDownPoint = convertPointOrientation(mouseDownPoint, screenMode);
+		mouseDownTime = System.currentTimeMillis();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseUp(MouseEvent event) {
+		if(event.button != 1) {
+			// Only first button can cause tap screen events.
+			return;
+		}
+
+		// Getting needed variables.
+		HTIScreenMode screenMode = screenView.getScreenSettings().getScreenMode(); 
+		Point eventPointOnImage = getZoomedPoint(event);
+		int holdDownTime = (int) (System.currentTimeMillis() - mouseDownTime);
+		Point convertedPoint = convertPointOrientation(eventPointOnImage, screenMode); 
+		
+		// Checking event boundaries.
+		if(outOfBoundary || isOutOfBoundary(eventPointOnImage, screenMode)) {
+			// Mouse up or down event was outside of the image. Doing nothing.
+			return;
+		}
+		
+		// Creating tap screen event, that needs to be run in normal thread.
+		// Running from UI thread would prevent using the Carbide before event has passed.
+		Thread tapScreenThread = new TapScreenThread(mouseDownPoint, convertedPoint, holdDownTime);
+		tapScreenThread.start();
+	}
+
+	/**
+	 * Thread for tap/drag events.
+	 */
+	private class TapScreenThread extends Thread {
+		
+		// Tap/drag event details.
+		private final Point upPoint;
+		private final Point downPoint;
+		private final int holdDownTime;
+
+		/**
+		 * Constructor.
+		 * @param downPoint Location where mouse down event happened.
+		 * @param upPoint Location where mouse up event happened.
+		 * @param holdDownTime Time between down and up events.
+		 */
+		public TapScreenThread(Point downPoint, Point upPoint, int holdDownTime) {
+			this.downPoint = downPoint;
+			this.upPoint = upPoint;
+			this.holdDownTime = holdDownTime;
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Thread#run()
+		 */
+		public void run() {
+
+			if(!isConnected) {
+				return;
+			}
+			
+			// Notifying user if tap screen takes longer than defined time limit.
+			if(holdDownTime > SHOW_NOTIFICATION_TIME_LIMIT) {
+				Runnable updateDescription = new Runnable(){
+					public void run() {
+						screenView.updateDescription(Messages.getString("TouchScreenHandler.TapScreenToolBar_Msg"));	 //$NON-NLS-1$
+					}							
+				};
+				// Description needs to be updated from UI thread.
+				Display.getDefault().syncExec(updateDescription);			
+			}
+
+			try {
+				if(downPoint.x == upPoint.x 
+						&& downPoint.y == upPoint.y) {
+					// Mouse is in same place as where it started. Sending tap event.
+					IKeyEventService service = HTIServiceFactory.createKeyEventService(RemoteControlConsole.getInstance());
+					service.tapScreen(downPoint.x, downPoint.y, 1, holdDownTime, 0, holdDownTime + TIMEOUT_TIME_ADDITION);
+				} 
+				else {
+					// Mouse has been moved. Sending drag event.
+					IKeyEventService service = HTIServiceFactory.createKeyEventService(RemoteControlConsole.getInstance());
+					service.tapAndDrag(downPoint.x, downPoint.y, upPoint.x, upPoint.y,
+							holdDownTime, holdDownTime + TIMEOUT_TIME_ADDITION);
+				}
+			} catch (ServiceShutdownException e) {
+				// Services have been purposely shut down. No need to report error.
+			} catch (Exception e) {
+				// Problem is reported already via RemoteControlConsole given as parameter to service.
+			}
+			
+			// Removing the notification.
+			if(holdDownTime > SHOW_NOTIFICATION_TIME_LIMIT) {
+				Runnable updateDescription = new Runnable(){
+					public void run() {
+						screenView.setDefaultDescription();
+					}							
+				};
+				// Description needs to be updated from UI thread.
+				Display.getDefault().syncExec(updateDescription);			
+			}
+		}
+	}
+	
+	/**
+	 * Checks if image is zoomed and returns location on image
+	 * where event happened.
+	 * @param event Location where mouse event happened.
+	 * @return Location on screen image where event happened.
+	 */
+	private Point getZoomedPoint(MouseEvent event) {
+		int xLocationZoomed = (int) (event.x / screenView.getScreenSettings().getZoomPercent());
+		int yLocationZoomed = (int) (event.y / screenView.getScreenSettings().getZoomPercent());
+		
+		return new Point(xLocationZoomed, yLocationZoomed);
+	}
+	
+	/**
+	 * Converts originalPoint to correct coordinates based on screen rotation.
+	 * @param originalPoint Original point to be converted.
+	 * @param screenMode Screen settings.
+	 * @return Point that is converted based on screen rotation.
+	 */
+	private Point convertPointOrientation(Point originalPoint, HTIScreenMode screenMode) {
+		// Default value that matches when screen rotation is 0°.
+		Point convertedPoint = new Point(originalPoint.x, originalPoint.y);
+
+		// Converting point if screen has been rotated.
+		
+		// Screen is rotated 90°.
+		if(screenMode.getRotation() == 1){
+			convertedPoint = new Point(screenMode.getHeight() - originalPoint.y,
+					originalPoint.x);
+		}
+		// Screen is rotated 180°.
+		else if(screenMode.getRotation() == 2){
+			convertedPoint = new Point(screenMode.getWidth() - originalPoint.x,
+					screenMode.getHeight() - originalPoint.y);
+		}
+		// Screen is rotated 270°.
+		else if(screenMode.getRotation() == 3){
+			convertedPoint = new Point(originalPoint.y,
+					screenMode.getWidth() - originalPoint.x);
+		}
+		
+		return convertedPoint;
+	}
+
+	/**
+	 * Checks if screenPoint is outside of the screen limits. This needs to
+	 * be checked from original image limits with possible difference caused by zoom.
+	 * @param screenPoint Point that is checked.
+	 * @param screenMode Screen settings.
+	 * @return True if point is outside of the screen boundaries. True if point is within the screen.
+	 */
+	private boolean isOutOfBoundary(Point screenPoint, HTIScreenMode screenMode) {
+		// Getting needed variables.
+		int screenWidth = screenMode.getWidth();
+		int screenHeight = screenMode.getHeight();
+		int pointX = screenPoint.x;
+		int pointY = screenPoint.y;
+
+		// Checking screen boundaries so that the point is not outside of the screen.
+		if(pointX < 0 || pointY < 0 || pointX > screenWidth || pointY > screenHeight){
+			return true;
+		}
+
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionTerminated()
+	 */
+	public void connectionTerminated() {
+		isConnected = false;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionStarted()
+	 */
+	public void connectionStarted() {
+		isConnected = true;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/AbstractUiFractionComposite.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Layout;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Abstract class that defines an abstract template 
+ * for the composites that should be used to populate
+ * the contents a tab area or a sub area inside a tab
+ * (or inside any other UI element). Just utilizing
+ * Eclipse UI functionality, but making it simpler
+ * and more compact to use UI Composites from at the
+ * source code level.
+ */
+public abstract class AbstractUiFractionComposite extends Composite {
+		
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 */
+	public AbstractUiFractionComposite(Composite parentComposite, int style) {
+		super(parentComposite, style);
+		checkParent(parentComposite);
+		initComposite();
+	}
+	
+	/**
+	 * Checks that parent has a valid display.
+	 * @param parentComposite Parent composite for the created composite. 
+	 */
+	private void checkParent(Composite parentComposite) {
+		if (parentComposite.getDisplay() == null){
+			throw new RuntimeException(Messages.getString("AbstractUiFractionComposite.AbstractUiFractionComposite.ParentDisplayNULL_ErrMsg")); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public AbstractUiFractionComposite(Composite parentComposite) {
+		super(parentComposite, SWT.NONE);
+		initComposite();
+	}
+	
+	/**
+	 * Performs template methods that take care
+	 * of finalizing composite construction.
+	 */
+	private void initComposite(){
+		setLayout(createLayout());
+		setLayoutData(createLayoutData());
+		createControls();
+	}
+	
+	/**
+	 * Sub classes can override this.
+	 * @return Width hint for the composite.
+	 */
+	public int getWidthHint(){
+		return SWT.DEFAULT;
+	}
+	
+	/**
+	 * Sub classes can override this.
+	 * @return Height hint for the composite.
+	 */
+	public int getHeightHint(){
+		return SWT.DEFAULT;
+	}
+	
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should initialize the composite's layout
+	 * in the implementation of this method.
+	 * @return Layout for the composite.
+	 */
+	protected abstract Layout createLayout();
+
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should initialize the composite's layout data
+	 * in the implementation of this method.
+	 * @return Layout for the composite.
+	 */
+	protected abstract Object createLayoutData();
+
+	/**
+	 * Template method to be implemented in sub classes.
+	 * Sub class should create all the composite's controls
+	 * in the implementation of this method.
+	 */
+	protected abstract void createControls();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/ConfirmDeleteDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Dialog for asking confirmation for deleting file or folder from user
+ */
+public class ConfirmDeleteDialog extends Dialog {
+
+	/**
+	 * Selected button
+	 */
+	private int selection = 0;
+	
+	/**
+	 * UI components
+	 */
+	private Button confirmDeleteRadioCB = null;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 */
+	public ConfirmDeleteDialog(Shell parentShell) {
+		super(parentShell);
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(Messages.getString("ConfirmDeleteDialog.ConfirmDelete_Title"));  //$NON-NLS-1$
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
+    	createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false);
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		Label label = new Label(dialogAreaComposite,SWT.NONE);
+		label.setText(Messages.getString("ConfirmDeleteDialog.ConfirmDelete_Text"));  //$NON-NLS-1$
+		 
+		// "Don't ask again" check box
+		confirmDeleteRadioCB  = new Button(dialogAreaComposite, SWT.CHECK);
+		confirmDeleteRadioCB.setText(Messages.getString("ConfirmDeleteDialog.ConfirmAlwaysCheck_Text")); //$NON-NLS-1$
+		confirmDeleteRadioCB.setSelection(!RCPreferences.getDeleteConfirm());
+
+		// Disable "No" button when check box is selected
+		confirmDeleteRadioCB.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent arg0) {
+				getButton(IDialogConstants.NO_ID).setEnabled(!confirmDeleteRadioCB.getSelection());
+			}
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				// Not implemented
+			}
+		});
+		
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		// Save pressed button id
+		selection = buttonId;
+		
+		if (buttonId != IDialogConstants.NO_ID) {
+			// Save "Don't ask again" state
+			RCPreferences.setDeleteConfirm(!confirmDeleteRadioCB.getSelection());
+		}
+		
+		super.close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+	
+	/**
+	 * Returns id of selected button
+	 * @return Id of selected button
+	 */
+	public int getSelection() {
+		return selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/ConfirmReplaceDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,192 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.preferences.RCPreferences;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Dialog for asking confirmation for replace operation from user
+ */
+public class ConfirmReplaceDialog extends Dialog {
+	
+	// File transfer operation
+	public enum Operation {
+		DOWNLOAD,
+		UPLOAD,
+		PASTE
+	}
+	
+	/**
+	 * Button id for a "Rename" button
+	 */
+	public static final int RENAME_ID = IDialogConstants.CLIENT_ID + 1;
+	
+	/**
+	 * File name
+	 */
+	private String fileName;
+	
+	/**
+	 * Is multi file operation
+	 */
+	private boolean multiFile = false;
+	
+	/**
+	 * Ftp operation
+	 */
+	private Operation operation;
+	
+	/**
+	 * Selected button
+	 */
+	private int selection = 0;
+	
+	/**
+	 * UI components
+	 */
+	private Button confirmReplaceRadioCB = null;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 * @param fileName Name of the file to be replaced
+	 * @param multiFile Is multi file operation. If true "Yes to all" button is shown
+	 * @param operation Download or upload operation
+	 */
+	public ConfirmReplaceDialog(Shell parentShell, String fileName, boolean multiFile, Operation operation) {
+		super(parentShell);
+		this.fileName = fileName;
+		this.multiFile = multiFile;
+		this.operation = operation;
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(Messages.getString("FtpUtils.Confirm_Replace_DlgLabel")); //$NON-NLS-1$ 
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
+    	if (multiFile) {
+    		createButton(parent, IDialogConstants.YES_TO_ALL_ID, IDialogConstants.YES_TO_ALL_LABEL, false);
+    	}
+    	createButton(parent, RENAME_ID, Messages.getString("ConfirmReplaceDialog.Rename_Button_Label"), false); //$NON-NLS-1$
+    	createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false);
+    	createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); 
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		Label label = new Label(dialogAreaComposite,SWT.NONE);
+		label.setText(Messages.getString("FtpUtils.Confirm_Replace_DlgMsg_Prefix") //$NON-NLS-1$
+						+ "'" //$NON-NLS-1$
+						+ fileName
+						+ "'" //$NON-NLS-1$
+						+ ". " //$NON-NLS-1$
+						+ Messages.getString("FtpUtils.Confirm_Replace_DlgMsg_Postfix")); //$NON-NLS-1$); 
+		 
+		// "Don't ask again" check box
+		confirmReplaceRadioCB  = new Button(dialogAreaComposite, SWT.CHECK);
+		confirmReplaceRadioCB.setText(Messages.getString("ConfirmReplaceDialog.Confirm_Replace_CheckButton_Text")); //$NON-NLS-1$
+		if (operation == Operation.DOWNLOAD) {
+			confirmReplaceRadioCB.setSelection(!RCPreferences.getDownloadConfirm());
+		} else if (operation == Operation.UPLOAD) {
+			confirmReplaceRadioCB.setSelection(!RCPreferences.getUploadConfirm());
+		} else {
+			confirmReplaceRadioCB.setSelection(!RCPreferences.getPasteConfirm());
+		}
+		// Disable "No" button when check box is selected
+		confirmReplaceRadioCB.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent arg0) {
+				getButton(IDialogConstants.NO_ID).setEnabled(!confirmReplaceRadioCB.getSelection());
+			}
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				// Not implemented
+			}
+		});
+		
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {
+		// Save pressed button id
+		selection = buttonId;
+		
+		if (buttonId != IDialogConstants.CANCEL_ID) {
+			// Save "Don't ask again" state
+			if (operation == Operation.DOWNLOAD) {
+				RCPreferences.setDownloadConfirm(!confirmReplaceRadioCB
+						.getSelection());
+			} else if (operation == Operation.UPLOAD){
+				RCPreferences.setUploadConfirm(!confirmReplaceRadioCB
+						.getSelection());
+			} else {
+				RCPreferences.setPasteConfirm(!confirmReplaceRadioCB
+						.getSelection());
+			}
+		}
+		
+		super.close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		return super.open();
+	}
+	
+	/**
+	 * Returns id of selected button
+	 * @return Id of selected button
+	 */
+	public int getSelection() {
+		return selection;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/DriveNameDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Dialog for adding new drives to be shown in File Transfer view.
+ */
+public class DriveNameDialog extends Dialog implements SelectionListener {
+
+	/**
+	 * Drive name that was selected.
+	 */
+	private String selectedDriveName = null;
+	/**
+	 * Combo box for selecting drive.
+	 */
+	private Combo driveCombo;
+	/**
+	 * List of shown drives.
+	 */
+	private final String[] drives;
+
+	/**
+	 * Constructor.
+	 * @param shell Parent shell.
+	 * @param drives List of drives to be shown.
+	 */
+	public DriveNameDialog(Shell shell, String[] drives) {
+		super(shell);
+		this.drives = drives;
+	}
+
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+        getButton(IDialogConstants.OK_ID).setFocus();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(Messages.getString("DriveNameDialog.ShowDrive_DlgTitle")); //$NON-NLS-1$
+    } 
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		
+		//
+		//Adding custom controls
+		//
+		
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gData = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gData);
+		
+		// Label
+		Label label = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		label.setLayoutData(gData);
+		label.setText(Messages.getString("DriveNameDialog.SelectDrive_DialogText")); //$NON-NLS-1$
+		
+		// Drive selection combo box.
+		driveCombo = new Combo(dialogAreaComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+		driveCombo.addSelectionListener(this);
+		driveCombo.setLayoutData(gData);
+		driveCombo.setVisibleItemCount(drives.length);
+		driveCombo.setItems(drives);
+		// Setting first item active.
+		driveCombo.select(0);
+		selectedDriveName = driveCombo.getItem(0);
+		
+		return dialogAreaComposite;
+	}
+	
+	/**
+	 * Returns drive name entered by user
+	 * @return drive name or null if nothing was selected.
+	 */
+	public String getDriveName(){
+		return selectedDriveName;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not implemented.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		selectedDriveName = driveCombo.getItem(driveCombo.getSelectionIndex());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/FolderNameDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Dialog for entering new folder name 
+ */
+public class FolderNameDialog extends Dialog {
+	
+	/**
+	 * Folder name text filed
+	 */
+	private Text folderNameText;
+	
+	/**
+	 * Folder name
+	 */
+	private String folderName;
+	
+	/**
+	 * Constructor.
+	 * @param parentShell Parent shell
+	 */
+	public FolderNameDialog(Shell parentShell) {
+		super(parentShell);
+	}
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);     
+		Button ok = getButton(IDialogConstants.OK_ID);
+		ok.setEnabled(false);
+    }
+    
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(Messages.getString("FolderNameDialog.Dialog_Label")); //$NON-NLS-1$ 
+    } 
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+	
+		//
+		//Adding custom controls
+		//
+		final int cols = 1;	  
+		GridLayout gl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gl);
+		dialogAreaComposite.setLayoutData(gd);
+	
+		Label label = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		label.setText(Messages.getString("FolderNameDialog.Folder_Name_Label")); //$NON-NLS-1$
+		folderNameText = new Text(dialogAreaComposite, SWT.LEFT | SWT.BORDER | SWT.BORDER);	
+		folderNameText.setLayoutData(gd);
+		folderNameText.setEnabled(true);
+		
+		// Enables OK button when one or more characters are entered
+		folderNameText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				folderName = folderNameText.getText();
+				if(folderName != null  && folderName.trim().length() > 0){
+					Button ok = getButton(IDialogConstants.OK_ID);
+					ok.setEnabled(true);
+				}else{
+					Button ok = getButton(IDialogConstants.OK_ID);
+					ok.setEnabled(false);
+				}
+			}
+		});	 				
+		return dialogAreaComposite;
+	}    
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		folderName = ""; //$NON-NLS-1$
+		return super.open();
+	}
+	
+	/**
+	 * Returns folder name entered by user
+	 * @return Folder name
+	 */
+	public String getFolderName(){
+		return folderName;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/RemoteControlMessageBox.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,134 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.common.ProductInfoRegistry;
+
+/**
+ * This class wraps the MessageBox in order to 
+ * enhance it with product name, and run it in
+ * Remote Control plugin's active shell context.
+ * 
+ * @see  org.eclipse.swt.widgets.MessageBox
+ */
+public class RemoteControlMessageBox {
+
+	/**
+	 * Message box
+	 */
+	private MessageBox msgBox;
+
+	/**
+	 * Constructor.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public RemoteControlMessageBox(String message, int style){		
+		Shell sh = RemoteControlActivator.getCurrentlyActiveWbWindowShell();
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/**
+	 * Constructor.
+	 * @param sh Parent shell for the new instance.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public RemoteControlMessageBox(Shell sh, String message, int style){		
+		msgBox = new MessageBox(sh, style);
+		msgBox.setMessage(message);	
+		msgBox.setText(ProductInfoRegistry.getProductName());
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object arg0) {
+		return msgBox.equals(arg0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#getMessage()
+	 */
+	public String getMessage() {
+		return msgBox.getMessage();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getParent()
+	 */
+	public Shell getParent() {
+		return msgBox.getParent();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getStyle()
+	 */
+	public int getStyle() {
+		return msgBox.getStyle();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#getText()
+	 */
+	public String getText() {
+		return msgBox.getText();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return msgBox.hashCode();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#setMessage(java.lang.String)
+	 */
+	public void setMessage(String string) {
+		msgBox.setMessage(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Dialog#setText(java.lang.String)
+	 */
+	public void setText(String string) {
+		msgBox.setText(string);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return msgBox.toString();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.MessageBox#open()
+	 */
+	public int open() {
+		return msgBox.open();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/dialogs/RenameDialog.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,164 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+
+/**
+ * Dialog for renaming file
+ */
+public class RenameDialog extends Dialog implements ModifyListener {
+	
+	/**
+	 * Name
+	 */
+	private String name;
+	
+	/**
+	 * File name text field
+	 */
+	private Text nameField = null;
+
+	/**
+	 * Flag for keeping track if original name is possible return value.
+	 */
+	private final boolean allowOriginalName;
+	
+	/**
+	 * Name for dialog.
+	 */
+	private final String dialogName;
+	
+	/**
+	 * Constructor
+	 * @param parentShell Shell
+	 * @param name Current name of the file
+	 * @param allowOriginalName True if it is possible to return original name. False otherwise.
+	 */
+	public RenameDialog(Shell parentShell, String fileName, boolean allowOriginalName, String dialogName) {
+		super(parentShell);
+		this.name = fileName;
+		this.allowOriginalName = allowOriginalName;
+		this.dialogName = dialogName;
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(dialogName);
+    } 	
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+    	GridLayout gdl = new GridLayout(1, false);
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+		parent.setLayout(gdl);
+		parent.setLayoutData(gd);
+		
+    	createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+    	createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+
+    	if(!allowOriginalName) {
+    		// Not allowed to return same file name. User needs to modify name before enabling OK button.
+			getButton(IDialogConstants.OK_ID).setEnabled(false);
+    	}
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		
+		//
+		//Adding custom controls
+		//
+		final int cols = 1;	  
+		GridLayout gl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gl);
+		dialogAreaComposite.setLayoutData(gd);
+	
+		Label label = new Label(dialogAreaComposite, SWT.NONE);
+		label.setText(Messages.getString("RenameDialog.label"));   //$NON-NLS-1$
+		nameField = new Text(dialogAreaComposite, SWT.LEFT | SWT.SINGLE | SWT.BORDER);
+		nameField.setLayoutData(gd);
+		nameField.setText(name);
+		
+		nameField.addModifyListener(this);
+		
+		return dialogAreaComposite;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+	 */
+	protected void buttonPressed(int buttonId) {	
+		if (buttonId == IDialogConstants.OK_ID) {
+			// Save file name that user entered
+			name = nameField.getText();
+		}	
+		super.buttonPressed(buttonId);
+	}
+	
+	
+	/**
+	 * Get file name
+	 * @return File name that user entered. If user canceled dialog
+	 * 			the original file name is returned.
+	 */
+	public String getFileName(){
+		return name;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+	 */
+	public void modifyText(ModifyEvent e) {
+		if(!allowOriginalName && nameField.getText().equalsIgnoreCase(name)) {
+			// Not allowed to return same file name.
+			getButton(IDialogConstants.OK_ID).setEnabled(false);
+		} else {
+			getButton(IDialogConstants.OK_ID).setEnabled(true);
+		}
+		
+		// Empty names are not allowed.
+		if(nameField.getText().equals("")) { //$NON-NLS-1$
+			getButton(IDialogConstants.OK_ID).setEnabled(false);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/ui/views/main/MainView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,421 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.ui.views.main;
+
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextActivation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.s60tools.hticonnection.listener.HtiConnectionManager;
+import com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener;
+import com.nokia.s60tools.remotecontrol.RemoteControlActivator;
+import com.nokia.s60tools.remotecontrol.RemoteControlHelpContextIDs;
+import com.nokia.s60tools.remotecontrol.ftp.ui.view.FtpView;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.remotecontrol.resources.Messages;
+import com.nokia.s60tools.remotecontrol.screen.ui.view.ScreenView;
+import com.nokia.s60tools.remotecontrol.util.RemoteControlConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * This class comprises the Main View of the Remote Control
+ * application.
+ */
+public class MainView extends ViewPart implements SelectionListener,
+										IHtiConnectionListener {
+	 
+	/**
+	 * We can get view ID at runtime once the view is instantiated, but we
+	 * also need static access to ID in order to be able to invoke the view.
+	 */
+	public static final String ID = "com.nokia.s60tools.remotecontrol.ui.views.main.MainView"; //$NON-NLS-1$
+		
+	/**
+	 * Screen view tab
+	 */
+	private CTabItem screenViewTab;
+	
+	/**
+	 * FTP view tab
+	 */
+	private CTabItem ftpViewTab;
+	
+	/**
+	 * FTP view
+	 */
+	private FtpView ftpView = null;
+	
+	/**
+	 * Screen view UI composite
+	 */
+	private ScreenView screenView;
+
+	/**
+	 * Tab folder
+	 */
+	private CTabFolder mainViewTabFolder;
+
+	/**
+	 * Contains status of connection.
+	 */
+	private boolean isConnected = false;
+	
+	/**
+	 * Context activation
+	 */
+	private IContextActivation contextActivation = null;
+	
+	/**
+	 * Context service
+	 */
+	private IContextService contextService = null;
+	
+	/**
+	 * The constructor.
+	 */
+	public MainView() {
+	}
+
+	/**
+	 * This is called by framework when the controls for
+	 * the view should be created.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		try {
+			//
+			// Actions invoked by content providers may set enable/disable
+			// states for the actions, therefore all the action has to be
+			// created before creating the controls. This makes sure that
+			// it is safe to refer to all the actions after this point.
+			//
+
+			//
+			// Creating controls
+			//
+
+			// The left side contains component hierarchy tree view
+			SashForm mainViewSashForm = new SashForm(parent,
+					SWT.HORIZONTAL);
+
+			// The right side contains tabbed panes for showing...
+			mainViewTabFolder = new CTabFolder(
+					mainViewSashForm, SWT.BOTTOM);
+			//... 1st tab
+			createScreenViewTabControl(mainViewTabFolder);
+			//... 2nd tab
+			createFtpViewTabControl(mainViewTabFolder);
+
+			// Default selection for tab folder
+			mainViewTabFolder.setSelection(screenViewTab);
+
+			// Adding listener to 
+			mainViewTabFolder.addSelectionListener(this);
+			
+			//
+			// Doing other initializations that may refer to the component
+			// that has been created above.
+			//
+			screenView.setAsActiveView();
+			
+			// Setting context help IDs	
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(screenView, 
+		    		RemoteControlHelpContextIDs.REMOTE_CONTROL_SCREEN_VIEW);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(ftpView, 
+					RemoteControlHelpContextIDs.REMOTE_CONTROL_FTP_VIEW);
+			
+			HtiConnectionManager.getInstance().addListener(this);
+			setDefaultDescription();
+			
+			// Set Screenview context as an active
+			contextService = (IContextService)getSite().getService(IContextService.class);
+			activateScreenviewContext();
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+		
+	/**
+	 * Creates screen view tab.
+	 * @param parentTabFolder Parent tab folder.
+	 */
+	private void createScreenViewTabControl(CTabFolder parentTabFolder) {
+		SashForm firstFromTheLeftSashForm = new SashForm(parentTabFolder, SWT.VERTICAL);		
+		screenViewTab = new CTabItem(parentTabFolder, SWT.NONE);
+		screenViewTab.setControl(firstFromTheLeftSashForm);
+		screenViewTab.setText(Messages.getString("MainView.Screencapture_Tabname")); //$NON-NLS-1$
+		screenViewTab.setImage(ImageResourceManager.getImage(ImageKeys.IMG_SCREEN_CAPTURE_MODE));
+		createScreenViewTabContents(firstFromTheLeftSashForm);
+	}
+
+	/**
+	 * Creates screen view tab contents. This can be also delegated to a class of its own.
+	 * @param parentComposite	Parent composite.
+	 */
+	private void createScreenViewTabContents(Composite parentComposite) {
+		// Contents creation is delegated to an external class
+		screenView = new ScreenView(parentComposite, SWT.NONE, this);	
+	}
+
+	/**
+	 * Creates ftp view tab.
+	 * @param parentTabFolder Parent tab folder.
+	 */
+	private void createFtpViewTabControl(CTabFolder parentTabFolder) {		
+		SashForm secondFromTheLeftSashForm = new SashForm(parentTabFolder, SWT.VERTICAL);		
+		ftpViewTab = new CTabItem(parentTabFolder, SWT.NONE);
+		ftpViewTab.setControl(secondFromTheLeftSashForm);
+		ftpViewTab.setText(Messages.getString("MainView.Ftp_Tabname")); //$NON-NLS-1$
+		ftpViewTab.setImage(ImageResourceManager.getImage(ImageKeys.IMG_FILE_TRANSFER_MODE));
+		createFtpViewTabContents(secondFromTheLeftSashForm);
+	}
+	
+	/**
+	 * Creates ftp view tab contents.
+	 * @param parentComposite	Parent composite.
+	 */
+	private void createFtpViewTabContents(Composite parentComposite) {
+		ftpView = new FtpView(parentComposite, SWT.NONE, this);
+	}
+	
+	/**
+	 * Focus request should be passed to the view's primary control.
+	 */
+	public void setFocus() {
+		// Checking which tab is selected and setting focus.
+		if(mainViewTabFolder.getSelection() == screenViewTab){
+			screenView.setFocus();
+		}
+		else if(mainViewTabFolder.getSelection() == ftpViewTab){
+			ftpView.setFocus();
+		}
+	}
+	
+	/**
+	 * Allows other classes to update content description.
+	 * @param newContentDescription New description.
+	 */
+	public void updateDescription(String newContentDescription){
+		setContentDescription(newContentDescription);
+		IToolBarManager tbManager = getViewSite().getActionBars().getToolBarManager();
+		tbManager.update(true);
+	}
+	
+	/**
+	 * Allows other classes to set default content description.
+	 */
+	public void setDefaultDescription() {
+		Runnable updateDescription = new Runnable(){
+			public void run() {
+				if(isConnected) {
+					updateDescription(Messages.getString("MainView.Connected_DescText")); //$NON-NLS-1$
+				} else {
+					updateDescription(Messages.getString("MainView.NotConnected_DescText")); //$NON-NLS-1$
+				}
+			}							
+		};
+		// Description needs to be updated from UI thread.
+		Display.getDefault().asyncExec(updateDescription);
+	}
+
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	public void refresh(){
+	}
+
+	/**
+	 * Sets enabled/disabled states for actions commands
+	 * on this view, based on the current application state.
+	 * This method should be called whenever an operation is
+	 * started or stopped that migh have effect on action 
+	 * button states.
+	 */
+	public void updateActionButtonStates(){
+	 // Currently there is no states that should be set
+	 // here but there will surely be in future.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		HtiConnectionManager.getInstance().removeListener(this);
+		deactivateScreenviewContext();
+		screenView.dispose();
+		ftpView.dispose();
+	}
+
+	/**
+	 * Enables to get reference of the main view
+	 * from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @param openInvisible  If true opens up the view if it was not visible.
+	 * @throws PartInitException 
+	 */
+	public static MainView getViewInstance(boolean openInvisible) throws PartInitException{
+		
+		IWorkbenchPage page = RemoteControlActivator.getCurrentlyActivePage();
+		
+		boolean viewAlreadyVisible = false;
+		IViewPart viewPart = null;
+		
+		// Checking if view is already open
+		IViewReference[] viewRefs = page.getViewReferences();
+		for (int i = 0; i < viewRefs.length; i++) {
+			IViewReference reference = viewRefs[i];
+			String id = reference.getId();
+			if(id.equalsIgnoreCase(MainView.ID)){
+				viewAlreadyVisible = true;
+				// Found, restoring the view
+				viewPart = reference.getView(true);
+				page.activate(viewPart);
+			}
+		}
+		
+		if(openInvisible && !viewAlreadyVisible){
+			// View was not opened
+			viewPart = page.showView(MainView.ID);							
+		}	
+		return ((MainView) viewPart);
+	}
+
+	/**
+	 * Enables update request for the main view
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 */
+	public static void update(){
+		try {
+			getViewInstance(false).inputUpdated();
+		} catch (PartInitException e) {
+			RemoteControlConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	private void inputUpdated() {
+		if(ftpView != null){
+			ftpView.refreshFolderContent();
+		}
+		
+		if(screenView != null){
+			screenView.refresh();
+		}
+		
+	}
+
+	/**
+	 * Registers context menu for main view.
+	 * @param menuManager Menu manager.
+	 * @param selectionProvider Selection provider.
+	 */
+	public void registerContextMenu(MenuManager menuManager,
+			ISelectionProvider selectionProvider) {
+		getSite().registerContextMenu(menuManager, selectionProvider);
+		
+	}
+
+	/**
+	 * Returns action bars from main view.
+	 * @return Action bars.
+	 */
+	public IActionBars getActionBars() {
+		return getViewSite().getActionBars();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not needed.
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		// Checking which tab is selected and updating action bars.
+		if(e.item == screenViewTab){
+			screenView.setAsActiveView();
+			activateScreenviewContext();
+		}
+		else if(e.item == ftpViewTab){
+			ftpView.setAsActiveView();
+			deactivateScreenviewContext();
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionTerminated()
+	 */
+	public void connectionTerminated() {
+		isConnected = false;
+		setDefaultDescription();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.hticonnection.listener.IHtiConnectionListener#connectionStarted()
+	 */
+	public void connectionStarted() {
+		isConnected = true;
+		setDefaultDescription();
+	}
+	
+	/**
+	 * Deactivate ScreenView context
+	 */
+	private void deactivateScreenviewContext() {
+		if (contextService != null) {
+			contextService.deactivateContext(contextActivation);
+		}
+	}
+
+	/**
+	 * Activate ScreenView context
+	 */
+	private void activateScreenviewContext() {
+		if (contextService != null) {
+			contextActivation = contextService.activateContext("com.nokia.s60tools.remotecontrol.SreenView"); //$NON-NLS-1$
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotecontrol/com.nokia.s60tools.remotecontrol/src/com/nokia/s60tools/remotecontrol/util/RemoteControlConsole.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.remotecontrol.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.remotecontrol.common.ProductInfoRegistry;
+import com.nokia.s60tools.remotecontrol.resources.ImageKeys;
+import com.nokia.s60tools.remotecontrol.resources.ImageResourceManager;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+
+/**
+ * Singleton class that offers console printing
+ * services for the AppDep product.
+ */
+public class RemoteControlConsole extends AbstractProductSpecificConsole {
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private RemoteControlConsole instance = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public RemoteControlConsole getInstance(){
+		if(instance == null ){
+			instance = new RemoteControlConsole();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private RemoteControlConsole(){		
+	}
+			
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleName()
+	 */
+	protected String getProductConsoleName() {
+		return ProductInfoRegistry.getConsoleWindowName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.console.AbstractProductSpecificConsole#getProductConsoleImageDescriptor()
+	 */
+	protected ImageDescriptor getProductConsoleImageDescriptor() {
+		return ImageResourceManager.getImageDescriptor(ImageKeys.IMG_APP_ICON);
+	}
+}
Binary file sftemplateswizard/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.carbide.extensions.symbianfoundationtemplates</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+			   license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/feature.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.symbianfoundationtemplates"
+      label="Carbide.c++ Extensions - Symbian Foundation Templates"
+      version="1.3.0"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.symbianfoundationtemplates">
+
+   <description>
+      Symbian Foundation Templates Wizard
+   </description>
+
+   <copyright>
+      Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies).All rights reserved.
+License: http://www.eclipse.org/legal/epl-v10.html
+   </copyright>
+
+   <license url="license.txt">
+      LICENSE INFORMATION
+                                              
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).All rights reserved.
+This component and the accompanying materials are made available
+under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available
+at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+   </license>
+
+   <url>
+      <update label="Carbide.c++ Update Site" url="http://tools.ext.nokia.com/updates/carbide22"/>
+   </url>
+
+   <plugin
+         id="com.nokia.s60tools.symbianfoundationtemplates"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.symbianfoundationtemplates.doc.user"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.carbide.extensions.symbianfoundationtemplates/license.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+                                   LICENSE INFORMATION
+                                 													
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).All rights reserved.
+This component and the accompanying materials are made available
+under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.symbianfoundationtemplates.doc.user</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Symbian Foundation Templates Wizard Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.symbianfoundationtemplates.doc.user;singleton:=true
+Bundle-Version: 1.3.0
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.help
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+<link href="book.css" rel="stylesheet" type="text/css">
+</head>
+<body lang="EN-US">
+<h2>Symbian Foundation Templates Wizard</h2>
+<p>Revised: Dec 2, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All
+rights reserved.<br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+<p>
+
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/book.css	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,181 @@
+/*	
+	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+	All rights reserved. 
+	License: http://www.eclipse.org/legal/epl-v10.html
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+html {
+	margin: 2px 10px 10px 10px;
+	}
+
+/* 20091007 added verdana and ariel to list to match SFO website fonts choices */
+body, p, table {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 1.0em;
+	font-weight: normal;
+}
+
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+/* 20091007 - changed sizes to use em versus px */
+h1 { font-size: 1.3em }
+h2 { font-size: 1.2em }
+h3 { font-size: 1.1em }
+h4 { font-size: 1.0em }
+h5 { font-size: 0.9em }
+h6 { font-size: 0.8em }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20090224-changed green fade to gold header image	*/
+h1, h2, h3 {
+	background-image: url(html/images/gold_header.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+/* 20091007 SFO styling added */
+h1.NavTitle		{ font-size: 1.2em }
+h3	.NavListTitle 	{ font-size: 1.1em }
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.8em;
+	color: #333333;
+	}
+
+.listing	{
+	background-color: #ffe869;
+	font-family: "Courier New", Courier, mono;
+	font-size: 1.1em;
+	color: #000000;
+	margin: 5px 0px;
+	}
+		
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 1.1em;
+	color: #000000;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	/* color: #111; */
+	/* border-bottom:2px solid #EEE; */
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+th	{
+	background-color: #ffd62c;
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+div h5, div h4	{
+	padding:5px 0px 5px 12px;
+	background-color: #ffd62c;
+	font-weight:bold;
+	color: #000000;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #026690;
+	text-align: center;
+	font-weight: bold;
+	}
+
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.8em;
+	}
+
+	
+.plain {
+	font-family: Verdana, Ariel, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #026690 }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #FFD62C }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+bin.includes = META-INF/,\
+               html/,\
+               plugin.xml,\
+               book.css,\
+               about.html,\
+               contexts.xml,\
+               build.properties
+src.includes = html/,\
+               META-INF/,\
+               plugin.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/contexts.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+<context id="OVERVIEW">
+ <description>Symbian Foundation Templates Overview</description>	   
+ <topic label="Symbian Foundation Templates Overview" href="html/overview.htm"/>
+</context>    
+
+</contexts>
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/images/contextmenu.png has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/images/gold_header.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/legal.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>License Information</title>
+    <link href="../book.css" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title></title>
+<h3>License Information</h3>  <h5>COPYRIGHTS</h5> 
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a></p>
+<h5>Initial Contributors:</h5>
+<p>Nokia Corporation - initial contribution</p>
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. <br>License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body></html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/overview.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,19 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<?Pub Inc>
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Overview</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body><h3>Overview</h3>  <p>The Symbian Foundation Templates Wizard Carbide.c++
+Extension is a collection of additional wizards for Carbide.c++. </p><p>You
+can access the templates in Carbide.c++ by selecting <b>File > New > Other
+> Symbian Foundation Templates.</b></p><p>You can access the templates also
+by right-clicking an MMP file in <b>Symbian Project View Navigator</b> or
+in <b>Project Explorer</b>.</p> 
+<p><img src="images/contextmenu.png"></p> 
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. <br>
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div> 
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/release_notes.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,35 @@
+<!--Arbortext, Inc., 1988-2004, v.4002-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release Notes</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+<style type="text/css"><!-- .style2 {font-size: 12px} --></style><?Pub Caret>
+</head>
+<body bgcolor="#FFFFFF"><h2>Release Notes</h2><h4>Symbian Foundation Templates
+Wizard 1.3.0</h4><ul>
+<li> <a href="#description">Product description</a></li>
+<li><a href="#enhancements">Enhancements</a></li>
+<li><a href="#requirements">System requirements</a></li>
+</ul><h3><a name="description"></a>Product description</h3><p> The Symbian
+Foundation Templates Wizard Carbide.c++ Extension is a collection of additional
+wizards for Carbide.c++, which give you the possibility to create new files
+(source, header, resource, icon makefile, classes) based on Symbian Foundation
+template files. The wizards provide the means to change the content of the
+template files on the Carbide.c++ user interface, eliminating the need to
+do the changes manually.</p><p>You can find the templates in Carbide.c++ from: <b>
+File > New > Other > Symbian Foundation Templates</b>. </p> <p>Symbian Foundation
+Template wizards can be launched by right-clicking an MMP file in <b>Symbian
+Project Navigator</b> and in <b>Project Explorer</b>. This tool also supports
+creating empty classes, that is, excluding instructions.</p><h3><a name="enhancements"></a>Enhancements
+</h3><ul>
+<li>N/A.</li>
+</ul><h3><a name="requirements"></a>System requirements</h3><p>Basic requirements:
+</p><ul>
+<li>Windows 2000, Windows XP</li>
+<li>Minimum Platform/SDK build PC.</li>
+<li>Normal Platform/SDK build PC.</li>
+</ul><div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. <br>License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div></body>
+</html>
+<?Pub *0000001858>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/s60templatesTOC.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!-- 
+	Links tool docs to main TOC for Carbide help in the defined location. 
+	NOTE: Tool name seems to be ignored here for display purposes but needed to
+	make the link_to section work.
+-->
+
+<!-- Current link_to attribute works on top of Carbide 1.3 -->
+<toc label="Symbian Foundation Templates Wizard" 
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+	
+<!-- 
+    This is old link_to attribute working on top of Carbide 1.2:
+	link_to="../com.nokia.carbide.cpp/nokiaTOC.xml#anchorCarbideFeature">
+	-->
+
+	<!--
+		Define the TOOL NAME as it should appear in the TOC. The tool.htm page
+		is the cover page for the tool help.
+	-->
+	   <topic label="Symbian Foundation Templates Wizard" href="html/toc.htm" >
+		
+	   <topic label="Release Notes" href="html/release_notes.htm" />
+		
+	   <topic label="Overview" href="html/overview.htm" />
+		   
+	   <topic label="Legal" href="html/legal.htm" />
+   		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/html/toc.htm	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+	<title>Table of Contents</title>
+	<link href="../book.css" type="text/css" rel="stylesheet"/>
+</head>
+
+<body>
+<h1>Symbian Foundation Templates Wizard</h1>
+<p><a href="release_notes.htm">Release notes</a></p>
+<p><a href="overview.htm">Overview</a></p>
+<p><a href="legal.htm">Legal</a></p>
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. <br>License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div></body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates.doc.user/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            file="html/s60templatesTOC.xml"
+            primary="true">
+      </toc>
+   </extension>
+   <extension
+         point="org.eclipse.help.contexts">
+      <contexts file="contexts.xml" plugin="com.nokia.s60tools.symbianfoundationtemplates.doc.user"/>
+   </extension>
+
+</plugin>
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.symbianfoundationtemplates</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/.settings/org.eclipse.core.resources.prefs	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,6 @@
+#Sat Nov 29 21:31:21 IST 2008
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/symbianfoundationtemplates/resources/messages.properties=8859_1
+encoding/about.html=ISO-8859-1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/META-INF/MANIFEST.MF	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Symbian Foundation Templates
+Bundle-SymbolicName: com.nokia.s60tools.symbianfoundationtemplates;singleton:=true
+Bundle-Version: 1.3.0
+Bundle-Activator: com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.ide,
+ com.nokia.carbide.cdt.builder,
+ org.eclipse.core.resources,
+ org.eclipse.cdt.ui,
+ com.nokia.carbide.cpp.ui,
+ com.nokia.carbide.cpp.epoc.engine,
+ org.eclipse.help
+Eclipse-LazyStart: true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.html	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0//EN>
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content=”text/html; charset=ISO-8859-1”>
+</head>
+<body lang=”ENE"EN-US">
+<h2>About This Content</h2>
+ 
+<p>Aug 19, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>
+Copyright ©2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+ License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+
+<p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.ini	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,32 @@
+################################################################################
+# Copyright ©2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+# License: http://www.eclipse.org/legal/epl-v10.html.	
+################################################################################
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.mappings	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,12 @@
+################################################################################
+# Copyright ©2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.	
+# License: http://www.eclipse.org/legal/epl-v10.html.
+################################################################################
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/about.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - Symbian Foundation Templates Wizard \n\
+\n\
+Version: 1.3.0\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.\n\
+\n\
+\n\
+This product includes software developed by Eclipse Project\n\
+(http://www.eclipse.org/).
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/build.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,14 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               templates/,\
+               images/,\
+               about.html,\
+               about.ini,\
+               about.mappings,\
+               about.properties
+javacSource=1.5
+javacTarget=1.5
+
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/Bld_inf_Definition_file.png has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/MMP_Definition_file.png has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/New_MMP_file_wizard_banner.png has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newcfile_wiz.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newcfile_wiz_banner.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newclass_wiz.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newclass_wiz_banner.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newfile_wiz.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newfile_wiz_banner.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newhfile_wiz.gif has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/images/newhfile_wiz_banner.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/plugin.xml	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+	<!-- Templates in File->New->Other... -->
+	<extension point="org.eclipse.ui.newWizards"> 
+		<!-- Categories -->
+		<category 
+			id="com.nokia.s60tools.symbianfoundationtemplates" 
+	        name="Symbian Foundation Templates"> 
+		</category> 
+		<category 
+        	id="com.nokia.s60tools.symbianfoundationtemplates.headers" 
+        	name="Headers" 
+        	parentCategory="com.nokia.s60tools.symbianfoundationtemplates"> 
+      	</category> 
+      	<category 
+        	id="com.nokia.s60tools.symbianfoundationtemplates.classes" 
+        	name="Classes" 
+        	parentCategory="com.nokia.s60tools.symbianfoundationtemplates"> 
+      	</category> 
+      	
+      	<!-- Headers -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.CClassHeaderTemplate" 
+          	name="C Class Header"
+          	icon="images\newhfile_wiz.gif"
+           	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.headers" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.CHeaderWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation C class header. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.MClassHeaderTemplate" 
+          	name="M Class Header" 
+          	icon="images\newhfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.headers" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.MHeaderWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation M class header. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.RClassHeaderTemplate" 
+          	name="R Class Header"
+          	icon="images\newhfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.headers" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.RHeaderWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation R class header. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.TClassHeaderTemplate" 
+          	name="T Class Header"
+          	icon="images\newhfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.headers" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.THeaderWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation T class header. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	
+       	<!-- Classes -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.CClassTemplate" 
+          	name="C Class"
+          	icon="images\newclass_wiz.gif"
+           	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.classes" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.CClassWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation C class. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.MClassTemplate" 
+          	name="M Class"
+          	icon="images\newclass_wiz.gif"
+           	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.classes" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.MClassWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation M class. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.RClassTemplate" 
+          	name="R Class"
+          	icon="images\newclass_wiz.gif"
+           	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.classes" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.RClassWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation R class. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.TClassTemplate" 
+          	name="T Class"
+          	icon="images\newclass_wiz.gif"
+           	category="com.nokia.s60tools.symbianfoundationtemplates/com.nokia.s60tools.symbianfoundationtemplates.classes" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.TClassWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation T class. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	
+      	<!-- Source -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.SourceTemplate" 
+          	name="Source File" 
+          	icon="images\newcfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.sourcewizards.SourceWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation source file. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	
+      	<!-- Resources -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.ResourceTemplate" 
+          	name="Resource File"
+          	icon="images\newfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.resourcewizards.ResourceWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation resource file. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+ 		
+ 		<!-- Icons -->
+ 		<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.IconTemplate" 
+          	name="Icon Makefile"
+          	icon="images\newfile_wiz.gif"
+          	category="com.nokia.s60tools.symbianfoundationtemplates" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards.IconWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation icon file. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	
+      	<!-- MMP -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.MMPTemplate" 
+          	name="MMP File"
+          	icon="images\MMP_Definition_file.png"
+          	category="com.nokia.s60tools.symbianfoundationtemplates" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards.MMPWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation MMP file. 
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+      	
+      	<!-- BLD.INF -->
+      	<wizard 
+          	id="com.nokia.s60tools.symbianfoundationtemplates.BuildInfoTemplate" 
+          	name="Build Info File"
+          	icon="images\Bld_inf_Definition_file.png"
+          	category="com.nokia.s60tools.symbianfoundationtemplates" 
+          	class="com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards.BuildInfoWizard"> 
+          		<description> 
+              		Create a new Symbian Foundation build info file.
+          		</description> 
+           		<selection class="org.eclipse.core.resources.IResource"/>          
+      	</wizard>
+   	</extension>
+ <extension
+       point="org.eclipse.ui.popupMenus">
+    <objectContribution
+          adaptable="true"
+          id="com.nokia.s60tools.symbianfoundationtemplates.symbianfoundationtemplatesobjectContribution"
+          nameFilter="*.mmp"
+          objectClass="org.eclipse.core.resources.IResource">
+       <menu
+             id="com.nokia.s60tools.symbianfoundationtemplates.menu1"
+             label="Symbian Foundation"
+             path="group.reorganize">
+          <groupMarker name="SourceActionGroup"/>
+          <separator name="separator"/>
+          <groupMarker name="ClassGroup"/>
+          <groupMarker name="HeaderGroup"/>
+       </menu>
+       <menu
+             id="com.nokia.s60tools.symbianfoundationtemplates.menu2"
+             label="Header File"
+             path="com.nokia.s60tools.symbianfoundationtemplates.menu1/HeaderGroup"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newhfile_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.tcheader"
+             label="T Class Header"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu2/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newhfile_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.rcheader"
+             label="R Class Header"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu2/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newhfile_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.mcheader"
+             label="M Class Header"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu2/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newhfile_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.ccheader"
+             label="C Class Header"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu2/additions"/>
+       <menu
+             id="com.nokia.s60tools.symbianfoundationtemplates.menu3"
+             label="Symbian OS C++ Class"
+             path="com.nokia.s60tools.symbianfoundationtemplates.menu1/ClassGroup"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newclass_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.tclass"
+             label="T Class"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu3/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newclass_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.cclass"
+             label="R Class"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu3/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newclass_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.rclass"
+             label="M Class"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu3/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newclass_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.mclass"
+             label="C Class"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/com.nokia.s60tools.symbianfoundationtemplates.menu3/additions"/>
+       <action
+             class="com.nokia.s60tools.symbianfoundationtemplates.actions.OpenWizardAction"
+             icon="images/newcfile_wiz.gif"
+             id="com.nokia.s60tools.symbianfoundationtemplates.sourcefile"
+             label="Source File"
+             menubarPath="com.nokia.s60tools.symbianfoundationtemplates.menu1/SourceActionGroup"/>
+    </objectContribution>
+ </extension> 
+</plugin>
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/.DS_Store has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/.DS_Store has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/.DS_Store has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/.DS_Store has changed
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/SymbianFoundationTemplates.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class SymbianFoundationTemplates extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "com.nokia.s60tools.symbianfoundationtemplates"; //$NON-NLS-1$
+
+	// The shared instance
+	private static SymbianFoundationTemplates plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public SymbianFoundationTemplates() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static SymbianFoundationTemplates getDefault() {
+		return plugin;
+	}
+	
+	/**
+	 * Show the error dialog.
+	 * 
+	 * @param error the error message.
+	 * @param reason the reason of the error.
+	 */
+	public void showErrorDialog(String error, String reason) {
+		IStatus status = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, reason, null);
+		
+		ErrorDialog.openError(Display.getCurrent().getActiveShell(),
+				Messages.getString("ErrorMessageTitle"), //$NON-NLS-1$
+				error, status);
+	}
+	
+	/**
+	 * Get the location of the templates associated with this plugin.
+	 * 
+	 * @return the location of templates
+	 */
+	public String getTemplatesPath() {
+		return getRootPath() + "templates"; //$NON-NLS-1$
+	}
+	
+	/**
+	 * Get the location of the images associated with this plugin.
+	 * 
+	 * @return the location of images
+	 */
+	public String getImagesPath() {
+		return getRootPath() + "images"; //$NON-NLS-1$
+	}
+	
+	/**
+	 * Get the plugin root path of this plugin
+	 * @return the plugin installation path
+	 */
+	private String getRootPath() {
+		URL relativeURL = getBundle().getEntry("/"); //$NON-NLS-1$
+		
+		URL localURL = null;
+		try {
+			localURL = FileLocator.toFileURL(relativeURL);
+		} catch(IOException ioe) {
+		}
+		
+		if(localURL == null)
+			return null;
+		
+		File f = new File(localURL.getPath());
+		
+		return f.getAbsolutePath() + File.separator;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/actions/MMPSourceUserIncPaths.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.actions;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+
+/**
+ * This class is used to save/remember the last used user-include and source-include paths. 
+ *
+ */
+public class MMPSourceUserIncPaths {
+
+	private static final String SOURCE_PATHS = "Source paths";
+	private static final String USERINCLUDE_PATHS = "User include paths";
+	
+	private static final String SOURCE_PATH_SECTION = "Source path section";
+	private static final String USERINCLUDE_SECTION = "UserInc section";
+	
+	/**
+	 * Path types, i.e, SOURCE or INCLUDE path 
+	 *
+	 */
+	public static enum ValueTypes {SRC_DIRS, USERINC_DIRS}
+	
+	/**
+	 * Save the given path values. 
+	 * @param pathType
+	 * @param value
+	 */
+	public void saveValues(ValueTypes pathType, String[] value) {
+		try {
+			switch (pathType) {
+				case SRC_DIRS: {
+					savePaths(value, SOURCE_PATHS, getSection(SOURCE_PATH_SECTION));
+					break;
+				}	
+				case USERINC_DIRS:{
+					savePaths(value, USERINCLUDE_PATHS, getSection(USERINCLUDE_SECTION));
+					break;
+				}				
+			}
+		} catch (Exception E) {
+			E.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Returns values user has previously entered to wizard pages.
+	 * @param valueType type of the values 
+	 * @return user's previous values
+	 */
+	public String[] getPreviousValues(ValueTypes valueType) {
+		try {
+			String[] retVal = null;
+			
+			switch (valueType) {
+				case SRC_DIRS: {
+					retVal = getPreviousPaths(SOURCE_PATH_SECTION,SOURCE_PATHS);
+					break;
+				}
+				case USERINC_DIRS:{
+					retVal = getPreviousPaths(USERINCLUDE_SECTION, USERINCLUDE_PATHS);
+					break;
+				}
+				
+			}			
+			return retVal;
+			
+		} catch (Exception e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * Saves given path to correct section in dialog_settings.xml
+	 * @param path path to save
+	 * @param array name of the array which contains correct values
+	 * @param section section which has array 
+	 */
+	protected void savePaths(String[] path, String listLabel, IDialogSettings section) {
+		if (section != null) {
+			String[] previousValues = section.getArray(listLabel);
+			
+			// No previous values exist
+			if (previousValues == null) {
+				previousValues = path;
+			// Previous values exists
+			} else {
+				previousValues = path;
+			}
+			section.put(listLabel, previousValues);
+		}
+	}
+	
+	/**
+	 * Returns previously entered values of wanted context (i.e. wizard page).
+	 * @param section section which contains array
+	 * @param array name of the array whose values are needed
+	 * @return previously entered paths of given section
+	 */
+	protected String[] getPreviousPaths(String section, String listLabel) {
+		String[] retVal = null;
+		IDialogSettings sect = getSection(section);
+		if (sect != null) {
+			retVal = sect.getArray(listLabel);
+		}
+		else
+		{
+			System.out.println("Section is null"); 
+		}
+		
+		return retVal;
+	}
+	
+	/**
+	 * Get the section by the given name.
+	 * @param section name of the IDialogSettings section
+	 * @return the IDialogSettings
+	 */
+	protected IDialogSettings getSection(String section) {
+		IDialogSettings retVal = null;
+		if (SymbianFoundationTemplates.getDefault().getDialogSettings() != null) {
+			 retVal = SymbianFoundationTemplates.getDefault().getDialogSettings().getSection(section);
+			if (retVal == null) {
+			 retVal = SymbianFoundationTemplates.getDefault().getDialogSettings().addNewSection(section);
+			}
+		}
+		return retVal;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/actions/OpenWizardAction.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,221 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.actions;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.EpocEnginePathHelper;
+import com.nokia.carbide.cdt.builder.ICarbideBuildManager;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.CClassWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.MClassWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.RClassWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards.TClassWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.CHeaderWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.MHeaderWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.RHeaderWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards.THeaderWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.sourcewizards.SourceWizard;
+
+/**
+ * This is an action class to open the wizard from the context menu of an MMP file. 
+ *
+ */
+public class OpenWizardAction implements IObjectActionDelegate {
+
+	S60TemplateWizard wiz;
+	private ICarbideProjectInfo prjInfo;
+	public OpenWizardAction() {
+	}
+
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+	}
+
+	public void run(final IAction action) {
+		IWorkbenchWindow window=SymbianFoundationTemplates.getDefault().getWorkbench().getActiveWorkbenchWindow();
+		ISelection selection= (ISelection)window.getSelectionService().getSelection();
+		IProject prj= CarbideBuilderPlugin.getProjectInContext();
+		ICarbideBuildManager mngr=CarbideBuilderPlugin.getBuildManager();
+		prjInfo = mngr.getProjectInfo(prj);
+		List<java.io.File> userinc = new ArrayList<java.io.File>(); 
+	    List<java.io.File> sysinc=new ArrayList<java.io.File>();
+	    
+		if(selection instanceof TreeSelection)
+		{
+			IStructuredSelection treeSelection= (IStructuredSelection)selection;
+			IPath mmp=new Path(treeSelection.getFirstElement().toString());
+			EpocEnginePathHelper pathHelper=new EpocEnginePathHelper(prjInfo.getProject());
+			//EpocEngineHelper.getMMPIncludePaths(prjInfo.getProject(),fl.getProjectRelativePath(),prjInfo.getDefaultConfiguration(), userinc, sysinc);
+			
+			//gets USERINCLUDE paths from the MMP file
+			//Treeselection object is different for different views
+			//(i.e. for Sysmbian Project Navigator  and Project Explorer)
+			IPath mmpPath=null;
+			if(treeSelection.getFirstElement() instanceof IResource)
+			{
+				mmpPath=((IResource)treeSelection.getFirstElement()).getLocation();
+				EpocEngineHelper.getMMPIncludePaths(prjInfo.getProject(),((IFile)treeSelection.getFirstElement()).getProjectRelativePath(),prjInfo.getDefaultConfiguration(), userinc, sysinc);
+			}
+			else
+			{
+				IFile fl=ResourcesPlugin.getWorkspace().getRoot().getFile(mmp);
+				mmpPath=fl.getLocation();
+				EpocEngineHelper.getMMPIncludePaths(prjInfo.getProject(),fl.getProjectRelativePath(),prjInfo.getDefaultConfiguration(), userinc, sysinc);
+			}
+			//gets SOURCEPATH paths from the MMP file  
+			List<IPath> sourceFiles=EpocEngineHelper.getSourceFilesForConfiguration(prjInfo.getDefaultConfiguration(),mmpPath);//mmppath.makeAbsolute());
+			Iterator<IPath> srsFilesItr=sourceFiles.iterator();
+			List<String> srcDirs=new ArrayList<String>();
+			while(srsFilesItr.hasNext())
+			{
+				//IFile inc=ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(test.next().toFile().getParent()));
+				IPath mmppath=srsFilesItr.next();
+				String str=(pathHelper.convertFilesystemToWorkspace(mmppath)).toFile().getParent().replace('\\', '/');
+				if(!srcDirs.contains(str))
+				{
+					srcDirs.add(str);
+				}
+			}
+			
+			MMPSourceUserIncPaths prevPaths=new MMPSourceUserIncPaths();
+			
+			//Convert all user include paths to project-relative
+			List<String> userIncPaths=new ArrayList<String>();
+			Iterator<File> incItr=userinc.iterator();
+			while(incItr.hasNext())
+			{
+				//IFile inc=ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(inci.next().getAbsolutePath()));
+				IPath incpath=new Path(incItr.next().getAbsolutePath());
+				String str=(pathHelper.convertFilesystemToWorkspace(incpath)).toString().replace('\\', '/');
+				userIncPaths.add(str);
+			}
+			
+			prevPaths.saveValues( MMPSourceUserIncPaths.ValueTypes.SRC_DIRS,srcDirs.toArray(new String[0]));
+			prevPaths.saveValues( MMPSourceUserIncPaths.ValueTypes.USERINC_DIRS,userIncPaths.toArray(new String[0]));
+			
+		}
+		//set boolean true when open from the project view 
+		IPreferenceStore preferenceStore = SymbianFoundationTemplates.getDefault().getPreferenceStore();
+		preferenceStore.setValue(PreferenceConstants.OPENED_FROM_VIEW, true);
+		Runnable showWizardRunnable = new Runnable(){
+			public void run(){
+	  		  WizardDialog wizDialog;
+	  		  if(action.getText().equalsIgnoreCase("C Class"))
+	  		  {
+	  			  wiz=new CClassWizard();
+	  			  wiz.setWindowTitle(Messages.getString("CClassWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("M Class"))
+	  		  {
+	  			  wiz=new MClassWizard();
+	  			  wiz.setWindowTitle(Messages.getString("MClassWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("R Class"))
+	  		  {
+	  			  wiz= new RClassWizard();
+	  			  wiz.setWindowTitle(Messages.getString("RClassWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("T Class"))
+	  		  {
+	  			  wiz=new TClassWizard();
+	  			  wiz.setWindowTitle(Messages.getString("TClassWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("C Class Header"))
+	  		  {
+	  			  wiz=new CHeaderWizard();
+	  			  wiz.setWindowTitle(Messages.getString("CHeaderWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("M Class Header"))
+	  		  {
+	  			  wiz=new MHeaderWizard();
+	  			  wiz.setWindowTitle(Messages.getString("MHeaderWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("R Class Header"))
+	  		  {
+	  			  wiz=new RHeaderWizard();
+	  			  wiz.setWindowTitle(Messages.getString("RHeaderWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("T Class Header"))
+	  		  {
+	  			  wiz=new THeaderWizard();
+	  			  wiz.setWindowTitle(Messages.getString("THeaderWizardTitle"));
+	  		  }
+	  		  else if(action.getText().equalsIgnoreCase("Source File"))
+	  		  {
+	  			  wiz=new SourceWizard();
+	  			  wiz.setWindowTitle(Messages.getString("SourceWizardTitle"));
+	  		  }
+	  		  wizDialog = new WizardDialog(Display.getCurrent().getActiveShell(), wiz);
+			  wizDialog.create();		
+	       	  wizDialog.getShell().setSize(550, 620);
+			  try{
+			  wizDialog.setBlockOnOpen(true);
+			  wizDialog.open();
+			  }catch(Exception e)
+			  {				  
+				  e.printStackTrace();
+			  }
+			 }
+		   };
+		   
+		  Display.getDefault().syncExec(showWizardRunnable); 
+		  
+		  clearAllPreviousValues();
+		  
+	}
+	/**
+	 * Clear all the values before the wizard is opened next time.
+	 *
+	 */
+	private void clearAllPreviousValues()
+	{
+		IPreferenceStore preferenceStore = SymbianFoundationTemplates.getDefault().getPreferenceStore();
+		MMPSourceUserIncPaths toClearPaths=new MMPSourceUserIncPaths();
+		toClearPaths.saveValues(MMPSourceUserIncPaths.ValueTypes.SRC_DIRS, null);
+		toClearPaths.saveValues(MMPSourceUserIncPaths.ValueTypes.USERINC_DIRS, null);
+		preferenceStore.setValue(PreferenceConstants.OPENED_FROM_VIEW, false);
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/BaseEngine.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Base engine class provides support for file opening and such.
+ * 
+ */
+public abstract class BaseEngine {
+	private StringBuilder templateString;
+	
+	/**
+	 * Default constructor.
+	 * 
+	 * @param templateFile the template file to open
+	 */
+	public BaseEngine(String templateFile) throws IOException {
+		BufferedReader in = null;
+		FileReader reader = null;
+		
+		if(templateFile == null)
+			throw new IOException("Could not determine the correct template file!");
+		
+		reader = new FileReader(templateFile);
+		in = new BufferedReader(reader);
+			
+		String line;
+			
+		templateString = new StringBuilder();
+			
+		while((line = in.readLine()) != null)
+			templateString.append(line).append("\n");
+
+		if(in != null)
+			in.close();
+		if(reader != null)
+			reader.close();
+	}
+	
+	/**
+	 * Get the opened template file as a string.
+	 * 
+	 * @return template file as a string
+	 */
+	protected String getTemplateString() {
+		if(templateString == null)
+			return null;
+		else
+			return templateString.toString();
+	}
+
+	/**
+	 * Get the transformed string.
+	 * 
+	 * @return the transformed string
+	 */
+	public abstract String getTransformedString();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/OriginalTemplate.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * Class represents an original template that has the template file
+ * and the transformation rules.
+ *
+ */
+public class OriginalTemplate {
+	private String templateFile;
+	
+	private IFile toBeTransformedFile;
+	
+	private Map<String, String> transformRules;
+	
+	public OriginalTemplate(String templateFile, IFile toBeTransformedFile, Map<String, String> transformRules) {
+		this.templateFile = templateFile;
+		this.toBeTransformedFile = toBeTransformedFile;
+		this.transformRules = transformRules;
+	}
+	
+	/**
+	 * @return the template file
+	 */
+	public String getTemplateFile() {
+		return templateFile;
+	}
+	
+	/**
+	 * @return the to-be-transformed file
+	 */
+	public IFile getToBeTransformedFile() {
+		return toBeTransformedFile;
+	}
+	
+	/**
+	 * @return transform rules
+	 */
+	public Map<String, String> getTransformRules() {
+		return transformRules;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/TransformedTemplate.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * Wrapper class which contains the transformed template as a string
+ * as well as the file name of the transformed template.
+ *
+ */
+public class TransformedTemplate {
+	private IFile file;
+	
+	private String transformed;
+	
+	/**
+	 * Default constructor.
+	 * 
+	 * @param file the file
+	 * @param transformed the transformed string
+	 */
+	public TransformedTemplate(IFile file, String transformed) {
+		this.file = file;
+		this.transformed = transformed;
+	}
+	
+	/**
+	 * Get the file.
+	 * 
+	 * @return the file
+	 */
+	public IFile getFile() {
+		return file;
+	}
+	
+	/**
+	 * Get the transformed string.
+	 * 
+	 * @return the transformed string
+	 */
+	public String getTransformed() {
+		return transformed;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/S60Engine.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine.s60;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Map;
+
+import com.nokia.s60tools.symbianfoundationtemplates.engine.BaseEngine;
+
+/**
+ * Symbian Foundation template transform engine.
+ *
+ */
+public class S60Engine extends BaseEngine {
+	private Map<String, String> rules;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param templateFile the template file used in transforming
+	 */
+	public S60Engine(String templateFile) throws IOException {
+		super(templateFile);
+	}
+
+	/**
+	 * Set transform rules used in transforming
+	 * 
+	 * @param rules the transform rules
+	 */
+	public void setTransformRules(Map<String, String> rules) {
+		this.rules = rules;
+	}
+	
+	@Override
+	public String getTransformedString() {
+		String transformed = getTemplateString();
+		
+		if(transformed == null)
+			return null;
+		
+		for(String key : rules.keySet()) {
+			String transformedString;
+			
+			if(key.equals(S60TransformKeys.getString("key_description")))
+				transformedString = createDescription(rules.get(key));
+			else
+				transformedString = rules.get(key);
+			
+			if(!transformedString.equals(""))
+				transformed = transformed.replace(key, transformedString);
+		}
+		return transformed;
+	}
+	
+	/**
+	 * Helper method to create a "pretty" description field.
+	 * 
+	 * @param description the original description string
+	 * @return the "pretty" description field
+	 */
+	private String createDescription(String description) {
+		StringBuffer buff = new StringBuffer();
+		
+		BufferedReader reader = new BufferedReader(new StringReader(description));
+		
+		try {
+			String line = reader.readLine();
+			
+			if(line == null)
+				return "";
+			
+			buff.append("*  Description : ").append(line);
+			
+			while((line = reader.readLine()) != null)
+				buff.append("\n").append("*                ").append(line);
+		} catch(IOException ioe) {
+			return "";
+		}
+		
+		return buff.toString();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/S60TransformKeys.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine.s60;
+
+import java.util.ResourceBundle;
+
+/**
+ * S60 transform keys provider.
+ *
+ */
+public class S60TransformKeys {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.symbianfoundationtemplates.engine.s60.s60transformkeys";
+	
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+	
+	private S60TransformKeys() {
+	}
+	
+	public static String getString(String key) {
+		return RESOURCE_BUNDLE.getString(key);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/engine/s60/s60transformkeys.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,22 @@
+key_filename = ?filename
+key_subsystem = ?Subsystem_name
+key_module = ?Module_name
+key_description = *  Description : ?Description
+key_copyright = ?year-?year
+key_classname = ?classname
+key_appname = ?myapp
+key_smallappname = ?smallmyapp
+key_mclassname = ?M_CLASSNAME_H
+key_rclassname = ?R_CLASSNAME_H
+key_cclassname = ?C_CLASSNAME_H
+key_tclassname = ?T_CLASSNAME_H
+key_hrhmodulename = ?MODULENAME_HRH
+key_rhmodulename = ?MODULENAME_RH
+key_normaliconname = icons_menu.mk
+key_scalableiconname = icons_extra.mk
+key_license= ?License
+key_companyname= ?Company_name
+key_licenseurl= ?LicenseUrl
+key_companycopyright= ?Company_copyright
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/HelpContextIDs.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+/**
+ * Static string IDs for context sensitive help.
+ * 
+ */
+public class HelpContextIDs {
+	private static final String SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID = "com.nokia.s60tools.symbianfoundationtemplates.help";
+	
+	public static final String SF_TEMPLATES_CLASS_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_CLASS_WIZARD_PAGE";
+	
+	public static final String SF_TEMPLATES_HEADER_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_HEADER_WIZARD_PAGE";
+
+	public static final String SF_TEMPLATES_SOURCE_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_SOURCE_WIZARD_PAGE";
+
+	public static final String SF_TEMPLATES_ICON_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_ICON_WIZARD_PAGE";
+
+	public static final String SF_TEMPLATES_RESOURCE_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_RESOURCE_WIZARD_PAGE";
+	
+	public static final String SF_TEMPLATES_MMP_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_MMP_WIZARD_PAGE";
+	
+	public static final String SF_TEMPLATES_BUILD_INFO_WIZARD_PAGE =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".SF_TEMPLATES_HELP_BUILD_INFO_WIZARD_PAGE";
+	
+	public static final String SF_TEMPLATES_OVERVIEW =
+		SF_TEMPLATES_HELP_PROJECT_PLUGIN_ID + ".OVERVIEW";
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/Images.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+import java.util.ResourceBundle;
+
+public class Images {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.symbianfoundationtemplates.resources.images";
+	
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+	
+	private Images() {
+	}
+	
+	public static String getString(String key) {
+		return RESOURCE_BUNDLE.getString(key);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/LastUsedData.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,154 @@
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+
+public class LastUsedData {
+
+	public static final String COMPANY_NAME = "Company name";
+	public static final String COMPANY_COPYRIGHT = "Company copyright";
+	
+	public static final String COMPANY_NAME_SECTION = "Company name section";
+	public static final String COMPANY_COPYRIGHT_SECTION = "Company copyright section";
+	
+	private static final int MAX_SAVED_VALUES = 5;
+	
+	public static enum ValueTypes {NAME, COPYRIGHT};
+	
+	/**
+	 * @param pathType specifies the type of the value being stored. This type
+	 * maps to a labelled set of values under a section, in dialog_settings.xml
+	 * @param value set of values to be stored.
+	 */
+	public void saveValues(ValueTypes pathType, String value) {
+		try {
+			switch (pathType) {
+				case NAME: {
+					savePath(value, COMPANY_NAME, getSection(COMPANY_NAME_SECTION));
+					break;
+				}	
+				case COPYRIGHT:{
+					savePath(value, COMPANY_COPYRIGHT, getSection(COMPANY_COPYRIGHT_SECTION));
+					break;
+				}
+				default: 
+					break;
+			}
+		} catch (Exception E) {
+			E.printStackTrace();
+		}
+	}
+	
+	/**
+	 * @param valueType type of the value to be retreived 
+	 * @return user's previous stored values for this type.
+	 */
+	public String[] getPreviousValues(ValueTypes valueType) {
+		try {
+			String[] retVal = null;
+			
+			switch (valueType) {
+				case NAME: {
+					retVal = getPreviousPaths(COMPANY_NAME_SECTION,COMPANY_NAME);
+					break;
+				}
+				case COPYRIGHT: {
+					retVal = getPreviousPaths(COMPANY_COPYRIGHT_SECTION,COMPANY_COPYRIGHT);
+					break;
+				}
+				default: 
+					break;
+			}			
+			return retVal;
+			
+		} catch (Exception e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * Saves given path to correct section in dialog_settings.xml
+	 * @param path path to be saved
+	 * @param listLabel name of the array which contains the values
+	 * @param section section which contain the actual array 
+	 */
+	protected void savePath(String path, String listLabel, IDialogSettings section) {
+		if (section != null) {
+			String[] previousValues = section.getArray(listLabel);
+			
+			// No previous values exist
+			if (previousValues == null) {
+				previousValues = new String[1];
+				previousValues[0] = path;
+			// Previous values exists
+			} else {
+				int valuesCount = previousValues.length;
+				
+				boolean valueExisted = false;
+				// see if passed value already exist.
+				for (int i = 0; i < valuesCount; i++) {
+					if (previousValues[i].compareToIgnoreCase(path) == 0) {
+						valueExisted = true;
+						
+						// passed value exists, move it to first position
+						for (int j = i; j > 0; j--) {
+							previousValues[j] = previousValues[j-1];
+						}
+						previousValues[0] = path;
+						
+						break;
+					}
+				}
+				
+				// passed value did not exist, add it to first position (and move older values "down")
+				if (!valueExisted) {
+						if (valuesCount >= MAX_SAVED_VALUES) {
+							for (int i = valuesCount-1; i > 0; i--) {
+								previousValues[i] = previousValues[i-1];
+							}
+							previousValues[0] = path;
+						}else{
+							String[] values = new String[valuesCount + 1];
+							values[0] = path;
+							for (int i = 0; i < valuesCount; i++) {
+								values[i+1] = previousValues[i];
+							}
+							previousValues = values;
+						}
+					}
+				}
+			section.put(listLabel, previousValues);
+		}
+	}
+	
+	/**
+	 * Returns previously entered values of wanted context (i.e. wizard page).
+	 * @param section section which contains array
+	 * @param listLabel name of the array whose values are needed
+	 * @return previously entered paths for given section
+	 */
+	protected String[] getPreviousPaths(String section, String listLabel) {
+		String[] retVal = null;
+		IDialogSettings sect = getSection(section);
+		if (sect != null)
+			retVal = sect.getArray(listLabel);
+		
+		return retVal;
+	}
+	
+	/**
+	 * @param sectionName name of the section to be retreived
+	 * @return section which maps to given name, in dialog_setting.xml file.
+	 */
+	protected IDialogSettings getSection(String sectionName) {
+		IDialogSettings retVal = null;
+		if (SymbianFoundationTemplates.getDefault().getDialogSettings() != null) {
+			 retVal = SymbianFoundationTemplates.getDefault().getDialogSettings().getSection(sectionName);
+			if (retVal == null) {
+			 retVal = SymbianFoundationTemplates.getDefault().getDialogSettings().addNewSection(sectionName);
+			}
+		}
+		return retVal;
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/Messages.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * UI-messages provider.
+ *
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.symbianfoundationtemplates.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/PreferenceConstants.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+/**
+ * Constant definitions for plug-in prefenreces.
+ *
+ */
+public class PreferenceConstants {
+	public static final String SF_HEADER_PAGE_DIRECTORY 	= "SF_HEADER_PAGE_DIRECTORY";
+	public static final String SF_HEADER_PAGE_MODULE		= "SF_HEADER_PAGE_MODULE";
+	public static final String SF_HEADER_PAGE_SUBSYSTEM	= "SF_HEADER_PAGE_SUBSYSTEM";
+
+	public static final String SF_CLASS_PAGE_SRCDIR		= "SF_CLASS_PAGE_SRCDIR";
+	public static final String SF_CLASS_PAGE_HDRDIR		= "SF_CLASS_PAGE_HDRDIR";
+	public static final String SF_CLASS_PAGE_MODULE		= "SF_CLASS_PAGE_MODULE";
+	public static final String SF_CLASS_PAGE_SUBSYSTEM		= "SF_CLASS_PAGE_SUBSYSTEM";
+	
+	public static final String SF_SOURCE_PAGE_DIRECTORY	= "SF_SOURCE_PAGE_DIRECTORY";
+	public static final String SF_SOURCE_PAGE_MODULE		= "SF_SOURCE_PAGE_MODULE";
+	public static final String SF_SOURCE_PAGE_SUBSYSTEM	= "SF_SOURCE_PAGE_SUBSYSTEM";
+	
+	public static final String SF_RESOURCE_PAGE_DIRECTORY	= "SF_RESOURCE_PAGE_DIRECTORY";
+	public static final String SF_RESOURCE_PAGE_MODULE		= "SF_RESOURCE_PAGE_MODULE";
+	public static final String SF_RESOURCE_PAGE_SUBSYSTEM	= "SF_RESOURCE_PAGE_SUBSYSTEM";
+	public static final String SF_RESOURCE_PAGE_APPNAME	= "SF_RESOURCE_PAGE_APPNAME";
+	
+	public static final String SF_ICON_PAGE_DIRECTORY		= "SF_ICON_PAGE_DIRECTORY";
+	public static final String SF_ICON_PAGE_MODULE			= "SF_ICON_PAGE_MODULE";
+	public static final String SF_ICON_PAGE_SUBSYSTEM		= "SF_ICON_PAGE_SUBSYSTEM";
+	public static final String SF_ICON_PAGE_APPNAME		= "SF_ICON_PAGE_APPNAME";
+	public static final String SF_ICON_PAGE_MENU			= "SF_ICON_PAGE_MENU";
+	public static final String SF_ICON_PAGE_EXTRA		= "SF_ICON_PAGE_EXTRA";
+	
+	public static final String S60_MMP_PAGE_DIRECTORY		= "SF_MMP_PAGE_DIRECTORY";
+	public static final String S60_MMP_PAGE_MODULE			= "SF_MMP_PAGE_MODULE";
+	public static final String S60_MMP_PAGE_SUBSYSTEM		= "SF_MMP_PAGE_SUBSYSTEM";
+	public static final String S60_MMP_PAGE_APPNAME			= "SF_MMP_PAGE_APPNAME";
+
+	public static final String S60_BUILD_INFO_PAGE_DIRECTORY= "SF_BUILD_INFO_PAGE_DIRECTORY";
+	public static final String S60_BUILD_INFO_PAGE_MODULE	= "SF_BUILD_INFO_PAGE_MODULE";
+	public static final String S60_BUILD_INFO_PAGE_SUBSYSTEM= "SF_BUILD_INFO_PAGE_SUBSYSTEM";
+	public static final String S60_BUILD_INFO_PAGE_APPNAME	= "SF_BUILD_INFO_PAGE_APPNAME";
+	
+	public static final String OPENED_FROM_VIEW				= "OPENED_FROM_VIEW";
+	
+	public static final String SF_LICENSE_INDEX = "SF_LICENSE_INDEX" ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/TemplateFiles.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.resources;
+
+import java.util.ResourceBundle;
+
+/**
+ * Template files provider.
+ *
+ */
+public class TemplateFiles {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.symbianfoundationtemplates.resources.templatefiles";
+	
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+	
+	private TemplateFiles() {
+	}
+	
+	public static String getString(String key) {
+		return RESOURCE_BUNDLE.getString(key);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/images.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,9 @@
+Image.Class = newclass_wiz.gif
+Banner.Class = newclass_wiz_banner.gif
+Image.Source = newcfile_wiz.gif
+Banner.Source = newcfile_wiz_banner.gif
+Image.Header = newhfile_wiz.gif
+Banner.Header = newhfile_wiz_banner.gif
+Image.File = newfile_wiz.gif
+Banner.File = newfile_wiz_banner.gif
+Banner.MMPFile = New_MMP_file_wizard_banner.png
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/messages.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,67 @@
+CClassWizardTitle=New Symbian Foundation C Class
+CClassWizardMessage=Create a new Symbian Foundation C class.
+MClassWizardTitle=New Symbian Foundation M Class
+MClassWizardMessage=Create a new Symbian Foundation M class.
+RClassWizardTitle=New Symbian Foundation R Class
+RClassWizardMessage=Create a new Symbian Foundation R class.
+TClassWizardTitle=New Symbian Foundation T Class
+TClassWizardMessage=Create a new Symbian Foundation T class.
+CHeaderWizardTitle=New Symbian Foundation C Header File
+CHeaderWizardMessage=Create a new Symbian Foundation C header file.
+MHeaderWizardTitle=New Symbian Foundation M Header File
+MHeaderWizardMessage=Create a new Symbian Foundation M header file.
+RHeaderWizardTitle=New Symbian Foundation R Header File
+RHeaderWizardMessage=Create a new Symbian Foundation R header file.
+THeaderWizardTitle=New Symbian Foundation T Header File
+THeaderWizardMessage=Create a new Symbian Foundation T header file.
+SourceWizardTitle=New Symbian Foundation Source File
+SourceWizardMessage=Create a new Symbian Foundation source file.
+ResourceWizardTitle=New Symbian Foundation Resource File
+ResourceWizardMessage=Create a new Symbian Foundation resource file.
+IconWizardTitle=New Symbian Foundation Icon Makefile
+IconWizardMessage=Create a new Symbian Foundation icon makefile.
+WizardErrorGeneratingTransformed=Error generating transformed file: 
+WizardErrorOpeningTransformed=Error opening transformed file: 
+WizardPageSourceFolderLabel=Source Folder:
+WizardPageScalableIconLabel=Extra icon
+WizardPageHeaderFolderLabel=Header Folder:
+WizardPageIconMakefileLabel=Icon Makefile(.mk):
+WizardPageMakefileFolderMsg=Makefile folder
+WizardPageResourceFileLabel=Resource File(.rss/.hrh/.rh/.loc):
+WizardPageResourceFolderMsg=Resource folder
+WizardPageDescriptionLabel=Description:
+WizardPageHeaderFolderMsg=Header folder
+WizardPageHeaderFileLabel=Header File(.h):
+WizardPageSourceFolderMsg=Source folder
+WizardPageSourceFileLabel=Source File(.cpp):
+WizardPageNormalIconLabel=Menu icon
+WizardPageErrorClassNameEmpty=Class name is empty.
+WizardPageMakefileFolderLabel=Makefile Folder:
+WizardPageResourceFolderLabel=Resource Folder:
+WizardPageErrorClassHeader=Class header file 
+WizardPageErrorClassSource=Class source file 
+WizardPageApplicationLabel=Application name:
+WizardErrorReasonWorkbenchWindowNull=Workbench window is null
+WizardPageWarningClassNameDiscouraged=Class name is discouraged. Name does not begin with letter 
+WizardErrorReasonWorkbenchPageNull=Workbench page is null
+WizardPageErrorClassAlreadyExists=\ already exists.
+FolderSelectionBrowseLabel=\ Browse... 
+FolderSelectionDialogTitle=Select Folder...
+WizardPageClassNameLabel=Class Name:
+WizardPageSubSystemLabel=Subsystem:
+WizardPageModuleLabel=Module:
+WizardPageCopyrightLabel=Copyright year(s):
+WizardPageIncludeInstructionsLabel=Include instructions in files
+WizardPageErrorFileNameEmpty=File name is empty.
+WizardPageErrorFileNameHasSpaces=File name must not contain any spaces.
+WizardPageErrorInvalidClassName=  is an invalid class name.
+WizardPageErrorInvalidFileName=  is an invalid file name.
+WizardPageIconTypeLabel=Icon Type:
+ErrorMessageTitle=Symbian Foundation Templates Wizard Error
+MMPWizardTitle=New Symbian Foundation MMP File
+MMPWizardMessage=Create a new Symbian Foundation MMP file.
+BuildInfoWizardTitle=New Symbian Foundation Build Info File
+BuildInfoWizardMessage=Create a new Symbian Foundation build info file.
+WizardPageLicenseLabel=License:
+WizardPageCompanyLabel=Company Name:
+WizardPageCopyrightStringLabel=Copyright Text:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/resources/templatefiles.properties	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,13 @@
+TemplateFile.C_Class = c_class_header_template.h;source_template.cpp;empty_c_class_header_template.h;empty_source_template.cpp
+TemplateFile.M_Class = m_class_header_template.h;source_template.cpp;empty_m_class_header_template.h;empty_source_template.cpp
+TemplateFile.R_Class = r_class_header_template.h;source_template.cpp;empty_r_class_header_template.h;empty_source_template.cpp
+TemplateFile.T_Class = t_class_header_template.h;source_template.cpp;empty_t_class_header_template.h;empty_source_template.cpp
+TemplateFile.C_Header = c_class_header_template.h;empty_c_class_header_template.h
+TemplateFile.M_Header = m_class_header_template.h;empty_m_class_header_template.h
+TemplateFile.R_Header = r_class_header_template.h;empty_r_class_header_template.h
+TemplateFile.T_Header = t_class_header_template.h;empty_t_class_header_template.h
+TemplateFile.Source = source_template.cpp;empty_source_template.cpp
+TemplateFile.Resource = resource_template.rss;resource_template.hrh;resource_template.rh;resource_template.loc;empty_resource_template.rss;empty_resource_template.hrh;empty_resource_template.rh;empty_resource_template.loc
+TemplateFile.Icon = icons_menu.mk;icons_extra.mk;empty_icons_menu.mk;empty_icons_extra.mk;
+TemplateFile.MMP = project_specification_template.mmp;empty_project_specification_template.mmp
+TemplateFile.BuildInfo = build_info_template.inf;empty_build_info_template.inf
Binary file sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/BaseTemplateWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.TransformedTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+
+/**
+ * Base template wizard. Extend this to create new template wizards
+ * based on different template engines.
+ *
+ */
+public abstract class BaseTemplateWizard extends Wizard implements INewWizard {
+	public boolean canFinish() {
+		for(BaseTemplateWizardPage page : getTemplatePages())
+			if(page.getStatus().matches(IStatus.ERROR))
+				return false;
+		
+		return true;
+	}
+	
+	@Override
+	public boolean performFinish() {
+		AbstractList<IFile> files = new ArrayList<IFile>();
+		
+		// Write the transformed templates into real files
+		for(TransformedTemplate transformed : getTransformedTemplates()) {
+			IFile file = transformed.getFile();
+
+			ByteArrayInputStream in = new ByteArrayInputStream(transformed.getTransformed().getBytes());
+
+			try {	
+				// If file already exists, delete it.
+				// This is ok because the wizards that don't want to overwrite
+				// files will check this themselves...
+				if(file.exists())
+					file.delete(true, true, new NullProgressMonitor());
+				
+				file.create(in, true, new NullProgressMonitor());
+			} catch(CoreException ce) {
+				SymbianFoundationTemplates.getDefault().showErrorDialog(
+						Messages.getString("WizardErrorGeneratingTransformed") + file.getName(), //$NON-NLS-1$
+						ce.getMessage());
+				file = null;
+			} finally {
+				if(file != null)
+					files.add(file);
+				else
+					return false;
+			}
+		}
+		
+		// Open the real files in different editors
+		for(IFile file : files) {
+			IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			
+			if(window == null) {
+				SymbianFoundationTemplates.getDefault().showErrorDialog(
+						Messages.getString("WizardErrorOpeningTransformed") + file.getName(), //$NON-NLS-1$
+						Messages.getString("WizardErrorReasonWorkbenchWindowNull")); //$NON-NLS-1$
+				
+				return false;
+			}
+		
+			IWorkbenchPage page = window.getActivePage();
+			
+			if(page == null) {
+				SymbianFoundationTemplates.getDefault().showErrorDialog(
+						Messages.getString("WizardErrorOpeningTransformed") + file.getName(), //$NON-NLS-1$
+						Messages.getString("WizardErrorReasonWorkbenchPageNull")); //$NON-NLS-1$
+				
+				return false;
+			}
+			
+			IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName());
+			
+			if(desc == null) {
+				SymbianFoundationTemplates.getDefault().showErrorDialog("Cannot open file '" + file + "' in editor!", "Default editor for file type could not be found");
+				return true;
+			}
+			
+			try {
+				page.openEditor(new FileEditorInput(file), desc.getId());
+			} catch(PartInitException pie) {
+				SymbianFoundationTemplates.getDefault().showErrorDialog(
+						Messages.getString("WizardErrorOpeningTransformed") + file.getName(), //$NON-NLS-1$
+						pie.getMessage());
+			
+				return false;
+			}
+		}
+		
+		savePreferencesToStore();
+		
+		return true;
+	}
+	
+	/**
+	 * Get template wizard pages in this wizard.
+	 * 
+	 * @return the template pages
+	 */
+	protected AbstractList<BaseTemplateWizardPage> getTemplatePages() {
+		AbstractList<BaseTemplateWizardPage> templatePages = new ArrayList<BaseTemplateWizardPage>();
+		
+		IWizardPage[] wizardPages = getPages();
+		
+		for(int i = 0; i < wizardPages.length; i++)
+			templatePages.add((BaseTemplateWizardPage)wizardPages[i]);
+
+		return templatePages;
+	}
+
+	/**
+	 * Save preferences to the preference store.
+	 *
+	 */
+	private void savePreferencesToStore() {
+		for(BaseTemplateWizardPage page : getTemplatePages())
+			page.savePreferencesToStore();
+	}
+	
+	public abstract void init(IWorkbench workbench, IStructuredSelection selection);
+
+	public abstract void addPages();
+	
+	/**
+	 * Get transformed templates from different template pages.
+	 * 
+	 * @return a list of transformed templates
+	 */
+	public abstract AbstractList<TransformedTemplate> getTransformedTemplates();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/BaseTemplateWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards;
+
+import java.util.AbstractList;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.wizard.WizardPage;
+
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+
+/**
+ * Base template wizard page.
+ *
+ */
+public abstract class BaseTemplateWizardPage extends WizardPage {
+	/**
+	 * The default constructor.
+	 * 
+	 * @param title the page title
+	 */
+	protected BaseTemplateWizardPage(String title) {
+		super(title);
+	}
+	
+	/**
+	 * Apply the given status to the wizard.
+	 * 
+	 * @param status the status of the page
+	 */
+	public void applyStatus(IStatus status) {
+		String message = status.getMessage();
+	
+		switch(status.getSeverity()) {
+			case IStatus.OK:
+				setErrorMessage(null);
+				if(message.length() == 0)
+					setMessage(getPageMessage());
+				break;
+			case IStatus.WARNING:
+				setErrorMessage(null);
+				setMessage(message, WizardPage.WARNING);
+				break;				
+			case IStatus.INFO:
+				setErrorMessage(null);
+				setMessage(message, WizardPage.INFORMATION);
+				break;			
+			default:
+				setErrorMessage(message);
+				setMessage(null);
+				break;		
+		}
+	}
+	
+	/**
+	 * Get templates from the page.
+	 * 
+	 * @return the templates
+	 */
+	public abstract AbstractList<OriginalTemplate> getTemplates();
+	
+	/**
+	 * Get this pages message for the wizard.
+	 * 
+	 * @return the message
+	 */
+	public abstract String getPageMessage();
+	
+	/**
+	 * Get the status of this page.
+	 * 
+	 * @return the status
+	 */
+	public abstract IStatus getStatus();
+
+	/**
+	 * Save the preferences to the preference store.
+	 *
+	 */
+	protected abstract void savePreferencesToStore();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/FileSelectionControl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * File selection control.
+ * 
+ * Provides mechanism for file selection for template
+ * wizard pages.
+ * 
+ */
+public class FileSelectionControl {
+	private Text fileText;
+	
+	/**
+	 * Default constructor.
+	 * 
+	 * @param page the template wizard page this control belongs to.
+	 * @param parent the parent composite to attach this control.
+	 */
+	public FileSelectionControl(Composite topLevel, Listener listener, String label) {
+		// File selection
+		new Label(topLevel, SWT.NONE).setText(label);
+		fileText = new Text(topLevel, SWT.BORDER);
+		GridData fileGridData = new GridData(GridData.FILL_HORIZONTAL);
+		fileGridData.horizontalSpan = 2;
+		fileText.setLayoutData(fileGridData);
+		fileText.addListener(SWT.Modify, listener);
+	}
+	
+	/**
+	 * Get selected file.
+	 * 
+	 * @return the selected file
+	 */
+	public String getSelectedFile() {
+		return fileText.getText();
+	}
+	
+	/**
+	 * Get selected file without extension.
+	 * 
+	 * @return the selected file without extension
+	 */
+	public String getSelectedFileWithoutExtension() {
+		if(fileText.getText().contains("."))
+			return fileText.getText().substring(0, fileText.getText().lastIndexOf('.'));
+		else
+			return fileText.getText();
+	}
+	/**
+	 * Set file name
+	 * 
+	 * @return
+	 */
+	public void setFileName(String filename)
+	{
+		if(filename!=null)
+		fileText.setText(filename);
+	}
+	/**
+	 * Get file name
+	 * @return
+	 */
+	public Text getTextControl()
+	{
+		return fileText;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/FolderSelectionControl.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.actions.MMPSourceUserIncPaths;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+
+/**
+ * Folder selection control.
+ *
+ */
+public class FolderSelectionControl implements Listener {
+	private final Composite topLevel;
+	
+	private Combo folderText;
+	
+	private Button folderButton;
+
+	public FolderSelectionControl(Composite topLevel, Listener listener, String label) {
+		this.topLevel = topLevel;
+		
+		// Folder selection
+		new Label(topLevel, SWT.NONE).setText(label);
+		folderText = new Combo(topLevel, SWT.BORDER);
+		folderText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		MMPSourceUserIncPaths pathsFromMMP=new MMPSourceUserIncPaths();
+		String[] paths=null;
+		IPreferenceStore preferenceStore = SymbianFoundationTemplates.getDefault().getPreferenceStore();
+		if(label.equals(Messages.getString("WizardPageSourceFolderLabel")) && preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW))
+		{
+			paths=pathsFromMMP.getPreviousValues(MMPSourceUserIncPaths.ValueTypes.SRC_DIRS);
+			if(paths!=null)
+			{
+			folderText.setItems(paths);
+			folderText.select(0);
+			}
+		}
+		else if(label.equals(Messages.getString("WizardPageHeaderFolderLabel")) && preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW))
+		{
+			paths=pathsFromMMP.getPreviousValues(MMPSourceUserIncPaths.ValueTypes.USERINC_DIRS);
+			if(paths!=null)
+			{
+			folderText.setItems(paths);
+			folderText.select(0);
+			}
+		}
+		folderText.addListener(SWT.Modify, listener);
+		folderButton = new Button(topLevel, SWT.NONE);
+		folderButton.setText(Messages.getString("FolderSelectionBrowseLabel")); //$NON-NLS-1$
+		folderButton.addListener(SWT.Selection, this);
+	}
+	
+	public void handleEvent(Event event) {
+		// Handle folder button
+		if(event.widget == folderButton) {
+			ContainerSelectionDialog dialog = new ContainerSelectionDialog(topLevel.getShell(),
+					ResourcesPlugin.getWorkspace().getRoot(), false,
+					Messages.getString("FolderSelectionDialogTitle")); //$NON-NLS-1$
+			
+			dialog.setBlockOnOpen(true);
+			
+			dialog.open();
+			
+			Object[] result = dialog.getResult();
+			
+			if(result != null) {
+				String path = result[0].toString();
+				folderText.setText(path.substring(1, path.length()));
+			}	
+		}
+	}
+	
+	/**
+	 * @return the selected folder
+	 */
+	public String getSelectedFolder() {
+		return folderText.getText();
+	}
+	
+	/**
+	 * @param text the selected folder to be set
+	 */
+	public void setSelectedFolder(String text) {
+		if(text != null)
+			folderText.setText(text);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplatePageType.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60;
+
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Images;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.TemplateFiles;
+
+/**
+ * Template page type.
+ *
+ */
+public enum S60TemplatePageType {
+	C_CLASS_PAGE	(	Messages.getString("CClassWizardTitle"), //$NON-NLS-1$
+						Messages.getString("CClassWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.C_Class"), //$NON-NLS-1$
+						Images.getString("Banner.Class")
+					),
+	
+	M_CLASS_PAGE	(	Messages.getString("MClassWizardTitle"), //$NON-NLS-1$
+						Messages.getString("MClassWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.M_Class"), //$NON-NLS-1$
+						Images.getString("Banner.Class")
+					),
+	
+	R_CLASS_PAGE	(	Messages.getString("RClassWizardTitle"), //$NON-NLS-1$
+						Messages.getString("RClassWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.R_Class"), //$NON-NLS-1$
+						Images.getString("Banner.Class")
+					),
+						
+	T_CLASS_PAGE	(	Messages.getString("TClassWizardTitle"), //$NON-NLS-1$
+						Messages.getString("TClassWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.T_Class"), //$NON-NLS-1$
+						Images.getString("Banner.Class")
+					),
+						
+	C_HEADER_PAGE	(	Messages.getString("CHeaderWizardTitle"), //$NON-NLS-1$
+						Messages.getString("CHeaderWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.C_Header"), //$NON-NLS-1$
+						Images.getString("Banner.Header")
+					),
+						
+	M_HEADER_PAGE	(	Messages.getString("MHeaderWizardTitle"), //$NON-NLS-1$
+						Messages.getString("MHeaderWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.M_Header"), //$NON-NLS-1$
+						Images.getString("Banner.Header")
+					),
+						
+	R_HEADER_PAGE	(	Messages.getString("RHeaderWizardTitle"), //$NON-NLS-1$
+						Messages.getString("RHeaderWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.R_Header"), //$NON-NLS-1$
+						Images.getString("Banner.Header")
+					),
+						
+	T_HEADER_PAGE	(	Messages.getString("THeaderWizardTitle"), //$NON-NLS-1$
+						Messages.getString("THeaderWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.T_Header"), //$NON-NLS-1$
+						Images.getString("Banner.Header")
+					),
+						
+	SOURCE_PAGE		(	Messages.getString("SourceWizardTitle"), //$NON-NLS-1$
+						Messages.getString("SourceWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.Source"), //$NON-NLS-1$
+						Images.getString("Banner.Source")
+					),
+						
+	RESOURCE_PAGE	(	Messages.getString("ResourceWizardTitle"), //$NON-NLS-1$
+						Messages.getString("ResourceWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.Resource"), //$NON-NLS-1$
+						Images.getString("Banner.File")
+					),
+						
+	ICON_PAGE		(	Messages.getString("IconWizardTitle"), //$NON-NLS-1$
+						Messages.getString("IconWizardMessage"), //$NON-NLS-1$
+						TemplateFiles.getString("TemplateFile.Icon"), //$NON-NLS-1$
+						Images.getString("Banner.File")
+					),
+	
+	MMP_PAGE		(	Messages.getString("MMPWizardTitle"),
+						Messages.getString("MMPWizardMessage"),
+						TemplateFiles.getString("TemplateFile.MMP"),
+						Images.getString("Banner.MMPFile")
+					),
+	
+	BUILD_INFO_PAGE	(	Messages.getString("BuildInfoWizardTitle"),
+						Messages.getString("BuildInfoWizardMessage"),
+						TemplateFiles.getString("TemplateFile.BuildInfo"),
+						Images.getString("Banner.File")
+					);
+	
+	private String title;
+	private String message;
+	private String templateFiles;
+	private String image;
+	
+	private S60TemplatePageType(String title, String message, String templateFiles, String image) {
+		this.title = title;
+		this.message = message;
+		this.templateFiles = templateFiles;
+		this.image = image;
+	}
+	
+	/**
+	 * @return the pages title
+	 */
+	public String getTitle() {
+		return title;
+	}
+	
+	/**
+	 * @return the pages message
+	 */
+	public String getMessage() {
+		return message;
+	}
+	
+	/**
+	 * @return the template files for this page
+	 */
+	public String getTemplateFiles() {
+		return templateFiles;
+	}
+	
+	public String getImage() {
+		return image;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplateWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.TransformedTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60Engine;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.BaseTemplateWizard;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.BaseTemplateWizardPage;
+
+/**
+ * S60 template wizard. Handles template transforming with S60Engine.
+ *
+ */
+public abstract class S60TemplateWizard extends BaseTemplateWizard {
+	public S60TemplateWizard(String image) {
+		super();
+		
+		Image wizardBanner = new Image(PlatformUI.getWorkbench().getDisplay(),
+				SymbianFoundationTemplates.getDefault().getImagesPath() + File.separator + image);
+		
+		setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(wizardBanner));
+	}
+	
+	@Override
+	public AbstractList<TransformedTemplate> getTransformedTemplates() {
+		AbstractList<TransformedTemplate> transformedTemplates = new ArrayList<TransformedTemplate>();
+		
+		for(BaseTemplateWizardPage page : getTemplatePages()) {
+			for(OriginalTemplate template : page.getTemplates()) {
+				try {
+					S60Engine engine = new S60Engine(template.getTemplateFile());
+					engine.setTransformRules(template.getTransformRules());
+				
+					transformedTemplates.add(new TransformedTemplate(template.getToBeTransformedFile(),
+							engine.getTransformedString()));
+				} catch(IOException ioe) {
+					SymbianFoundationTemplates.getDefault().showErrorDialog("Error transforming template!", ioe.getMessage());
+				}
+			}
+		}
+		
+		return transformedTemplates;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/S60TemplateWizardPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,96 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60;
+
+import java.util.AbstractList;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.BaseTemplateWizardPage;
+
+/**
+ * S60 template wizard base page.
+ *
+ */
+public abstract class S60TemplateWizardPage extends BaseTemplateWizardPage implements Listener {
+	protected static final IPreferenceStore preferenceStore = SymbianFoundationTemplates.getDefault().getPreferenceStore();
+	
+	protected final S60TemplatePageType pageType;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param pageType the page type
+	 */
+	public S60TemplateWizardPage(S60TemplatePageType pageType) {
+		super(pageType.getTitle());
+		
+		this.pageType = pageType;
+	}
+	
+	public void handleEvent(Event event) {
+		updateStatus();
+			
+		getWizard().getContainer().updateButtons();
+	}
+
+	public IStatus getStatus() {
+		for(IStatus status : getStatuses())
+			if(status.matches(IStatus.ERROR))
+				return status;
+		
+		return new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null);
+	}
+	
+	public String getPageMessage() {
+		return pageType.getMessage();
+	}
+	
+	/**
+	 * Update the status of the page.
+	 *
+	 */
+	protected void updateStatus() {
+		IStatus mostSevere = new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null);
+		
+		for(IStatus status : getStatuses())
+			if(status.getSeverity() > mostSevere.getSeverity())
+				mostSevere = status;
+		
+		applyStatus(mostSevere);
+		
+		updateFields();
+	}
+
+	/**
+	 * Get the statuses of this page.
+	 * 
+	 * @return the statuses
+	 */
+	protected abstract AbstractList<IStatus> getStatuses();
+	
+	/**
+	 * Update the fields of this page.
+	 *
+	 */
+	protected abstract void updateFields();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/CClassWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * C class wizard.
+ *
+ */
+public class CClassWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.C_CLASS_PAGE;
+
+	public CClassWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new ClassPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/ClassPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,370 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Class page.
+ *
+ */
+public class ClassPage extends S60TemplateWizardPage {
+	private FolderSelectionControl sourceFolderSelection;
+	private FolderSelectionControl headerFolderSelection;
+	
+	private FileSelectionControl classSelection;
+	public FileSelectionControl fileNameSelection;
+	private Text subSystemText;
+	private Text moduleText;
+	private Text descriptionText;
+	private Text copyrightText;
+	private Composite topLevel;
+	private Button cleanBtn;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	
+	public ClassPage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		if(pageType != S60TemplatePageType.M_CLASS_PAGE)
+			sourceFolderSelection = new FolderSelectionControl(selection, this, Messages.getString("WizardPageSourceFolderLabel")); //$NON-NLS-1$
+		
+		// Folder selection control
+		headerFolderSelection = new FolderSelectionControl(selection, this, Messages.getString("WizardPageHeaderFolderLabel")); //$NON-NLS-1$
+		
+		// File selection control
+		classSelection = new FileSelectionControl(selection, this, Messages.getString("WizardPageClassNameLabel")); //$NON-NLS-1$
+		
+		//
+		fileNameSelection = new FileSelectionControl(selection, this, "File Name:");
+
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageDescriptionLabel")); //$NON-NLS-1$
+		descriptionText = new Text(info, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+			
+		GC gc = new GC(descriptionText);
+		FontMetrics fm = gc.getFontMetrics();
+		int cols = 20;
+		int rows = 6;
+		int width = cols * fm.getAverageCharWidth();
+		int height = rows * fm.getHeight();
+			
+		GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
+		gridData.widthHint = width;
+		gridData.heightHint = height;
+			
+		descriptionText.setLayoutData(gridData);
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+	
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+	
+		if(!preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW))
+			setPreferencesFromStore();
+
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+	
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_OVERVIEW);
+	}
+	
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		String[] templateFiles = getTemplateFile().split(";"); //$NON-NLS-1$
+		
+		IFile headerFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(
+				headerFolderSelection.getSelectedFolder() + File.separator
+				+ fileNameSelection.getSelectedFileWithoutExtension() + ".h")); //$NON-NLS-1$
+		
+		IFile sourceFile = null;
+		if(pageType != S60TemplatePageType.M_CLASS_PAGE)
+			sourceFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(
+					sourceFolderSelection.getSelectedFolder() + File.separator
+					+ fileNameSelection.getSelectedFileWithoutExtension() + ".cpp")); //$NON-NLS-1$
+			
+		templates.add(new OriginalTemplate(templateFiles[0], headerFile, getTransformRules()));
+		if(pageType != S60TemplatePageType.M_CLASS_PAGE)
+			templates.add(new OriginalTemplate(templateFiles[1], sourceFile, getTransformRules()));
+		
+		return templates;
+	}
+	
+	protected AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(headerFolderSelection.getSelectedFolder(), Messages.getString("WizardPageHeaderFolderMsg"))); //$NON-NLS-1$
+		if(pageType != S60TemplatePageType.M_CLASS_PAGE)
+			statuses.add(Util.getFolderNameStatus(sourceFolderSelection.getSelectedFolder(), Messages.getString("WizardPageSourceFolderMsg"))); //$NON-NLS-1$
+		
+		statuses.add(getFileNameStatus(classSelection.getSelectedFile(),fileNameSelection.getSelectedFile()));
+		
+		return statuses;
+	}
+	
+	protected void updateFields() {
+		if(pageType != S60TemplatePageType.M_CLASS_PAGE)
+			subSystemText.setText(Util.getSubSystemName(sourceFolderSelection.getSelectedFolder()));
+		moduleText.setText(Util.getModuleName(headerFolderSelection.getSelectedFolder()));
+	}
+	
+	protected void savePreferencesToStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false)
+		{
+			if(pageType != S60TemplatePageType.M_CLASS_PAGE)	
+				preferenceStore.setValue(PreferenceConstants.SF_CLASS_PAGE_SRCDIR, sourceFolderSelection.getSelectedFolder());
+			preferenceStore.setValue(PreferenceConstants.SF_CLASS_PAGE_HDRDIR, headerFolderSelection.getSelectedFolder());
+			preferenceStore.setValue(PreferenceConstants.SF_CLASS_PAGE_MODULE, moduleText.getText());
+			preferenceStore.setValue(PreferenceConstants.SF_CLASS_PAGE_SUBSYSTEM, subSystemText.getText());
+		}
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false)
+		{
+			if(pageType != S60TemplatePageType.M_CLASS_PAGE && preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_SRCDIR)!="")
+				sourceFolderSelection.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_SRCDIR));
+			if(preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_SRCDIR)!="")
+				headerFolderSelection.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_HDRDIR));
+			moduleText.setText(preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_MODULE));
+			subSystemText.setText(preferenceStore.getString(PreferenceConstants.SF_CLASS_PAGE_SUBSYSTEM));
+		}
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+		
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), fileNameSelection.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_description"), descriptionText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_classname"), classSelection.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		String upperCaseClassName = classSelection.getSelectedFileWithoutExtension().toUpperCase();
+		
+		switch(pageType) {
+		case C_CLASS_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_cclassname"), "C_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case M_CLASS_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_mclassname"), "M_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case R_CLASS_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_rclassname"), "R_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case T_CLASS_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_tclassname"), "T_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		}
+		
+		return transformRules;
+	}
+	
+	private IStatus getFileNameStatus(String className,String fileName) {
+		IStatus fileStatus = new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+		
+		if(className.length() == 0)
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, Messages.getString("WizardPageErrorClassNameEmpty"), null); //$NON-NLS-1$
+		else if(fileName.length() == 0)
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, Messages.getString("WizardPageErrorFileNameEmpty"), null);
+		else if(fileName.indexOf(" ")!=-1)
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, Messages.getString("WizardPageErrorFileNameHasSpaces"), null);
+		else if(!Util.checkFileName(className))
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, className+Messages.getString("WizardPageErrorInvalidClassName"), null);
+		else if(!Util.checkFileName(fileName))
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, fileName+Messages.getString("WizardPageErrorInvalidFileName"), null);
+		else if(headerFolderSelection.getSelectedFolder()!="" && Util.getSelectedFile(fileName + ".h", headerFolderSelection.getSelectedFolder()).exists()) //$NON-NLS-1$
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, Messages.getString("WizardPageErrorClassHeader") + fileName + ".h" + Messages.getString("WizardPageErrorClassAlreadyExists"), null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		else if(pageType != S60TemplatePageType.M_CLASS_PAGE && sourceFolderSelection.getSelectedFolder()!="" && Util.getSelectedFile(fileName + ".cpp", sourceFolderSelection.getSelectedFolder()).exists()) //$NON-NLS-1$
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, Messages.getString("WizardPageErrorClassSource") + fileName + ".cpp" + Messages.getString("WizardPageErrorClassAlreadyExists"), null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		
+		else {
+			String message = Messages.getString("WizardPageWarningClassNameDiscouraged"); //$NON-NLS-1$
+			
+			switch(pageType) {
+			case C_CLASS_PAGE:
+				if(!className.startsWith("C")) //$NON-NLS-1$
+					fileStatus = new Status(IStatus.WARNING, SymbianFoundationTemplates.PLUGIN_ID, 1, message + "C.", null); //$NON-NLS-1$
+				break;
+			case M_CLASS_PAGE:
+				if(!className.startsWith("M")) //$NON-NLS-1$
+					fileStatus = new Status(IStatus.WARNING, SymbianFoundationTemplates.PLUGIN_ID, 1, message + "M.", null); //$NON-NLS-1$
+				break;
+			case R_CLASS_PAGE:
+				if(!className.startsWith("R")) //$NON-NLS-1$
+					fileStatus = new Status(IStatus.WARNING, SymbianFoundationTemplates.PLUGIN_ID, 1, message + "R.", null); //$NON-NLS-1$
+				break;
+			case T_CLASS_PAGE:
+				if(!className.startsWith("T")) //$NON-NLS-1$
+					fileStatus = new Status(IStatus.WARNING, SymbianFoundationTemplates.PLUGIN_ID, 1, message + "T.", null); //$NON-NLS-1$
+				break;
+			}
+		}
+		
+		return fileStatus;
+	}
+	
+	private String getTemplateFile() {
+		String location = SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator;
+		String[] templateFiles = pageType.getTemplateFiles().split(";"); //$NON-NLS-1$
+		if(!cleanBtn.getSelection())
+			return location + templateFiles[2] + ";" + location + templateFiles[3]; //$NON-NLS-1$
+		
+		return location + templateFiles[0] + ";" + location + templateFiles[1]; //$NON-NLS-1$
+	} 
+	@Override
+	public void handleEvent(Event event) {
+		if(event.widget == classSelection.getTextControl())
+		{
+			fileNameSelection.setFileName(classSelection.getSelectedFile());
+		}
+		super.handleEvent(event);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/MClassWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * M class wizard.
+ *
+ */
+public class MClassWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.M_CLASS_PAGE;
+	
+	public MClassWizard() {
+		super(pageType.getImage());
+	}
+	@Override
+	public void addPages() {
+		addPage(new ClassPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/RClassWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * R class wizard.
+ *
+ */
+public class RClassWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.R_CLASS_PAGE;
+	
+	public RClassWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new ClassPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/classwizards/TClassWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.classwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * T class wizard.
+ *
+ */
+public class TClassWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.T_CLASS_PAGE;
+	
+	public TClassWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new ClassPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/CHeaderWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * C class header wizard.
+ *
+ */
+public class CHeaderWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.C_HEADER_PAGE;
+	
+	public CHeaderWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new HeaderPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/HeaderPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,295 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Header page.
+ *
+ */
+public class HeaderPage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private FileSelectionControl fileSelectionControl;
+	private Text subSystemText;
+	private Text moduleText;
+	private Text descriptionText;
+	private Text copyrightText;
+	private Composite topLevel;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	private Button cleanBtn;
+		
+	/**
+	 * Default constructor.
+	 * 
+	 * @param pageType the page type
+	 */
+	public HeaderPage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, Messages.getString("WizardPageHeaderFolderLabel")); //$NON-NLS-1$
+		
+		// File selection control
+		fileSelectionControl = new FileSelectionControl(selection, this, Messages.getString("WizardPageHeaderFileLabel")); //$NON-NLS-1$
+		
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageDescriptionLabel")); //$NON-NLS-1$
+		descriptionText = new Text(info, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+			
+		GC gc = new GC(descriptionText);
+		FontMetrics fm = gc.getFontMetrics();
+		int cols = 20;
+		int rows = 6;
+		int width = cols * fm.getAverageCharWidth();
+		int height = rows * fm.getHeight();
+			
+		GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
+		gridData.widthHint = width;
+		gridData.heightHint = height;
+			
+		descriptionText.setLayoutData(gridData);
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+		
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+	
+		if(!preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW))
+			setPreferencesFromStore();
+
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+	
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_OVERVIEW);
+	}
+	
+	@Override
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		String fileName = templateFiles[0];
+		//To return the empty template file name
+		if(!cleanBtn.getSelection())
+			fileName = templateFiles[1];
+		templates.add(new OriginalTemplate(SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator + fileName, getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+
+	public AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), Messages.getString("WizardPageHeaderFolderMsg"))); //$NON-NLS-1$
+		statuses.add(Util.getFileNameStatus(fileSelectionControl.getSelectedFile(),
+				pageType.getTemplateFiles(), folderSelectionControl.getSelectedFolder()));
+		
+		return statuses;
+	}
+	
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+	
+	protected void savePreferencesToStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false)
+		{
+		preferenceStore.setValue(PreferenceConstants.SF_HEADER_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.SF_HEADER_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_HEADER_PAGE_SUBSYSTEM, subSystemText.getText());
+		}
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_description"), descriptionText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_classname"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		String upperCaseClassName = fileSelectionControl.getSelectedFileWithoutExtension().toUpperCase();
+		
+		switch(pageType) {
+		case C_HEADER_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_cclassname"), "C_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case M_HEADER_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_mclassname"), "M_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case R_HEADER_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_rclassname"), "R_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		case T_HEADER_PAGE:
+			transformRules.put(S60TransformKeys.getString("key_tclassname"), "T_" + upperCaseClassName + "_H"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			break;
+		}
+		
+		return transformRules;
+	}
+	
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ fileSelectionControl.getSelectedFile()));
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false && preferenceStore.getString(PreferenceConstants.SF_HEADER_PAGE_DIRECTORY)!="")
+		{
+		folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_HEADER_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.SF_HEADER_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.SF_HEADER_PAGE_SUBSYSTEM));
+		}
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/MHeaderWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * M class header wizard.
+ *
+ */
+public class MHeaderWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.M_HEADER_PAGE;
+	
+	public MHeaderWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new HeaderPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/RHeaderWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * R class header wizard.
+ *
+ */
+public class RHeaderWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.R_HEADER_PAGE;
+	
+	public RHeaderWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new HeaderPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/headerwizards/THeaderWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.headerwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * T class header wizard.
+ *
+ */
+public class THeaderWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.T_HEADER_PAGE;
+	
+	public THeaderWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new HeaderPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/BuildInfoPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Build info page. 
+ */
+public class BuildInfoPage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private Text subSystemText;
+	private Text moduleText;
+	private Text appNameText;
+	private Text copyrightText;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	private Button cleanBtn;
+
+	private Composite topLevel;
+	
+	public BuildInfoPage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+	
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, "Group Folder:");
+		
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageApplicationLabel")); //$NON-NLS-1$
+		appNameText = new Text(info, SWT.BORDER);
+		appNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+				
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		//setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+	
+
+		setPreferencesFromStore();
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_RESOURCE_WIZARD_PAGE);
+	}
+	
+	@Override
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		String fileName = templateFiles[0];
+		//To return the empty template file name
+		if(!cleanBtn.getSelection())
+			fileName = templateFiles[1];
+		
+		templates.add(new OriginalTemplate(SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator + fileName, getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+	
+	@Override
+	protected AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), "Group folder")); //$NON-NLS-1$
+				
+		return statuses;
+	}
+
+	@Override
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+
+	@Override
+	protected void savePreferencesToStore() {
+		preferenceStore.setValue(PreferenceConstants.S60_BUILD_INFO_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.S60_BUILD_INFO_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.S60_BUILD_INFO_PAGE_SUBSYSTEM, subSystemText.getText());
+		preferenceStore.setValue(PreferenceConstants.S60_BUILD_INFO_PAGE_APPNAME, appNameText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ "bld.inf"));
+	}
+	
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_appname"), appNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		return transformRules;
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getString(PreferenceConstants.S60_BUILD_INFO_PAGE_DIRECTORY)!="")
+			folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.S60_BUILD_INFO_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.S60_BUILD_INFO_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.S60_BUILD_INFO_PAGE_SUBSYSTEM));
+		appNameText.setText(preferenceStore.getString(PreferenceConstants.S60_BUILD_INFO_PAGE_APPNAME));
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/BuildInfoWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * Build info wizard 
+ */
+public class BuildInfoWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.BUILD_INFO_PAGE;
+	
+	public BuildInfoWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new BuildInfoPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/IconPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,309 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Icon page.
+ *
+ */
+public class IconPage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private FileSelectionControl fileSelectionControl;
+	
+	private Button menuIcon;
+	private Button extraIcon;
+
+	private Text copyrightText;
+	private Text appNameText;
+	private Text moduleText;
+	private Text subSystemText;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	private Button cleanBtn;
+
+	private Composite topLevel;
+	
+	public IconPage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, Messages.getString("WizardPageMakefileFolderLabel")); //$NON-NLS-1$
+		
+		// File selection control
+		fileSelectionControl = new FileSelectionControl(selection, this, Messages.getString("WizardPageIconMakefileLabel")); //$NON-NLS-1$
+		
+		// Separator
+		Label separator1 = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator1.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageApplicationLabel")); //$NON-NLS-1$
+		appNameText = new Text(info, SWT.BORDER);
+		appNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+				
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+				
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Separator
+		Label separator2 = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator2.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite typeSelection = new Composite(topLevel, SWT.NONE);
+		typeSelection.setLayout(new GridLayout(4, false));
+		typeSelection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+
+		new Label(typeSelection, SWT.NONE).setText(Messages.getString("WizardPageIconTypeLabel")); //$NON-NLS-1$
+		
+		menuIcon = new Button(typeSelection, SWT.RADIO);
+		menuIcon.setText(Messages.getString("WizardPageNormalIconLabel")); //$NON-NLS-1$
+		extraIcon = new Button(typeSelection, SWT.RADIO);
+		extraIcon.setText(Messages.getString("WizardPageScalableIconLabel")); //$NON-NLS-1$
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+		
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+	
+		setPreferencesFromStore();
+		performHelp();
+		if(menuIcon.getSelection() == false
+				&& extraIcon.getSelection() == false)
+			menuIcon.setSelection(true);
+		
+		//updateStatus();
+		topLevel.setFocus();
+	}
+	
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_RESOURCE_WIZARD_PAGE);
+	}
+	
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		templates.add(new OriginalTemplate(getTemplateFile(), getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+	
+	public AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), Messages.getString("WizardPageMakefileFolderMsg"))); //$NON-NLS-1$
+		statuses.add(Util.getFileNameStatus(fileSelectionControl.getSelectedFile(),
+				pageType.getTemplateFiles(), folderSelectionControl.getSelectedFolder()));
+		
+		return statuses;
+	}
+	
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+	
+	protected void savePreferencesToStore() {
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_SUBSYSTEM, subSystemText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_APPNAME, appNameText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_MENU, menuIcon.getSelection());
+		preferenceStore.setValue(PreferenceConstants.SF_ICON_PAGE_EXTRA, extraIcon.getSelection());
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_appname"), appNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_smallappname"), appNameText.getText().toLowerCase()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		if(menuIcon.getSelection())
+			transformRules.put(S60TransformKeys.getString("key_normaliconname"), fileSelectionControl.getSelectedFileWithoutExtension() + ".mk"); //$NON-NLS-1$ //$NON-NLS-2$
+		else if(extraIcon.getSelection())
+			transformRules.put(S60TransformKeys.getString("key_scalableiconname"), fileSelectionControl.getSelectedFileWithoutExtension() + ".mk"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		return transformRules;
+	}
+
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ fileSelectionControl.getSelectedFile()));
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getString(PreferenceConstants.SF_ICON_PAGE_DIRECTORY)!="")
+			folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_ICON_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.SF_ICON_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.SF_ICON_PAGE_SUBSYSTEM));
+		appNameText.setText(preferenceStore.getString(PreferenceConstants.SF_ICON_PAGE_APPNAME));
+		menuIcon.setSelection(preferenceStore.getBoolean(PreferenceConstants.SF_ICON_PAGE_MENU));
+		extraIcon.setSelection(preferenceStore.getBoolean(PreferenceConstants.SF_ICON_PAGE_EXTRA));
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+	
+	private String getTemplateFile() {
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		
+		String templateFile = "";
+		if(menuIcon.getSelection())
+		{
+			templateFile = templateFiles[0];
+			if(!cleanBtn.getSelection())
+				templateFile = templateFiles[2];
+		}
+		else if(extraIcon.getSelection())
+		{
+			templateFile = templateFiles[1];
+			if(!cleanBtn.getSelection())
+				templateFile = templateFiles[3];
+		}
+		
+		/*for(int i = 0; i < templateFiles.length; i++)
+			if(scalableIcon.getSelection() && templateFiles[i].contains("scalable"))
+				templateFile = templateFiles[i];
+			else if(bitmapIcon.getSelection() && templateFiles[i].contains("bitmaps"))
+				templateFile = templateFiles[i];
+			else if(normalIcon.getSelection() && templateFiles[i].contains("icons."))
+				templateFile = templateFiles[i];*/
+		
+		return SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator
+				+ templateFile;
+	} 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/IconWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * Icon wizard.
+ *
+ */
+public class IconWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.ICON_PAGE;
+	
+	public IconWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new IconPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/MMPPage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,258 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Project specification page.
+ */
+public class MMPPage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private FileSelectionControl fileSelectionControl;
+
+	private Text subSystemText;
+	private Text moduleText;
+	private Text appNameText;
+	private Text copyrightText;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	private Button cleanBtn;
+
+	private Composite topLevel;
+	
+	public MMPPage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+	
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, "Folder:");
+		
+		// File selection control
+		fileSelectionControl = new FileSelectionControl(selection, this, "MMP File(.mmp):");
+		
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageApplicationLabel")); //$NON-NLS-1$
+		appNameText = new Text(info, SWT.BORDER);
+		appNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+				
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+		
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+		
+		setPreferencesFromStore();
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_RESOURCE_WIZARD_PAGE);
+	}
+	
+	@Override
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		String fileName = templateFiles[0];
+		//To return the empty template file name
+		if(!cleanBtn.getSelection())
+			fileName = templateFiles[1];
+		
+		templates.add(new OriginalTemplate(SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator + fileName,	getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+	
+	@Override
+	protected AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), "Folder")); //$NON-NLS-1$
+		statuses.add(Util.getFileNameStatus(fileSelectionControl.getSelectedFile(),
+				pageType.getTemplateFiles(), folderSelectionControl.getSelectedFolder()));
+		
+		return statuses;
+	}
+
+	@Override
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+
+	@Override
+	protected void savePreferencesToStore() {
+		preferenceStore.setValue(PreferenceConstants.S60_MMP_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.S60_MMP_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.S60_MMP_PAGE_SUBSYSTEM, subSystemText.getText());
+		preferenceStore.setValue(PreferenceConstants.S60_MMP_PAGE_APPNAME, appNameText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ fileSelectionControl.getSelectedFile()));
+	}
+	
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_appname"), appNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		return transformRules;
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getString(PreferenceConstants.S60_MMP_PAGE_DIRECTORY)!="")
+			folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.S60_MMP_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.S60_MMP_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.S60_MMP_PAGE_SUBSYSTEM));
+		appNameText.setText(preferenceStore.getString(PreferenceConstants.S60_MMP_PAGE_APPNAME));
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/projectwizards/MMPWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.projectwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * Project specification wizard.
+ */
+public class MMPWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.MMP_PAGE;
+	
+	public MMPWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new MMPPage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/resourcewizards/ResourcePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,307 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.resourcewizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Resource page.
+ *
+ */
+public class ResourcePage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private FileSelectionControl fileSelectionControl;
+
+	private Text subSystemText;
+	private Text moduleText;
+	private Text appNameText;
+	private Text copyrightText;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Combo copyrightString;
+	private Button cleanBtn;
+
+	private Composite topLevel;
+	
+	public ResourcePage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+	
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, Messages.getString("WizardPageResourceFolderLabel")); //$NON-NLS-1$
+		
+		// File selection control
+		fileSelectionControl = new FileSelectionControl(selection, this, Messages.getString("WizardPageResourceFileLabel")); //$NON-NLS-1$
+		
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageApplicationLabel")); //$NON-NLS-1$
+		appNameText = new Text(info, SWT.BORDER);
+		appNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+				
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+		
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+		
+		setPreferencesFromStore();
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+	
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+			HelpContextIDs.SF_TEMPLATES_RESOURCE_WIZARD_PAGE);
+	}
+	
+	@Override
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		templates.add(new OriginalTemplate(getTemplateFile(),
+				getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+	
+	public AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), Messages.getString("WizardPageResourceFolderMsg"))); //$NON-NLS-1$
+		statuses.add(Util.getFileNameStatus(fileSelectionControl.getSelectedFile(),
+				pageType.getTemplateFiles(), folderSelectionControl.getSelectedFolder()));
+		statuses.add(getFileNameStatus(fileSelectionControl.getSelectedFile()));
+		
+		return statuses;
+	}
+	
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+	
+	protected void savePreferencesToStore() {
+		preferenceStore.setValue(PreferenceConstants.SF_RESOURCE_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.SF_RESOURCE_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_RESOURCE_PAGE_SUBSYSTEM, subSystemText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_RESOURCE_PAGE_APPNAME, appNameText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getString(PreferenceConstants.SF_RESOURCE_PAGE_DIRECTORY)!="")
+			folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_RESOURCE_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.SF_RESOURCE_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.SF_RESOURCE_PAGE_SUBSYSTEM));
+		appNameText.setText(preferenceStore.getString(PreferenceConstants.SF_RESOURCE_PAGE_APPNAME));
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+	
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ fileSelectionControl.getSelectedFile()));
+	}
+	
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_appname"), appNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		if(fileSelectionControl.getSelectedFile().endsWith(".hrh"))
+		{
+			transformRules.put(S60TransformKeys.getString("key_hrhmodulename"), fileSelectionControl.getSelectedFile().replace(".", "_").toUpperCase());
+		}
+		else if(fileSelectionControl.getSelectedFile().endsWith(".rh"))
+		{
+			transformRules.put(S60TransformKeys.getString("key_rhmodulename"), fileSelectionControl.getSelectedFile().replace(".", "_").toUpperCase());
+		}
+		
+		return transformRules;
+	}
+	
+	private String getTemplateFile() {
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		
+		String selectedFile = fileSelectionControl.getSelectedFile();
+		
+		if(!selectedFile.contains("."))
+			return null;
+		
+		String extension = selectedFile.substring(selectedFile.lastIndexOf('.'), selectedFile.length());
+		
+		//Get the two files of the given extension
+		String[] ext_templateFile = new String[2];
+		int j=0;
+		for(int i = 0; i < templateFiles.length; i++)
+			if(templateFiles[i].endsWith(extension))
+			{
+				ext_templateFile[j] = templateFiles[i];
+				j++;
+			}
+		//From the above two files, first one is with instructions and second is without instructions
+		String templateFile = ext_templateFile[0];
+		if(!cleanBtn.getSelection())
+			templateFile = ext_templateFile[1];
+		
+		return SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator
+				+ templateFile;
+	}
+	
+	private IStatus getFileNameStatus(String fileName) {
+		IStatus status = new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null);
+		
+		AbstractList<String> approvedExtensions = Util.getFileExtensions(pageType.getTemplateFiles());
+		
+		boolean endsWithCorrect = false;
+
+		for(String extension : approvedExtensions)
+			if(fileName.endsWith(extension))
+				endsWithCorrect = true;
+		
+		if(!endsWithCorrect)
+			status = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, 1, "Cannot determine resource template type. File extension does not correspond to file types " + approvedExtensions + ".", null);
+		
+		return status;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/resourcewizards/ResourceWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.resourcewizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * Resource wizard.
+ *
+ */
+public class ResourceWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.RESOURCE_PAGE;
+	
+	public ResourceWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new ResourcePage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/sourcewizards/SourcePage.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,275 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.sourcewizards;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.OriginalTemplate;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.HelpContextIDs;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.LastUsedData;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.Messages;
+import com.nokia.s60tools.symbianfoundationtemplates.resources.PreferenceConstants;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FileSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.FolderSelectionControl;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizardPage;
+import com.nokia.s60tools.symbianfoundationtemplates.util.Util;
+
+/**
+ * Source page.
+ *
+ */
+public class SourcePage extends S60TemplateWizardPage {
+	private FolderSelectionControl folderSelectionControl;
+	
+	private FileSelectionControl fileSelectionControl;
+	
+	private Text subSystemText;
+	private Text moduleText;
+	private Text descriptionText;
+	private Text copyrightText;
+	private Combo licenseText;
+	private Combo companyNameText;
+	private Composite topLevel;
+	private Button cleanBtn;
+	private Combo copyrightString;
+	
+	public SourcePage(S60TemplatePageType pageType) {
+		super(pageType);
+		setTitle(pageType.getTitle());
+	}
+	
+	public void createControl(Composite parent) {
+		topLevel = new Composite(parent, SWT.NONE);
+		// Layout manager
+		topLevel.setLayout(new GridLayout(1, false));
+		topLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		Composite selection = new Composite(topLevel, SWT.NONE);
+		selection.setLayout(new GridLayout(3, false));
+		selection.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Folder selection control
+		folderSelectionControl = new FolderSelectionControl(selection, this, Messages.getString("WizardPageSourceFolderLabel")); //$NON-NLS-1$
+		
+		// File selection control
+		fileSelectionControl = new FileSelectionControl(selection, this, Messages.getString("WizardPageSourceFileLabel")); //$NON-NLS-1$
+		
+		// Separator
+		Label separator = new Label(topLevel, SWT.SEPARATOR | SWT.HORIZONTAL);
+		separator.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		// Info control
+		Composite info = new Composite(topLevel, SWT.NONE);
+		info.setLayout(new GridLayout(2, false));
+		info.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+	
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageSubSystemLabel")); //$NON-NLS-1$
+		subSystemText = new Text(info, SWT.BORDER);
+		subSystemText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageModuleLabel")); //$NON-NLS-1$
+		moduleText = new Text(info, SWT.BORDER);
+		moduleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageDescriptionLabel")); //$NON-NLS-1$
+		descriptionText = new Text(info, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+			
+		GC gc = new GC(descriptionText);
+		FontMetrics fm = gc.getFontMetrics();
+		int cols = 20;
+		int rows = 6;
+		int width = cols * fm.getAverageCharWidth();
+		int height = rows * fm.getHeight();
+			
+		GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
+		gridData.widthHint = width;
+		gridData.heightHint = height;
+			
+		descriptionText.setLayoutData(gridData);
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightLabel")); //$NON-NLS-1$
+		copyrightText = new Text(info, SWT.BORDER);
+		copyrightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageLicenseLabel")); //$NON-NLS-1$
+		licenseText = new Combo(info, SWT.BORDER|SWT.READ_ONLY);
+		licenseText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCompanyLabel")); //$NON-NLS-1$
+		companyNameText = new Combo(info, SWT.BORDER);
+		companyNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		new Label(info, SWT.NONE).setText(Messages.getString("WizardPageCopyrightStringLabel"));
+		copyrightString = new Combo(info, SWT.BORDER);// | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
+		copyrightString.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		
+		GridData data=new GridData(GridData.FILL_HORIZONTAL);
+		data.heightHint=30;
+		cleanBtn=new Button(topLevel,SWT.CHECK);
+		cleanBtn.setText(Messages.getString("WizardPageIncludeInstructionsLabel"));
+		cleanBtn.setSelection(true);
+		cleanBtn.setLayoutData(data);
+		
+		setControl(topLevel);
+		setPageComplete(true);
+		
+		copyrightText.setText(new Integer(Util.getCopyrightYear()).toString());
+		licenseText.setItems(Util.getDefaultLicence());
+		licenseText.select(0);
+
+		LastUsedData previousData = new LastUsedData();
+		String[] values = previousData.getPreviousValues(LastUsedData.ValueTypes.NAME);
+		if(values!=null)
+		{
+			companyNameText.setItems(values);
+			companyNameText.select(0);
+		}
+		else
+		{
+			companyNameText.setText(Util.getDefaultCompanyName());
+			previousData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		}
+		
+		values = previousData.getPreviousValues(LastUsedData.ValueTypes.COPYRIGHT);
+		if(values !=null)
+		{
+			copyrightString.setItems(values);
+			copyrightString.select(0);
+		}
+		else
+		{
+			copyrightString.setText(Util.getDefaultCompanyCopyright());
+			previousData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+		}
+		
+		if(!preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW))
+			setPreferencesFromStore();
+		performHelp();
+		//updateStatus();
+		topLevel.setFocus();
+	}
+	
+	public void performHelp() {
+		PlatformUI.getWorkbench().getHelpSystem().displayHelp(
+			HelpContextIDs.SF_TEMPLATES_SOURCE_WIZARD_PAGE);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
+				HelpContextIDs.SF_TEMPLATES_OVERVIEW);
+	}
+	
+	@Override
+	public AbstractList<OriginalTemplate> getTemplates() {
+		AbstractList<OriginalTemplate> templates = new ArrayList<OriginalTemplate>();
+		
+		String[] templateFiles = pageType.getTemplateFiles().split(";");
+		String fileName = templateFiles[0];
+		//To return the empty template file name
+		if(!cleanBtn.getSelection())
+			fileName = templateFiles[1];
+		templates.add(new OriginalTemplate(SymbianFoundationTemplates.getDefault().getTemplatesPath() + File.separator + fileName, getSelectedFile(), getTransformRules()));
+		
+		return templates;
+	}
+	
+	public AbstractList<IStatus> getStatuses() {
+		AbstractList<IStatus> statuses = new ArrayList<IStatus>();
+		
+		statuses.add(Util.getFolderNameStatus(folderSelectionControl.getSelectedFolder(), Messages.getString("WizardPageSourceFolderMsg"))); //$NON-NLS-1$
+		statuses.add(Util.getFileNameStatus(fileSelectionControl.getSelectedFile(),
+				pageType.getTemplateFiles(), folderSelectionControl.getSelectedFolder()));
+		
+		return statuses;
+	}
+	
+	protected void updateFields() {
+		moduleText.setText(Util.getModuleName(folderSelectionControl.getSelectedFolder()));
+		subSystemText.setText(Util.getSubSystemName(folderSelectionControl.getSelectedFolder()));
+	}
+	
+	protected void savePreferencesToStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false)
+		{
+		preferenceStore.setValue(PreferenceConstants.SF_SOURCE_PAGE_DIRECTORY, folderSelectionControl.getSelectedFolder());
+		preferenceStore.setValue(PreferenceConstants.SF_SOURCE_PAGE_MODULE, moduleText.getText());
+		preferenceStore.setValue(PreferenceConstants.SF_SOURCE_PAGE_SUBSYSTEM, subSystemText.getText());
+		}
+		preferenceStore.setValue(PreferenceConstants.SF_LICENSE_INDEX, licenseText.getSelectionIndex());
+		LastUsedData saveData = new LastUsedData();
+		saveData.saveValues(LastUsedData.ValueTypes.NAME, companyNameText.getText());
+		saveData.saveValues(LastUsedData.ValueTypes.COPYRIGHT, copyrightString.getText());
+	}
+
+	private Map<String, String> getTransformRules() {
+		Map<String, String> transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_module"), moduleText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), subSystemText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_description"), descriptionText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_copyright"), copyrightText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_classname"), fileSelectionControl.getSelectedFileWithoutExtension()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_license"), licenseText.getText()); //$NON-NLS-1$		
+		transformRules.put(S60TransformKeys.getString("key_companyname"), companyNameText.getText()); //$NON-NLS-1$
+		transformRules.put(S60TransformKeys.getString("key_companycopyright"), copyrightString.getText());
+		
+		if(licenseText.getText().equalsIgnoreCase("Symbian Foundation License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+		else if(licenseText.getText().equalsIgnoreCase("Eclipse Public License v1.0"))
+			transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.eclipse.org/legal/epl-v10.html");
+		
+		return transformRules;
+	}	
+	
+	private IFile getSelectedFile() {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(folderSelectionControl.getSelectedFolder() 
+						+ File.separator 
+						+ fileSelectionControl.getSelectedFile()));
+	}
+	
+	private void setPreferencesFromStore() {
+		if(preferenceStore.getBoolean(PreferenceConstants.OPENED_FROM_VIEW)==false && preferenceStore.getString(PreferenceConstants.SF_SOURCE_PAGE_DIRECTORY)!="")
+		{
+		folderSelectionControl.setSelectedFolder(preferenceStore.getString(PreferenceConstants.SF_SOURCE_PAGE_DIRECTORY));
+		moduleText.setText(preferenceStore.getString(PreferenceConstants.SF_SOURCE_PAGE_MODULE));
+		subSystemText.setText(preferenceStore.getString(PreferenceConstants.SF_SOURCE_PAGE_SUBSYSTEM));
+		}
+		licenseText.select(preferenceStore.getInt(PreferenceConstants.SF_LICENSE_INDEX));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/ui/wizards/s60/sourcewizards/SourceWizard.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.sourcewizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplatePageType;
+import com.nokia.s60tools.symbianfoundationtemplates.ui.wizards.s60.S60TemplateWizard;
+
+/**
+ * Source wizard.
+ *
+ */
+public class SourceWizard extends S60TemplateWizard {
+	private final static S60TemplatePageType pageType = S60TemplatePageType.SOURCE_PAGE;
+	
+	public SourceWizard() {
+		super(pageType.getImage());
+	}
+	
+	@Override
+	public void addPages() {
+		addPage(new SourcePage(pageType));
+	}
+
+	@Override
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setWindowTitle(pageType.getTitle());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/src/com/nokia/s60tools/symbianfoundationtemplates/util/Util.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,235 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.util;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+
+import com.nokia.s60tools.symbianfoundationtemplates.SymbianFoundationTemplates;
+
+/**
+ * Utility class.
+ *
+ */
+public class Util {
+	/**
+	 * Get the status of the given file name (empty, exists already, discouraged extension...)
+	 * 
+	 * @param fileName the file name
+	 * @param templates template files used for checking extensions
+	 * @param folder folder where file resides
+	 * @return status
+	 */
+	public static IStatus getFileNameStatus(String fileName, String templates, String folder) {
+		IStatus fileStatus = new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null);
+		
+		if(fileName.length() == 0)
+			fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, "File name is empty.", null);
+		else {
+			AbstractList<String> approvedExtensions = getFileExtensions(templates);
+		
+			boolean endsWithCorrect = false;
+
+			for(String extension : approvedExtensions)
+				if(fileName.endsWith(extension))
+					endsWithCorrect = true;
+			
+			if(!endsWithCorrect)
+				fileStatus = new Status(IStatus.WARNING, SymbianFoundationTemplates.PLUGIN_ID, 1, "File name is discouraged. File extension does not correspond to file types " + approvedExtensions + ".", null);
+			
+			if(folder!="" && getSelectedFile(fileName, folder).exists())
+				fileStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, "File already exists.", null);
+		}
+		
+		return fileStatus;
+	}
+
+	/**
+	 * Get the status of the given folder name (empty, exists already...)
+	 * 
+	 * @param folderName folder name
+	 * @param folderType folder type used for creating a correct status message	 
+	 * @return status
+	 */
+	public static IStatus getFolderNameStatus(String folderName, String folderType) {
+		IStatus folderStatus = new Status(IStatus.OK, SymbianFoundationTemplates.PLUGIN_ID, 0, "", null);
+		
+		if(folderName.equals(""))
+			folderStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, folderType + " is empty.", null);
+		else if(!selectedFolderExists(folderName))
+			folderStatus = new Status(IStatus.ERROR, SymbianFoundationTemplates.PLUGIN_ID, -1, folderType + " does not exist.", null);
+		
+		return folderStatus;
+	}
+	
+	/**
+	 * Helper method for getting the selected file
+	 * 
+	 * @param file file name
+	 * @param folder folder name
+	 * @return IFile representing the selected file
+	 */
+	public static IFile getSelectedFile(String file, String folder) {
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(
+			new Path(folder 
+					+ File.separator 
+					+ file));
+	}
+	
+	/**
+	 * Get the module name.
+	 * 
+	 * @param folder folder to determine the module from
+	 * @return the module name
+	 */
+	public static String getModuleName(String folder) {
+		String[] folderParts = folder.split("/");
+		
+		if(folderParts.length > 0)
+			return folderParts[0];
+		else
+			return "";
+	}
+	
+	/**
+	 * Get the subsystem name.
+	 * 
+	 * @param folder the folder to determine the subsystem from
+	 * @return the subsystem name
+	 */
+	public static String getSubSystemName(String folder) {
+		String[] folderParts = folder.split("/");
+		
+		if(folderParts.length > 1)
+			return folderParts[1];
+		else
+			return "";
+	}
+	
+	public static int getCopyrightYear() {
+		return new GregorianCalendar().get(Calendar.YEAR);
+	}
+	
+	/**
+	 * Helper method for getting template file extensions
+	 * 
+	 * @param templates templates
+	 * @return extensions
+	 */
+	public static AbstractList<String> getFileExtensions(String templates) {
+		String[] templateFiles = templates.split(";");
+		
+		AbstractList<String> extensions = new ArrayList<String>();
+		
+		for(int i = 0; i < templateFiles.length; i++)
+			if(templateFiles[i].contains(".")) {
+				String extension = templateFiles[i].substring(
+						templateFiles[i].lastIndexOf('.'),
+						templateFiles[i].length());
+				
+				if(!extensions.contains(extension))
+					extensions.add(extension);
+			}
+	
+		return extensions;
+	}
+	
+	/**
+	 * Helper method for checking whether the selected directory already exists.
+	 * 
+	 * @return true if exists, false otherwise
+	 */
+	private static boolean selectedFolderExists(String folderName) {
+		String[] pathParts = folderName.split("/");
+		IProject project=null;
+		if(pathParts!=null && folderName.indexOf("\\")==-1 && !folderName.startsWith(".") && !folderName.startsWith("/"))
+		{
+			project = ResourcesPlugin.getWorkspace().getRoot().getProject(pathParts[0]);
+		}
+		else
+			return false;
+		
+		String directory = pathParts[0] + File.separator;
+		
+		if(pathParts.length > 1)
+			for(int i = 1; i < pathParts.length; i++)
+				directory += pathParts[i] + File.separator;
+		
+		IFolder folder = null;
+		
+		if(pathParts.length > 1)
+			folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(new Path(directory));
+		
+		if(folder == null)
+			return project.exists();
+		else
+			return folder.exists();
+	}
+	/**
+	 * Helper method for checking whether the given file name is valid or not.
+	 * @param filename filename
+	 * @return true if it is valid.
+	 */
+	public static boolean checkFileName(String filename)
+	{
+		String[] restricted_chars={"&", "^", "+", "-", "@", "$", "%", "*", "(", ")", "|", "\\", "/", "[", "]", "{", "}", "<", ">", "?", ";", ":", ",", "'"};
+		
+		for (int i = 0; i < restricted_chars.length; i++) {
+			if(filename.indexOf(restricted_chars[i])!=-1)
+				return false;
+		}
+		if(filename.indexOf(".") != filename.lastIndexOf("."))
+			return false;
+			
+		return true;
+	}
+
+	/**
+	 * Helper method for getting default license.
+	 * @return License string
+	 */
+	public static String[] getDefaultLicence() {
+		return new String[] {"Symbian Foundation License v1.0","Eclipse Public License v1.0"};
+	}
+
+	/**
+	 * Helper method for getting the default company name.
+	 * @return Company name string.
+	 */
+	public static String getDefaultCompanyName() {
+		return "Nokia Corporation";
+	}
+
+	/**
+	 * Helper method for getting the default company copytight.
+	 * @return Company copyright string.
+	 */
+	public static String getDefaultCompanyCopyright() {
+		return "Nokia Corporation and/or its subsidiary(-ies)";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,96 @@
+/*
+* ============================================================================
+*  Name        : bld.inf
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Build information file for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+PRJ_PLATFORMS
+*** Specify the platforms your component needs to be built for here.  Example:
+DEFAULT
+
+PRJ_EXPORTS
+*** Specify the source file followed by its destination here
+*** copy will be used to copy the source file to its destination
+*** If there's no destination then the source file will be copied
+*** to the same name in \epoc32\include.  Example:
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+*** Icons are built using a makefile.  Example:
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+*** Specify the .mmp files required for building the important component
+*** releasables. Specify "tidy" if the component you need to build doesn't
+*** need to be released.  Example:
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+*** Specify the .mmp files required for building any test programs here.
+*** Example:
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+*** Specify the files to be copied from the source directories to the
+*** releasables' directories for use with test programs.  Example:
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,223 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A C class (except for CBase) will derive from exactly one C class, and
+*** from zero or more M classes.  A C class owns heap-allocated (dynamic)
+*** memory, and thus needs an explicit destructor.  A C class may be
+*** instantiated only on the heap.
+
+
+#ifndef ?C_CLASSNAME_H
+#define ?C_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** global function prototypes (which should be very rare) go here:
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** non-derived functions go here, starting with the Symbian
+*** constructors and the C++ destructor:
+
+    ?IMPORT_C static ?classname* NewL();
+    ?IMPORT_C static ?classname* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static ?classname* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~?classname();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here, starting with the C++
+*** constructor and the Symbian second-phase constructor
+
+    ?classname();
+
+    void ConstructL();
+
+*** other function declarations as above
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?C_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* ============================================================================
+*  Name        : bld.inf
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Build information file for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+PRJ_PLATFORMS
+
+DEFAULT
+
+PRJ_EXPORTS
+
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,151 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef ?C_CLASSNAME_H
+#define ?C_CLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?IMPORT_C static ?classname* NewL();
+    ?IMPORT_C static ?classname* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static ?classname* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~?classname();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private:
+
+    ?classname();
+
+    void ConstructL();
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?C_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_icons_extra.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,66 @@
+# ============================================================================
+#  Name        : icons_extra.mk
+#  Part of     : ?Subsystem_name / ?Module_name
+#  Description : extra icons makefile for project ?myapp
+#  Version     : %version: %
+#
+#  Copyright © ?year-?year ?Company_copyright. 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+#  ?Company_name
+# ============================================================================
+# Template version: 4.1.1
+
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?smallmyapp_extraicons.mif
+
+HEADERDIR=\epoc32\include
+HEADERFILENAME=$(HEADERDIR)\?smallmyapp_extraicons.mbg
+
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@if exist $(ICONTARGETFILENAME) erase $(ICONTARGETFILENAME)
+	@if exist $(HEADERFILENAME) erase $(HEADERFILENAME)
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) (HEADERFILENAME) : qgn_?smallmyapp_icon_1.svg qgn_?smallmyapp_icon_2.svg
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,8 qgn_?smallmyapp_icon_1.svg \
+		/c8,8 qgn_?smallmyapp_icon_2.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(HEADERFILENAME) && \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_icons_menu.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,60 @@
+# ============================================================================
+#  Name        : icons_menu.mk
+#  Part of     : ?Subsystem_name / ?Module_name
+#  Description : menu icons makefile for project ?myapp
+#  Version     : %version: %
+#
+#  Copyright © ?year-?year ?Company_copyright. 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+#  ?Company_name
+# ============================================================================
+# Template version: 4.1.1
+
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?smallmyapp_aif.mif
+
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@if exist $(ICONTARGETFILENAME) erase $(ICONTARGETFILENAME)
+	
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : qgn_menu_?smallmyapp.svg
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_menu_?smallmyapp.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,78 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef ?M_CLASSNAME_H
+#define ?M_CLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+/**  ?description */
+extern ?data_type;
+
+class ?forward_classname;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+    };
+
+
+#endif // ?M_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+/*
+* ============================================================================
+*  Name        : ?filename.mmp
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Project definition file for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,114 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef ?R_CLASSNAME_H
+#define ?R_CLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+// from base class ?base_class
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?R_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+/*
+* ============================================================================
+*  Name        : ?filename.hrh
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+#ifndef ?MODULENAME_HRH
+#define ?MODULENAME_HRH
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // ?MODULENAME_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,89 @@
+/*
+* ============================================================================
+*  Name        : ?filename.loc
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Localization strings for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rh
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+#ifndef ?MODULENAME_RH
+#define ?MODULENAME_RH
+
+
+#include <?include_file.hrh>
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // ?MODULENAME_RH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rss
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource definitions for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+#include <?include_file>
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+#define ?constant ?value
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,187 @@
+/*
+* ============================================================================
+*  Name        : ?filename.cpp
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::?classname()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void ?classname::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewL()
+    {
+    ?classname* self = ?classname::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewLC()
+    {
+    ?classname* self = new( ELeave ) ?classname;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::~?classname()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?classname::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/empty_t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,117 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef ?T_CLASSNAME_H
+#define ?T_CLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+const ?type ?constant_var = ?constant;
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?T_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/icons_extra.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,89 @@
+# ============================================================================
+#  Name        : icons_extra.mk
+#  Part of     : ?Subsystem_name / ?Module_name
+#  Description : extra icons makefile for project ?myapp
+#  Version     : %version: %
+#
+#  Copyright © ?year-?year ?Company_copyright. 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+#  ?Company_name
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?smallmyapp_extraicons.mif
+
+HEADERDIR=\epoc32\include
+HEADERFILENAME=$(HEADERDIR)\?smallmyapp_extraicons.mbg
+
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@if exist $(ICONTARGETFILENAME) erase $(ICONTARGETFILENAME)
+	@if exist $(HEADERFILENAME) erase $(HEADERFILENAME)
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) (HEADERFILENAME) : qgn_?smallmyapp_icon_1.svg qgn_?smallmyapp_icon_2.svg
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,8 qgn_?smallmyapp_icon_1.svg \
+		/c8,8 qgn_?smallmyapp_icon_2.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(HEADERFILENAME) && \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/icons_menu.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,83 @@
+# ============================================================================
+#  Name        : icons_menu.mk
+#  Part of     : ?Subsystem_name / ?Module_name
+#  Description : menu icons makefile for project ?myapp
+#  Version     : %version: %
+#
+#  Copyright © ?year-?year ?Company_copyright. 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+#  ?Company_name
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?smallmyapp_aif.mif
+
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+	@if exist $(ICONTARGETFILENAME) erase $(ICONTARGETFILENAME)
+	
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : qgn_menu_?smallmyapp.svg
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_menu_?smallmyapp.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/inline_template.inl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,52 @@
+/*
+* ============================================================================
+*  Name        : ?filename.inl
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+// -----------------------------------------------------------------------------
+// ?implementation_description
+// -----------------------------------------------------------------------------
+//
+inline ?type ?classname::?member_function()
+    {
+    ?code
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,123 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An M class defines only pure virtual functions, therefore, is an
+*** abstract base class.  An M class will derive from zero or more
+*** other M classes.
+
+
+#ifndef ?M_CLASSNAME_H
+#define ?M_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** pure virtual functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+*** function declarations as above
+
+    };
+
+
+#endif // ?M_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,105 @@
+/*
+* ============================================================================
+*  Name        : ?filename.mmp
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Project definition file for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+*** Uncomment LANG SC below if and only if the resource file needs localisation
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+*** Other possible keywords:
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,184 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An R class denotes a client-side handle to a resource, owned typically by
+*** a Symbian OS server elsewhere on the device.  Generally R classes are
+*** instantiated either on the stack, or nested within C classes, then opened
+*** in some way, usually to a call such as Open() or Connect().  When they
+*** are finished with, it is essential to use the appropriate function to
+*** dispose of the class, usually Close().  An R class will derive from zero
+*** or one other R classes.
+
+
+#ifndef ?R_CLASSNAME_H
+#define ?R_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor:
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+*** declarations of functions derived from base_class are grouped
+*** together here:
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class
+
+*** function declarations as above
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?R_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,57 @@
+/*
+* ============================================================================
+*  Name        : ?filename.hrh
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef ?MODULENAME_HRH
+#define ?MODULENAME_HRH
+
+
+*** data types go here:
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // ?MODULENAME_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,110 @@
+/*
+* ============================================================================
+*  Name        : ?filename.loc
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Localization strings for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
+
+
+*** localization strings go here:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,68 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rh
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef ?MODULENAME_RH
+#define ?MODULENAME_RH
+
+
+*** includes go here:
+
+#include <?include_file.hrh>
+
+
+*** structure definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // ?MODULENAME_RH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rss
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : Resource definitions for project ?myapp
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** For a component's main .rss file, resource NAME identifier go here:
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+*** include files go here:
+
+#include <?include_file>
+
+*** resource identifiers go here:
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+*** constants go here:
+
+#define ?constant ?value
+
+*** resource definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,232 @@
+/*
+* ============================================================================
+*  Name        : ?filename.cpp
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, comments, or code.  ?EXPORT_C means either
+*** the EXPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** Implement only one class in one file.
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external function prototypes go here:
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+*** local constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+*** In the same order as defined in the header file.
+
+*** The first function includes examples of correct tabulation of some
+*** commonly used statements, and some suggested places to put
+*** implementation comments, if needed.
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::?classname()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void ?classname::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewL()
+    {
+    ?classname* self = ?classname::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewLC()
+    {
+    ?classname* self = new( ELeave ) ?classname;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::~?classname()
+    {
+    ?code
+    }
+
+
+*** Non-derived function:
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?classname::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+*** Derived function:
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+*** For an application's UiApp class, functions NewApplication and E32Main
+*** should go here:
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.symbianfoundationtemplates/templates/t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,192 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name
+*  Description : ?Description
+*  Version     : %version: %
+*
+*  Copyright © ?year-?year ?Company_copyright.
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the Symbian Foundation coding conventions.
+*** Remove all unneeded declarations and definitions before checking 
+*** the file in!  Also remove the template's usage instructions, that is, 
+*** everything that begins with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A T class differs from a C class only in the respect that it owns no
+*** heap-allocated (dynamic) memory, and thus needs no explicit destructor.
+*** A T class may be instantiated either on the heap or on the stack.
+*** You must ensure that a T class is fully constructed before use.
+*** A T class will derive from zero or one other T classes.
+
+
+#ifndef ?T_CLASSNAME_H
+#define ?T_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor.
+*** No destructor is needed.
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?T_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/.classpath	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/com.nokia.s60tools.symbianfoundationtemplates"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/.project	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.templates.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,97 @@
+/*
+* ============================================================================
+*  Name        : bld.inf
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Build information file for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+PRJ_PLATFORMS
+*** Specify the platforms your component needs to be built for here.  Example:
+DEFAULT
+
+PRJ_EXPORTS
+*** Specify the source file followed by its destination here
+*** copy will be used to copy the source file to its destination
+*** If there's no destination then the source file will be copied
+*** to the same name in \epoc32\include.  Example:
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+*** Icons are built using a makefile.  Example:
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+*** Specify the .mmp files required for building the important component
+*** releasables. Specify "tidy" if the component you need to build doesn't
+*** need to be released.  Example:
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+*** Specify the .mmp files required for building any test programs here.
+*** Example:
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+*** Specify the files to be copied from the source directories to the
+*** releasables' directories for use with test programs.  Example:
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,229 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A C class (except for CBase) will derive from exactly one C class, and
+*** from zero or more M classes.  A C class owns heap-allocated (dynamic)
+*** memory, and thus needs an explicit destructor.  A C class may be
+*** instantiated only on the heap.
+
+
+#ifndef C_TESTCLASSNAME_H
+#define C_TESTCLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** global function prototypes (which should be very rare) go here:
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** non-derived functions go here, starting with the Symbian
+*** constructors and the C++ destructor:
+
+    ?IMPORT_C static TestClassName* NewL();
+    ?IMPORT_C static TestClassName* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static TestClassName* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~TestClassName();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here, starting with the C++
+*** constructor and the Symbian second-phase constructor
+
+    TestClassName();
+
+    void ConstructL();
+
+*** other function declarations as above
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // C_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,59 @@
+/*
+* ============================================================================
+*  Name        : bld.inf
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Build information file for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+PRJ_PLATFORMS
+
+DEFAULT
+
+PRJ_EXPORTS
+
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,156 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef C_TESTCLASSNAME_H
+#define C_TESTCLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?IMPORT_C static TestClassName* NewL();
+    ?IMPORT_C static TestClassName* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static TestClassName* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~TestClassName();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private:
+
+    TestClassName();
+
+    void ConstructL();
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // C_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,56 @@
+# ============================================================================
+#  Name        : icons.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+#  Nokia Corporation
+# ============================================================================
+# Template version: 4.0.1
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+HEADERDIR=$(EPOCROOT)epoc32\include
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName.mif
+HEADERFILENAME=$(HEADERDIR)\TestAppName.mbg
+
+MAKMAKE :
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,1 qgn_myapp_icon_1 \
+		/c8,1 qgn_myapp_icon_2
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons_aif_bitmaps.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,53 @@
+# ============================================================================
+#  Name        : icons_aif_bitmaps.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : scalable icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+#  Nokia Corporation
+# ============================================================================
+# Template version: 4.1.1
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName_aif.mbm
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_lst.bmp \
+		/c8,8 qgn_myapp_cxt.bmp
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_icons_aif_scalable.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,53 @@
+# ============================================================================
+#  Name        : icons_aif_scalable.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : scalable icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+#  Nokia Corporation
+# ============================================================================
+# Template version: 4.1.1
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName_aif.mif
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_icon_1.svg \
+		/c8,1 qgn_myapp_icon_2.svg
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,83 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef M_TESTCLASSNAME_H
+#define M_TESTCLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+/**  ?description */
+extern ?data_type;
+
+class ?forward_classname;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+    };
+
+
+#endif // M_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,79 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.mmp
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Project definition file for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.1
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,119 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef R_TESTCLASSNAME_H
+#define R_TESTCLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    TestClassName();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    TestClassName( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+// from base class ?base_class
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // R_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,33 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.hrh
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource headers for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.0
+*/
+
+#ifndef TESTFILENAME_HRH
+#define TESTFILENAME_HRH
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // TESTFILENAME_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,89 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.loc
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Localization strings for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.0
+*/
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,42 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.rh
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource headers for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.0
+*/
+
+#ifndef TESTFILENAME_RH
+#define TESTFILENAME_RH
+
+
+#include <?include_file.hrh>
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // TESTFILENAME_RH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,45 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.rss
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource definitions for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.1
+*/
+
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+#include <?include_file>
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+#define ?constant ?value
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,192 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.cpp
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.1
+*/
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+TestClassName::TestClassName()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void TestClassName::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TestClassName* TestClassName::NewL()
+    {
+    TestClassName* self = TestClassName::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TestClassName* TestClassName::NewLC()
+    {
+    TestClassName* self = new( ELeave ) TestClassName;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+TestClassName::~TestClassName()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type TestClassName::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/empty_t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,122 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef T_TESTCLASSNAME_H
+#define T_TESTCLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+const ?type ?constant_var = ?constant;
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    TestClassName();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    TestClassName( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // T_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+# ============================================================================
+#  Name        : icons.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.0.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+HEADERDIR=$(EPOCROOT)epoc32\include
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName.mif
+HEADERFILENAME=$(HEADERDIR)\TestAppName.mbg
+
+MAKMAKE :
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,1 qgn_myapp_icon_1 \
+		/c8,1 qgn_myapp_icon_2
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons_aif_bitmaps.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+# ============================================================================
+#  Name        : icons_aif_bitmaps.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : scalable icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName_aif.mbm
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_lst.bmp \
+		/c8,8 qgn_myapp_cxt.bmp
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/icons_aif_scalable.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+# ============================================================================
+#  Name        : icons_aif_scalable.mk
+#  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+#  Description : scalable icons makefile for project TestAppName
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of "Eclipse Public License v1.0"
+#  which accompanies this distribution, and is available
+#  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#  Initial Contributors:
+#  Nokia Corporation - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\TestAppName_aif.mif
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_icon_1.svg \
+		/c8,1 qgn_myapp_icon_2.svg
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/inline_template.inl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.inl
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+// -----------------------------------------------------------------------------
+// ?implementation_description
+// -----------------------------------------------------------------------------
+//
+inline ?type TestClassName::?member_function()
+    {
+    ?code
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,129 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An M class defines only pure virtual functions, therefore, is an
+*** abstract base class.  An M class will derive from zero or more
+*** other M classes.
+
+
+#ifndef M_TESTCLASSNAME_H
+#define M_TESTCLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** pure virtual functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+*** function declarations as above
+
+    };
+
+
+#endif // M_TESTCLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,106 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.mmp
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Project definition file for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+*** Uncomment LANG SC below if and only if the resource file needs localisation
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+*** Other possible keywords:
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,190 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An R class denotes a client-side handle to a resource, owned typically by
+*** a Symbian OS server elsewhere on the device.  Generally R classes are
+*** instantiated either on the stack, or nested within C classes, then opened
+*** in some way, usually to a call such as Open() or Connect().  When they
+*** are finished with, it is essential to use the appropriate function to
+*** dispose of the class, usually Close().  An R class will derive from zero
+*** or one other R classes.
+
+
+#ifndef R_TESTCLASSNAME_H
+#define R_TESTCLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor:
+
+    TestClassName();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    TestClassName( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+*** declarations of functions derived from base_class are grouped
+*** together here:
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class
+
+*** function declarations as above
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // R_TESTCLASSNAME_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.hrh
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource headers for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef TESTFILENAME_HRH
+#define TESTFILENAME_HRH
+
+
+*** data types go here:
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // TESTFILENAME_HRH
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,111 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.loc
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Localization strings for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
+
+
+*** localization strings go here:
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.rh
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource headers for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef TESTFILENAME_RH
+#define TESTFILENAME_RH
+
+
+*** includes go here:
+
+#include <?include_file.hrh>
+
+
+*** structure definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // TESTFILENAME_RH
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,81 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.rss
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : Resource definitions for project TestAppName
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** For a component's main .rss file, resource NAME identifier go here:
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+*** include files go here:
+
+#include <?include_file>
+
+*** resource identifiers go here:
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+*** constants go here:
+
+#define ?constant ?value
+
+*** resource definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,238 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.cpp
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, comments, or code.  ?EXPORT_C means either
+*** the EXPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** Implement only one class in one file.
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external function prototypes go here:
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+*** local constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+*** In the same order as defined in the header file.
+
+*** The first function includes examples of correct tabulation of some
+*** commonly used statements, and some suggested places to put
+*** implementation comments, if needed.
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+TestClassName::TestClassName()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void TestClassName::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TestClassName* TestClassName::NewL()
+    {
+    TestClassName* self = TestClassName::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TestClassName* TestClassName::NewLC()
+    {
+    TestClassName* self = new( ELeave ) TestClassName;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+TestClassName::~TestClassName()
+    {
+    ?code
+    }
+
+
+*** Non-derived function:
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type TestClassName::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+*** Derived function:
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+*** For an application's UiApp class, functions NewApplication and E32Main
+*** should go here:
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/correct/t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,198 @@
+/*
+* ============================================================================
+*  Name        : TestFileName.h
+*  Part of     : TestSubSystem / TestModule       *** Info from the SWAD
+*  Description : TestDescription
+*                
+*                continues
+*                
+*                ---
+*                still
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2000-2001 Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of "Eclipse Public License v1.0"
+*  which accompanies this distribution, and is available
+*  at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+*  Initial Contributors:
+*  Nokia Corporation - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A T class differs from a C class only in the respect that it owns no
+*** heap-allocated (dynamic) memory, and thus needs no explicit destructor.
+*** A T class may be instantiated either on the heap or on the stack.
+*** You must ensure that a T class is fully constructed before use.
+*** A T class will derive from zero or one other T classes.
+
+
+#ifndef T_TESTCLASSNAME_H
+#define T_TESTCLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class TestClassName : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor.
+*** No destructor is needed.
+
+    TestClassName();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    TestClassName( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // T_TESTCLASSNAME_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,97 @@
+/*
+* ============================================================================
+*  Name        : bld.inf
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Build information file for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+PRJ_PLATFORMS
+*** Specify the platforms your component needs to be built for here.  Example:
+DEFAULT
+
+PRJ_EXPORTS
+*** Specify the source file followed by its destination here
+*** copy will be used to copy the source file to its destination
+*** If there's no destination then the source file will be copied
+*** to the same name in \epoc32\include.  Example:
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+*** Icons are built using a makefile.  Example:
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+*** Specify the .mmp files required for building the important component
+*** releasables. Specify "tidy" if the component you need to build doesn't
+*** need to be released.  Example:
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+*** Specify the .mmp files required for building any test programs here.
+*** Example:
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+*** Specify the files to be copied from the source directories to the
+*** releasables' directories for use with test programs.  Example:
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,224 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+*  ?Company_name
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A C class (except for CBase) will derive from exactly one C class, and
+*** from zero or more M classes.  A C class owns heap-allocated (dynamic)
+*** memory, and thus needs an explicit destructor.  A C class may be
+*** instantiated only on the heap.
+
+
+#ifndef ?C_CLASSNAME_H
+#define ?C_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** global function prototypes (which should be very rare) go here:
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** non-derived functions go here, starting with the Symbian
+*** constructors and the C++ destructor:
+
+    ?IMPORT_C static ?classname* NewL();
+    ?IMPORT_C static ?classname* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static ?classname* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~?classname();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here, starting with the C++
+*** constructor and the Symbian second-phase constructor
+
+    ?classname();
+
+    void ConstructL();
+
+*** other function declarations as above
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?C_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_build_info_template.inf	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Build information file for project ?myapp
+*
+*/
+
+
+PRJ_PLATFORMS
+
+DEFAULT
+
+PRJ_EXPORTS
+
+..\inc\?headerfile.h
+..\inc\?headerfile_2.h                   \epoc32\include\?path_somewhere_else\?headerfile_2.h
+..\data\?inifile.ini                     \epoc32\data\c\private\?uid3\?inifile.ini
+..\graphics\?qgn_myapp_icon_1.bmp        \s60\bitmaps2\?qgn_myapp_icon_1.bmp
+..\graphics\?qgn_myapp_icon_1_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_1_mask.bmp
+..\graphics\?qgn_myapp_icon_2.bmp        \s60\bitmaps2\?qgn_myapp_icon_2.bmp
+..\graphics\?qgn_myapp_icon_2_mask.bmp   \s60\bitmaps2\?qgn_myapp_icon_2_mask.bmp
+
+PRJ_MMPFILES
+gnumakefile icons.mk
+#ifdef __SCALABLE_ICONS
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_scalable.mk
+#else
+    // Remember to change the mk-file name to be unique within the
+    // Architecture domain
+    gnumakefile icons_aif_bitmaps.mk
+#endif 
+myproject.mmp
+myhelpproject.mmp tidy
+#if defined( MARM )
+    myarmspecificproject.mmp
+#endif
+
+PRJ_TESTMMPFILES
+..\test\group\mytest.mmp
+
+PRJ_TESTEXPORTS
+..\test\inc\mytestcommon.h     \epoc32\somewhere\mytestcommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_c_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,146 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+#ifndef ?C_CLASSNAME_H
+#define ?C_CLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**
+ * ?description
+ *
+ * @since S60 ?S60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+?type ?function_name( ?arg_list );
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?IMPORT_C static ?classname* NewL();
+    ?IMPORT_C static ?classname* NewLC();
+
+    /**
+     * Two-phased constructor.
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     */
+    ?IMPORT_C static ?classname* NewL(?type1 ?arg1, ?type2 ?arg2);
+    
+
+    /**
+    * Destructor.
+    */
+    virtual ~?classname();
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private:
+
+    ?classname();
+
+    void ConstructL();
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Own.  *** Write "Own" if this class owns the object pointed to; in
+                 other words, if this class is responsible for deleting it.
+     */
+    ?type* ?member_name;
+
+    /**
+     * ?description_of_pointer_member
+     * Not own.  *** Write "Not own" if some other class owns this object.
+     */
+    ?type* ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?C_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:  icons makefile for project ?myapp
+#
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+HEADERDIR=$(EPOCROOT)epoc32\include
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp.mif
+HEADERFILENAME=$(HEADERDIR)\?myapp.mbg
+
+MAKMAKE :
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,1 qgn_myapp_icon_1 \
+		/c8,1 qgn_myapp_icon_2
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons_aif_bitmaps.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:  scalable icons makefile for project ?myapp
+#
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp_aif.mbm
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_lst.bmp \
+		/c8,8 qgn_myapp_cxt.bmp
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_icons_aif_scalable.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:  scalable icons makefile for project ?myapp
+#
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp_aif.mif
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_icon_1.svg \
+		/c8,1 qgn_myapp_icon_2.svg
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,73 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+#ifndef ?M_CLASSNAME_H
+#define ?M_CLASSNAME_H
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+/**  ?description */
+extern ?data_type;
+
+class ?forward_classname;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+    };
+
+
+#endif // ?M_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Project definition file for project ?myapp
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+#ifndef ?R_CLASSNAME_H
+#define ?R_CLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+// from base class ?base_class
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?R_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Resource headers for project ?myapp
+*
+*/
+
+
+#ifndef ?MODULENAME_HRH
+#define ?MODULENAME_HRH
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // ?MODULENAME_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Localization strings for project ?myapp
+*
+*/
+
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Resource headers for project ?myapp
+*
+*/
+
+
+#ifndef ?MODULENAME_RH
+#define ?MODULENAME_RH
+
+
+#include <?include_file.hrh>
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // ?MODULENAME_RH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Resource definitions for project ?myapp
+*
+*/
+
+
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+#include <?include_file>
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+#define ?constant ?value
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+
+#include <?include_file>
+
+#include "?include_file"
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::?classname()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void ?classname::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewL()
+    {
+    ?classname* self = ?classname::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewLC()
+    {
+    ?classname* self = new( ELeave ) ?classname;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::~?classname()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?classname::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/empty_t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+#ifndef ?T_CLASSNAME_H
+#define ?T_CLASSNAME_H
+
+#include <?include_file>
+
+#include "?include_file"
+
+class ?forward_classname;
+
+/**  ?description */
+extern ?data_type;
+
+const ?type ?constant_var = ?constant;
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+protected:
+
+// from base class ?base_class2
+
+// from base class ?base_class3
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+#include "?include_file.inl"
+
+
+#endif // ?T_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,80 @@
+# ============================================================================
+#  Name        : icons.mk
+#  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+#  Description : icons makefile for project ?myapp
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.0.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+HEADERDIR=$(EPOCROOT)epoc32\include
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp.mif
+HEADERFILENAME=$(HEADERDIR)\?myapp.mbg
+
+MAKMAKE :
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c8,1 qgn_myapp_icon_1 \
+		/c8,1 qgn_myapp_icon_2
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons_aif_bitmaps.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+# ============================================================================
+#  Name        : icons_aif_bitmaps.mk
+#  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+#  Description : scalable icons makefile for project ?myapp
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp_aif.mbm
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_lst.bmp \
+		/c8,8 qgn_myapp_cxt.bmp
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/icons_aif_scalable.mk	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,77 @@
+# ============================================================================
+#  Name        : icons_aif_scalable.mk
+#  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+#  Description : scalable icons makefile for project ?myapp
+#  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+#
+#  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies). 
+#  All rights reserved.
+#  This component and the accompanying materials are made available
+#  under the terms of the License "?License"
+#  which accompanies this distribution, and is available
+#  at the URL "?LicenseUrl".
+#
+#  Initial Contributors:
+#  ?Company_name - initial contribution.
+#
+#  Contributors:
+# ============================================================================
+# Template version: 4.1.1
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** REMEMBER TO CHANGE THIS TEMPLATE FILE NAME TO BE UNIQUE WITHIN
+*** ARCHITECTURE DOMAIN. 
+*** DO NOT USE THE DEFAULT NAME
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** Filenames and pathnames must be completely in lowercase.
+
+*** Commands must be preceded by exactly one tab character.  Commands
+*** can continue to the next line if the last character on the line is
+*** \.
+
+
+ifeq (WINS,$(findstring WINS,$(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\?myapp_aif.mif
+
+MAKMAKE : 
+	mifconv $(ICONTARGETFILENAME) \
+		/c8,8 qgn_myapp_icon_1.svg \
+		/c8,1 qgn_myapp_icon_2.svg
+
+BLD : ;
+
+CLEAN : ;
+
+LIB : ;
+
+CLEANLIB : ;
+
+RESOURCE : ;
+
+FREEZE : ;
+
+SAVESPACE : ;
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/inline_template.inl	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,53 @@
+/*
+* ============================================================================
+*  Name        : ?filename.inl
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+// -----------------------------------------------------------------------------
+// ?implementation_description
+// -----------------------------------------------------------------------------
+//
+inline ?type ?classname::?member_function()
+    {
+    ?code
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/m_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,124 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An M class defines only pure virtual functions, therefore, is an
+*** abstract base class.  An M class will derive from zero or more
+*** other M classes.
+
+
+#ifndef ?M_CLASSNAME_H
+#define ?M_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** pure virtual functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C virtual ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 ) = 0;
+
+protected:
+
+*** function declarations as above
+
+    };
+
+
+#endif // ?M_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/project_specification_template.mmp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,106 @@
+/*
+* ============================================================================
+*  Name        : ?filename.mmp
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Project definition file for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET                  ?target_name
+TARGETTYPE              ?target_type
+UID                     0x?uid2 0x?uid3
+
+CAPABILITY              ?capabilities
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  ?source_file
+SOURCE                  ?source_file_2
+
+START RESOURCE          ?resource_file
+HEADER
+TARGETPATH              ?target_path
+*** Uncomment LANG SC below if and only if the resource file needs localisation
+// LANG                 SC
+END // RESOURCE
+
+USERINCLUDE             ?user_include_directory
+USERINCLUDE             ?user_include_directory_2
+
+// Select one, only one, of the following layer specific include macros, which
+// are specified in the /epoc32/include/platform_paths.hrh.
+// It should be the layername to which your component belongs to.
+//APP_LAYER_SYSTEMINCLUDE
+//MW_LAYER_SYSTEMINCLUDE
+//OS_LAYER_SYSTEMINCLUDE
+
+// Note: 
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+//SYSTEMINCLUDE           ?system_include_directory
+
+LIBRARY                 ?library_name
+LIBRARY                 ?library_name_2
+
+*** Other possible keywords:
+
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+
+DEFFILE                 ?deffilename
+
+START RESOURCE          ?resource_reg.rss
+// Do not change the UID 10003a3f below.
+TARGETPATH              /private/10003a3f/apps
+END
+
+MACRO                   ?macro_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/r_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,185 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** An R class denotes a client-side handle to a resource, owned typically by
+*** a Symbian OS server elsewhere on the device.  Generally R classes are
+*** instantiated either on the stack, or nested within C classes, then opened
+*** in some way, usually to a call such as Open() or Connect().  When they
+*** are finished with, it is essential to use the appropriate function to
+*** dispose of the class, usually Close().  An R class will derive from zero
+*** or one other R classes.
+
+
+#ifndef ?R_CLASSNAME_H
+#define ?R_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+/**  ?description */
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor:
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class
+
+*** declarations of functions derived from base_class are grouped
+*** together here:
+
+    /**
+     * From ?base_class.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class
+
+*** function declarations as above
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?R_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.hrh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,58 @@
+/*
+* ============================================================================
+*  Name        : ?filename.hrh
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef ?MODULENAME_HRH
+#define ?MODULENAME_HRH
+
+
+*** data types go here:
+
+/** ?comment */
+enum ?declaration
+
+/** ?_comment */
+typedef ?declaration
+
+#endif // ?MODULENAME_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.loc	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,111 @@
+/*
+* ============================================================================
+*  Name        : ?filename.loc
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Localization strings for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+
+/*
+  The syntax of a logical name entry in this file is the following:
+
+  // d:context description (line 1)
+  // d:context description (line N)
+  // l:layout id
+  // w:
+  // r:release information
+  //
+  #define qtn_<?feature_or_application>_?freetext "?text"
+
+  where
+      "qtn_" starts a logical name.  Note: "text_" has been used in
+           old logical names, but is deprecated.
+      "?feature/application" is 2-5 lower-case characters and/or numbers
+           identifying the larger context of the display text.
+      "?freetext" is the free text portion of the logical name.
+           It may contain only lower-case letters ('a' to 'z'), numbers
+           ('0' to '9'), and the underscore ('_').  The total length of
+           the logical name does must not exceed 50 characters.
+      "d:" Starts a description line clarifying the entry's context with
+           information like:
+           - Is a word a verb in imperative or is it a noun?  (For instance,
+             what does "Set" mean?)
+           - What will replace %U (unicode text parameter) or %N (number
+             parameter) included in texts?  (For instance, is it a phone
+             number or an e-mail address?)
+      "l:" Starts a layout id information (one line).
+           "P" and "No" are symbols in LAF's information table
+                - "P" is parent pane or current pane
+                - "No" is reference number in table
+      "r:" Starts a release information: one line indicating in which
+           S60 release the text was used for the first time.
+
+  Refer to the S60 localization instructions for more information.
+
+  Examples:
+
+// d:Command in options list in short term memories.
+// d:Opens the call list view that is focused.
+// l:list_single_popup_menu_pane_1
+// r:3.1
+//
+#define text_logs_stm_cmd_open "Open"
+
+// d:Title pane text in converter main state.
+// l:title_pane_1
+// r:3.0
+//
+#define qtn_cnv_title "Converter"
+
+// d:Prompt text for currency data query in converter.
+// l:popup_query_data_window_1
+// r:4.0
+//
+#define qtn_cnv_edit_name_prompt "Currency name"
+
+// d:Active call is terminated and a held call becomes active.
+// d:Operation is confirmed with this info note.
+// d:%U stands for the call identification of the activated call.
+// l:popup_note_window_1
+// r:3.1
+//
+#define qtn_multc_unhold_done_note "%U active"
+
+*/
+
+
+*** localization strings go here:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.rh	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,69 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rh
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Resource headers for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.0
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+#ifndef ?MODULENAME_RH
+#define ?MODULENAME_RH
+
+
+*** includes go here:
+
+#include <?include_file.hrh>
+
+
+*** structure definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+struct ?structure_name
+    {
+    ?structure_data; // ?comment
+
+    // ?comment
+    ?structure_data;
+    }
+
+#endif // ?MODULENAME_RH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/resource_template.rss	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,81 @@
+/*
+* ============================================================================
+*  Name        : ?filename.rss
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : Resource definitions for project ?myapp
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** A line should not end with a backslash (\).  If it is absolutely
+*** necessary to have a line end in a backslash, add a comment after
+*** it, or some versions of the build system might think it's a
+*** continuing line.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** For a component's main .rss file, resource NAME identifier go here:
+
+NAME ?four_letter_resource_name_in_uppercase_and_unique_in_module
+
+*** include files go here:
+
+#include <?include_file>
+
+*** resource identifiers go here:
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf=""; }
+
+*** constants go here:
+
+#define ?constant ?value
+
+*** resource definitions go here:
+
+// ---------------------------------------------------------------------------
+// ?resource_name
+// ?description
+// ---------------------------------------------------------------------------
+//
+RESOURCE ?structure_name [?resource_name]
+    {
+    ?resource_data; // ?comment
+
+    // ?comment
+    ?resource_data;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/source_template.cpp	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,233 @@
+/*
+* ============================================================================
+*  Name        : ?filename.cpp
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.1
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, comments, or code.  ?EXPORT_C means either
+*** the EXPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+
+*** Implement only one class in one file.
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** external function prototypes go here:
+
+extern ?external_function( ?arg_type, ?arg_type );
+
+*** local constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+?type ?function_name( ?arg_type ?arg,
+                      ?arg_type ?arg )
+    {
+    ?code  // ?implementation comment on this line
+    // ?implementation comment on the following statement or block:
+    ?code
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+*** In the same order as defined in the header file.
+
+*** The first function includes examples of correct tabulation of some
+*** commonly used statements, and some suggested places to put
+*** implementation comments, if needed.
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::?classname()
+    {
+    if ( ?condition )
+        {
+        // ?implementation_comment
+        ?code
+        }
+    else
+        {
+        // ?implementation_comment
+        ?code
+        }
+
+    // ?implementation_comment
+    while ( ?condition )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    for ( ?for_init_statement; ?condition; ?expression )
+        {
+        ?code
+        }
+
+    // ?implementation_comment
+    switch ( ?condition )
+        {
+        case ?constant:
+            ?code
+            break;
+        case ?constant:
+            ?code
+            // fall-through intended here
+        case ?constant:
+            ?code
+            break;
+        default:
+            ?code
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void ?classname::ConstructL()
+    {
+    ?code
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewL()
+    {
+    ?classname* self = ?classname::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+EXPORT_C ?classname* ?classname::NewLC()
+    {
+    ?classname* self = new( ELeave ) ?classname;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+?classname::~?classname()
+    {
+    ?code
+    }
+
+
+*** Non-derived function:
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?classname::?member_function(
+    ?really_really_really_really_long_arg_type_1 ?really_really_long_arg_1,
+    ?really_really_really_really_long_arg_type_2 ?really_really_long_arg_2 )
+    {
+    ?code
+    }
+
+
+*** Derived function:
+
+// ---------------------------------------------------------------------------
+// From class ?base_class.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+?EXPORT_C ?type ?function_name( ?arg_type_1 ?arg_1, ?arg_type_2 ?arg_2 )
+    {
+    ?code
+    }
+
+
+// ======== GLOBAL FUNCTIONS ========
+
+*** For an application's UiApp class, functions NewApplication and E32Main
+*** should go here:
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CApaApplication* NewApplication()
+    {
+    return new ?CMyApplication;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Main function of the application executable.
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+    {
+    return EikStart::RunApplication( NewApplication );
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/data/templates/t_class_header_template.h	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,193 @@
+/*
+* ============================================================================
+*  Name        : ?filename.h
+*  Part of     : ?Subsystem_name / ?Module_name       *** Info from the SWAD
+*  Description : ?Description
+*  Version     : %version: % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © ?year-?year Nokia Corporation and/or its subsidiary(-ies).
+*  All rights reserved.
+*  This component and the accompanying materials are made available
+*  under the terms of the License "?License"
+*  which accompanies this distribution, and is available
+*  at the URL "?LicenseUrl".
+*
+*  Initial Contributors:
+*  ?Company_name - initial contribution.
+*
+*  Contributors:
+* 
+* ============================================================================
+* Template version: 4.2
+*/
+
+*** INSTRUCTIONS TO THE TEMPLATE USER:
+
+*** This template follows the S60 coding conventions
+*** (S60_Coding_Conventions.doc).  Remove all unneeded declarations
+*** and definitions before checking the file in!  Also remove the
+*** template's usage instructions, that is, everything that begins
+*** with "***".
+
+*** The copyright years should be < the year of the file's creation >
+*** - < the year of the file's latest update >.
+
+*** Words that begin with "?" are for you to replace with your own
+*** identifiers, filenames, or comments.  ?IMPORT_C means either the
+*** IMPORT_C visibility directive, or nothing, depending on whether
+*** the function is to be exported or not.
+
+*** To support building on Linux, use only forward slashes in include
+*** directives.  Also, all filenames and pathnames must be completely
+*** in lowercase.
+
+*** Indent four spaces per step, using spaces, not tabs, to display
+*** the code consistently across different editors.
+
+*** A T class differs from a C class only in the respect that it owns no
+*** heap-allocated (dynamic) memory, and thus needs no explicit destructor.
+*** A T class may be instantiated either on the heap or on the stack.
+*** You must ensure that a T class is fully constructed before use.
+*** A T class will derive from zero or one other T classes.
+
+
+#ifndef ?T_CLASSNAME_H
+#define ?T_CLASSNAME_H
+
+
+*** system include files go here:
+
+#include <?include_file>
+
+*** user include files go here:
+
+#include "?include_file"
+
+*** forward declarations go here:
+
+class ?forward_classname;
+
+*** external data types go here:
+
+/**  ?description */
+extern ?data_type;
+
+*** constants go here:
+
+const ?type ?constant_var = ?constant;
+
+
+*** the class declaration goes here:
+
+/**
+ *  ?one_line_short_description
+ *
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class ?classname : public ?base_class_list
+    {
+
+*** friend classes go here:
+
+    friend class ?class1;
+    friend class ?class2;
+
+public:
+
+*** data types go here:
+
+    /**  ?description */
+    enum ?declaration
+
+    /**  ?description */
+    typedef ?declaration
+
+*** C++ constructors go here, starting with the default constructor.
+*** No destructor is needed.
+
+    ?classname();
+
+    /**
+     * Constructor.
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?classname( ?type1 ?arg1, ?type2 ?arg2 );
+
+*** member functions go here:
+
+    /**
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     * @param ?arg2 ?description
+     * @return ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type1 ?arg1, ?type2 ?arg2 );
+
+// from base class ?base_class1
+
+*** declarations of functions derived from base_class1 are grouped
+*** together here:
+
+    /**
+     * From ?base_class1.
+     * ?description
+     *
+     * @since S60 ?S60_version
+     * @param ?arg1 ?description
+     */
+    ?IMPORT_C ?type ?member_function( ?type ?arg1 );
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+protected:
+
+*** function declarations as above
+
+// from base class ?base_class2
+
+*** function declarations as above
+
+// from base class ?base_class3
+
+*** function declarations as above
+
+
+private:
+
+*** private, non-derived functions go here; function declarations as above
+
+
+*** avoid the use of public or protected data; data should nearly
+*** always be accessed through getter and setter functions
+
+private: // data
+
+    /**
+     * ?description_of_member
+     */
+    ?type ?member_name;
+
+    };
+
+
+*** put the inline functions, if any, in a file included here:
+
+#include "?include_file.inl"
+
+
+#endif // ?T_CLASSNAME_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/readme.txt	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,17 @@
+INSTRUCTIONS TO EXECUTE UNIT TEST-CASES SUCCESSFULLY
+-----------------------------------------------------
+Basic:
+All the test data is placed in 'data' folder.
+'data' folder should contain below files
+	- correct folder
+	- templates folder
+	
+
+
+NOTE : 
+1) The 'data' folder is accessed by adding one VM Argument to 'data' folder path.
+As follows, -DTESTDATALOCATION=<path to data folder>.
+
+
+END OF INSTRUCTIONS
+-------------------
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/src/com/nokia/s60tools/symbianfoundationtemplates/engine/AllPureJunitTests.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Test suite for the template wizard.
+ */
+public class AllPureJunitTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(
+				"Test for com.nokia.s60tools.symbianfoundationtemplates.engine");
+		//$JUnit-BEGIN$
+		suite.addTestSuite(EngineTest.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sftemplateswizard/com.nokia.s60tools.templates.tests/src/com/nokia/s60tools/symbianfoundationtemplates/engine/EngineTest.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,588 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.symbianfoundationtemplates.engine;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60Engine;
+import com.nokia.s60tools.symbianfoundationtemplates.engine.s60.S60TransformKeys;
+
+/**
+ * Test cases for the template wizard.
+ */
+public class EngineTest extends TestCase {
+	private static final String PLUGIN_DIRECTORY = System.getProperty("TESTDATALOCATION") + "/templates";
+	private static final String TEST_DIRECTORY = System.getProperty("TESTDATALOCATION") + "/correct";
+
+	private static final String C_CLASS_HEADER_TEMPLATE = "/c_class_header_template.h";
+	private static final String M_CLASS_HEADER_TEMPLATE = "/m_class_header_template.h";
+	private static final String R_CLASS_HEADER_TEMPLATE = "/r_class_header_template.h";
+	private static final String T_CLASS_HEADER_TEMPLATE = "/t_class_header_template.h";
+	
+	private static final String C_EMPTY_CLASS_HEADER_TEMPLATE = "/empty_c_class_header_template.h";
+	private static final String M_EMPTY_CLASS_HEADER_TEMPLATE = "/empty_m_class_header_template.h";
+	private static final String R_EMPTY_CLASS_HEADER_TEMPLATE = "/empty_r_class_header_template.h";
+	private static final String T_EMPTY_CLASS_HEADER_TEMPLATE = "/empty_t_class_header_template.h";
+	
+	private static final String SOURCE_TEMPLATE 		= "/source_template.cpp";
+	private static final String C_EMPTY_CLASS_SOURCE_TEMPLATE = "/empty_source_template.cpp";
+		
+	private static final String RESOURCE_HRH_TEMPLATE	= "/resource_template.hrh";
+	private static final String RESOURCE_RH_TEMPLATE	= "/resource_template.rh";
+	private static final String RESOURCE_LOC_TEMPLATE	= "/resource_template.loc";
+	private static final String RESOURCE_RSS_TEMPLATE	= "/resource_template.rss";
+	
+	private static final String EMPTY_RESOURCE_HRH_TEMPLATE	= "/empty_resource_template.hrh";
+	private static final String EMPTY_RESOURCE_RH_TEMPLATE	= "/empty_resource_template.rh";
+	private static final String EMPTY_RESOURCE_LOC_TEMPLATE	= "/empty_resource_template.loc";
+	private static final String EMPTY_RESOURCE_RSS_TEMPLATE	= "/empty_resource_template.rss";
+
+	private static final String ICONS_TEMPLATE			= "/icons.mk";
+	private static final String ICONS_BITMAP_TEMPLATE	= "/icons_aif_bitmaps.mk";
+	private static final String ICONS_SCALABLE_TEMPLATE	= "/icons_aif_scalable.mk";
+	
+	private static final String EMPTY_ICONS_TEMPLATE			= "/empty_icons.mk";
+	private static final String EMPTY_ICONS_BITMAP_TEMPLATE	= "/empty_icons_aif_bitmaps.mk";
+	private static final String EMPTY_ICONS_SCALABLE_TEMPLATE	= "/empty_icons_aif_scalable.mk";
+	
+	private static final String MMP_TEMPLATE			= "/project_specification_template.mmp";
+	private static final String BLDINF_TEMPLATE			= "/build_info_template.inf";
+	
+	private static final String EMPTY_MMP_TEMPLATE			= "/empty_project_specification_template.mmp";
+	private static final String EMPTY_BLDINF_TEMPLATE			= "/empty_build_info_template.inf";
+	
+	private static final String INLINE_TEMPLATE			= "/inline_template.inl";
+	
+	private Map<String, String> transformRules;
+	
+	public void setUp() {
+		transformRules = new HashMap<String, String>();
+		
+		transformRules.put(S60TransformKeys.getString("key_filename"), "TestFileName");
+		transformRules.put(S60TransformKeys.getString("key_subsystem"), "TestSubSystem");
+		transformRules.put(S60TransformKeys.getString("key_module"), "TestModule");
+		transformRules.put(S60TransformKeys.getString("key_description"), "TestDescription\n\ncontinues\n\n---\nstill\n");
+		transformRules.put(S60TransformKeys.getString("key_copyright"), "2000-2001");
+		transformRules.put(S60TransformKeys.getString("key_classname"), "TestClassName");
+		transformRules.put(S60TransformKeys.getString("key_appname"), "TestAppName");
+		transformRules.put(S60TransformKeys.getString("key_cclassname"), "C_TESTCLASSNAME_H");
+		transformRules.put(S60TransformKeys.getString("key_mclassname"), "M_TESTCLASSNAME_H");
+		transformRules.put(S60TransformKeys.getString("key_rclassname"), "R_TESTCLASSNAME_H");
+		transformRules.put(S60TransformKeys.getString("key_tclassname"), "T_TESTCLASSNAME_H");
+		transformRules.put(S60TransformKeys.getString("key_hrhmodulename"), "TESTFILENAME_HRH");
+		transformRules.put(S60TransformKeys.getString("key_rhmodulename"), "TESTFILENAME_RH");
+		transformRules.put(S60TransformKeys.getString("key_license"), "Symbian Foundation License v1.0");
+		transformRules.put(S60TransformKeys.getString("key_companyname"), "Nokia Corporation");
+		transformRules.put(S60TransformKeys.getString("key_licenseurl"), "http://www.symbianfoundation.org/legal/sfl-v10.html");
+	}
+	
+	public void testCClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + C_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + C_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testMClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + M_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + M_CLASS_HEADER_TEMPLATE), true);
+	}
+
+	public void testRClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + R_CLASS_HEADER_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + R_CLASS_HEADER_TEMPLATE), true);
+	}
+
+	public void testTClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + T_CLASS_HEADER_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + T_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testEmptyCClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + C_EMPTY_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + C_EMPTY_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testEmptyMClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + M_EMPTY_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + M_EMPTY_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testEmptyRClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + R_EMPTY_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + R_EMPTY_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testEmptyTClassTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + T_EMPTY_CLASS_HEADER_TEMPLATE);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		engine.setTransformRules(transformRules);
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + T_EMPTY_CLASS_HEADER_TEMPLATE), true);
+	}
+	
+	public void testSourceTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + SOURCE_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + SOURCE_TEMPLATE), true);
+	}
+	
+	public void testEmptySourceTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + C_EMPTY_CLASS_SOURCE_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + C_EMPTY_CLASS_SOURCE_TEMPLATE), true);
+	}
+	
+	public void testResourceHRHTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + RESOURCE_HRH_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + RESOURCE_HRH_TEMPLATE), true);
+	}
+	
+	public void testEmptyResourceHRHTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_RESOURCE_HRH_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_RESOURCE_HRH_TEMPLATE), true);
+	}
+	
+	public void testResourceRHTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + RESOURCE_RH_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + RESOURCE_RH_TEMPLATE), true);
+	}
+	
+	public void testEmptyResourceRHTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_RESOURCE_RH_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_RESOURCE_RH_TEMPLATE), true);
+	}
+	
+	public void testResourceLOCTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + RESOURCE_LOC_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + RESOURCE_LOC_TEMPLATE), true);
+	}
+	
+	public void testEmptyResourceLOCTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_RESOURCE_LOC_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+	
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_RESOURCE_LOC_TEMPLATE), true);
+	}
+	
+	public void testResourceRSSTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + RESOURCE_RSS_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + RESOURCE_RSS_TEMPLATE), true);
+	}
+	
+	public void testEmptyResourceRSSTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_RESOURCE_RSS_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_RESOURCE_RSS_TEMPLATE), true);
+	}
+	
+	public void testIconsTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + ICONS_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + ICONS_TEMPLATE), true);
+	}
+	
+	public void testEmptyIconsTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_ICONS_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_ICONS_TEMPLATE), true);
+	}
+	
+	public void testIconsBitmapTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + ICONS_BITMAP_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + ICONS_BITMAP_TEMPLATE), true);
+	}
+	
+	public void testEmptyIconsBitmapTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_ICONS_BITMAP_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_ICONS_BITMAP_TEMPLATE), true);
+	}
+	
+	public void testIconsScalableTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + ICONS_SCALABLE_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + ICONS_SCALABLE_TEMPLATE), true);
+	}
+	
+	public void testEmptyIconsScalableTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_ICONS_SCALABLE_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_ICONS_SCALABLE_TEMPLATE), true);
+	}
+	
+	public void testMMPTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + MMP_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + MMP_TEMPLATE), true);
+	}
+	
+	public void testEmptyMMPTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_MMP_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_MMP_TEMPLATE), true);
+	}
+	
+	public void testBuildInfoTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + BLDINF_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + BLDINF_TEMPLATE), true);
+	}
+	
+	public void testEmptyBuildInfoTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + EMPTY_BLDINF_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + EMPTY_BLDINF_TEMPLATE), true);
+	}
+	
+	public void testInlineTransform() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + INLINE_TEMPLATE);
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			fail(ioe.getMessage());
+		}
+		
+		assertEquals(stringEqualsFile(engine.getTransformedString(), TEST_DIRECTORY + INLINE_TEMPLATE), true);
+	}
+	
+	public void testInvalidFile() {
+		S60Engine engine = null;
+		
+		try {
+			engine = new S60Engine(PLUGIN_DIRECTORY + "invalidfile.test");
+		
+			engine.setTransformRules(transformRules);
+		} catch(IOException ioe) {
+			return;
+		}
+		
+		fail("Exception not thrown!");
+	}
+	
+	/**
+	 * Helper method for testing that a transformed string equals the contents of
+	 * a "correctly" transformed file.
+	 * 
+	 * @param string the transformed string
+	 * @param file the transformed file
+	 * @return true if equal, false otherwise
+	 */
+	private boolean stringEqualsFile(String string, String file) {
+		BufferedReader stringIn = null;
+		BufferedReader fileIn = null;
+		
+		StringReader stringReader = null;
+		FileReader fileReader = null;
+		
+		boolean equal = true;
+		
+		int lineNum = 0;
+		
+		try {
+			stringReader = new StringReader(string);
+			fileReader = new FileReader(file);
+			
+			stringIn = new BufferedReader(stringReader);
+			fileIn = new BufferedReader(fileReader);
+		
+			String f1Line;
+			
+			while((f1Line = stringIn.readLine()) != null) {
+				lineNum++;
+				
+				String f2Line = fileIn.readLine();
+				
+				if(!f1Line.equals(f2Line)) {
+					System.out.println("NOT EQUAL " + lineNum + ":\n" + f1Line + "\n" + f2Line + "\n");
+					equal = false;
+				}
+			}
+			
+			if(fileIn.readLine() != null) {
+				System.out.println("NOT EQUAL:\n" + "Too many newlines in the end of the file\n");
+				equal = false;
+			}
+		} catch(FileNotFoundException fnfe) {
+			System.out.println(fnfe);
+		} catch(IOException ioe) {
+			System.out.println(ioe);
+		} finally {
+			try {
+				if(stringReader != null)
+					stringReader.close();
+			
+				if(fileReader != null)
+					fileReader.close();
+			
+				if(stringIn != null)
+					stringIn.close();
+				
+				if(fileIn != null)
+					fileIn.close();
+			} catch(IOException ioe) {
+				System.out.println(ioe);
+			}
+		}
+		
+		return equal;
+	}
+}