1. Copyrights changed to EPL
authornoe\swadi
Sat, 09 Jan 2010 10:04:11 +0530
changeset 0 a02c979e8dfd
child 1 9176d200b8fe
1. Copyrights changed to EPL 2. Feature updates mentioned in release notes.
srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/.project
srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/build.properties
srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/feature.xml
srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/license.txt
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/.project
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/META-INF/MANIFEST.MF
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/book.css
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/build.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/contexts.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/images/green_fade_left_68_165_28.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/index.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/nokia.css
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/propertiesTab.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/screenshots/sdk_data_source_properties.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/toc.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/toc.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/plugin.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.classpath
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.cvsignore
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.project
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.settings/org.eclipse.jdt.core.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.settings/org.eclipse.jdt.ui.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/META-INF/MANIFEST.MF
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/about.html
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/build.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/plugin.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/CacheHelpContextIDs.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/Product.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/Product.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/ProductInfoRegistry.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/CacheEntry.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/CacheEntryStorage.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/MetadataHeadersFinder.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/JobMessageUtils.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/SeekMetaXMLFilesJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/UpdateSDKSelectionJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/plugin/CachePlugin.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/resources/Messages.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/resources/messages.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/searchmethod/LocalCacheSearchMethodExtension.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/searchmethod/ui/LocalCacheUIComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/util/SDKFinder.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/util/SDKUtil.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/xml/MetadataXMLToUIMappingRules.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.classpath
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.project
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.settings/org.eclipse.jdt.core.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/META-INF/MANIFEST.MF
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/book.css
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/build.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/concepts.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/data_source.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/metadata_file.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/software_development_kit.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/contexts.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/datasources/datasources.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/GS_index.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/overview.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/walk_through.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/images/green_fade_left_68_165_28.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/index.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/legal.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/nokia.css
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/release_notes.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/configure_data_sources.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_for_project.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_for_source_code_identifier.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_from_context_menu.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_from_search_tab.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/context_menu.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/data_source_config.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/generate_api_report.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/identifier_from_code.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/multiserach.PNG
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/results.PNG
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/sample_api_report.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/search_tab.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/singlesearch.PNG
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/web_sample_details.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/web_sample_found_entries.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/tasks.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/toc.htm
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocConcepts.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocGettingStarted.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocReference.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocTasks.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/toolTOC.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/plugin.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/ppt/APIQueryMainPluginHelpFigures.ppt
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/ppt/README.txt
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.classpath
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.cvsignore
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.project
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.core.resources.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.jdt.core.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.jdt.ui.prefs
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/META-INF/MANIFEST.MF
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.html
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.ini
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.mappings
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/build.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/ccbuild.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/docs/ReleaseNote.txt
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/docs/internal/testing/FunctionalityTestingNotes.txt
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/.cvsignore
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/apiquery_tsk.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/apiquery_wiz.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/not_yet_implemented_action_misc.png
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/plugin.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/plugin.xml
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/resources/htmlReportStyles.css
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/schema/searchMethods.exsd
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/APIQueryHelpContextIDs.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/job/ActiveProjectQueryJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/job/ActiveProjectQueryJobManager.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckIdentifierAction.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckProjectAction.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckProjectReport.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/OpenFileAction.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/QueryErrorInfo.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/APIQueryWebServerConfigurator.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/ReportActionConstants.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/ReportActionServlet.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/settings/IUserSettingsListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/settings/UserSettings.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/Product.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/ProductInfoRegistry.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/product.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIDetailField.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIDetails.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIQueryParameters.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIShortDescription.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIShortDescriptionSearchResults.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/FieldMappingRules.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/QueryErrorInfo.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/XMLToUIMappingRules.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/AbstractEntry.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/AbstractEntryStorage.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/DuplicateEntryException.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/EntryNotFoundException.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/IConfigurationChangedListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/exceptions/QueryOperationFailedException.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/exceptions/XMLNotValidException.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/AbstractJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/FindFileFromFoldersJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IJobCompletionListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IJobProgressStatus.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IManageableJob.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/JobCancelledByUserException.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/plugin/APIQueryPlugin.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferenceConstants.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferenceInitializer.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferences.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/ImageKeys.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/Messages.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/messages.properties
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/AbstractSearchMethodExtension.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ISearchMethodExtension.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ISearchMethodExtensionInfo.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/SearchMethodExtensionInfo.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ui/AbstractUiFractionComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethodregistry/SearchMethodExtensionRegistry.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/services/QueryServices.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/settings/UserSettingListenerNotificator.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/AbstractEntryTableViewerUiComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/IEntryCheckStateListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/dialogs/APIQueryMessageBox.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/LogUtils.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/SourceCodeParsingUtilities.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/console/APIQueryConsole.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLDataSAXHandler.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLElementData.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLUtils.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/actions/AbstractMainViewAction.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/actions/ToolsMenuAction.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/dialogs/FirstTimePopUpDialog.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/dialogs/OpenReportStatusDialog.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/MainView.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/properties/PropertiesTabComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/APIDataTaskList.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/APITask.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/DataLabelProvider.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/DataSorter.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/IQueryDefCompositeListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/IResultSettingsListener.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryDefComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryResultsComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryTypeSelectionComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/SearchTabComposite.java
srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/SearchTabUIFieldsMediator.java
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/.project
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/Carbide_Image.png
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/build.properties
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/build.xml
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/feature.xml
srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/license.txt
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.classpath
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.cvsignore
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.project
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.settings/org.eclipse.jdt.core.prefs
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/META-INF/MANIFEST.MF
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/about.html
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/book.css
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/build.properties
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/contexts.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/appendix.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/component.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/concepts.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/function.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/platform.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/properties.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/GS_index.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/overview.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/walk_through.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/images/green_fade_left_68_165_28.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.css
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.gif
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.properties
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep_hov.gif
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/book.css
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/overviewAppDepExtContent.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/whatsnewAppDepExtContent.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/legal.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/references.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/add_sis_files.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/bin_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/bin_obj_link.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/collapse_tree.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/context_menu.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/de_toolbar.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/expand_subtree.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/expand_tree.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/find.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_back.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_home.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_into.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/search.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/select_new_root.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/select_new_sdk.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/toolbar.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/update_cache.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/toolbar.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/warnings_and_errors.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/release_notes.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/analyse_component.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_comp_prop.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_exp_func.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_imp_func.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/export_report.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/locate_component.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/manage_platforms.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/.cvsignore
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/add_sis_files_1.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/bin_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/bin_obj_link.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/build_target_selection.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/cache_generation.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/expand_collapse_context_menu.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/expand_collapse_toolbar.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/find_components.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/navigation_btns_context_menu.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/navigation_btns_toolbar.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_component_analysis.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_red_green.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_used_by_components.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sdk_sel_wizard.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/select_new_root.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_change_platform.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_component_select.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_depview.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_doubleclick.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_export_functions.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_import_functions.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_platform_select.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_properties.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_properties_pop.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_1.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_2.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_3.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_root_comp.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_used_by.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/search.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/search_comp.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/selecting_platform.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/setting_preferences.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/tasks.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_method_call_locations.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_source.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_source_file_in_project.htm
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/toc.html
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/index.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/plugin.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/toc.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocconcepts.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocgettingstarted.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocreferences.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/toctasks.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.classpath
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.cvsignore
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.project
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.core.resources.prefs
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.jdt.core.prefs
srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.jdt.ui.prefs
srcanaapps/depexplorer/com.nokia.s60tools.appdep/META-INF/MANIFEST.MF
srcanaapps/depexplorer/com.nokia.s60tools.appdep/about.html
srcanaapps/depexplorer/com.nokia.s60tools.appdep/build.properties
srcanaapps/depexplorer/com.nokia.s60tools.appdep/ccbuild.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/appdep.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/appdep_wizard_banner.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_bind.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_error.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_link.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_warning.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cache_update.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cache_warning.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cached_target.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/collapse_all.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/expand_all.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/expand_subtree.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/find.PNG
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/folder_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/folder_obj_err.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/function_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/is_used_by_action.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/new_root_action.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/non_cached_target.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/not_supported_target.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/root_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/root_obj_error.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/search.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/select_sdk_action.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_green_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_red_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_yellow_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/virtual_func_obj.png
srcanaapps/depexplorer/com.nokia.s60tools.appdep/os/win32/x86/appdep.exe
srcanaapps/depexplorer/com.nokia.s60tools.appdep/os/win32/x86/cfilt.exe
srcanaapps/depexplorer/com.nokia.s60tools.appdep/plugin.xml
srcanaapps/depexplorer/com.nokia.s60tools.appdep/resources/IsUsedByReport.xsl
srcanaapps/depexplorer/com.nokia.s60tools.appdep/resources/PrintReport.xsl
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/AppDepHelpContextIDs.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/Product.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/Product.properties
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/ProductInfoRegistry.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepCacheIndexManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepCoreFacade.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepSettings.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/BuildTypeDebug.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/BuildTypeRelease.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheCreationProgressLineReader.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheDataLoadProcessManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheGenerationOptions.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IAppDepSettingsChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IBuildType.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/ICacheIndexListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/ITargetPlatform.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IToolchain.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/LinesToStringArrayListCustomLineReader.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/TargetPlatform.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/Toolchain.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheCompPropertyField.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheDataConstants.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheDataManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndex.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndexCreationRequest.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndexCreator.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheLibPropertyField.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentLinkLeafNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentParentNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ICacheDataManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/IComponentParentNodeListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/IComponentSearchProgressListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/AppDepJobManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/GenerateCacheJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/ICacheGenerationJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IJobCompletionListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IJobProgressStatus.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IManageableJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/UsedByOtherComponentsJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/AbstractFunctionData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/CacheFactory.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ComponentPropertiesData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/DependenciesCache.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ExportFunctionData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ICacheLoadProgressNotification.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ITargetCache.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ImportFunctionData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/LibPropertiesData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/SymbolsCache.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/TargetCache.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/UsedComponentData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/CacheFileDoesNotExistException.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/CacheIndexNotReadyException.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/InvalidCmdLineToolSettingException.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/InvalidModelDataException.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/ZeroFunctionOrdinalException.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/ExportJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/ExportVisitor.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/IsUsedByXMLReport.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/StringUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/XMLUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/find/FindVisitor.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/find/IFindStartNodeProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/CProjectJobStatus.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/CreateProjectJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/DEProjectUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/LocateComponentJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/SeekParentNodesService.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/SeekParentNodesVisitor.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/ShowMethodCallLocationsJob.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/plugin/AppDepPlugin.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/ImageKeys.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/ImageResourceManager.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/Messages.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/messages.properties
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/search/MatchType.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/search/SearchConstants.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractShowMethodCallLocationsAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractShowSourceFileAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AddSisAndUpdateCacheMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/CacheUpdateMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/CollapseAllMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ComponentIsUsedByMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ComponentPropertiesMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExpandAllMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExpandSubtreeMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExportReportListViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExportReportMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FindMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByExportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByImportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/LocateComponentMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SearchMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromListAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromTableViewerComponentListViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromTableViewerMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectNewRootComponentMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectNewSDKMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SetNewRootComponentListViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SetNewRootMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowMethodCallLocationsImportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowMethodCallLocationsSearchDialogAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectExportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectImportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileExportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileImportFunctionMainViewAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ToolbarShortcutAction.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AddComponentPrefixSearchOrderDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AddSISFilesDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepFindDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepMessageBox.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepSearchDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/LocateComponentDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SISFileEntry.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SISFileEntryTableViewerSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SearchConfirmNewRootSelectionDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferenceConstants.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferenceInitializer.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferencePage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferences.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/utils/UiUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/ComponentListNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/IVisitable.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/IVisitor.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/PropertyData.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ComponentListViewSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ComponentPropertiesClipboardCopyHandler.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListView.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewSelectionChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ComponentPropertyTabClipboardCopyHandler.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportFunctionDataSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportFunctionsClipboardCopyHandler.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportedFunctionsTabSelectionChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportFunctionDataSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportFunctionsClipboardCopyHandler.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportedFunctionsTabSelectionChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainView.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentPropertiesTabContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentPropertiesTabLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentTreeContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentTreeLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewDataPopulator.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewDoubleClickListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewExportFunctionsTabContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewExportFunctionsTabLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewImportFunctionsTabContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewImportFunctionsTabLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewPopulateProgressListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewSelectionChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/PropertyDataSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/AbstractSelectSDKWizardPage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/AppDepWizardDialog.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntry.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntryInfo.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetSelectionBuildTypeFilter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetSelectionNonEmptyAndNonSuppTargetFilter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetTableViewerSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/CacheGenerationOptionsWizardPage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ComponentTableViewerSorter.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ICacheIndexCreatorObserver.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/IRefreshable.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ISelectSDKWizard.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/InvisibleRootNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SdkTreeViewNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPageContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPageLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageLabelProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageTableViewerDoubleClickListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageTableViewerSelectionChangedListener.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizard.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPage.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPageContentProvider.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPageLabelProvider2.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/TreeViewNode.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/WizardUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/AppDepConsole.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/LogUtils.java
srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/SISFileUtils.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.carbide.extensions.apiquery</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/srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/feature.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.apiquery"
+      label="Carbide.c++ Extensions - API Query"
+      version="1.2.6"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.apiquery">
+
+   <description>
+      API Query is tool to search for information about the APIs used in S60 projects.
+   </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="com.nokia.s60tools.sdk" version="1.1.5" 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"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.apiquery"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.apiquery.help"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.apiquery.cache"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.apiquery.cache.help"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.carbide.extensions.apiquery/license.txt	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,8 @@
+
+ Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+
+ This component and the accompanying materials are made available
+ under the terms 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.apiquery.cache.help</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>
+		<buildCommand>
+			<name>com.nokia.carbide.extension.pclint.pclintAuditor</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>com.nokia.carbide.extension.pclint.pclintNature</nature>
+	</natures>
+</projectDescription>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbice.c++ Extensions - API Query Metadata information from the SDK Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.apiquery.cache.help;singleton:=true
+Bundle-Version: 1.2.6
+Bundle-Vendor: Nokia
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/book.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,191 @@
+/*	
+
+ Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+
+ This component and the accompanying materials are made available
+ under the terms of "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               book.css
+bin.excludes = html/nokia.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/contexts.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+
+	<context id="CACHE_HELP_PROPERTIES_TAB">
+	      	<description>Properties tab</description>	   
+			<topic label="Configuring the API metadata file data source properties" href="html/propertiesTab.htm" >
+			</topic>
+	</context>  
+     		     
+</contexts>
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/images/green_fade_left_68_165_28.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/index.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,88 @@
+<?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="API metadata file data source, configuring" >
+		<topic href="html/propertiesTab.htm" />
+	</entry>
+
+	<!-- BBBBBBBB -->	
+
+	<!-- CCCCCCCC -->	
+
+	<entry keyword="configuring data sources" >
+		<entry keyword="API metadata file data source" >
+			<topic href="html/propertiesTab.htm" />
+		</entry>
+	</entry>
+
+	<!-- DDDDDDDD -->		
+
+	<!-- EEEEEEEE -->	
+
+	<!-- FFFFFFFF -->
+
+	<!-- GGGGGGGG -->	
+	
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+	<!-- MMMMMMMM -->
+	
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+	
+	<!-- PPPPPPPP -->
+	
+	<!-- QQQQQQQQ -->
+	
+	<!-- RRRRRRRR -->
+	
+	<!-- SSSSSSSS -->
+
+	<entry keyword="SDK metadata data source, configuring" >
+		<topic href="html/propertiesTab.htm" />
+	</entry>
+	
+	<!-- TTTTTTTT -->
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+
+	<!-- XXXXXXXX -->
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/nokia.css	Sat Jan 09 10:04:11 2010 +0530
@@ -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".
+*/
+
+/*	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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/propertiesTab.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Configuring the API metadata file data source properties</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>Configuring the API metadata file data source properties</h3>
+<p>Using the API metadata file data source from an SDK is a good option, for example, for cases when you have network restrictions for using the Web data source option. This data source only requires a suitable SDK to be present.</p>
+<p>To configure the API metadata file data source, do the following:</p>
+<ol>
+<li>On the <b>Properties</b> tab, select <b>API Metadata files from the SDK</b> from the <b>Data Source</b> drop-down list.
+<p><img src="screenshots\sdk_data_source_properties.png"></p></li>
+<li>
+From the listbox, select an SDK from your local workstation.To aid selection ,cached/uncached information is displayed against each sdk.
+<p>With applicable SDKs, API Query starts seeking for the existing <i>.metaxml</i> files from the SDK.</p>
+<p>If you have problems with the SDK, see the <a href="#tips">Tips and hints</a> below for more information. </p> 
+
+</li>
+</ol>
+<p>Next, you can start an API query either from the <b>Search</b> tab or from the context menu of your project. For instructions, see the <i>Tasks</i> section in the Table of Contents in API Query Help.</p>
+
+<h3><a id="tips"></a>Tips and hints for API metadata file data source</h3>
+<table border="1" cellspacing="1" cellpadding="2">
+<colgroup><col><col></colgroup>
+<tbody>
+<tr>
+<td><b>Situation</b></td>
+<td><b>Solution</b></td>
+</tr>
+<tr>
+<td><p>The selected SDK does not contain any API metadata <i>.metaxml</i> files.</p></td>
+<td><p>The SDK cannot be used in API queries. Select another SDK and try again.</p></td>
+</tr>
+<tr>
+<td><p>Some of the data sources cannot be loaded. </p></td>
+<td><p>The SDK contains API metadata files that are not formally valid XML. These files are excluded from API queries. </p><p>(If possible, to fix the issue, notify the API's responsible person about the problem.)</p></td>
+</tr>
+<tr>
+<td><p>The SDK contents have changed since it was first loaded. </p></td>
+<td><p>You can refresh the local cache of the specified SDK by clicking <b>Refresh cache</b>. </p><p>Refreshing the SDK data is useful in cases when the metadata files have been updated or errors detected earlier have been corrected. </p></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
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/screenshots/sdk_data_source_properties.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/toc.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>API metadata file data source</title>
+<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>API metadata file data source</h3>
+<p>The API metadata file data source enables the query of API information from a local software development kit (SDK) installed on your workstation.</p>
+<p>Queries can be made only in SDKs that contain API metadata (<i>.metaxml</i>) files. In addition, only files that are valid XML are included in queries.</p>
+<p>The used SDK is specified on the <b>Properties</b> tab. For instructions, see <a href="propertiesTab.htm">Configuring the SDK metadata data source properties</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/html/toc.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!-- 
+	Links Data Source documentation to Data Sources section
+	in API Query's main help plug-in
+-->
+
+<toc label="API metadata file data source" 
+	link_to="../com.nokia.s60tools.apiquery.help/html/toolTOC.xml#DataSources" >
+
+	<topic label="API metadata file data source" href="html/toc.htm" >
+				   
+       <topic label="Configuring the API metadata file data source properties" href="html/propertiesTab.htm" />
+   		
+	</topic>
+		
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache.help/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+	<extension point="org.eclipse.help.toc">
+		<toc
+			file="html/toc.xml"
+			primary="true"/>     
+	</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.apiquery.cache.help"/>
+   </extension>
+	
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.classpath	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+bin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.apiquery.cache</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.settings/org.eclipse.jdt.core.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+#Wed Feb 28 15:29:47 EET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/.settings/org.eclipse.jdt.ui.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,3 @@
+#Wed Feb 28 15:29:47 EET 2007
+eclipse.preferences.version=1
+internal.default.compliance=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbice.c++ Extensions - API Query Metadata information from the SDK Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.apiquery.cache; singleton:=true
+Bundle-Version: 1.2.6
+Bundle-Activator: com.nokia.s60tools.apiquery.cache.plugin.CachePlugin
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ com.nokia.s60tools.util;bundle-version="1.1.11",
+ com.nokia.s60tools.apiquery,
+ com.nokia.s60tools.sdk;bundle-version="1.1.6",
+ com.nokia.carbide.cpp.sdk.core,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.ide
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: com.nokia.s60tools.apiquery.cache.configuration,
+ com.nokia.s60tools.apiquery.cache.util,
+ com.nokia.s60tools.apiquery.cache.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/about.html	Sat Jan 09 10:04:11 2010 +0530
@@ -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=”EN-US”>
+<h2>About This Content</h2>
+ 
+<p>Dec 2, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>
+
+Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+
+<p>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,8 @@
+javacSource=1.5
+javacTarget=1.5
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               about.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="com.nokia.s60tools.apiquery.searchMethods">
+      <searchMethod
+            class="com.nokia.s60tools.apiquery.cache.searchmethod.LocalCacheSearchMethodExtension"
+            description="API Metadata files from the SDK"
+            id="cache"/>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/CacheHelpContextIDs.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.cache;
+
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class CacheHelpContextIDs {
+	/**
+	 * The plug-in ID. Copy from APIQueryHelpActivator.PLUGIN_ID
+	 * to here to avoid runtime dependency to help project 
+	 */	 
+	private static final String CACHE_HELP_PROJECT_PLUGIN_ID = "com.nokia.s60tools.apiquery.cache.help"; //$NON-NLS-1$
+	
+	
+	/**
+	 * ID for Excel Interface Sheets properties -tab.
+	 */
+    public static final String CACHE_HELP_PROPERTIES_TAB = 
+  		  CACHE_HELP_PROJECT_PLUGIN_ID +".CACHE_HELP_PROPERTIES_TAB"; //$NON-NLS-1$
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/Product.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+/*
+* 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.apiquery.cache.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.apiquery.cache.common.Product"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Product() {
+	}
+
+	/**
+	 * @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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/Product.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies 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=API Metadata files from the SDK
+ProductInfoRegistry.Console_Window_Name=Console
+ProductInfoRegistry.Images_Directory=icons
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/common/ProductInfoRegistry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,56 @@
+/*
+* 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.apiquery.cache.common;
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information defined
+ * in one place and used via single access point.
+ */
+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");	 //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.Images_Directory");	 //$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;
+	}
+
+
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/CacheEntry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,216 @@
+/*
+* 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.apiquery.cache.configuration;
+
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.cache.xml.MetadataXMLToUIMappingRules;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.exceptions.XMLNotValidException;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * Stores information for a single API Metadata information from the SDK entry.
+ */
+public class CacheEntry extends AbstractEntry {
+
+	//
+	// Column sorting indices for table column sorter
+	//
+	public static final int NAME_COLUMN_INDEX = 0;
+	public static final int FOLDER_COLUMN_INDEX = 1;
+	
+	/**
+	 * file size 
+	 */
+	private long size;
+	/**
+	 * File name
+	 */
+	private String name;
+
+	/**
+	 * Date of file creation
+	 */
+	private long date = 0;
+	
+	/**
+	 * SDK Id as given by {@link SdkInformation#getSdkId()}
+	 */
+	private String sdkid;
+	
+	private String apiName;
+	
+	
+	/**
+	 *  API Details (XML data file contents readed to memory)
+	 */
+	private APIDetails APIDetails = null;
+
+
+	/**
+	 * Constructor.
+	 * @param id Entry id that is unique per search method. 
+	 * @param name If Sheet entry name.
+	 * @param size Folder path name.
+	 * @param isSelected Is this server entry used for queries.
+	 */
+	public CacheEntry(String id, String name, String SDKID, boolean isSelected, long size, long date,String apiName){
+		super(id, isSelected);//There are no not selected entries in Metadata data source
+		sdkid = SDKID;
+		this.date  = date;
+		validateArguments(id, name);
+		this.name = name;
+		this.size = size;
+		this.apiName =apiName;
+	}
+	
+
+	/**
+	 * Validates that all the datafiles are valid
+	 * i.e. currently checking that they all contain values.
+	 * @param id file name with absolutely path
+	 * @param name entry (file) name.
+	 * @param size File size on disk.
+	 * @throws IllegalArgumentException
+	 */
+	private void validateArguments(String id, String name) throws IllegalArgumentException{
+		if( ( id == null || name == null )
+			||
+			( id.length() == 0 || name.length() == 0 )){
+			throw new IllegalArgumentException(new String(Messages.getString("CacheEntry.Cannot_Contain_Empty_Field_ErrMsg"))); //$NON-NLS-1$
+			}
+	}
+
+
+
+	/**
+	 * @return the folder in file system
+	 */
+	public long getSize() {
+		return size;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.web.configuration.AbstractEntry#updateEntryTypeSpecificDataFields(com.nokia.s60tools.apiquery.web.configuration.AbstractEntry)
+	 */
+	public void updateEntryTypeSpecificDataFields(AbstractEntry entryWithUpdatedData) {
+		CacheEntry entry = (CacheEntry) entryWithUpdatedData;
+		this.size = entry.getSize();	
+		this.name = entry.getName();
+		this.date = entry.getDate();
+		this.sdkid = entry.getSDKID();
+		this.isSelected = entry.isSelected;		
+	}
+
+	
+	/**
+	 * Get ID for SDK where entry belongs to
+	 * @return SDK Id as given by {@link SdkInformation#getSdkId()}
+	 */
+	public String getSDKID() {
+		return sdkid;
+	}
+
+	/**
+	 * return the file name
+	 * @return
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * return the file creation date
+	 * @return date
+	 */
+	public long getDate() {
+		return date;
+	}
+
+	/**
+	 * Set API details
+	 * @param APIDetails
+	 */
+	public void setAPIDetails(APIDetails APIDetails) {
+		this.APIDetails = APIDetails;
+	}
+
+	/**
+	 * get API details
+	 * @return API Details
+	 */
+	public APIDetails getAPIDetails() {
+		//If details is null, it must not be loaded now, because of lot of time taken
+		//and UpdateSDKSelectionJob gets API Details when saving current situation to ram 
+		//for user cancel situation data restore.
+		return APIDetails;
+	}	
+
+	/**
+	 * Load file contents for this entry.
+	 * 
+	 * if load() fails for some reason, this entry will be set as not selected.
+	 * @see CacheEntry#setSelected(false)
+	 * 
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	public void load() throws XMLNotValidException{
+
+		try {
+			StringBuffer buf = FileUtils.loadDataFromFile(getId());	
+		
+			APIDetails details = XMLUtils.extractAPIDetailsData(buf.toString(), new MetadataXMLToUIMappingRules());
+			  
+			MetadataHeadersFinder headerFinder = new MetadataHeadersFinder();
+			details.addOrUpdateField(MetadataXMLToUIMappingRules.HEADERS, headerFinder.getHeadersForEntry(this));
+			setAPIDetails(details);
+		} catch (FileNotFoundException e) {
+			setSelected(false, true);//Because load was failed, this cannot be selected as data source, if is, search will fail
+			throw new XMLNotValidException(e.getMessage(), getId());
+		} catch (IOException e) {
+			setSelected(false, true);//Because load was failed, this cannot be selected as data source, if is, search will fail
+			throw new XMLNotValidException(e.getMessage(), getId());			
+		}catch (Exception e) {
+			setSelected(false, true);//Because load was failed, this cannot be selected as data source, if is, search will fail
+			e.printStackTrace();
+			throw new XMLNotValidException(e.getMessage(), getId());			
+		}		
+		
+	}
+
+	/**
+	 * Release API details from memory by setting API Details to <code>null</code>.
+	 */
+	public void unload() {
+		setAPIDetails(null);
+	}
+	
+  public String getAPIName()
+  {
+	  return apiName;
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/CacheEntryStorage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,744 @@
+/*
+* 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.apiquery.cache.configuration;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.apiquery.cache.plugin.CachePlugin;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.DuplicateEntryException;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.EntryNotFoundException;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener;
+import com.nokia.s60tools.apiquery.shared.exceptions.XMLNotValidException;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLElementData;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * 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 store If Sheet entries configured by user.
+ * 
+ * The format of used XML:
+ * 
+ * <?xml version="1.0" encoding="UTF-8" ?> <entries> <metadata id="<drive>:\<path>\my_api.metaxml"
+ * selected="true" sdkid="<DEVICE ID>" size="665" last_modified="1228305614126" />
+ * <metadata id="<drive2>:\<path>\my_api2.metaxml" selected="false" sdkid="<DEVICE2
+ * ID>" size="802" last_modified="1228305614126" /> </entries>
+ * 
+ */
+public class CacheEntryStorage extends AbstractEntryStorage {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private CacheEntryStorage instance = null;
+
+	/**
+	 * Public Singleton instance accessor.
+	 * 
+	 * @return Returns instance of this singleton class-
+	 */
+	public static CacheEntryStorage getInstance() {
+		if (instance == null) {
+			instance = new CacheEntryStorage();
+		}
+		return instance;
+	}
+
+	//
+	// Variables for creating XML file from server entry data.
+	//
+	private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";//$NON-NLS-1$
+
+	private static final String XML_ROOT_START_ELEMENT = "<entries>";//$NON-NLS-1$
+
+	private static final String XML_ROOT_END_ELEMENT = "</entries>";//$NON-NLS-1$
+
+	private static final String XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START = "=\"";//$NON-NLS-1$
+
+	private static final String CARRIAGE_RETURN_AND_NEWLINE = "\r\n";//$NON-NLS-1$
+
+	private static final String SINGLE_SPACE = " ";//$NON-NLS-1$
+
+	private static final String QUOTE_AND_SINGLE_SPACE = "\" ";//$NON-NLS-1$
+
+	private static final String ELEMENT_START_STR = "<";//$NON-NLS-1$
+
+	private static final String ELEMENT_END_STR = "/>"; //$NON-NLS-1$
+
+	//
+	// XML element and attribute names used for storing configuration
+	//	
+	private static final String METADATA_ELEMENT = "metadata";//$NON-NLS-1$
+
+	private static final String ID_ATTRIBUTE = "id";//$NON-NLS-1$
+
+	private static final String SDK_ID_ATTRIBUTE = "sdkid";//$NON-NLS-1$
+
+	private static final String SIZE_ATTRIBUTE = "size";//$NON-NLS-1$
+
+	private static final String SELECTION_ATTRIBUTE = "selected";//$NON-NLS-1$	
+
+	private static final String DATE_ATTRIBUTE = "last_modified";//$NON-NLS-1$
+
+	private static final String API_NAME = "api_name";//$NON-NLS-1$
+
+	private Vector<XMLNotValidException> loadErrors = null;
+
+	private boolean isLoaded = false;
+
+	/**
+	 * Private default constructor.
+	 */
+	private CacheEntryStorage() {
+		super();
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS,
+				"-- <<create>> --> " + getClass().getName()); //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage#save(java.lang.String)
+	 */
+	public void save(String destinationFileAbsolutePathName) throws IOException {
+		// System.out.println("save" + destinationFileAbsolutePathName);
+
+		StringBuffer xmlDataBuf = new StringBuffer();
+
+		File f = new File(destinationFileAbsolutePathName);
+		// Deleting possibly old
+		if (f.exists()) {
+			if (!f.canWrite()) {
+				String cannotWriteToFileErrMsg = Messages
+						.getString("CacheEntry.Destination_File_Is_Write_Protected_ErrMsg") //$NON-NLS-1$
+						+ destinationFileAbsolutePathName;
+				APIQueryConsole.getInstance().println(cannotWriteToFileErrMsg,
+						APIQueryConsole.MSG_ERROR);
+				throw new RuntimeException(cannotWriteToFileErrMsg);
+			}
+			if (!f.delete()) {
+				String cannotWriteToFileErrMsg = Messages
+						.getString("CacheEntry.Destination_File_Is_In_Use_ErrMsg") //$NON-NLS-1$
+						+ destinationFileAbsolutePathName;
+				APIQueryConsole.getInstance().println(cannotWriteToFileErrMsg,
+						APIQueryConsole.MSG_ERROR);
+				throw new RuntimeException(cannotWriteToFileErrMsg);
+			}
+		}
+
+		FileOutputStream fos = new FileOutputStream(f);
+
+		BufferedOutputStream bos = new BufferedOutputStream(fos);
+
+		xmlDataBuf.append(XML_HEADER);
+		xmlDataBuf.append(CARRIAGE_RETURN_AND_NEWLINE);
+		xmlDataBuf.append(XML_ROOT_START_ELEMENT);
+		xmlDataBuf.append(CARRIAGE_RETURN_AND_NEWLINE);
+		Collection<AbstractEntry> entriesColl = getEntries();
+		// Create <ifheet>...</ifheet> XML -elements from entries
+		for (AbstractEntry entryBeforeCast : entriesColl) {
+			CacheEntry entry = (CacheEntry) entryBeforeCast;
+			xmlDataBuf.append(ELEMENT_START_STR + METADATA_ELEMENT
+					+ SINGLE_SPACE);
+			xmlDataBuf.append(ID_ATTRIBUTE
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START + entry.getId()
+					+ QUOTE_AND_SINGLE_SPACE);
+			xmlDataBuf.append(SELECTION_ATTRIBUTE
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START
+					+ Boolean.toString(entry.isSelected())
+					+ QUOTE_AND_SINGLE_SPACE);
+			xmlDataBuf.append(SDK_ID_ATTRIBUTE
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START
+					+ entry.getSDKID() + QUOTE_AND_SINGLE_SPACE);
+			xmlDataBuf.append(SIZE_ATTRIBUTE
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START
+					+ entry.getSize() + QUOTE_AND_SINGLE_SPACE);
+			xmlDataBuf.append(DATE_ATTRIBUTE
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START
+					+ entry.getDate() + QUOTE_AND_SINGLE_SPACE);
+			xmlDataBuf.append(API_NAME
+					+ XML_ATTRIBUTE_ASSIGNMENT_WITH_QUOTE_START
+					+ entry.getAPIName() + QUOTE_AND_SINGLE_SPACE);
+			//System.out.println("apiname" +entry.getAPIName());
+			xmlDataBuf.append(ELEMENT_END_STR);
+			xmlDataBuf.append(CARRIAGE_RETURN_AND_NEWLINE);
+		}
+		xmlDataBuf.append(XML_ROOT_END_ELEMENT);
+		xmlDataBuf.append(CARRIAGE_RETURN_AND_NEWLINE);
+
+		// Writing data to file
+		byte[] writeData = xmlDataBuf.toString().getBytes();
+		bos.write(writeData, 0, writeData.length);
+		bos.flush();
+		bos.close();
+		fos.close();
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage#load(java.lang.String)
+	 */
+	public void load(String storageFilePathName) throws IOException {
+		//System.out.println("storage file path" + storageFilePathName);
+
+		// Setting elements to be parsed
+		Set<String> elemNameSet = new LinkedHashSet<String>();
+		elemNameSet.add(METADATA_ELEMENT); // server element
+		// Setting attributes to be parsed for server element
+		Map<String, String> attrNameSet = new LinkedHashMap<String, String>();
+		attrNameSet.put(ID_ATTRIBUTE, ID_ATTRIBUTE);
+		attrNameSet.put(SELECTION_ATTRIBUTE, SELECTION_ATTRIBUTE);
+		attrNameSet.put(SDK_ID_ATTRIBUTE, SDK_ID_ATTRIBUTE);
+		attrNameSet.put(SIZE_ATTRIBUTE, SIZE_ATTRIBUTE);
+		attrNameSet.put(DATE_ATTRIBUTE, DATE_ATTRIBUTE);
+		attrNameSet.put(API_NAME, API_NAME);
+		Map<String, Map<String, String>> attributeMap = new LinkedHashMap<String, Map<String, String>>();
+		attributeMap.put(METADATA_ELEMENT, attrNameSet);
+
+		try {
+			// Loading XML data into memory
+			StringBuffer xmlData = FileUtils
+					.loadDataFromFile(storageFilePathName);
+			// Parsing elements from the XML data and adding found server
+			// entries to storage
+			XMLElementData[] elementArr = XMLUtils.parseXML(xmlData.toString(),
+					elemNameSet, attributeMap);
+			ArrayList<CacheEntry> foundEntries = convertElementDataToEntryList(elementArr);
+			// Removing the old server entries and adding new ones
+			// When we are really sure that the whole load opearation was
+			// successful.
+			entriesMap.clear();
+			for (AbstractEntry entry : foundEntries) {
+				// CacheEntry ent = (CacheEntry) entry;
+
+				entriesMap.put(entry.getId(), entry);
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			String msg = Messages
+					.getString("CacheEntry.LoadFailed_Part_1_ErrMsg") + e.getMessage() //$NON-NLS-1$
+					+ ". " + Messages.getString("CacheEntry.LoadFailed_Part_2_ErrMsg"); //$NON-NLS-1$ //$NON-NLS-2$
+			APIQueryConsole.getInstance().println(msg,
+					APIQueryConsole.MSG_ERROR);
+			File f = new File(storageFilePathName);
+			if (f.exists()) {
+				f.delete();
+			}
+		}
+	}
+
+	/**
+	 * Converts element data into server entry list.
+	 * 
+	 * @param elementArr
+	 *            XML Element data to be converted.
+	 * @return Server entry list.
+	 */
+	private ArrayList<CacheEntry> convertElementDataToEntryList(
+			XMLElementData[] elementArr) {
+		ArrayList<CacheEntry> foundEntries = new ArrayList<CacheEntry>();
+
+		// Temporary data used during attribute fetching
+		String id = null;
+		String sdkid = null;
+		boolean isSelected = false;
+		String apiName = null;
+		long size = -1;
+		long date = -1;
+
+		for (int i = 0; i < elementArr.length; i++) {
+			XMLElementData data = elementArr[i];
+			Map<String, String> params = data.getAttributes();
+
+			try {
+
+				id = params.get(ID_ATTRIBUTE);
+				isSelected = Boolean.parseBoolean(params
+						.get(SELECTION_ATTRIBUTE));
+				sdkid = params.get(SDK_ID_ATTRIBUTE);
+				size = Long.parseLong(params.get(SIZE_ATTRIBUTE));
+				date = Long.parseLong(params.get(DATE_ATTRIBUTE));
+				apiName = params.get(API_NAME);
+				//System.out.println("api name" + apiName);
+			} catch (Exception e) {
+				throw new RuntimeException(
+						Messages
+								.getString("CacheEntry.Unexpected_Attribute_ErrMsg") + data.getElementName()); //$NON-NLS-1$
+			}
+
+			File file = new File(id);
+			if (file.exists()) {
+				String fileName = file.getName();
+				// Adding an entry
+				foundEntries.add(new CacheEntry(id, fileName, sdkid,
+						isSelected, size, date, apiName));
+			}
+		}
+		return foundEntries;
+	}
+
+	/**
+	 * Get currentry selected SDK ID
+	 * 
+	 * @return SDK ID or <code>null</code> if not found.
+	 */
+	public String getCurrentlySelectedSDKID() {
+		for (AbstractEntry entry : getEntries()) {
+			CacheEntry cacheEntry = (CacheEntry) entry;
+			if (cacheEntry.getSDKID() != null && cacheEntry.isSelected()) {
+				return cacheEntry.getSDKID();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Updates an entry to the storage. Additional not recommended possibility
+	 * to update entry without notifying listeners. It's not recommended to use
+	 * this, but if used, make sure that listeners is notified afterwards by
+	 * using
+	 * {@link AbstractEntryStorage#notifyConfigurationChangeListeners(int)}.
+	 * 
+	 * @param entryWithNewData
+	 *            Entry object containing new data.
+	 * @throws EntryNotFoundException
+	 * @param dontNotifyListeners
+	 *            if <code>true</code> listeners will not be notified.
+	 */
+	public void updateEntry(AbstractEntry entryWithNewData,
+			boolean dontNotifyListeners) throws EntryNotFoundException {
+
+		if (dontNotifyListeners) {
+			AbstractEntry entryWithOldData = (AbstractEntry) entriesMap
+					.get(entryWithNewData.getId());
+			if (entryWithOldData == null) {
+				String nonExistingEntryMsg = Messages
+						.getString("AbstractEntryStorage.NonExistingEntry_ErrMsg") + entryWithNewData.getId(); //$NON-NLS-1$
+				throw new EntryNotFoundException(nonExistingEntryMsg);
+			}
+			// Updating data fields (which triggers notification to
+			// configuration change listeners)
+			entryWithOldData
+					.updateEntryTypeSpecificDataFields(entryWithNewData);
+		} else {
+			updateEntry(entryWithNewData);
+		}
+		this.isLoaded = false;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage#updateEntry(com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry)
+	 */
+	public void updateEntry(AbstractEntry entryWithNewData)
+			throws EntryNotFoundException {
+		super.updateEntry(entryWithNewData);
+		this.isLoaded = false;
+
+	}
+
+	/**
+	 * Adds an entry to the storage. Additional not recommended possibility to
+	 * add entry without notifying listeners. It's not recommended to use this,
+	 * but if used, make sure that listeners is notified afterwards by using
+	 * {@link AbstractEntryStorage#notifyConfigurationChangeListeners(int)}.
+	 * 
+	 * @param entry
+	 *            Entry to be added.
+	 * @param dontNotifyListeners
+	 *            if <code>true</code> listeners will not be notified.
+	 * @throws DuplicateEntryException
+	 */
+	public void addEntry(AbstractEntry entry, boolean dontNotifyListeners)
+			throws DuplicateEntryException {
+
+		if (!dontNotifyListeners) {
+			super.addEntry(entry);
+		} else {
+			if (entriesMap.get(entry.getId()) != null) {
+				String duplicateEntriesErrMsg = Messages
+						.getString("AbstractEntryStorage.Duplicate_ErrMsg"); //$NON-NLS-1$
+				throw new DuplicateEntryException(duplicateEntriesErrMsg);
+			}
+			entriesMap.put(entry.getId(), entry);
+		}
+		this.isLoaded = false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage#addEntry(com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry)
+	 */
+	public void addEntry(AbstractEntry entry) throws DuplicateEntryException {
+		super.addEntry(entry);
+		this.isLoaded = false;
+	}
+
+	/**
+	 * Load all selected entrys to storage. Parsing XML:s for all items, by
+	 * calling {@link CacheEntry#load()}.
+	 * 
+	 * Also {@link CacheEntry#unload()} for entry if not selected.
+	 * 
+	 * If want to know if there was some errors, ask it by
+	 * {@link CacheEntryStorage#isLoadErros()}. If there was errors, ask them
+	 * by {@link CacheEntryStorage#getLoadErrors()}.
+	 * 
+	 * @param monitor
+	 *            to check for cancellations
+	 * @param newSelectedSDKInfo
+	 *            SDK info to be selected
+	 * @throws JobCancelledByUserException
+	 *             if canceled by user
+	 * 
+	 */
+
+	public void selectSDKAndLoadAllSelectedDatasToMemory(
+			IProgressMonitor monitor, SdkInformation newSelectedSDKInfo)
+			throws JobCancelledByUserException {
+		selectSDKAndLoadAllSelectedDatasToMemory(monitor, newSelectedSDKInfo,
+				true);
+	}
+
+	/**
+	 * Load all selected entrys to storage. Parsing XML:s for all items, by
+	 * calling {@link CacheEntry#load()}.
+	 * 
+	 * Also {@link CacheEntry#unload()} for entry if not selected.
+	 * 
+	 * If want to know if there was some errors, ask it by
+	 * {@link CacheEntryStorage#isLoadErros()}. If there was errors, ask them
+	 * by {@link CacheEntryStorage#getLoadErrors()}.
+	 * 
+	 * @param monitor
+	 *            to check for cancellations
+	 * @param newSelectedSDKInfo
+	 *            SDK info to be selected
+	 * @param selectSDK
+	 *            if newSelectedSDKInfo is to be selected as new selected SDK
+	 * @throws JobCancelledByUserException
+	 *             if canceled by user
+	 * 
+	 */
+	private void selectSDKAndLoadAllSelectedDatasToMemory(
+			IProgressMonitor monitor, SdkInformation newSelectedSDKInfo,
+			boolean selectSDK) throws JobCancelledByUserException {
+
+		// set to data store that all are deselected
+		Collection<AbstractEntry> entrys = getEntries();
+
+		// Store current situation for restoring it in cases of cancel
+		Set<String> keys = entriesMap.keySet();
+		Map<String, AbstractEntry> storedEntriesMap = new LinkedHashMap<String, AbstractEntry>(
+				entriesMap.size());
+		for (String key : keys) {
+			CacheEntry ent = (CacheEntry) entriesMap.get(key);
+			APIDetails det = ent.getAPIDetails();// If details is null, it
+			// must not be loaded now,
+			// because of lot of time
+			// taken
+			CacheEntry ent_ = new CacheEntry(ent.getId(), ent.getName(), ent
+					.getSDKID(), ent.isSelected(), ent.getSize(),
+					ent.getDate(), ent.getAPIName());
+			ent_.setAPIDetails(det);
+			storedEntriesMap.put(new String(key), ent_);
+		}
+
+		try {
+
+			// select new SDK
+			if (selectSDK) {
+				selectNewSDK(monitor, newSelectedSDKInfo, entrys);
+			}
+
+			// For XML validity errors
+			loadErrors = null;
+			Vector<CacheEntry> entrysToBeUnloaded = new Vector<CacheEntry>();
+			// Loading all selected entrys to to memory by using entry.load()
+			for (AbstractEntry entry : entrys) {
+				// If canceled, throwing exception and catch will handle data
+				// restore
+				if (monitor.isCanceled()) {
+					throw new JobCancelledByUserException(
+							Messages
+									.getString("CacheEntryStorage.JobCanceledByUserMsg"));
+				}
+				CacheEntry ce = (CacheEntry) entry;
+				if (ce.isSelected()) {
+					try {
+						ce.load();
+					} catch (XMLNotValidException e) {
+						addLoadError(e);
+					}
+				}
+				// If entry is not selected, unloading it from memory.
+				else {
+					entrysToBeUnloaded.add(ce);
+				}
+			}
+			// If canceled during operation, we unload entrys just when all is
+			// loaded, unload does not really take any time.
+			// So for here cancel wont occur anymore
+			for (CacheEntry ce : entrysToBeUnloaded) {
+				ce.unload();
+			}
+
+			this.isLoaded = true;
+
+		} catch (JobCancelledByUserException e) {
+			entriesMap = storedEntriesMap;
+			throw e;
+		}
+	}
+
+	/**
+	 * Sets selected sdk as true and un selects not selected SDK
+	 * 
+	 * @param monitor
+	 * @param newSelectedSDKInfo
+	 * @param entrys
+	 * @throws JobCancelledByUserException
+	 */
+	private void selectNewSDK(IProgressMonitor monitor,
+			SdkInformation newSelectedSDKInfo, Collection<AbstractEntry> entrys)
+			throws JobCancelledByUserException {
+		for (AbstractEntry entry : entrys) {
+			if (monitor.isCanceled()) {
+				// If canceled, throwing exception and catch will handle data
+				// restore
+				throw new JobCancelledByUserException(Messages
+						.getString("CacheEntryStorage.JobCanceledByUserMsg"));
+			}
+			CacheEntry ce = (CacheEntry) entry;
+			if (ce.getSDKID().equalsIgnoreCase(newSelectedSDKInfo.getSdkId())) {
+				entry.setSelected(true, true);
+			} else {
+				ce.setSelected(false, true);
+			}
+		}
+	}
+
+	/**
+	 * Load all selected entrys to storage. Parsing XML:s for all items, by
+	 * calling {@link CacheEntry#load()}.
+	 * 
+	 * Also {@link CacheEntry#unload()} for entry if not selected.
+	 * 
+	 * If want to know if there was some errors, ask it by
+	 * {@link CacheEntryStorage#isLoadErros()}. If there was errors, ask them
+	 * by {@link CacheEntryStorage#getLoadErrors()}.
+	 * 
+	 * @param monitor
+	 *            to check for cancellations
+	 * @throws JobCancelledByUserException
+	 *             if canceled by user
+	 */
+	public void loadAllSelectedDatasToMemory(IProgressMonitor monitor)
+			throws JobCancelledByUserException {
+
+		selectSDKAndLoadAllSelectedDatasToMemory(monitor, null, false);
+
+	}
+
+	/**
+	 * Check if there was load errors.
+	 * 
+	 * @return <code>true</code> if there was load errors <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean isLoadErros() {
+		return loadErrors != null;
+	}
+
+	/**
+	 * Get load errors
+	 * 
+	 * @return load errors or <code>null</code> if there was no errors on
+	 *         CacheEntryStorage#loadAllSelectedDatasToMemory().
+	 */
+	public Vector<XMLNotValidException> getLoadErrors() {
+		return loadErrors;
+	}
+
+	/**
+	 * Adds load error to errors
+	 * 
+	 * @param e
+	 */
+	private void addLoadError(XMLNotValidException e) {
+
+		if (loadErrors == null) {
+			loadErrors = new Vector<XMLNotValidException>();
+		}
+		loadErrors.add(e);
+
+	}
+
+	/**
+	 * Removes all selected entrys.
+	 */
+	public void removeSelectedEntrys(String currentlySelectedSDKID) {
+
+		Collection<AbstractEntry> entrys = getEntries();
+		Vector<String> ids = new Vector<String>();
+		for (AbstractEntry aEntry : entrys) {
+			CacheEntry entry = (CacheEntry) aEntry;
+			if (entry.isSelected()
+					|| entry.getSDKID().equals(currentlySelectedSDKID)) {
+				ids.add(entry.getId());
+			}
+
+		}
+		for (String id : ids) {
+			entriesMap.remove(id);
+		}
+
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_SELECTED_ENTRYS_REMOVED);
+	}
+
+	/**
+	 * Unloads all entrys
+	 */
+	public void unload() {
+		Collection<AbstractEntry> entrys = getEntries();
+		// For XML validity errors
+		loadErrors = null;// Now there are no loads -> no load Errors eather
+		// Unload all items
+		for (AbstractEntry entry : entrys) {
+			CacheEntry ce = (CacheEntry) entry;
+			ce.unload();
+		}
+		this.isLoaded = false;
+	}
+
+	/**
+	 * Check if source is loaded.
+	 * 
+	 * @return <code>true</code> if is loaded, false otherwise
+	 */
+	public boolean isLoaded() {
+		return isLoaded;
+	}
+
+	/**
+	 * Return the path to xml file.
+	 * @param sdkID : SDK name as given in metadata_cache_entries.xml file
+	 * @param APIName : API Name
+	 * @param headerFile : header file name
+	 * @return
+	 */
+	
+	public String getID(String sdkID, String APIName, String headerFile) {
+		// System.out.println("SDK ID" +sdkID + "apiame " + APIName + "
+		// headerfile : " + headerFile);
+		try {
+			//CacheEntryStorage instance = getInstance();
+			//instance.load(CachePlugin.getconfigFilePath());
+
+			Set<String> elemNameSet = new LinkedHashSet<String>();
+			elemNameSet.add(METADATA_ELEMENT); // server element
+			// Setting attributes to be parsed for server element
+			Map<String, String> attrNameSet = new LinkedHashMap<String, String>();
+			attrNameSet.put(ID_ATTRIBUTE, ID_ATTRIBUTE);
+			attrNameSet.put(SELECTION_ATTRIBUTE, SELECTION_ATTRIBUTE);
+			attrNameSet.put(SDK_ID_ATTRIBUTE, SDK_ID_ATTRIBUTE);
+			attrNameSet.put(SIZE_ATTRIBUTE, SIZE_ATTRIBUTE);
+			attrNameSet.put(DATE_ATTRIBUTE, DATE_ATTRIBUTE);
+			attrNameSet.put(API_NAME, API_NAME);
+			Map<String, Map<String, String>> attributeMap = new LinkedHashMap<String, Map<String, String>>();
+			attributeMap.put(METADATA_ELEMENT, attrNameSet);
+
+			// Loading XML data into memory
+			StringBuffer xmlData = FileUtils.loadDataFromFile(CachePlugin
+					.getconfigFilePath());
+			// Parsing elements from the XML data and adding found server
+			// entries to storage
+			XMLElementData[] elementArr = XMLUtils.parseXML(xmlData.toString(),
+					elemNameSet, attributeMap);
+			for (int i = 0; i < elementArr.length; i++) {
+				XMLElementData data = elementArr[i];
+				Map<String, String> params = data.getAttributes();
+
+				if (params.get(API_NAME).equalsIgnoreCase(APIName)
+						&& params.get(SDK_ID_ATTRIBUTE).equalsIgnoreCase(sdkID)) {
+					//System.out.println("found");
+					// serach in the list of avaliable folders
+					String id = params.get(ID_ATTRIBUTE);
+					// c:\.....\xyz.xml
+
+					String folder = id.substring(0, id.lastIndexOf("\\"))
+							+ "\\inc";
+					//System.out.println( "Folder" + folder);
+
+					File directory = new File(folder);
+
+					if (directory.isDirectory()) { // check to make sure it
+						// is a directory
+						String filenames[] = directory.list(); // make array of
+						// filenames.
+
+						for (int j = 0; j < filenames.length; j++) {
+							if (filenames[j].equalsIgnoreCase(headerFile))
+								return id;
+						}
+
+					} // is directory
+
+				}
+			} //forloop
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		
+		 
+
+		return null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/configuration/MetadataHeadersFinder.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.cache.configuration;
+
+import java.io.File;
+import java.io.FilenameFilter;
+
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Helper class for seeking header files from where .metaxml file was found.
+ */
+public class MetadataHeadersFinder {
+	
+	private IConsolePrintUtility printUtility;
+
+	/**
+	 * Constructor with IConsolePrintUtility
+	 * @param printUtility
+	 */
+	public MetadataHeadersFinder(IConsolePrintUtility printUtility){
+		this.printUtility = printUtility;
+		
+	}
+	public MetadataHeadersFinder(){
+		this.printUtility = APIQueryConsole.getInstance();
+	}
+	
+	public static final String INC_FOLDER = "inc"; //$NON-NLS-1$
+	public static final String HEADER_FILE_H_SUFFIX = ".h"; //$NON-NLS-1$
+	public static final String HEADER_FILE_HPP_SUFFIX = ".hpp";	 //$NON-NLS-1$
+	public static final String HEADER_FILE_HRH_SUFFIX = ".hrh"; //$NON-NLS-1$
+	public static final String HEADER_FILE_DISTRIBUTION_POLICY_PREFIX = "distribution.policy"; //$NON-NLS-1$
+	
+	/**
+	 * Get headers as comma separated String
+	 * @param entry
+	 * @return headers belongs to API
+	 */
+	public String getHeadersForEntry(CacheEntry entry){
+		
+		try {
+			String metaXMLSourcePath = entry.getId();
+			String metaPath = metaXMLSourcePath.substring(0, metaXMLSourcePath.lastIndexOf(File.separator));
+			String incPath = metaPath + File.separatorChar + INC_FOLDER;
+			File incPathFile = new File(incPath);
+			//We did not found inc folder, just returning with no results
+			if(!incPathFile.exists() || !incPathFile.isDirectory()){
+				//It's probably error if there is no ../inc folder at all, when metadata file is existing, but its no major error, just printing console message for that
+				printUtility.println(Messages.getString("MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part1") +incPath +Messages.getString("MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part2") +entry.getId() +Messages.getString("MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part3")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				return ""; //$NON-NLS-1$
+			}
+			File [] headers = incPathFile.listFiles(new HeaderFilter());
+			if(headers.length > 0){
+				StringBuffer b = new StringBuffer();
+				for (int i = 0; i < headers.length; i++) {
+					File header = headers[i];
+					//Skipping folders, only files is added
+					if(header.isDirectory()){
+						continue;
+					}
+					String headerName = header.getName();
+					b.append(headerName);
+					b.append(APIDetailField.VALUE_FIELD_SEPARATOR);
+				}
+				//If there was no files, only folders, there is no ", ":s eather, then just returning empty string
+				int commaIndex = b.lastIndexOf(APIDetailField.VALUE_FIELD_SEPARATOR);
+				if(commaIndex == -1){
+					return "";
+				}
+				//Cut last ", " of, and then return header names.				
+				return b.substring(0, commaIndex);
+			}
+			//Else it's not an error if there are none header files in folder,
+			//so no operations when there are no headers found.
+		} catch (Exception e) {			
+			e.printStackTrace();
+			printUtility.println(Messages.getString("MetadataHeadersFinder.HeadersSeekError_Msg") +e, IConsolePrintUtility.MSG_ERROR);			 //$NON-NLS-1$
+		}
+		
+		return ""; //$NON-NLS-1$
+	}
+	
+	/**
+	 * Checks that file is header file. Every other files will be accepted, 
+	 * but {@link MetadataHeadersFinder#HEADER_FILE_DISTRIBUTION_POLICY_PREFIX}
+	 * will be excluded.
+	 */
+	private class HeaderFilter implements FilenameFilter{
+
+		
+		public boolean accept(File f, String name) {
+			
+			String name_ = name.toLowerCase();			
+			if( name_.startsWith(HEADER_FILE_DISTRIBUTION_POLICY_PREFIX) ){
+				return false;
+			}else{
+				return true;
+			}
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/JobMessageUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.cache.core.job;
+
+import java.util.Vector;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.exceptions.XMLNotValidException;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+
+/**
+ * Class for show and print Messages
+ */
+public class JobMessageUtils {
+	
+	/**
+	 * Show error dialog for load errors. Also prints message to console.
+	 */
+	public static void showLoadErrorDialog() {
+		
+		Runnable showMsg = new Runnable(){
+
+			public void run() {
+				String msg = getLoadErrorMessage();
+				printErrorMessage(msg);
+				new APIQueryMessageBox(msg, SWT.OK| SWT.ICON_ERROR  ).open();
+				
+			}
+
+		};
+		Display.getDefault().asyncExec(showMsg);
+
+	}	
+	/**
+	 * Get load errors as message
+	 * @return error message
+	 */
+	private static String getLoadErrorMessage() {
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+		Vector<XMLNotValidException> errors = storage.getLoadErrors();
+		StringBuffer msg = new StringBuffer();
+		msg.append(Messages.getString("JobMessageUtils.DataSourceLoadErrorMsg_Part1")); //$NON-NLS-1$
+		for (XMLNotValidException e : errors) {
+			msg.append(e.getFileName());
+			msg.append(": "); //$NON-NLS-1$
+			msg.append(e.getMessage());
+			msg.append("\n"); //$NON-NLS-1$
+		}
+		msg.append(Messages.getString("JobMessageUtils.DataSourceLoadErrorMsg_Part2")); //$NON-NLS-1$
+		return msg.toString();
+	}
+	
+	/**
+	 * Print error message to console
+	 */
+	public static void printLoadErrorMessage(){
+		printErrorMessage(getLoadErrorMessage());
+	}
+	/**
+	 * Print error message to console
+	 */
+	private static void printErrorMessage(String msg){
+		APIQueryConsole.getInstance().println(msg,APIQueryConsole.MSG_ERROR);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/SeekMetaXMLFilesJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,359 @@
+/*
+* 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.apiquery.cache.core.job;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntry;
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.DuplicateEntryException;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.EntryNotFoundException;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener;
+import com.nokia.s60tools.apiquery.shared.job.AbstractJob;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.resource.FileFinder;
+import com.nokia.s60tools.util.resource.FileUtils;
+import com.nokia.s60tools.util.resource.IFileFinderObserver;
+
+/**
+ * Job for seeking .metaxml files from under SDK ({@link SdkInformation}) given. 
+ */
+public class SeekMetaXMLFilesJob extends AbstractJob implements IFileFinderObserver {
+
+	/**
+	 * Metaxml file type
+	 */
+	private static final String METAXML_FILE_SUFFIX = ".metaxml"; //$NON-NLS-1$
+
+	/**
+	 * s60 folder name in R&D SDK
+	 */
+	private static final String S60 = "s60"; //$NON-NLS-1$
+	
+	/***
+	 * SF folder 
+	 * 
+	 */
+	private static final String SF = "sf"; //$NON-NLS-1$
+
+	/**
+	 * Information about selected SDK
+	 */
+	private final SdkInformation sdkInformation;
+	
+	/**
+	 * Total steps as double, to be able to count percentages.
+	 */
+	double stepsAsDouble = 1;
+
+	/**
+	 * Folders where to seek .metaxml files under selected SDK
+	 */
+	private static final String [] FOLDERS_TO_SEEK_META_FILES = new String [] {
+		"osext",  //$NON-NLS-1$
+		"mw",  //$NON-NLS-1$
+		"app",
+		"os" }; //$NON-NLS-1$
+	
+	
+	/**
+	 * Create a Job to seek .metaxml files under selected SDK.
+	 * @param name
+	 * @param sdkInformation
+	 */
+	public SeekMetaXMLFilesJob(String name, SdkInformation sdkInformation) {
+		super(name);
+		this.sdkInformation = sdkInformation;
+		setUser(true);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		
+			
+		
+		setMonitor(monitor);
+	
+		reportStartTime();
+		try {	
+			MainView.enablePropTabcontents(false);
+			FileFinder finder = new FileFinder(APIQueryConsole.getInstance());
+
+			String epocRoot = sdkInformation.getEpocRootDir();
+			
+			//System.out.println("epoc 32 " + epocRoot);
+			
+			String message = Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part1")  //$NON-NLS-1$
+				+METAXML_FILE_SUFFIX +Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part2") +sdkInformation.getSdkId() //$NON-NLS-1$
+				+Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part3") +epocRoot +"'."; //$NON-NLS-1$ //$NON-NLS-2$
+			APIQueryConsole.getInstance().println(message);
+
+			String [] folders = new String[FOLDERS_TO_SEEK_META_FILES.length];
+			  
+			boolean isS60 = true;
+			//try to check if s60 is present
+			File directoryOfPdfs = new File(epocRoot );
+
+			if(directoryOfPdfs.isDirectory()) { // check to make sure it is a directory
+			String filenames[] = directoryOfPdfs.list(); //make array of filenames.
+			for(int i =0 ;i <filenames.length;i++)
+			{
+			if (	filenames[i].equalsIgnoreCase(SF) )
+			{ isS60 = false;				
+				break;
+			}
+			}
+			}
+			
+					
+			
+			for (int i = 0; i < FOLDERS_TO_SEEK_META_FILES.length; i++) {
+				folders[i] = epocRoot + ((isS60)?S60 : SF)+File.separatorChar + FOLDERS_TO_SEEK_META_FILES[i];
+			}		
+			
+		
+			finder.seekFilesFromFolders(this, METAXML_FILE_SUFFIX, folders);
+			return Job.ASYNC_FINISH;
+		}		
+		catch (Exception e) {
+			IStatus status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,Messages.getString("SeekMetaXMLFilesJob.SeekErrorMsg") +sdkInformation.getSdkId(), e); //$NON-NLS-1$
+			return status;
+		}
+		
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#completed(int, java.util.Collection)
+	 */
+	public void completed(int exitValue, Collection<File> files) {
+
+		try {
+	
+			if(isCanceled() || exitValue == IStatus.CANCEL){
+				interrupted(Messages.getString("SeekMetaXMLFilesJob.CancelledByUser")); //$NON-NLS-1$
+			}
+			else if(exitValue == IStatus.OK){
+				handleSeekCompleatedOK(files);
+			}
+			else{
+				handleSeekCompleatedError(exitValue);
+			}
+			reportEndTime();
+		} catch (Exception e) {
+			//Handle file not found e.g. errors.
+			e.printStackTrace();
+			handleSeekCompleatedError(e);
+		}
+		finally{
+			MainView.enablePropTabcontents(true);
+			
+			
+		}
+	}
+
+	/**
+	 * Handle Error situations after getting data
+	 * @param e
+	 */
+	private void handleSeekCompleatedError(Exception e) {
+		String message = Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedErrorMsg") +sdkInformation.getSdkId(); //$NON-NLS-1$
+		APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR);
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,message, e);
+		
+		done(status);
+	}
+	
+	/**
+	 * Handle error return values
+	 * @param exitValue
+	 */
+	private void handleSeekCompleatedError(int exitValue) {
+		String message = Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedErrorMsg") +sdkInformation.getSdkId() +Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedExitValueErrorMsg") +exitValue; //$NON-NLS-1$ //$NON-NLS-2$
+		APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR);		
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,message, null);
+		
+		done(status);
+	}
+
+	/**
+	 * If status was OK, handling completed situation
+	 * @param files
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private void handleSeekCompleatedOK(Collection<File> files) throws FileNotFoundException, IOException {
+
+		//We are pretty much done, so marking that we are in 100% of progress, updating storage does not really take any time
+		progress(steps, Messages.getString("SeekMetaXMLFilesJob.UpdatingDB_ProgressMsg")); //$NON-NLS-1$
+
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+
+		try {
+		
+		
+		
+			//set to data store that all are deselected
+			storage.deselectAll(true);//When SDK is changed, all entries is deselected
+				
+			for (File file : files) {
+				//Read the File , get the API Name
+				//System.out.println("file path" + file.getAbsolutePath());
+				StringBuffer buf = FileUtils.loadDataFromFile(file.getAbsolutePath());
+				int startIndex = buf.indexOf("<name>");
+					String apiName =   buf.substring(startIndex+6,  buf.indexOf("</name>",startIndex ));	
+					System.out.println("api name while seeking" + apiName);
+				   
+				CacheEntry entry = new CacheEntry(
+						file.getAbsolutePath(), file.getName(), sdkInformation.getSdkId(), 
+						true, file.length(),  file.lastModified(),apiName.trim());
+				try {
+					
+					if(isCanceled()){
+						interrupted(Messages.getString("SeekMetaXMLFilesJob.CancelledByUser")); //$NON-NLS-1$
+						return;
+					}		
+					if(storage.contains(entry)){
+						storage.updateEntry(entry, true);					
+					}else{
+						storage.addEntry(entry, true);					
+					}
+				} catch (DuplicateEntryException e) {
+					// Should not be able to occur, because if(storage.contains(entry)) check before adding
+					e.printStackTrace();
+				}
+				catch (EntryNotFoundException e) {
+					// Should not be able to occur, because if(storage.contains(entry)) check before update
+					e.printStackTrace();
+				}
+				
+	 		}	
+	
+			reportStartTime();
+			storage.loadAllSelectedDatasToMemory(getMonitor());//There can be parsing errors, so listeners must be notified afterwards 
+	
+			//Notifying listeners, only one notifying should be enaugh.
+			storage.notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRYS_UPDATED);
+			
+			//If there was some load errors.
+			if(storage.isLoadErros()){
+				JobMessageUtils.showLoadErrorDialog();
+			}		
+			reportEndTime();
+			
+			
+			if(files == null || files.size()==0){
+				showNoMetadatasWarning();			
+			}		
+			
+			done(Status.OK_STATUS);
+			
+		} catch (JobCancelledByUserException e) {
+			e.printStackTrace();
+			//return original map 
+			done(Status.CANCEL_STATUS);
+		}		
+	}
+
+	/**
+	 * Show warning dialog when no metadata found from selected sdk 
+	 */
+	private void showNoMetadatasWarning() {
+		Runnable showWarning = new Runnable(){			
+
+			public void run() {
+				APIQueryMessageBox msg = new APIQueryMessageBox(
+						Messages.getString("SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part1")  //$NON-NLS-1$
+						+sdkInformation.getSdkId() 
+						+Messages.getString("SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part2") ,  //$NON-NLS-1$
+						SWT.OK| SWT.ICON_WARNING );
+				msg.open();				
+			}
+		};
+		Display.getDefault().asyncExec(showWarning);
+	}
+
+	public void interrupted(String reasonMsg) {
+		done(Status.CANCEL_STATUS);
+		super.cancel();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#isCancelled()
+	 */
+	public boolean isCanceled(){
+		return getMonitor().isCanceled();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#beginTask(java.lang.String, int)
+	 */
+	public void beginTask(String name, int steps) {
+
+		//Its not allowed to dived with "0"
+		if(steps < 1){
+			steps = 1;
+		}
+		this.steps = steps;
+		stepsAsDouble = new Double(steps).doubleValue();
+		
+		getMonitor().beginTask(name, PROGRESS_COMPLETED_PERCENTAGE);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.job.AbstractJob#progress(int, java.lang.String)
+	 */
+	public void progress(int stepsCompleated, String prosessing) {
+
+        try {
+        	int persentage = (new Double( stepsCompleated / stepsAsDouble * 100)).intValue();
+        	
+			super.progress(persentage, prosessing);
+		} catch (JobCancelledByUserException e) {
+			e.printStackTrace();
+			done(Status.CANCEL_STATUS);
+		}
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/UpdateSDKSelectionJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,178 @@
+/*
+* 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.apiquery.cache.core.job;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.cache.searchmethod.ui.LocalCacheUIComposite;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener;
+import com.nokia.s60tools.apiquery.shared.job.AbstractJob;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * Job for loading already seeked SDK data to RAM
+ */
+public class UpdateSDKSelectionJob extends AbstractJob {
+
+	private final SdkInformation info;
+	private boolean showErrorDialog = true;
+
+
+	/**
+	 * Constructor
+	 * @param name
+	 * @param info
+	 */
+	public UpdateSDKSelectionJob(String name, SdkInformation info) {
+		super(name);
+		this.info = info;
+		setUser(true);
+	}
+	/**
+	 * Constructor
+	 * @param name
+	 * @param info
+	 * @param showErrorDialog set <code>false</code> if dont want to show error dialog when there was errors 
+	 * when updating cache. 
+	 */
+	public UpdateSDKSelectionJob(String name, SdkInformation info, boolean showErrorDialog) {
+		super(name);
+		this.info = info;
+		setUser(true);
+		this.showErrorDialog = showErrorDialog;
+	}	
+	
+	/**
+	 * Check if job is allready running
+	 * @return true if job with same name is allready running
+	 */
+	public boolean isAllreadyRunning(){
+
+		//Get and check all jobs
+		Job[] jobs = getJobManager().find(null);
+		for (int i = 0; i < jobs.length; i++) {
+			if(jobs[i] instanceof UpdateSDKSelectionJob){
+				UpdateSDKSelectionJob job = (UpdateSDKSelectionJob)jobs[i];
+				//If we found job what is not this job, and it runs for same SDK (same name)
+				//then there is job allready runnig to update this SDK
+				if(!job.equals(this) && job.getName().equals(this.getName())){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+	
+		
+		MainView.enablePropTabcontents(false);
+		//Check if Update is already ongoing, returning warning if is.
+		if(isAllreadyRunning()){
+			IStatus status = new Status(
+					Status.WARNING,Platform.PI_RUNTIME,
+					Status.WARNING, "Job: '" +getName() +"' already runnig.", null);			
+			return status;
+		}		
+		
+		setMonitor(monitor);
+		try{
+			reportStartTime();
+			updateDataStore();
+			reportEndTime();
+			return Status.OK_STATUS;
+			
+		}catch (JobCancelledByUserException e) {			
+			return Status.CANCEL_STATUS;
+		}catch (Exception e) {
+			e.printStackTrace();
+			return returnErrorStatus(e);
+		}		
+		finally{
+			
+			MainView.enablePropTabcontents(true);
+			
+			
+		}
+
+	}
+	
+	/**
+	 * Return error status
+	 * @param e
+	 * @return
+	 */
+	private IStatus returnErrorStatus(Exception e){
+		String msg = Messages.getString("UpdateSDKSelectionJob.SDKReadError_Msg") +info.getSdkId() +"'";	 //$NON-NLS-1$ //$NON-NLS-2$
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,msg, e);
+		return status;			
+	}
+
+	/**
+	 * When known that data source allready found (files seeked under SDK) just
+	 * updating datastore selections so that selected SDK is selected.
+	 * 
+	 * @throws IOException
+	 * @throws FileNotFoundException
+	 * @throws JobCancelledByUserException 
+	 */
+	private void updateDataStore() throws FileNotFoundException, IOException, JobCancelledByUserException {
+
+		getMonitor().beginTask(
+				Messages.getString("UpdateSDKSelectionJob.ReadingSDK_ProgressMsg") + info.getSdkId() + "'", //$NON-NLS-1$ //$NON-NLS-2$
+				IProgressMonitor.UNKNOWN); 
+
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+
+		getMonitor().subTask(Messages.getString("UpdateSDKSelectionJob.ParsingFiles_ProgressMsg")); //$NON-NLS-1$
+		// Cancel situations will throw exception and restore old data
+		storage.selectSDKAndLoadAllSelectedDatasToMemory(getMonitor(), info);
+
+		// Notifying listeners, only one notifying should be enough.
+		storage.notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRYS_UPDATED);
+
+		// Show error message or write to log if there is some errors on load.
+		if (storage.isLoadErros()) {
+			if (showErrorDialog) {
+				JobMessageUtils.showLoadErrorDialog();
+			} else {
+				JobMessageUtils.printLoadErrorMessage();
+			}
+		}
+		
+	}
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/plugin/CachePlugin.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,157 @@
+/*
+* 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.apiquery.cache.plugin;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+/**
+ * The extension plugin class for API Query Metadata information from the SDK Plug-in.
+ * This plug-in adds a data source to API Query Plug-in. 
+ */
+public class CachePlugin extends AbstractUIPlugin implements IConfigurationChangedListener {
+
+	//The shared instance.
+	private static CachePlugin plugin;
+	
+	/**
+	 * Instantiating if sheet entry storage singleton class, and therefore
+	 * making sure that it is available during the existence of the whole 
+	 * plug-in's lifetime.
+	 */
+	private static CacheEntryStorage entryStorage = CacheEntryStorage.getInstance();
+	
+	/**
+	 * Absolute path name for the plug-in specific configuration file.
+	 */
+	private static String configFilePath;
+	
+	/**
+	 * Entrys file name
+	 */
+	private static final String CACHE_ENTRY_CONFIG_FILE_DEFAULT_NAME = "metadata_cache_entries.xml";//$NON-NLS-1$
+	
+	
+	/**
+	 * The constructor.
+	 */
+	public CachePlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		// Starting to listen for configuration change events
+		entryStorage.addConfigurationChangeListener(this);
+		// Loading server information stored by the user
+		String wsPath = getPluginWorkspacePath();
+		configFilePath = wsPath + File.separator + CACHE_ENTRY_CONFIG_FILE_DEFAULT_NAME;
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Metadata information from the SDK method's config file: " + configFilePath);//$NON-NLS-1$
+		File configFile = new File(configFilePath);
+		if(configFile.exists()){
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Metadata information from the SDK method/loading configuration");//$NON-NLS-1$
+			entryStorage.load(configFilePath);
+		}		
+		else{
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Metadata information from the SDK configuration file not found: " +configFilePath);//$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * 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 CachePlugin 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.apiquery.cache.plugin", path); //$NON-NLS-1$
+	}
+	/**
+	 * Returns runtime workspace directory path for the plugin, which
+	 * can be used e.g. to store plugin/workspace-specific configuration data.
+	 * 
+	 * @return Workspace directory path for the plugin.
+	 */
+	public static String getPluginWorkspacePath(){		
+		IPath runtimeWorkspacePath = plugin.getStateLocation();
+		runtimeWorkspacePath.makeAbsolute();		
+		return runtimeWorkspacePath.toOSString();
+	}
+
+	/**
+	 * Saves the configuration for an external file.
+	 * @throws IOException
+	 */
+	private static void saveConfiguration() throws IOException{
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Metadata information from the SDK/Storing configuration...");//$NON-NLS-1$
+		entryStorage.save(configFilePath);
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Metadata information from the SDK/Configuration stored!");//$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener#configurationChanged(int)
+	 */
+	public void configurationChanged(int eventType) {
+		try {
+			saveConfiguration();
+		} catch (IOException e) {
+			String errMsg = Messages.getString("CacheEntry.Save_Configuration_ErrMsg")  //$NON-NLS-1$
+	            + " ( " + e.getMessage() + ").";//$NON-NLS-1$ //$NON-NLS-2$
+			APIQueryMessageBox msgBox = new APIQueryMessageBox(errMsg, SWT.OK | SWT.ICON_ERROR);
+			msgBox.open();		
+		}		
+	}
+
+public static String getconfigFilePath()
+{
+	return configFilePath;
+}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/resources/Messages.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+/*
+* 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.apiquery.cache.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Class for getting externalized Strings. 
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.apiquery.cache.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	/**
+	 * Get String by key
+	 * @param key
+	 * @return a 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/resources/messages.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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: 
+#
+#
+AbstractEntryStorage.Duplicate_ErrMsg=
+AbstractEntryStorage.NonExistingEntry_ErrMsg=
+CacheEntry.Cannot_Contain_Empty_Field_ErrMsg=API Metadata information from the SDK entry cannot contain an empty field.
+CacheEntry.Destination_File_Is_Write_Protected_ErrMsg=Error encountered, cannot save configuration. Destination file is write-protected:
+CacheEntry.Destination_File_Is_In_Use_ErrMsg=Error encountered, failed to delete old configuration. Destination file is in use:
+CacheEntry.LoadFailed_Part_1_ErrMsg=Failed to load API Metadata information from the SDK entry configuration: 
+CacheEntry.LoadFailed_Part_2_ErrMsg=Removing possibly corrupted configuration file.
+CacheEntry.Unexpected_Attribute_ErrMsg=Unexpected attribute in configuration file element:
+CacheEntry.Save_Configuration_ErrMsg=Failed to save configuration
+JobMessageUtils.DataSourceLoadErrorMsg_Part1=There were errors loading the following data sources:\n\n
+JobMessageUtils.DataSourceLoadErrorMsg_Part2=\nThese files were not selected as data sources.
+LocalCacheSearchMethodExtension.No_Server_Entries_ErrMsg=No server entries configured or selected in Properties-tab.
+LocalCacheSearchMethodExtension.UnexpectedEntryErrMsg=Unexpected null data source found, entry id was: 
+LocalCacheSearchMethodExtension.UnexpectedException_ErrMsg=Unexpected exception
+LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part1=Updating '
+LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part2=' data sources.
+LocalCacheSearchMethodExtension.IOException_ErrMsg=I/O Exception
+LocalCacheSearchMethodExtension.InvalidXML_ErrMsg=Invalid XML
+LocalCacheSearchMethodExtension.Failed_To_Start_Query_ErrMsg=Failed to start API query from context menu:
+LocalCacheUIComposite.RefreshCache=Refresh cache
+LocalCacheUIComposite.SDKDoesNotExistErrMsg_Part1=Selected SDK: '
+LocalCacheUIComposite.SDKDoesNotExistErrMsg_Part2=' does not exist, please check your devices configuration.
+LocalCacheUIComposite.SDKSelectionErrMsg_Part1=Selected SDK: '
+LocalCacheUIComposite.SDKSelectionErrMsg_Part2=' cannot be refreshed, see log for more information.
+LocalCacheUIComposite.SDKSelectionErrMsg_Part3=\ Error was: 
+LocalCacheUIComposite.SeekingMetadataFilesMsg=Seeking metadatas from SDK: 
+LocalCacheUIComposite.SelectSDK=Select SDK:
+LocalCacheUIComposite.UpdatingDataSourceMsg_Part1=Updating '
+LocalCacheUIComposite.UpdatingDataSourceMsg_Part2=' data sources.
+MetadataHeadersFinder.HeadersSeekError_Msg=Error seeking header files, Exception was: 
+MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part1=Inc folder: '
+MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part2=' for entry: '
+MetadataHeadersFinder.IncFolderNotFound_WarnMsg_Part3=' does not exist. Headers was not added for API.
+MetadataXMLToUIMappingRules.Adaptiotion=Adaptation
+MetadataXMLToUIMappingRules.Collection=Collection
+MetadataXMLToUIMappingRules.Description=Description
+MetadataXMLToUIMappingRules.ExtendedSDK=Extended SDK
+MetadataXMLToUIMappingRules.Headers=Headers
+MetadataXMLToUIMappingRules.HtmlDocProvided=Html doc provided
+MetadataXMLToUIMappingRules.Libs=Libs
+MetadataXMLToUIMappingRules.Name=Name
+MetadataXMLToUIMappingRules.Release=Release
+MetadataXMLToUIMappingRules.ReleaseCategory=Release category
+MetadataXMLToUIMappingRules.Subsystem=Subsystem
+MetadataXMLToUIMappingRules.Type=Type
+MetadataXMLToUIMappingRules.ReleaseSince=Release since version
+MetadataXMLToUIMappingRules.DeprecatedSince=Release deprecated since version
+SeekMetaXMLFilesJob.CancelledByUser=Cancelled by User.
+SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part1=No metadata found from SDK: '
+SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part2='. An SDK with no metadata cannot be used as a data source. Please select another SDK.
+SeekMetaXMLFilesJob.SeekCompleatedErrorMsg=Error when seeking Metadata files from SDK: 
+SeekMetaXMLFilesJob.SeekCompleatedExitValueErrorMsg=. Exit value was: 
+SeekMetaXMLFilesJob.SeekErrorMsg=Error starting to seek Metadata files from SDK: 
+SeekMetaXMLFilesJob.StartJobMsg_Part1=Starting to seek '
+SeekMetaXMLFilesJob.StartJobMsg_Part2=' files from selected SDK: '
+SeekMetaXMLFilesJob.StartJobMsg_Part3=' under EPOCROOT: '
+SeekMetaXMLFilesJob.UpdatingDB_ProgressMsg=Updating metadata data source data base.
+UpdateSDKSelectionJob.ParsingFiles_ProgressMsg=Parsing .metaxml files...
+UpdateSDKSelectionJob.ReadingSDK_ProgressMsg=Reading .metaxml files from SDK: '
+UpdateSDKSelectionJob.SDKReadError_Msg=Error on reading .metaxml files from SDK: '
+CacheEntryStorage.JobCanceledByUserMsg=Job canceled by user
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/searchmethod/LocalCacheSearchMethodExtension.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,859 @@
+/*
+* 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.apiquery.cache.searchmethod;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+
+
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntry;
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.core.job.UpdateSDKSelectionJob;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.cache.searchmethod.ui.LocalCacheUIComposite;
+import com.nokia.s60tools.apiquery.cache.util.SDKFinder;
+import com.nokia.s60tools.apiquery.cache.util.SDKUtil;
+import com.nokia.s60tools.apiquery.cache.xml.MetadataXMLToUIMappingRules;
+import com.nokia.s60tools.apiquery.popup.actions.OpenFileAction;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescriptionSearchResults;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.exceptions.XMLNotValidException;
+import com.nokia.s60tools.apiquery.shared.searchmethod.AbstractSearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.SearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.services.QueryServices;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Search Method extension allowing to create local caches from the web server
+ * entries, and used the cached information instead of the online information.
+ */
+public class LocalCacheSearchMethodExtension implements  ISearchMethodExtension, IExecutableExtension, IJobChangeListener
+{
+	
+	/**
+	 * This class is created by using <code>createExecutableExtension</code>
+	 * method from <code>IConfigurationElement</code> class, and therefore the
+	 * constructor cannot have any parameters.
+	 * 
+	 * @see org.eclipse.core.runtime.IConfigurationElement#createExecutableExtension
+	 */
+	public LocalCacheSearchMethodExtension(){
+		extensionInfo = new SearchMethodExtensionInfo();			
+	}
+	
+	private SearchMethodExtensionInfo extensionInfo;
+	private APIQueryParameters apiQueryParameters = null;
+		
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
+	 *      java.lang.String, java.lang.Object)
+	 */
+	public void setInitializationData(IConfigurationElement configElem, String classPropertyName, Object data) throws CoreException {
+		extensionInfo.setId(configElem.getAttribute(AbstractSearchMethodExtension.ID_ATTRIBUTE));
+		extensionInfo.setDescription(configElem.getAttribute(AbstractSearchMethodExtension.DESCRIPTION_ATTRIBUTE));
+		extensionInfo.setDefault(Boolean.parseBoolean(configElem.getAttribute(AbstractSearchMethodExtension.IS_DEFAULT_ATTRIBUTE)));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getExtensionInfo()
+	 */
+	public SearchMethodExtensionInfo getExtensionInfo() {
+		return extensionInfo;
+	}	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtension#notifyExtensionShutdown()
+	 */
+	public void notifyExtensionShutdown() {
+		// Currently nothing to do
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtension#createExtensionConfigurationUi(org.eclipse.swt.widgets.Composite)
+	 */
+	public AbstractUiFractionComposite createExtensionConfigurationUi(Composite parent) {
+		return new LocalCacheUIComposite(parent);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#isSupportedQueryType(int)
+	 */
+	public boolean isSupportedQueryType(int queryType) {
+		// By default the query type is not supported.
+		boolean isSupported = false;
+		
+		switch (queryType) {
+		
+	     	// Flow through (supported types)
+			case APIQueryParameters.QUERY_BY_API_NAME:
+			case APIQueryParameters.QUERY_BY_SUBSYSTEM_NAME:
+			case APIQueryParameters.QUERY_BY_LIB_NAME:
+			case APIQueryParameters.QUERY_BY_HEADER_NAME:
+				 isSupported = true;
+			     break;
+			     
+			default:
+				break;
+		}
+
+		return isSupported;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getAPIDetails(com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription)
+	 */
+	public APIDetails getAPIDetails(APIShortDescription summary) throws QueryOperationFailedException {
+		
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+		if(!storage.isLoaded()){
+			startUpdateJobAndWaitUntilFinished(storage);		
+		}
+		
+		APIDetails details = null;
+	
+		CacheEntry entry = (CacheEntry) storage.getByEntryId(summary.getSource());		
+		details = entry.getAPIDetails();		
+		return details;				
+	}	
+	
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getEntryStorageInstance()
+	 */
+	public AbstractEntryStorage getEntryStorageInstance() {
+		return CacheEntryStorage.getInstance();
+	}
+
+
+	
+	/**
+	 * Handles (run) query for one entry
+	 * 
+	 * @param parameters
+	 * @param runSynchronous
+	 * @return APIs matching search criteria
+	 * @throws QueryOperationFailedException
+	 */
+	private Collection<APIShortDescription> handleSingleEntryQuery(APIQueryParameters parameters, boolean runSynchronous) throws QueryOperationFailedException {
+		
+		ArrayList<APIShortDescription> summary = null;
+		// Create a job to convert needed Excel If sheets to XML format
+		try {
+				summary = getSummarys(parameters, runSynchronous);
+		} catch (Exception e1) {
+			examineAndHandleQueryFailureException(e1);
+		}
+		
+		return summary;
+		
+	}
+	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#runAPIQuery(com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters)
+	 */
+	public APIShortDescriptionSearchResults runAPIQuery(APIQueryParameters parameters) {
+		
+		this.apiQueryParameters  = parameters;
+		// Owerwriting query for if sheets, because of usually there is multiple
+		// (>100) data sources
+		APIShortDescriptionSearchResults results = new APIShortDescriptionSearchResults();
+
+		try {
+			// Making query for each configured and selected server entry.
+			AbstractEntry[] selEntryArr = getEntryStorageInstance().getSelectedEntries();
+			
+			// Were any entries configured or selected?
+			if(selEntryArr.length == 0){
+				throw new QueryOperationFailedException(Messages.getString("LocalCacheSearchMethodExtension.No_Server_Entries_ErrMsg")); //$NON-NLS-1$
+			}
+			
+			boolean runSynchronous = !parameters.isQueryFromUI();// If query
+																	// comes
+																	// from UI,
+																	// running
+																	// async, if
+																	// not,
+																	// running
+																	// sync
+			
+			// If there was semi-comma separated search items or not
+			if (parameters.getSearchString().contains(
+					APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR)) {
+				results.addSearchResults(handleMultiEntryQuery(parameters, runSynchronous));
+			} else {
+				results.addSearchResults(handleSingleEntryQuery(parameters, runSynchronous));
+			}
+		}catch(QueryOperationFailedException e){
+			results.addSearchError(e);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			results.addSearchError( new QueryOperationFailedException(e.getMessage()));
+		}
+		
+		return results;
+	}		
+	
+	/**
+	 * Get APIShortDescriptions from XML Excel If Sheet XML files.
+	 * 
+	 * @return
+	 * @throws QueryOperationFailedException
+	 */
+	private ArrayList<APIShortDescription> getSummarys( APIQueryParameters parameters, boolean runSynchronous) throws QueryOperationFailedException {
+		ArrayList<APIShortDescription> summary = new ArrayList<APIShortDescription>();
+		String curId = "";//$NON-NLS-1$
+		try {		
+			CacheEntryStorage storage = CacheEntryStorage.getInstance();
+			Collection<AbstractEntry> selectedAPIs = storage.getSelectedEntriesCollection();
+			
+			// if storage is not loaded, e.g. this is first time of searching
+			// after Carbide is started up, must load data first
+			if(!storage.isLoaded() && !runSynchronous){
+				startUpdateJobAndRunQueryWhenFinished(storage);
+			}
+			else{
+				if(!storage.isLoaded()){
+					startUpdateJobAndWaitUntilFinished(storage);
+				}				
+			
+				String [] searchStrings = new String []{parameters.getSearchString()};			
+	
+				
+				// Try to found search string from selected search method
+				// (selected field from XML data)
+				for (AbstractEntry abstractEntry : selectedAPIs) {
+					
+					CacheEntry entry = (CacheEntry)abstractEntry;
+					
+					APIDetails det = entry.getAPIDetails();
+					if(det == null){
+						APIQueryConsole.getInstance().println(Messages.getString("LocalCacheSearchMethodExtension.UnexpectedEntryErrMsg") +entry.getId()); //$NON-NLS-1$
+						continue;// Should not be able to occur, because load
+									// deselects source if load fails
+					}
+					curId =  entry.getId(); 
+					String curSourceDesc = entry.getName() ;
+					// Select Field from APIDetail, by selected search type, to
+					// found if that field contais the search string
+					APIDetailField fieldToSearchFor = getSelectedSearchField(det, parameters.getQueryType());
+					String fieldValueToSearch = fieldToSearchFor.getValue();
+					String apiName = det.getDetail(MetadataXMLToUIMappingRules.NAME).getValue();
+	
+					DbgUtility.println(DbgUtility.PRIORITY_LOOP, "From API: " +//$NON-NLS-1$
+							apiName
+							+", file: " + curId //$NON-NLS-1$
+							+", querytype: " +parameters.getQueryType()//$NON-NLS-1$
+							+ ", foundig values to search for: " +fieldValueToSearch);//$NON-NLS-1$
+					
+					// Looking for all search strings if there was semi-comma
+					// separated strings to search for
+					for (int i = 0; i < searchStrings.length; i++) {
+						boolean matchs;
+						if(apiQueryParameters.isExactMatchInUse()){
+							// If exact match is in use, using equals as match
+							matchs = fieldValueToSearch.equalsIgnoreCase(searchStrings[i]);
+						}
+						else{
+							// If exact match is not in use, and if result
+							// contains search string (case insensitive)
+							matchs = fieldValueToSearch.toLowerCase().contains(searchStrings[i].toLowerCase());
+						}
+						// If result matches to search string, creating new API
+						// Summary object and add it to result
+
+						if(matchs){
+							APIShortDescription sum = new APIShortDescription(
+									apiName
+									,curId,
+									curSourceDesc);
+							// If API Details should be added to description
+							// then adding it
+							if(parameters.isDetailsMentToAddToDescriptions()){
+								sum.setAPIDetails(det);
+							}
+							summary.add(sum);
+						}					
+					}
+				}
+			}
+		
+		} catch (Exception e) {
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Error when handling file: " + curId);//$NON-NLS-1$
+			e.printStackTrace();
+			examineAndHandleQueryFailureException(e);
+		}
+		return summary;
+	}
+
+	/**
+	 * Update (load) data sources if not loaded yet, after done, launch real
+	 * query
+	 * 
+	 * @param storage
+	 * @throws QueryOperationFailedException
+	 */
+	private void startUpdateJobAndRunQueryWhenFinished(CacheEntryStorage storage)
+			throws QueryOperationFailedException {
+
+		try {		
+			
+			SdkInformation info = SDKFinder.getSDKInformation(storage.getCurrentlySelectedSDKID());
+			UpdateSDKSelectionJob job = new UpdateSDKSelectionJob(Messages.getString("LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part1") +info.getSdkId() +Messages.getString("LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part2"), info, false); //$NON-NLS-1$ //$NON-NLS-2$
+			if(job.isAllreadyRunning()){
+				return;
+			}
+			job.setPriority(Job.DECORATE);			
+			job.addJobChangeListener(this);
+			job.schedule();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			examineAndHandleQueryFailureException(e);
+		}
+	}	
+	
+	/**
+	 * Update (load) data sources if not loaded yet, after done, launch real
+	 * query
+	 * 
+	 * @param storage
+	 * @throws QueryOperationFailedException
+	 */
+	private void startUpdateJobAndWaitUntilFinished(CacheEntryStorage storage)
+			throws QueryOperationFailedException {
+
+		try {		
+			
+			SdkInformation info = SDKFinder.getSDKInformation(storage.getCurrentlySelectedSDKID());
+			UpdateSDKSelectionJob job = new UpdateSDKSelectionJob(Messages.getString("LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part1") +info.getSdkId() +Messages.getString("LocalCacheSearchMethodExtension.UpdatingDataSourceMsg_Part2"), info, false); //$NON-NLS-1$ //$NON-NLS-2$
+			if(job.isAllreadyRunning()){
+				return;
+			}
+			job.setPriority(Job.DECORATE);
+			job.schedule();
+			job.join();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			examineAndHandleQueryFailureException(e);
+		}
+	}	
+	
+	
+	/**
+	 * get search field by query type
+	 * 
+	 * @param det
+	 * @param queryType
+	 * @return
+	 */
+	private APIDetailField getSelectedSearchField(APIDetails det, int queryType) {
+				
+		APIDetailField field;
+		switch (queryType) {
+		case APIQueryParameters.QUERY_BY_API_NAME:
+			field = det.getDetail(MetadataXMLToUIMappingRules.NAME);
+			break;
+		case APIQueryParameters.QUERY_BY_SUBSYSTEM_NAME:
+			field = det.getDetail(MetadataXMLToUIMappingRules.SUBSYSTEM);
+			break;
+		case APIQueryParameters.QUERY_BY_LIB_NAME:
+			field = det.getDetail(MetadataXMLToUIMappingRules.LIBS);
+			break;
+		case APIQueryParameters.QUERY_BY_HEADER_NAME:
+			field = det.getDetail(MetadataXMLToUIMappingRules.HEADERS);
+			break;
+		default:
+			field = det.getDetail(MetadataXMLToUIMappingRules.NAME);
+			break;
+		}		
+		return field;
+	}	
+
+
+	/**
+	 * Handles (run) query for several search strings
+	 * 
+	 * @param parameters
+	 * @param runSynchronous
+	 * @return APIs matching search criteria
+	 * @throws QueryOperationFailedException
+	 */
+	private Collection<APIShortDescription> handleMultiEntryQuery(APIQueryParameters parameters, boolean runSynchronous) throws QueryOperationFailedException {
+		
+		// Using table to make sure that same API:s does not exist more than
+		// once
+		Hashtable<String, APIShortDescription> summary  = new Hashtable<String, APIShortDescription>();
+		String [] searchStrings = parameters.getSearchString().split(APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR);
+		
+		APIQueryParameters param ;
+		Collection<APIShortDescription>  temp;
+		// Adding all APIDetails to collection one by one
+		for (int i = 0; i < searchStrings.length; i++) {
+			param = new APIQueryParameters(parameters.getQueryType(), searchStrings[i]);
+
+			temp = handleSingleEntryQuery(param, runSynchronous);
+			for (APIShortDescription api : temp) {
+				summary.put(api.getName(), api);// One API can contain in
+												// results only once. HashTable
+												// does not allow multiple
+												// occurances as keys.
+			}			
+
+		}		
+		return summary.values();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getAPIDetails(java.util.Collection)
+	 */
+	public Hashtable<String, APIDetails> getAPIDetails(Collection<APIShortDescription> apis) throws QueryOperationFailedException {
+
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+		if(!storage.isLoaded()){
+			startUpdateJobAndWaitUntilFinished(storage);		
+		}
+		
+		Hashtable<String, APIDetails> apiDetails = new Hashtable<String, APIDetails>(apis.size());
+		for (APIShortDescription summary : apis) {
+			apiDetails.put(summary.getName(), getAPIDetails(summary));
+		}
+		return apiDetails;
+	}	
+	
+	/**
+	 * Examines the type of throwable parameter, and adds appropriate error
+	 * message or default message, and forwards the information for further
+	 * processing.
+	 * 
+	 * @param throwable
+	 *            Throwable to be examined.
+	 * @throws QueryOperationFailedException
+	 */
+	private void examineAndHandleQueryFailureException(Throwable throwable) throws QueryOperationFailedException{
+		
+		String errMsg = Messages.getString("LocalCacheSearchMethodExtension.UnexpectedException_ErrMsg"); //$NON-NLS-1$
+		
+		if(throwable instanceof IOException) {
+			errMsg = Messages.getString("LocalCacheSearchMethodExtension.IOException_ErrMsg"); //$NON-NLS-1$
+		}
+		else if(throwable instanceof XMLNotValidException) {
+			errMsg = Messages.getString("LocalCacheSearchMethodExtension.InvalidXML_ErrMsg"); //$NON-NLS-1$
+		} 
+		
+		queryFailed(errMsg, throwable.getMessage());
+	}
+	/**
+	 * Throws an exception for user with the given message.
+	 * 
+	 * @param errorMsg
+	 *            Main error message for the user.
+	 * @param detailedMsg
+	 *            More detailed message shown in parenthesis.
+	 * @throws QueryOperationFailedException
+	 */
+	private void queryFailed(String errorMsg, String detailedMsg) throws QueryOperationFailedException {
+		APIQueryConsole.getInstance().println(errorMsg, APIQueryConsole.MSG_ERROR);
+		String combinedMsg = errorMsg + " (" + detailedMsg + ")."; //$NON-NLS-1$ //$NON-NLS-2$
+		throw new QueryOperationFailedException(combinedMsg);
+	}	
+	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 *      When data sources (metadata) is loaded, running real query
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.MainView#runAPIQueryFromExternalClass(int,
+	 *      java.lang.String)
+	 */
+	public void done(IJobChangeEvent event) {
+		
+		Job job = event.getJob();
+		UpdateSDKSelectionJob ifsJob = (UpdateSDKSelectionJob)job;
+		ifsJob.reportEndTime();
+		IStatus status = ifsJob.getResult();
+
+		// Chekc that job status was ok before launching query
+		if( status != null && status.getSeverity() == IStatus.OK) { 
+		
+			// Launching the the real query when XML:s was generated
+			Runnable runQueryRunnable = new Runnable(){
+				public void run(){
+					try {
+						QueryServices.runAPIQuery(apiQueryParameters.getQueryType(),
+								apiQueryParameters.getSearchString());
+					} catch (QueryOperationFailedException e) {
+						APIQueryConsole.getInstance().println(Messages.getString("LocalCacheSearchMethodExtension.Failed_To_Start_Query_ErrMsg")  //$NON-NLS-1$
+								+e.getMessage(), APIQueryConsole.MSG_ERROR);
+						e.printStackTrace();
+					}
+				}
+			};
+						
+			// Showing a visible message has to be done in its own thread
+			// in order not to cause invalid thread access
+			Display.getDefault().asyncExec(runQueryRunnable);        	
+		}
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+		// Not needed
+	}	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getAPIDetailsToReport()
+	 */
+	public String[] getAPIDetailsToReport(Set <String> usedAPIs, Hashtable<String, APIDetails> projectUsingAPIDetails) {
+		
+		boolean containsCollection = false;
+		boolean containsSubsystem = false;
+		for (String api : usedAPIs) {
+			APIDetails det = projectUsingAPIDetails.get(api);
+			if(det == null || det.getKeys() == null){
+				continue;
+			}
+			if(det.getKeys().contains(MetadataXMLToUIMappingRules.COLLECTION)){
+				containsCollection = true;
+			}
+			if(det.getKeys().contains(MetadataXMLToUIMappingRules.SUBSYSTEM)){
+				containsSubsystem = true;
+			}	
+			// If we found occurrence of both subsystems version (sybsystem in
+			// data version 1.0 collection in data version 2.0)
+			// we can continue because then both headers will occur in report
+			// anyway
+			if(containsCollection && containsSubsystem){
+				break;
+			}
+		}
+		
+		String [] apiDetailsToReport;
+		
+		// If both subsystem versions is found
+		if(containsCollection && containsSubsystem){
+			apiDetailsToReport= new String []{
+				MetadataXMLToUIMappingRules.COLLECTION,
+				MetadataXMLToUIMappingRules.SUBSYSTEM,
+				MetadataXMLToUIMappingRules.RELEASE_CATEGORY,
+				MetadataXMLToUIMappingRules.RELEASE_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.RELEASE_DEPRECATED_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.LIBS		
+			};
+		}
+		// if we found only collections, not subsystems
+		else if(containsCollection && !containsSubsystem){
+			apiDetailsToReport= new String []{
+				MetadataXMLToUIMappingRules.COLLECTION,
+				MetadataXMLToUIMappingRules.RELEASE_CATEGORY,
+				MetadataXMLToUIMappingRules.RELEASE_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.RELEASE_DEPRECATED_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.LIBS		
+			};
+		}
+		// else if we dont found collections or we did not found anything, using
+		// subsystem as default value
+		else {// if(!containsCollection){
+			apiDetailsToReport= new String []{
+				MetadataXMLToUIMappingRules.SUBSYSTEM,
+				MetadataXMLToUIMappingRules.RELEASE_CATEGORY,
+				MetadataXMLToUIMappingRules.RELEASE_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.RELEASE_DEPRECATED_SINCE_VERSION,
+				MetadataXMLToUIMappingRules.LIBS		
+			};
+		}				
+		return apiDetailsToReport;
+	}	
+	
+	/**
+	 * Maps query type to API Detail topic in API Details.
+	 * 
+	 * @param queryType
+	 *            Query type constant.
+	 * @return Name of the API Detail.
+	 */
+	public String getAPIDetailNameInDetailsByQueryType(int queryType){
+		
+		String apiDetail = null;
+		
+		switch (queryType) {
+
+		case APIQueryParameters.QUERY_BY_API_NAME:
+			apiDetail = MetadataXMLToUIMappingRules.NAME;
+			break;
+
+		case APIQueryParameters.QUERY_BY_SUBSYSTEM_NAME:
+			apiDetail = MetadataXMLToUIMappingRules.SUBSYSTEM;
+			break;
+
+		case APIQueryParameters.QUERY_BY_DLL_NAME:
+			apiDetail = XMLUtils.DESCRIPTION_DLLS;
+			break;
+
+		case APIQueryParameters.QUERY_BY_LIB_NAME:
+			apiDetail = MetadataXMLToUIMappingRules.LIBS;
+			break;
+
+		case APIQueryParameters.QUERY_BY_HEADER_NAME:
+			apiDetail = MetadataXMLToUIMappingRules.HEADERS;
+			break;
+
+		case APIQueryParameters.QUERY_BY_CRPS_KEY_NAME:
+			apiDetail = XMLUtils.DESCRIPTION_KEY_NAME;
+			break;
+
+		default:
+			throw new IllegalArgumentException(Messages.getString("APIQueryParameters.QueryTypePart1_ErrMsg")  //$NON-NLS-1$
+					                           + queryType
+					                           + Messages.getString("APIQueryParameters.QueryTypePart2_ErrMsg") //$NON-NLS-1$
+					                           );
+		}
+		
+		return apiDetail;
+	}		
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getQueryTypeByAPIDetailNameInDetails(java.lang.String)
+	 */
+	public int getQueryTypeByAPIDetailNameInDetails(String queryType) {
+		int queryInt = -1;
+		
+		if(queryType == null){
+			return queryInt;
+		}		
+
+		if(queryType.equals(MetadataXMLToUIMappingRules.NAME)){
+			queryInt = APIQueryParameters.QUERY_BY_API_NAME;
+		}
+		else if(queryType.equals( MetadataXMLToUIMappingRules.SUBSYSTEM)){
+			queryInt = APIQueryParameters.QUERY_BY_SUBSYSTEM_NAME;
+		}
+		else if(queryType.equals(XMLUtils.DESCRIPTION_DLLS)){
+			queryInt = APIQueryParameters.QUERY_BY_DLL_NAME;
+		}
+		else if(queryType.equals(MetadataXMLToUIMappingRules.LIBS)){
+			queryInt = APIQueryParameters.QUERY_BY_LIB_NAME;
+		}
+		else if(queryType.equals(MetadataXMLToUIMappingRules.HEADERS)){
+			queryInt = APIQueryParameters.QUERY_BY_HEADER_NAME;
+		}
+		else if(queryType.equals(XMLUtils.DESCRIPTION_KEY_NAME)){
+			queryInt = APIQueryParameters.QUERY_BY_CRPS_KEY_NAME;
+		}		
+		
+		return queryInt;
+	}
+
+	public boolean isAsyncQueryPreferred() {
+		return false;
+	}
+
+	
+/**
+ * opens the header file in the workbench
+ */
+	/*
+	public int openHeaderFile(String headerName,String source) {
+		try{
+		
+			String temp =source.replace(
+					"\\", "/");
+			System.out.println(temp);
+
+			temp = temp.substring(0, temp.lastIndexOf("/"))
+					+ "/inc/" + headerName;
+			temp = "file://" + temp;
+			System.out.print("temp" + temp);
+		
+		
+			
+			OpenFileAction action = new OpenFileAction();
+			action.openFile(new URI(temp), headerName);
+		}catch (Exception e) {
+			return 1;
+		}
+		
+		return 0;
+	}
+	*/
+	
+	
+
+	public boolean serachHeaderLinkEnable() {
+	
+		return true;
+	}
+
+	public String[] getHeaderSourceList() {
+		return	new String[] 
+				         {"http://s60lxr", "http://developer.symbian.org/xref/oss", "3.2RnDSDK", "pf_5250robot"};			    
+		
+		}	
+	
+	
+
+		public int  openHeaderFile(String headerName, String APIName) {
+			try{
+			System.out.println("header" + headerName + "APINAME " +APIName);
+				
+		// get the source
+		String	source =	LocalCacheUIComposite.headerSource;
+		String url = " ";
+		boolean isweb = false;
+		if(source.equalsIgnoreCase("http://s60lxr")){
+			 url  = "http://s60lxr/search?filestring=%2F"+headerName+"%24&advanced=1&string=";
+			 isweb = true;			
+		}
+		else if(source.equalsIgnoreCase("http://developer.symbian.org/xref/oss"))
+		{url="http://developer.symbian.org/xref/epl/search?q=&defs=&refs=&path="+headerName+"&hist=&project=%2FMCL";
+		isweb = true;
+		}
+
+	
+			
+			if(isweb)	
+			{	//open from the browser	
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				IWebBrowser browser;
+
+				browser = workbench.getBrowserSupport()
+						.createBrowser(null);
+							
+				browser
+						.openURL(new java.net.URL(url));
+			}
+			else
+			{ //open from the sdk
+				SDKUtil.headerOpen(source, APIName, headerName);
+			}
+			}catch (Exception e) {
+				e.printStackTrace();
+			}
+			
+			return 0 ;
+				
+			}
+				
+	 
+			
+			
+		
+	
+	
+	
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/searchmethod/ui/LocalCacheUIComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,470 @@
+/*
+* 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.apiquery.cache.searchmethod.ui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+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.RGB;
+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.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.apiquery.cache.CacheHelpContextIDs;
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntry;
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+import com.nokia.s60tools.apiquery.cache.core.job.SeekMetaXMLFilesJob;
+import com.nokia.s60tools.apiquery.cache.core.job.UpdateSDKSelectionJob;
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.cache.util.SDKFinder;
+import com.nokia.s60tools.apiquery.cache.util.SDKUtil;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.settings.UserSettingListenerNotificator;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.sdk.SdkManager;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+public class LocalCacheUIComposite extends AbstractUiFractionComposite
+		implements IJobChangeListener {
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 1;
+
+	public static CCombo SDKCombo;
+
+	private Button refreshBtn;
+
+	static final String CACHED = "   |SDK CACHED";
+
+	static final String UNCACHED = "   |SDK  UNCACHED";
+
+	private Combo headerfileSource;
+
+	public static String headerSource;
+
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public LocalCacheUIComposite(Composite parentComposite) {
+		super(parentComposite);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		return new GridData(GridData.FILL_HORIZONTAL);
+	}
+
+	/**
+	 * Set context sensitive help ids to components that can have focus	
+	 * @param tbl
+	 */
+	private void setContextSensitiveHelpIDs() {
+		//When all links point to same direction, we only need set context sensitive link id to composite.
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
+				CacheHelpContextIDs.CACHE_HELP_PROPERTIES_TAB);
+	}
+
+	public static void updateSDKCacheInfoList() {
+
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				SDKCombo.setItems(getSDKs());
+
+			}
+		});
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls()
+	 */
+	protected void createControls() {
+
+		RGB rgbWhite = new RGB(255, 255, 255);
+		Color white = new Color(null, rgbWhite);
+
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		Label label = new Label(this, SWT.HORIZONTAL | SWT.LEFT);
+		label.setText(Messages.getString("LocalCacheUIComposite.SelectSDK")); //$NON-NLS-1$
+		SDKCombo = new CCombo(this, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.BORDER);
+
+		SDKCombo.setBackground(white);
+		SDKCombo.setItems(getSDKs());
+
+		String comboSelection = getSDKComboSelection();
+		System.out.println("combo selection" + comboSelection);
+		SDKCombo.setText(comboSelection);
+		SDKCombo.addSelectionListener(new SDKComboSelectionListener());
+
+		refreshBtn = new Button(this, SWT.PUSH);
+		refreshBtn.setText(Messages
+				.getString("LocalCacheUIComposite.RefreshCache")); //$NON-NLS-1$
+		refreshBtn.addSelectionListener(new RefreshBtnSelectionListener());
+
+		//Setting context sensitive help IDs
+		setContextSensitiveHelpIDs();
+
+		(new Label(this, SWT.LEFT)).setText(" ");
+		Label comboTitleLabel1 = new Label(this, SWT.LEFT);
+		//		 Creating controls
+
+		comboTitleLabel1.setText("Select Source For Headers"); //$NON-NLS-1$
+
+		headerfileSource = new Combo(this, SWT.READ_ONLY);
+		final Combo myCombo = headerfileSource;
+		String[] cached  =   SDKUtil.getCachedSDKs();
+	       String[] webSources = {    "http://s60lxr", "http://developer.symbian.org/xref/oss"}; 
+	       String[] headersources  = new String[cached.length+webSources.length];
+	       System.arraycopy(webSources, 0, headersources,0 , webSources.length);       
+	       System.arraycopy(cached, 0, headersources,2 , cached.length);
+		
+		myCombo.setItems(headersources);
+
+
+String defaultSource = "http://s60lxr";
+if(headersources.length!=0)	defaultSource = comboSelection;
+	
+	headerfileSource.setText(defaultSource);
+	
+		headerSource = myCombo.getText();
+		myCombo.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				headerSource = myCombo.getText();
+				//System.out.println("you selected me: " + myCombo.getText());
+			}
+		});
+
+	}
+
+	/**
+	 * Refresh SDK
+	 */
+	private class RefreshBtnSelectionListener implements SelectionListener {
+
+		public void widgetDefaultSelected(SelectionEvent arg0) {
+			//not needed
+		}
+
+		/**
+		 * Refrenshing selected SDK...
+		 */
+		public void widgetSelected(SelectionEvent arg0) {
+			String selectedSDK = SDKCombo.getText();
+			int index = selectedSDK.indexOf(CACHED);
+
+			if (index == -1)
+				index = selectedSDK.indexOf(UNCACHED);
+			selectedSDK = selectedSDK.substring(0, index).trim();
+
+			try {
+				DbgUtility.println(DbgUtility.PRIORITY_LOOP,
+						" Refreshing SDK: " + selectedSDK); //$NON-NLS-1$
+				SdkInformation info = SDKFinder.getSDKInformation(selectedSDK);
+				CacheEntryStorage storage = CacheEntryStorage.getInstance();
+				//removing selected entrys
+				storage.removeSelectedEntrys(selectedSDK);
+
+				//update (seek and load) selected SDK
+				selectSDKAndSeekFilesIfNeeded(info);
+			} catch (Exception e) {
+
+				e.printStackTrace();
+				String message = Messages
+						.getString("LocalCacheUIComposite.SDKSelectionErrMsg_Part1") + selectedSDK //$NON-NLS-1$
+						+ Messages
+								.getString("LocalCacheUIComposite.SDKSelectionErrMsg_Part2"); //$NON-NLS-1$
+				APIQueryConsole
+						.getInstance()
+						.println(
+								message
+										+ Messages
+												.getString("LocalCacheUIComposite.SDKSelectionErrMsg_Part3") + e, APIQueryConsole.MSG_ERROR); //$NON-NLS-1$
+				APIQueryMessageBox box = new APIQueryMessageBox(message,
+						SWT.ICON_ERROR | SWT.OK);
+				box.open();
+			}
+		}
+
+	}
+
+	/**
+	 * Get selection for SDK combo
+	 * @return SDK ID or <code>null</code>
+	 */
+	private String getSDKComboSelection() {
+		String currentlySelectedSDKID = CacheEntryStorage.getInstance()
+				.getCurrentlySelectedSDKID();
+		if (currentlySelectedSDKID == null) {
+			currentlySelectedSDKID = ""; //$NON-NLS-1$
+		}
+		return currentlySelectedSDKID;
+	}
+
+	/**
+	 * Select SDK
+	 */
+	private class SDKComboSelectionListener implements SelectionListener,
+			ActionListener {
+
+		public void widgetDefaultSelected(SelectionEvent arg0) {
+			//Not needed
+
+		}
+
+		/**
+		 * selecting new SDK
+		 */
+		public void widgetSelected(SelectionEvent arg0) {
+
+			String selectedSDK = SDKCombo.getText();
+			
+			//update the headersource
+
+			int index = selectedSDK.indexOf(CACHED);
+			if(index!=-1){
+				//update header source selection list
+			String headersrc=selectedSDK.substring(0,selectedSDK.indexOf(CACHED)).trim();
+				headerfileSource.setText(headersrc);
+			}
+
+			if (index == -1)
+				index = selectedSDK.indexOf(UNCACHED);
+			selectedSDK = selectedSDK.substring(0, index).trim();
+
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP,
+					" Selecting SDK: " + selectedSDK); //$NON-NLS-1$
+			SdkInformation info = SDKFinder.getSDKInformation(selectedSDK);
+			if (info != null) {
+				selectSDKAndSeekFilesIfNeeded(info);
+
+			} else {
+				String message = Messages
+						.getString("LocalCacheUIComposite.SDKDoesNotExistErrMsg_Part1") + selectedSDK //$NON-NLS-1$
+						+ Messages
+								.getString("LocalCacheUIComposite.SDKDoesNotExistErrMsg_Part2"); //$NON-NLS-1$
+				APIQueryConsole.getInstance().println(message,
+						APIQueryConsole.MSG_ERROR);
+				APIQueryMessageBox box = new APIQueryMessageBox(message,
+						SWT.ICON_ERROR | SWT.OK);
+				box.open();
+			}
+		}
+
+		public void actionPerformed(ActionEvent arg0) {
+
+		}
+
+	}
+
+	/**
+	 * Selecting dataSource and seeking file from SDK if not seeked allready
+	 * @param info
+	 */
+	private void selectSDKAndSeekFilesIfNeeded(SdkInformation info) {
+
+		//If selected SDK allready added, just updating data stor
+		if (isSDKAllreadySeeked(info)) {
+			updateDataStore(info);
+		}
+		//else we need to seek files under SDK and then update storage (job will do that)
+		else {
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP,
+					" Starting to seek files from SDK: " + info.getSdkId()); //$NON-NLS-1$
+			SeekMetaXMLFilesJob job = new SeekMetaXMLFilesJob(
+					Messages
+							.getString("LocalCacheUIComposite.SeekingMetadataFilesMsg") + info.getSdkId(), info); //$NON-NLS-1$
+			job.setPriority(Job.DECORATE);
+			job.addJobChangeListener(this);
+			job.schedule();
+		}
+
+		//When SDK is changed, it really means that data source is changed, and we want to clear existing search results
+		UserSettingListenerNotificator.notifyListeners();
+	}
+
+	/**
+	 * Returning previous selection to SDK if cancelled.
+	 */
+	private void doCancel() {
+		Runnable doCancel = new Runnable() {
+			public void run() {
+				SDKCombo.setText(getSDKComboSelection());
+			}
+		};
+		Display.getDefault().asyncExec(doCancel);
+	}
+
+	/**
+	 * Check if selected SDK is allready added to data store
+	 * @param info
+	 * @return <code>true</code> if found, <code>false</code> otherwise.
+	 */
+public 	static boolean isSDKAllreadySeeked(SdkInformation info) {
+		CacheEntryStorage storage = CacheEntryStorage.getInstance();
+		Collection<AbstractEntry> entrys = storage.getEntries();
+		for (AbstractEntry entry : entrys) {
+			CacheEntry ce = (CacheEntry) entry;
+			if (ce.getSDKID().equalsIgnoreCase(info.getSdkId())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * When known that data source allready found (files seeked under SDK) 
+	 * just updating datastore selections so that selected SDK is selected.
+	 * @param info
+	 */
+	private void updateDataStore(SdkInformation info) {
+
+		UpdateSDKSelectionJob job = new UpdateSDKSelectionJob(
+				Messages
+						.getString("LocalCacheUIComposite.UpdatingDataSourceMsg_Part1") + info.getSdkId() + Messages.getString("LocalCacheUIComposite.UpdatingDataSourceMsg_Part2"), info); //$NON-NLS-1$ //$NON-NLS-2$
+		if (job.isAllreadyRunning()) {
+			return;
+		}
+		job.setPriority(Job.DECORATE);
+		job.addJobChangeListener(this);
+		job.schedule();
+
+	}
+
+	/**
+	 * Get SDK:s
+	 * @return sdk:s
+	 */
+public static String[] getSDKs() {
+
+		try {
+			SdkInformation[] sdkInfoColl = SdkManager.getSdkInformation();
+			String[] sdks = new String[sdkInfoColl.length];
+
+			for (int i = 0; i < sdkInfoColl.length; i++) {
+				
+				sdks[i] = sdkInfoColl[i].getSdkId()
+						+ ((isSDKAllreadySeeked(SDKFinder
+								.getSDKInformation(sdkInfoColl[i].getSdkId()))) ? CACHED
+								: UNCACHED);
+
+			}
+
+			return sdks;
+
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().println(e.getMessage(),
+					IConsolePrintUtility.MSG_ERROR);
+			return null;
+		}
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"-- Dispose() --> " + getClass().getName()); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void done(IJobChangeEvent event) {
+		//If cancelled, select selection was before started!
+		IStatus status = event.getResult();
+		if (status.getCode() != IStatus.OK) {
+			doCancel();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+		// not needed	
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+		// not needed		
+	}
+	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/util/SDKFinder.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.cache.util;
+
+import org.osgi.framework.Version;
+
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.sdk.SdkManager;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+
+/**
+ * Helper Class for finding SDK information.
+ */
+public class SDKFinder {
+
+	/**
+	 * Get SDK information by SDK ID
+	 * @param sdkID
+	 * @return information about SDK
+	 */
+	public static SdkInformation getSDKInformation(String sdkID){
+		try{
+			
+		SdkInformation[] sdkInfoColl = SdkManager.getSdkInformation();
+			
+			for (int i = 0; i < sdkInfoColl.length; i++) {
+				SdkInformation info = sdkInfoColl[i];
+			
+	
+	
+				if(info.getSdkId().equalsIgnoreCase(sdkID)){
+					return info;
+				}
+			}
+			return null;//Should not be able to occur
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().println(e.getMessage(), 
+										IConsolePrintUtility.MSG_ERROR);
+			return null;
+		}		
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/util/SDKUtil.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.s60tools.apiquery.cache.util;
+
+import java.net.URI;
+import java.util.ArrayList;
+
+import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage;
+
+import com.nokia.s60tools.apiquery.cache.searchmethod.ui.LocalCacheUIComposite;
+import com.nokia.s60tools.apiquery.popup.actions.OpenFileAction;
+
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.sdk.SdkManager;
+
+public class SDKUtil {
+
+	public static void headerOpen(String sdkName, String apiName,
+			String headerName) {
+		try {
+
+			CacheEntryStorage cacheEntryStorage = CacheEntryStorage
+					.getInstance();
+			String source = cacheEntryStorage.getID(sdkName, apiName,
+					headerName);
+			System.out.println("source " + source);
+			String temp = source.replace("\\", "/");
+			System.out.println(temp);
+
+			temp = temp.substring(0, temp.lastIndexOf("/")) + "/inc/"
+					+ headerName;
+			temp = "file://" + temp;
+			System.out.print("temp" + temp);
+
+			OpenFileAction action = new OpenFileAction();
+			action.openFile(new URI(temp), headerName);
+
+		} catch (Exception e) {
+
+		}
+
+	}
+
+	/*
+	 * return cachedarray
+	 */
+	public static String[] getCachedSDKs() {
+		String[] cachedsdks = new String[0];
+
+		try {
+			ArrayList<String> sdks = new ArrayList<String>();
+			SdkInformation[] sdkInfoColl = SdkManager.getSdkInformation();
+			//String[] sdks = new String[sdkInfoColl.length];
+
+			for (int i = 0; i < sdkInfoColl.length; i++) {
+               String sdkid = sdkInfoColl[i].getSdkId();
+				if (LocalCacheUIComposite.isSDKAllreadySeeked(SDKFinder
+						.getSDKInformation(sdkid))) {
+					sdks.add(sdkid);
+					System.out.println("cached" + sdkid);
+
+				}
+			}
+
+			cachedsdks = new String[sdks.size()];
+			sdks.toArray(cachedsdks);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return cachedsdks;
+
+	}
+	
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/xml/MetadataXMLToUIMappingRules.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,139 @@
+/*
+* 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.apiquery.cache.xml;
+
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import com.nokia.s60tools.apiquery.cache.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.datatypes.XMLToUIMappingRules;
+
+
+/**
+ * XML to UI Mapping rules for .metaxml files.
+ */
+public class MetadataXMLToUIMappingRules extends XMLToUIMappingRules {
+	
+	private static final String NAME_PARAM = "name"; //$NON-NLS-1$
+
+	//
+	// UI Texts
+	//	
+	public static final String RELEASE_DEPRECATED_SINCE_VERSION = Messages.getString("MetadataXMLToUIMappingRules.DeprecatedSince"); //$NON-NLS-1$
+	public static final String RELEASE_SINCE_VERSION = Messages.getString("MetadataXMLToUIMappingRules.ReleaseSince"); //$NON-NLS-1$
+	public static final String RELEASE_CATEGORY = Messages.getString("MetadataXMLToUIMappingRules.ReleaseCategory"); //$NON-NLS-1$
+	public static final String ADAPTATION = Messages.getString("MetadataXMLToUIMappingRules.Adaptiotion"); //$NON-NLS-1$
+	public static final String HTML_DOC_PROVIDED = Messages.getString("MetadataXMLToUIMappingRules.HtmlDocProvided"); //$NON-NLS-1$
+	public static final String SUBSYSTEM = Messages.getString("MetadataXMLToUIMappingRules.Subsystem"); //$NON-NLS-1$
+	public static final String TYPE = Messages.getString("MetadataXMLToUIMappingRules.Type"); //$NON-NLS-1$
+	public static final String DESCRIPTION = Messages.getString("MetadataXMLToUIMappingRules.Description"); //$NON-NLS-1$
+	public static final String NAME = Messages.getString("MetadataXMLToUIMappingRules.Name"); //$NON-NLS-1$
+	public static final String LIBS = Messages.getString("MetadataXMLToUIMappingRules.Libs"); //$NON-NLS-1$
+	public static final String HEADERS = Messages.getString("MetadataXMLToUIMappingRules.Headers"); //$NON-NLS-1$
+	
+	//Extended SDK is removed in metadata version 2.0.
+	public static final String EXTENDED_SDK = Messages.getString("MetadataXMLToUIMappingRules.ExtendedSDK"); //$NON-NLS-1$
+	
+	
+	/**
+	 * Collection replaces {@link MetadataXMLToUIMappingRules#SUBSYSTEM} in metadata version 2.0.
+	 */
+	public static final String COLLECTION = Messages.getString("MetadataXMLToUIMappingRules.Collection"); //$NON-NLS-1$
+
+	public MetadataXMLToUIMappingRules(){
+		init();
+	}
+
+	/**
+	 * Set rules for mapping .metaxml file to UI.
+	 * 
+	 */
+	private void init() {
+		
+		/*
+		 * 1.0 version of XML:
+		 * <code>
+		 * <?xml version="1.0" ?>
+		 * <api id="3d801aa532c1cec3ee82d87a99fdf63f" dataversion="1.0">
+		 * <name>temp</name>
+		 * <description>temp</description>
+		 * <type>c++</type>
+		 * <subsystem>temp</subsystem>
+		 * <libs><lib name="aa.lib"/>
+		 * </libs>
+		 * <release category="sdk" sinceversion="1.0" deprecatedsince="1.2"/>
+		 * <attributes>
+		 * <htmldocprovided>yes</htmldocprovided>
+		 * <adaptation>yes</adaptation>
+		 * <extendedsdk sinceversion="1.0" deprecatedsince="1.2"/>
+		 * </attributes>
+		 * </api>
+		 * </code>
+		 * 2.0 version of XML
+		 * 
+		 * <?xml version="1.0" ?>
+		 * <api id="3d801aa532c1cec3ee82d87a99fdf63f" dataversion="1.0">
+		 * <name>temp</name>
+		 * <description>temp</description>
+		 * <type>c++</type>
+		 * <collection>temp</collection>
+		 * <libs><lib name="aa.lib"/>
+		 * </libs>
+		 * <release category="public" sinceversion="1.0" deprecatedsince="1.2"/>
+		 * <attributes>
+		 * <htmldocprovided>yes</htmldocprovided>
+		 * <adaptation>yes</adaptation>
+		 * </attributes>
+		 * </api>
+		 */
+
+		addRule(NAME_PARAM, NAME);
+		addRule("description", DESCRIPTION);//$NON-NLS-1$		
+		addRule("type", TYPE);//$NON-NLS-1$		
+		addRule("subsystem", SUBSYSTEM);//$NON-NLS-1$		
+		addRule("collection", COLLECTION);//$NON-NLS-1$		//Collection replaces subsystem in version 2.0
+		
+		//Libs parameters
+		Map<String, String> libAttributes = new LinkedHashMap <String,String>();
+		libAttributes.put(NAME_PARAM, NAME_PARAM); //$NON-NLS-1$		
+		addRule("lib", LIBS, "libs", libAttributes);//$NON-NLS-1$		//$NON-NLS-2$		
+		
+		//release parameters
+		//@see e.g. Z:\s60\mw\cameraengines\cameraengines_dom\custom_onboard_camera_api\custom_onboard_camera_api.metaxml for release attributes		
+		Map<String, String> releasAttributes = new LinkedHashMap <String, String>();
+		releasAttributes.put("category", RELEASE_CATEGORY); //$NON-NLS-1$		//$NON-NLS-2$		
+		releasAttributes.put("sinceversion", RELEASE_SINCE_VERSION); //$NON-NLS-1$ //$NON-NLS-2$		
+		releasAttributes.put("deprecatedsince", RELEASE_DEPRECATED_SINCE_VERSION); //$NON-NLS-1$ //$NON-NLS-2$				
+		addRule("release", Messages.getString("MetadataXMLToUIMappingRules.Release"), releasAttributes); //$NON-NLS-1$ //$NON-NLS-2$
+
+		addRule("htmldocprovided", HTML_DOC_PROVIDED);//$NON-NLS-1$		
+		addRule("adaptation", ADAPTATION);//$NON-NLS-1$		
+
+		//Extended SDK parameters
+		//Extended SDK is removed in metadata version 2.0.
+		//Developer edited by hand file: Z:\s60\mw\ahle\ahle_dom\adaptive_history_list_api\adaptive_history_list_api.metaxml Where is extended SDK params to tests - This comment can be removed.
+		Map<String, String> extendedAttributes = new LinkedHashMap <String, String>();
+		extendedAttributes.put("sinceversion", "Extended SDK since version"); //$NON-NLS-1$ //$NON-NLS-2$		
+		extendedAttributes.put("deprecatedsince", "Extended SDK deprecated since version"); //$NON-NLS-1$ //$NON-NLS-2$		
+		addRule("extendedsdk", EXTENDED_SDK, extendedAttributes);//$NON-NLS-1$		
+		
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.classpath	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,6 @@
+<?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="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.apiquery.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>
+		<buildCommand>
+			<name>com.nokia.carbide.extension.pclint.pclintAuditor</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.nokia.carbide.extension.pclint.pclintNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/.settings/org.eclipse.jdt.core.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+#Thu Oct 09 15:30:10 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - APIQuery Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.apiquery.help;singleton:=true
+Bundle-Version: 1.2.6
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.help
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/book.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,191 @@
+/*	
+
+ Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+
+ This component and the accompanying materials are made available
+ under the terms of "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               book.css
+bin.excludes = html/nokia.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/concepts.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,21 @@
+<!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" />
+<title>Concepts</title>
+<link rel="StyleSheet" href="../../book.css" type="text/css"/>
+</head>
+<body>
+<h2>Concepts</h2>
+<p>The following concepts provide information on relevant concepts for the API Query tool:</p>
+<ul>
+  <li><a href="data_source.htm">Data source</a></li>
+  <li><a href="software_development_kit.htm">Software Development Kit (SDK)</a></li>
+  <li><a href="metadata_file.htm">API metadata 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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/data_source.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Data source</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Data source</h2>
+<p>A data source is an external repository that stores information about Application Programming Interfaces (APIs).</p>
+<p>The repository can be, for example:</p>
+<ul>
+<li>a Web database service, </li>
+<li>an API metadata file (<i>.metaxml</i>) obtained from a Software Development Kit (SDK). </li>
+</ul>
+<p>API information identifies, for example, the header files, DLL files, subsystems, SDKs, and the contact persons for an API. However, different data sources contain different levels of detail. To check which data source suits your needs the best and how to take it into use, see the topics under <a href="../datasources/datasources.htm">Data source configurations</a>.</p>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/metadata_file.htm">Metadata file</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/configure_data_sources.htm">Configuring data sources</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/metadata_file.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>API metadata file</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>API 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="1.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;subsystem>commonservices&lt;/subsystem><br>
+&nbsp; &lt;libs><br>
+&nbsp;&nbsp;&nbsp; &lt;lib name="CommonEngine.lib" /><br>
+&nbsp; &lt;/libs><br>
+&nbsp; &lt;release category="sdk" sinceversion="2.0"/><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>. 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>
+<p><b>Tip:</b> These files can be created and edited in the Carbide.c++ development environment with the <i>Metadata Editor</i> tool. You can start the tool from the <b>Carbide > Metadata Editor</b> menu.</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/concepts/software_development_kit.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Software Development Kit (SDK)</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Software Development Kit (SDK)</h2>
+<p>A Software Development Kit (SDK) contains the tools, documentation and code examples that support the development of applications. It also contains Application Programming Interface (API) metadata files (<i>.metaxml</i>) that you can specify as one data source type for your queries.</p>
+<p>You can use both Public SDKs and RnD SDKs in queries. Public SDKs can be downloaded from the Internet (for example, from <a href="http://www.forum.nokia.com" target="_new">Forum Nokia</a> pages), whereas RnD SDKs are more restricted but contain all system-level components.</p>
+<p>To install SDKs to Carbide.c++, go to <b>Windows > Preferences > Carbide.c++ > SDK Preferences > Add New SDK</b>, and select the SDK to be added.</p>
+<p>For more information, see <b>SDK Support</b> under the general Carbide.c++ help.</p>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/data_source.htm">Data source</a></li>
+</ul>
+
+<h5>Related tasks</h5><ul>
+<li><a href="../tasks/configure_data_sources.htm">Configuring data sources</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/contexts.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+	<context id="API_QUERY_HELP_SEARCH_TAB">
+	      	<description>Search tab</description>	   
+			<topic label="Running an API query from the Search tab" href="html/tasks/query_from_search_tab.htm" >    	
+			</topic>
+			<topic label="Running an API query from the context menu" href="html/tasks/query_from_context_menu.htm" >    	
+			</topic>
+	</context>	  
+		    
+	<context id="API_QUERY_HELP_PROPERTIES_TAB">
+	      	<description>Properties tab</description>	   
+			<topic label="Configuring data sources" href="html/tasks/configure_data_sources.htm" >
+			</topic>
+	</context>    
+
+     		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/datasources/datasources.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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" />
+<title>Data source configurations</title>
+<link rel="StyleSheet" href="../../book.css" type="text/css"/>
+</head>
+<body>
+
+<h2>Data source configurations</h2>
+<p>This section of the help shows the documentation for currently installed data sources. Each data source implementation can be installed as a separate plug-in, and each plug-in provides its help under this category. Follow the topic links on the help's table of contents for more information.</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/GS_index.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Getting Started</title>
+    <link href="../../book.css" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+<h2>Getting started</h2>
+
+<p>The information in this section will help you get started quickly using the basic 
+ features of the API Query 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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/overview.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Overview</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Overview</h2>
+<p>API Query is a tool for querying Application Programming Interface (API) information. With this tool, you can quickly found out which headers belong to a specific API, who is the owner of a particular API, and whether the API has been published in an SDK.</p>
+<p>API data is accessed via a data source, such as an online database service. For more information, see <a href="../concepts/data_source.htm">Data source</a>.</p>
+<p>You can use the following criteria when querying for API information (some of these may not be available with all data source types): </p>
+<ul>
+<li>API name</li>
+<li>subsystem name</li>
+<li>DLL name</li>
+<li>LIB name</li>
+<li>header name</li>
+<li>CR/P&amp;S key name. </li>
+</ul>
+<p>In the API Query tool, you can run a query either from the <b>Search</b> tab or directly from your code. In the code, you can either search for specific identifiers or generate a report about the usage of APIs in your entire project.</p>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/data_source.htm">Data source</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/configure_data_sources.htm">Configuring data sources</a></li>
+<li><a href="../tasks/query_from_search_tab.htm">Running an API query from the Search tab</a></li>
+<li><a href="../tasks/query_from_context_menu.htm">Running an API query from the context menu</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/gettingstarted/walk_through.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Basic walk-through</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>Basic walk-through</h3>
+<p>To launch the API Query extension, do either of the following:</p>
+<ul>
+<li>Select <b>Carbide > API Query</b>.</li>
+<li>Select <b>Window > Show View > Other...</b>, where the tool can be found the <b>Carbide Extensions</b> category.</li>
+</ul>
+<p>Before you can run queries, <a href="../tasks/configure_data_sources.htm">configure the data sources</a> you want to use. The currently installed data sources are listed on the <b>Properties</b> tab.</p>
+<p>After this, you can <a href="../tasks/query_from_search_tab.htm">run an API query from the Search tab</a> or <a href="../tasks/query_from_context_menu.htm">from the context menu</a> of your project.</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 srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/images/green_fade_left_68_165_28.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/index.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,144 @@
+<?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="API Query" >
+		<topic href="html/gettingstarted/overview.htm" />
+
+		<entry keyword="basic walk-through" >
+			<topic href="html/gettingstarted/walk_through.htm" />
+		</entry>
+
+		<entry keyword="Release Note" >
+			<topic href="html/release_notes.htm" />
+		</entry>
+
+	</entry>
+
+	<entry keyword="API query criteria" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry>
+
+	<!-- BBBBBBBB -->	
+
+	<!-- CCCCCCCC -->	
+
+	<entry keyword="configuring data sources" >
+		<topic href="html/tasks/configure_data_sources.htm" />
+	</entry>
+
+	<!-- DDDDDDDD -->		
+
+	<entry keyword="data sources, overview" >
+		<topic href="html/concepts/data_source.htm" />
+		
+		<entry keyword="configuring" >
+			<topic href="html/tasks/configure_data_sources.htm" />
+		</entry>
+	</entry>
+
+
+	<!-- EEEEEEEE -->	
+
+	<!-- FFFFFFFF -->
+
+	<!-- GGGGGGGG -->	
+	
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+	<!-- MMMMMMMM -->
+	
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+	
+	<!-- PPPPPPPP -->
+	
+	<!-- QQQQQQQQ -->
+
+	<entry keyword="querying APIs" >
+	
+		<entry keyword="on Search tab" >
+			<topic href="html/tasks/query_from_search_tab.htm" />
+		</entry>
+
+		<entry keyword="for identifier" >
+			<topic href="html/tasks/query_for_source_code_identifier.htm" />
+		</entry>
+
+		<entry keyword="for project" >
+			<topic href="html/tasks/query_for_project.htm" />
+		</entry>
+
+	</entry>
+
+	<entry keyword="query from source code" >
+		<topic href="html/tasks/query_from_context_menu.htm" />
+	</entry>
+
+	<!-- RRRRRRRR -->
+
+	<entry keyword="Release Notes" >
+
+		<entry keyword="API Query" >
+			<topic href="html/release_notes.htm" />
+		</entry>
+	</entry>
+	
+	<entry keyword="reports" >
+
+		<entry keyword="API query" >
+			<topic href="html/tasks/query_for_project.htm" />
+		</entry>
+	</entry>
+	
+	<!-- SSSSSSSS -->
+
+	<entry keyword="searching" >
+		<entry keyword="API data" >
+			<topic href="html/tasks/query_from_search_tab.htm" />
+		</entry>
+	</entry>
+	
+	<!-- TTTTTTTT -->
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+	
+	<!-- XXXXXXXX -->
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/legal.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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. This component and the accompanying materials are made available under the terms of the License "Symbian Foundation 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/nokia.css	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/release_notes.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,80 @@
+<!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 Query 1.2.6</h4>
+<ul>
+	<li><a href="#description">Product description</a></li>
+	<li><a href="#features">Features</a></li>
+	<li><a href="#enhancements">Enhancements/Fixed</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 Query is a tool for querying Application Programming Interface (API) information.</p>
+<p>You can start the API Query tool either by selecting the <b>Carbide > API Query</b> menu item or via <b>Window > Show View > Other...</b> under <b>Carbide Extensions</b> category.</p>
+
+<h3><a name="features"></a>Features</h3>
+<ul>
+	<li>API Query using metadata files (<i>.metaxml</i>) from an SDK. </li>
+	<li>API usage verification in an active project. </li>
+	<li>Usage logging when a search is executed. </li>
+	</ul>
+
+<h3><a name="enhancements"></a>Enhancements/Fixed</h3>
+<ul>
+	<li>The search results list can show only API names.</li>
+	<li>The HTML report links start an API Query or open the selected file.</li>
+	
+</ul>
+
+<h3><a name="newfeatures"></a>New Features</h3>
+<ul>
+	<li>Search results are displayed with focus on the search criteria.</li>
+	<li>The value that fulfils the search criteria is shown highlighted with red.</li>
+	<li>Hyperlink to open the header file will be active.</li>
+	<li>Multi search support with keywords seperated by ;</li>
+	<li>In the API metadata file data source, Cached/Unchached information displayed against each sdk</li>	
+	<li>Sorter for results</li>	
+</ul>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic Requirements:</p>
+<ul>
+	<li>Windows 2000, Windows XP</li>
+	<li>Carbide.c++ v2.0</li>
+	<li>Minimum Platform/SDK build PC.</li>
+	<li>Normal Platform/SDK build PC.</li>
+</ul>
+<p>Additional Requirements:</p>
+<ul>
+	<li>Carbide.c++ with all its prerequisites have to be installed prior to installation. ActivePerl-5.6.1.635 and at least one S60 3rd Edition SDK/Platform need to be installed. See <i>readme\readme_sdks.html</i> under the Carbide.c++ installation directory for more information on prerequisites. </li>
+</ul>
+<p></p>
+
+<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 multiple Carbide.C++ editor instances are running on same PC, active project report links may not work. Close other Carbide.C++ instances and rerun API Query for active project or restart API Query plug-in.</li>
+<li>Context-sensitive help will not get focus when pressing F1 if the API Query plug-in is running in the same tab as the Help. The help will open to a relative item on F1 key press, and can be navigated to by clicking the Help tab. </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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/configure_data_sources.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Configuring data sources</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Configuring data sources</h2>
+<p>Data sources are configured on the <b>Properties</b> Tab in the API Query tool. The currently used data source is selected from the list box. The contents of the configuration UI vary based on which data source is selected. There is no common rule for configuration UI, but it is normally divided into several data source entries that can be either taken into or omitted from an API search.</p>
+<img src="screenshots/data_source_config.png">
+<p>For data source specific configuration steps, see <a href="../datasources/datasources.htm">Data source configurations</a> in this help.</p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/query_from_search_tab.htm">Running an API query from the Search tab</a></li>
+<li><a href="../tasks/query_from_context_menu.htm">Running an API query from the context menu</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+<li><a href="../concepts/data_source.htm">Data source</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_for_project.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,39 @@
+<!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 an API query for a project</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Running an API query for a project</h2>
+<p>You can generate a report of the usage of APIs throughout your active project from the context menu. 
+You can access the context menu either by right-clicking any <i>.cpp</i> or <i>.h</i> file or any folder in the C/C++ Projects view, or by right-clicking your code anywhere in the editor.</p>
+
+<p>The report is a table in HTML format and is named as <code>[name]-project_is_using_APIs.html</code> by default. You can view it in Carbide's internal browser or in any Web browser.</p>
+<p>To run a query for a project, do the following:</p>
+<ol>
+<li> Right-click the item of your choice and from the pop-up menu, select <b>API Query > for Active Project</b>.</li>
+<li>In the <b>Save As</b> dialog, select the location for saving the query report within your project and click <b>OK</b>.</li>
+<li>When the report has been generated, click <b>OK</b> in the confirmation dialog to view it right away. <p>The report is opened to Carbide's internal browser. See the following figure for an example:</p>
+<p><img src="screenshots\sample_api_report.png"></p>
+<p>You can perform operations by clicking the underlined links in the report:</p>
+<ul>
+<li>Click an item in the <b>API Name</b>, <b>Subsystem</b>, or <b>Libs</b> column to start an API Query with the selected API name, subsystem or library as the search string and a preselected query type.</li>
+<li>Click an item in the <b>Used headers</b> or <b>Using files</b> column to open the selected file.</li>
+</ul>
+<p><b>Note</b>: You can only open links from the report when the API Query Carbide.c++ Extension is running.</p>
+</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/query_from_context_menu.htm">Running an API query from the context menu</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_for_source_code_identifier.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Running an API query based on the source code identifier</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Running an API query based on the source code identifier</h2>
+<p>A convenient way to run an API query is to start it directly from your source code. You can use any of the following identifier types as criteria:</p>
+<ul>
+<li>Header Name</li>
+<li>LIB Name</li>
+<li>CR/P&amp;S Key Name.</li>
+</ul>
+<p>To run a query using an identifier, do the following: </p>
+<ol>
+<li>Select the identifier name or part of the name from the code. <p><b>Tip:</b> with the Header Name type, it is enough to place the cursor on a line that has a valid <code>#include</code> directive, or select multiple lines.</p></li>
+<li>Right-click the selection and from the pop-up menu, select <b>API Query</b> followed by the identifier type.
+<p><img src="screenshots\context_menu.png"></p>
+<p>The API Query view is opened, if not already activated, and the selected identifier is copied into the <b>Search string</b> field. The query is carried out automatically and the found matches are displayed in the <b>Search results</b> list. </p></li>
+<li>Select the API of your choice from the list to view its details. <p>The information is retrieved into the <b>API details</b> table. </p></li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/query_from_context_menu.htm">Running an API query from the context menu</a></li>
+<li><a href="../tasks/query_from_search_tab.htm">Running an API query from the Search tab</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_from_context_menu.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Running an API query from the context menu</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Running an API query from the context menu</h2>
+<p>API Query provides a context menu that is visible for Carbide projects both in the <b>C/C++ Projects</b> view, and for header and source files of those projects opened in the editor. </p><p><img src="screenshots/context_menu.png"></p>
+<p>From the context menu, you can either run a query based on a specific identifier in the source code (for example, a header name), or you can generate a report of API usage throughout your project. The report is in HTML format, and it summarizes the API names and header files that your project uses.</p>
+<p>For instructions, see <a href="../tasks/query_for_source_code_identifier.htm">Running an API Query based on the source code identifier</a> and <a href="../tasks/query_for_project.htm">Running an API Query for a project</a>.</p>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/configure_data_sources.htm">Configuring data sources</a></li>
+<li><a href="../tasks/query_from_search_tab.htm">Running an API Query from the Search tab</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/query_from_search_tab.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,43 @@
+<!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 an API query from the Search tab </title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Running an API query from the Search tab</h2>
+
+<h5>Before you start</h5>
+<p>Make sure you have configured the data source you want to use. For instructions, see <a href="../tasks/configure_data_sources.htm">Configuring data sources</a>.</p>
+<p>To run API queries, do the following:</p>
+<ol>
+<li>Select the query type from the <b>Query by</b> group.<p><b>Note:</b> a different set of query types may be enabled depending on the configured data source. </p></li>
+<li>In the <b>Search string</b> field, enter the string you want to search for. <p>For example, <code>avkon</code> for an API name or <code>akna</code> for a header name, and so on. For multi search seperate the keyword with "; " character.  Wildcard characters (*,?) are not supported.</p></li>
+<li>To run the query, click <b>Search</b>.<p>The list of found APIs are shown in the <b>Search results</b> list, as shown in the example below.</p>
+<p><b>Single keyword search </b></p>
+<img src="screenshots/singlesearch.PNG">
+<p><b>Multi Keyword search</b></p>
+<img src="screenshots/multiserach.png">
+
+<p>The ID of the data source is shown in the brackets after the API name. If there are multiple data source entries configured, the same API may be listed once for each data source entry.</p>
+<p>To view only the API names in the <b>Search results</b> list, check the option <b>Show only API names</b>.</p></li>
+<li>Select the API of your choice from the list to view its details. <p>The information is fetched into the <b>API details</b> table and the value that fulfils the search criteria is highlighted with red, as shown in the example below.</p>
+<p><img src="screenshots/results.png"></p>
+<p>Headers can be opened  by clicking on the link provided in the api details tab.Header is opened in editor/web browser based on the selected data source.If the data source is sdk then it will be opened in editor.If the data source is webserver then it will be opened in s60lxr.</p>
+<p>Note: the data fields shown in the <b>API details</b> table can vary based on the current data source selection and headerlink will be enabled only when the serach is for header file.</p>
+</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+<li><a href="../tasks/configure_data_sources.htm">Configuring data sources</a></li>
+<li><a href="../tasks/query_from_context_menu.htm">Running an API query from the context menu</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>
+
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/context_menu.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/data_source_config.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/generate_api_report.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/identifier_from_code.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/multiserach.PNG has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/results.PNG has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/sample_api_report.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/search_tab.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/singlesearch.PNG has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/web_sample_details.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/screenshots/web_sample_found_entries.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tasks/tasks.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 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" />
+<title>Tasks</title>
+<link rel="StyleSheet" href="../../book.css" type="text/css"/>
+</head>
+<body>
+
+<h2>Tasks</h2>
+<p>The following tasks are available for this tool:</p>
+<ul>
+  <li><a href="configure_data_sources.htm">Configuring data sources</a></li>
+  <li><a href="query_from_search_tab.htm">Running an API query from the Search tab</a></li>
+  <li><a href="query_from_context_menu.htm">Running an API query from the context menu</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/toc.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Table of Contents</title>
+	<link href="../book.css" type="text/css" rel="stylesheet">
+</head>
+
+<body>
+<h1>API Query 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/data_source.htm">Data source</a></li>
+	<li><a href="concepts/software_development_kit.htm">Software Development Kit (SDK)</a></li>
+	<li><a href="concepts/metadata_file.htm">API metadata file</a></li>
+</ul>
+
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/configure_data_sources.htm">Configuring data sources</a></li>
+	<li><a href="tasks/query_from_search_tab.htm">Running an API query from the Search tab</a></li>
+	<li><a href="tasks/query_from_context_menu.htm">Running an API query from the context menu</a></li>
+</ul>
+
+<p><a href="datasources/datasources.htm">Data source configurations</a>
+
+<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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocConcepts.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+<?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="Data source" href="html/concepts/data_source.htm" />
+	<topic label="Software Development Kit (SDK)" href="html/concepts/software_development_kit.htm" />
+	<topic label="API metadata file" href="html/concepts/metadata_file.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocGettingStarted.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocReference.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -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="Reference 1" href="html/reference/reference1.htm" />
+	<topic label="Reference 2" href="html/reference/reference2.htm" />
+	
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/tocTasks.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -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="Configuring data sources" href="html/tasks/configure_data_sources.htm" />
+	<topic label="Running an API query from the Search tab" href="html/tasks/query_from_search_tab.htm" />
+	<topic label="Running an API query from the context menu" href="html/tasks/query_from_context_menu.htm">
+		<topic label="Running an API Query based on the source code identifier" href="html/tasks/query_for_source_code_identifier.htm" />
+		<topic label="Running an API Query for a project" href="html/tasks/query_for_project.htm" />
+	</topic>
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/html/toolTOC.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -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 Query" 
+link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature">
+
+	<!--
+		Define the API Query as it should appear in the TOC. The tool.htm page
+		is the cover page for the tool help.
+	-->
+	<topic label="API Query" 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="Data source configurations" href="html/datasources/datasources.htm" >
+      		<anchor id="DataSources"/>
+	   </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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,59 @@
+<?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/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.apiquery.help"/>
+   </extension>
+</plugin>
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/ppt/APIQueryMainPluginHelpFigures.ppt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.help/ppt/README.txt	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,4 @@
+
+APIQueryMainPluginHelpFigures.ppt stores the figures that
+are edited in Powerpoint before they are stored under the
+screenshots directory under the corresponding help directory.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.classpath	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+bin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.apiquery</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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.core.resources.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,4 @@
+#Thu Sep 06 17:13:39 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/apiquery/shared/common/product.properties=8859_1
+encoding//src/com/nokia/s60tools/apiquery/shared/resources/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.jdt.core.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+#Mon Feb 26 15:24:00 EET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/.settings/org.eclipse.jdt.ui.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,3 @@
+#Mon Feb 26 15:24:00 EET 2007
+eclipse.preferences.version=1
+internal.default.compliance=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - API Query Tool
+Bundle-SymbolicName: com.nokia.s60tools.apiquery; singleton:=true
+Bundle-Version: 1.2.6
+Bundle-Activator: com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin
+Bundle-Vendor: Nokia
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ com.nokia.s60tools.sdk,
+ com.nokia.s60tools.ui,
+ com.nokia.s60tools.util,
+ org.eclipse.core.resources,
+ org.eclipse.jface.text,
+ org.eclipse.ui.ide,
+ org.eclipse.help,
+ org.eclipse.ui.forms,
+ javax.servlet;bundle-version="2.4.0",
+ org.eclipse.equinox.http.jetty;bundle-version="1.1.0",
+ com.nokia.carbide.cpp.sdk.core;bundle-version="2.0.0",
+ com.nokia.carbide.cdt.builder;bundle-version="2.0.0"
+Bundle-ActivationPolicy: lazy
+Export-Package: com.nokia.s60tools.apiquery.popup.actions;x-friends:="com.nokia.s60tools.apiquery.cache",
+ com.nokia.s60tools.apiquery.shared.common,
+ com.nokia.s60tools.apiquery.shared.datatypes,
+ com.nokia.s60tools.apiquery.shared.datatypes.config,
+ com.nokia.s60tools.apiquery.shared.exceptions,
+ com.nokia.s60tools.apiquery.shared.job,
+ com.nokia.s60tools.apiquery.shared.plugin,
+ com.nokia.s60tools.apiquery.shared.preferences,
+ com.nokia.s60tools.apiquery.shared.resources,
+ com.nokia.s60tools.apiquery.shared.searchmethod,
+ com.nokia.s60tools.apiquery.shared.searchmethod.ui,
+ com.nokia.s60tools.apiquery.shared.searchmethodregistry,
+ com.nokia.s60tools.apiquery.shared.services,
+ com.nokia.s60tools.apiquery.shared.settings,
+ com.nokia.s60tools.apiquery.shared.ui,
+ com.nokia.s60tools.apiquery.shared.ui.dialogs,
+ com.nokia.s60tools.apiquery.shared.util,
+ com.nokia.s60tools.apiquery.shared.util.console,
+ com.nokia.s60tools.apiquery.shared.util.xml,
+ com.nokia.s60tools.apiquery.ui.views.main;x-friends:="com.nokia.s60tools.apiquery.cache"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.html	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Dec 2, 2009</p>	
+
+<h3>Copyright</h3>
+
+<p>
+
+Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+
+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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.ini	Sat Jan 09 10:04:11 2010 +0530
@@ -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".
+################################################################################
+
+# 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.mappings	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies 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=3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/about.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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: 
+#
+#
+
+productBlurb=Carbide.c++ Extensions - API Query \n\
+\n\
+Version: 1.2.6\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+License:http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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: 
+#
+#
+javacSource=1.5
+javacTarget=1.5
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               icons/,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               about.html,\
+               plugin.properties,\
+               resources/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/ccbuild.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,490 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.apiquery" default="cc" basedir=".">
+
+	<!-- Targets -->
+	<target name="cc" depends="clean-test, jar, analyze, feature, test, 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="feature.name" value="APIQuery"/>
+	<property name="feature.project.name" value="com.nokia.carbide.extension.apiquery"/>
+	<property name="feature.project.folder" location="../com.nokia.carbide.extensions.apiquery"/>
+	<property name="cache.name" value="${ant.project.name}.cache"/>
+	<property name="ifsheets.name" value="${ant.project.name}.ifsheets"/>
+	<property name="web.name" value="${ant.project.name}.web"/>
+	
+
+	<property name="help.project.name" value="${ant.project.name}.help"/>
+	<property name="help.cache.name" value="${ant.project.name}.cache.help"/>
+	<property name="help.ifsheets.name" value="${ant.project.name}.ifsheets.help"/>
+	<property name="help.web.name" value="${ant.project.name}.web.help"/>
+	
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	<property name="help.cache.filename" value="${help.cache.name}.jar"/>
+	<property name="help.ifsheets.filename" value="${help.ifsheets.name}.jar"/>
+	<property name="help.web.filename" value="${help.web.name}.jar"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="cache.jar.filename" value="${ant.project.name}.cache.jar"/>
+	<property name="ifsheets.jar.filename" value="${ant.project.name}.ifsheets.jar"/>
+	<property name="web.jar.filename" value="${ant.project.name}.web.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	
+	<!-- Folder definitions -->
+	<property name="cache.folder" location="../${cache.name}"/>
+	<property name="ifsheets.folder" location="../${ifsheets.name}"/>
+	<property name="web.folder" location="../${web.name}"/>
+	<property name="test.folder" location="../${ant.project.name}.tests"/>
+	<property name="test.cache.folder" location="../${ant.project.name}.cache.tests"/>
+	<property name="test.ifsheets.folder" location="../${ant.project.name}.ifsheets.tests"/>
+	<property name="test.web.folder" location="../${ant.project.name}.web.tests"/> 
+	<property name="binaries.folder" location="${basedir}/../${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="com"/>
+		<delete dir="${cache.folder}/com"/>
+		<delete dir="${ifsheets.folder}/com"/>
+		<delete dir="${web.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>
+		
+		<!-- Build the source -->
+		<javac destdir="${cache.folder}" 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="${cache.folder}/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>
+		
+		<!-- Build the source -->
+		<javac destdir="${ifsheets.folder}" 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="${ifsheets.folder}/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>
+		
+		<!-- Build the source -->
+		<javac destdir="${web.folder}" 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="${web.folder}/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>
+		
+		<!-- Copy necessary resources -->
+		<copy todir="${cache.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${cache.folder}/src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+		
+		<!-- Copy necessary resources -->
+		<copy todir="${ifsheets.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${ifsheets.folder}/src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+		
+		<!-- Copy necessary resources -->
+		<copy todir="${web.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${web.folder}/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="META-INF/**"/>		
+							<include name="com/**"/>
+							<include name="resources/**"/>    
+						  <include name="icons/**"/>
+						  <include name="plugin.xml"/>
+						  <include name="about.html"/>
+						  <include name="about.ini"/>
+						  <include name="about.mappings"/>
+						  <include name="about.properties"/>
+						  <include name="plugin.properties"/>
+				</fileset>
+		</zip>
+		
+		<zip destfile="../plugins/${cache.jar.filename}">
+				<fileset dir="${cache.folder}">
+						 	<include name="META-INF/**"/>		
+							<include name="com/**"/>
+						  <include name="about.html"/>
+						  <include name="plugin.xml"/>
+				</fileset>
+		</zip>
+		
+		<zip destfile="../plugins/${ifsheets.jar.filename}">
+				<fileset dir="${ifsheets.folder}">
+						 	<include name="META-INF/**"/>		
+							<include name="com/**"/>
+						  <include name="about.html"/>
+						  <include name="plugin.xml"/>
+						  <include name="os/**"/>
+				</fileset>
+		</zip>
+		
+		<zip destfile="../plugins/${web.jar.filename}">
+				<fileset dir="${web.folder}">
+						 	<include name="META-INF/**"/>		
+							<include name="com/**"/>
+							<include name="plugin.xml"/>
+						  <include name="about.html"/>
+						  <include name="resources/default_server_entries.xml"/>
+				</fileset>
+		</zip>
+
+	</target>
+	
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="com" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+			<instr instrpath="${cache.folder}/com" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+			<instr instrpath="${ifsheets.folder}/com" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+			<instr instrpath="${web.folder}/com" 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/,.*"/>
+		<zip destfile="../plugins/${help.cache.filename}" basedir="../${help.cache.name}" excludes="src/,.*"/>
+		<zip destfile="../plugins/${help.ifsheets.filename}" basedir="../${help.ifsheets.name}" excludes="src/,.*"/>
+		<zip destfile="../plugins/${help.web.filename}" basedir="../${help.web.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"/>
+		
+		
+		
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}"/>
+		</exec>
+		<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}.cache"/>
+		</exec>
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.cache.help"/>
+		</exec>			
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.ifsheets"/>
+		</exec>
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.ifsheets.help"/>
+		</exec>		
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.web"/>
+		</exec>
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.web.help"/>
+		</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>
+				<fileset dir="${test.folder}">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${cache.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${test.cache.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${ifsheets.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${test.ifsheets.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${web.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+				<fileset dir="${test.web.folder}/src/">
+					<include name="**/*.java"/>
+				</fileset>
+		</pmd>
+	</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"/>
+			<pathelement location="${test.cache.folder}/src"/>
+			<pathelement location="${test.ifsheets.folder}/src"/>
+			<pathelement location="${test.web.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>
+	    <javac srcdir="${test.cache.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+	    <javac srcdir="${test.ifsheets.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+	    <javac srcdir="${test.web.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\APIQuery\workspace\trunk" />
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.apiquery.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+	      	<test name="com.nokia.s60tools.apiquery.cache.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+	      	<test name="com.nokia.s60tools.apiquery.ifsheets.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+	      	<test name="com.nokia.s60tools.apiquery.web.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" />
+            	<html outfile="${reports.emma}/coverage.html" />
+        	</report>
+	    </emma>
+	    
+			<copy todir="${binaries.folder}/reports" failonerror="true" overwrite="true">
+					<fileset dir="${reports.folder}" />
+			</copy>
+	    
+	</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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/docs/ReleaseNote.txt	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,85 @@
+========================================================================
+RELEASE NOTE FOR APIQUERY 1.0 Build 1 (version 1.0.4)
+SUPPORTING S60 1.x-3.x
+========================================================================
+
+Product Description:
+====================
+
+API Query is a tool for querying S60 Application Programming Interface (API) information. 
+
+You can start the API Query tool either by selecting the Carbide > 
+API Query menu item or via Window > Show View > Other... under Carbide Extensions category. 
+
+
+Features:
+=========
+
+- API Query using the following software asset database services: 
+	- for S60 data: http://kevlar.nmp.nokia.com/kevlar/api/legacyquery/ 
+	- for Core SW data: http://trwww017/cgi-bin/ifinfo/sheets.pl 
+	- for SPP data: http://s60tools/cgi-bin/spp/ifinfo/sheets.pl 
+- API Query using local API Interface Sheets. 
+- API usage verification in an active project. 
+
+
+Fixed issues:
+=============
+- Search result for working sources can be seen, when there was some sources
+  unavailable or causing errors. If at least one source is giving results but not
+  errors, warning message for failed sources is given, if all sources is giving
+  errors, an error message is given to user. 
+  This issue is fixed to plug-in version 1.0.3. 
+- API Query WWW Search Method plug-in search failed for 'API name' search 
+  when 'Search string' field contained white space character(s). This issue
+  is fixed to plug-in version 1.0.2.
+
+Enhancements:
+=============
+- Added usage logging and update site url
+
+
+New Features:
+=============
+- N/A (1st version)
+ 
+ 
+System Requirements:
+====================
+Basic Requirements:
+- Windows 2000, Windows XP
+- Carbide.c++ v2.0 (tested with build 7)
+- Minimum Platform/SDK build PC.
+- Normal Platform/SDK build PC.
+
+Additional Requirements:
+- Carbide.c++ with all its prerequisites have to be installed prior to installation.
+  See readme\readme_sdks.html under Carbide.c++ installation directory for prerequisites
+  (ActivePerl-5.6.1.635 and at least one S60 3rd Edition SDK/Platform needs to be installed).
+  
+How to upgrade from the older versions:
+---------------------------------------
+
+New version of the extension comes with updated versions of common utility plug-ins.
+Once you have installed the new set of plug-ins, perform the following steps:
+
+1) Open up 'Command Prompt'
+2) Go to the Carbide.c++ installation directory (e.g. C:\Program Files\Nokia\Carbide.c++ v2.0).
+3) Start Carbide.c++ with the following command line: "Carbide.c++.exe" -clean
+
+The starting of Carbide.c++ with clean option makes sure that the latest versions 
+of the plug-ins are loaded.  
+
+Compatibility Issues:
+=====================
+- N/A
+
+Known Issues:
+=============
+- Context sensitive help will not get focus when pressing F1 if API Query plug-in is
+  running in same tab with Help. Afterall, Context sensitive help will open to relative
+  item when pressing F1, and can be navigated by opening Help by clicking tab.
+    
+
+Copyright © 2007, 2008 Nokia Corporation. All rights reserved. 
+Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/docs/internal/testing/FunctionalityTestingNotes.txt	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,33 @@
+
+------------------------------------------------------------------------
+Things that has been tested but might need official functionality tests:
+------------------------------------------------------------------------
+
+- Failed to start some search method extension.
+	* Prints error info into console
+
+- No extension plugins (that implement "com.nokia.s60tools.apiquery.searchMethods" extension point)
+  exists in the system.
+	* Show an error dialog to a user
+	* Prints error info into console
+	* Raises run-time exception that creates and error log entry.
+  
+- 
+
+  
+- 
+
+  
+- 
+
+  
+- 
+
+---------------------------------------------------------------------------
+Things that has NOT been tested and might need official functionality tests:
+----------------------------------------------------------------------------
+
+- 
+  
+- 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+Thumbs.db
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/apiquery_tsk.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/apiquery_wiz.png has changed
Binary file srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/icons/not_yet_implemented_action_misc.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/plugin.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#
+view.Label=API Query
+view.Tooltip=API Query
+popups.ApiQueryMainMenu=API Query
+popups.action.searchProject=for Active Project
+popups.action.searchCRPSKey=for CR/P&S key name
+popups.action.searchLIBName=for LIB Name
+popups.action.searchHeaderName=for Header Name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+    <extension
+      point="org.eclipse.core.runtime.products"
+      id="product">      
+      <product name="API Query" application="org.eclipse.ui.ide.workbench" > 
+          <property name="appName" value="Carbide.c++ Extensions - API Query"/> 
+     </product> 
+   </extension>
+
+   <extension-point id="searchMethods" name="com.nokia.s60tools.apiquery.searchMethods" schema="schema/searchMethods.exsd"/>
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="API Query Tool&apos;s Actions"
+            id="com.nokia.s60tools.apiquery.ui.actionSet"
+            label="%view.Label"
+            visible="true">
+         <action
+               class="com.nokia.s60tools.apiquery.ui.actions.ToolsMenuAction"
+               icon="icons/apiquery_tsk.png"
+               id="com.nokia.s60tools.apiquery.ui.actions.ToolsMenuAction"
+               label="%view.Label"
+               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.views">
+      <category
+            id="com.nokia.s60tools"
+            name="Carbide Extensions"/>
+      <stickyView
+            closeable="true"
+            id="com.nokia.s60tools.apiquery.ui.views.main.MainView"
+            location="RIGHT"
+            moveable="true"/>
+      <view
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.apiquery.ui.views.main.MainView"
+            icon="icons/apiquery_tsk.png"
+            id="com.nokia.s60tools.apiquery.ui.views.main.MainView"
+            name="%view.Label"/>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.popupMenus">
+         
+      <objectContribution
+	        adaptable="true"
+            objectClass="org.eclipse.core.resources.IProject"
+            id="com.nokia.s60tools.apiquery.popup.actions.project">
+         <menu
+               id="com.nokia.s60tools.apiquery.popup.project"
+               label="%popups.ApiQueryMainMenu"
+               path="additions">
+            <separator name="forProjectWideActions"/>
+            <separator name="forIdentifierLevelActions"/>
+         </menu>
+         <!-- Only show action for Carbide.c++ projects. -->
+         <filter
+              name="projectNature"
+              value="com.nokia.carbide.cdt.builder.carbideCPPBuilderNature"/>
+         <action
+               label="%popups.action.searchProject"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.project/forProjectWideActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction">
+         </action>
+      </objectContribution>
+      
+      <objectContribution
+	        adaptable="true"
+            objectClass="org.eclipse.core.resources.IFolder"
+            id="com.nokia.s60tools.apiquery.popup.actions.folder">
+         <menu
+               id="com.nokia.s60tools.apiquery.popup.folder"
+               label="%popups.ApiQueryMainMenu"
+               path="additions">
+            <separator name="forProjectWideActions"/>
+            <separator name="forIdentifierLevelActions"/>
+         </menu>
+         <!-- Only show action for Carbide.c++ projects. -->
+         <filter
+              name="projectNature"
+              value="com.nokia.carbide.cdt.builder.carbideCPPBuilderNature"/>
+         <action
+               label="%popups.action.searchProject"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.folder/forProjectWideActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction">
+         </action>
+      </objectContribution>
+
+      <objectContribution
+	        adaptable="true"
+            objectClass="org.eclipse.core.resources.IFile"
+            id="com.nokia.s60tools.apiquery.popup.actions.file">
+         <!-- We have to replicate the menu because this is a part of object contribution -->
+         <menu
+			   id="com.nokia.s60tools.apiquery.popup.file"
+			   label="%popups.ApiQueryMainMenu">
+			<separator name="forProjectWideActions"/>
+			<separator name="forIdentifierLevelActions"/>
+         </menu>
+         <!-- Only show action for Carbide.c++ projects. -->
+         <filter
+	          name="projectNature"
+	          value="com.nokia.carbide.cdt.builder.carbideCPPBuilderNature"/>
+         <visibility>
+           <or>
+             <objectState
+                   name="extension"
+                   value="cpp">
+             </objectState>
+              <objectState
+                    name="extension" 
+                    value="cp"
+                    />
+             <objectState
+                   name="extension"
+                   value="hpp"
+                   />
+              <objectState
+                    name="extension" 
+                    value="h"
+                    />
+              <objectState
+                    name="extension" 
+                    value="mmp"
+                    />
+           </or>
+        </visibility>  
+         <action
+               label="%popups.action.searchCRPSKey"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.file/forIdentifierLevelActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction.CRPSKey">
+         </action>
+         <action
+               label="%popups.action.searchLIBName"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.file/forIdentifierLevelActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction.LIBName">
+         </action>
+         <action
+               label="%popups.action.searchHeaderName"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.file/forIdentifierLevelActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction.HeaderName">
+         </action>
+         <action
+               label="%popups.action.searchProject"
+               class="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction"
+               menubarPath="com.nokia.s60tools.apiquery.popup.file/forProjectWideActions"
+               enablesFor="1"
+               id="com.nokia.s60tools.apiquery.popup.actions.CheckProjectAction">
+         </action>
+      </objectContribution>
+   </extension>
+   
+     <extension
+           id="com.nokia.s60tools.apiquery.servlets.ReportActionServlet"
+           name="ReportActionServlet"
+           point="org.eclipse.equinox.http.registry.servlets">
+        <servlet
+              alias="/reportAction"
+              class="com.nokia.s60tools.apiquery.servlets.ReportActionServlet"
+              load-on-startup="false">
+        </servlet>
+     </extension>
+        		        
+     <extension
+           id="com.nokia.s60tools.apiquery.preferences"
+           point="org.eclipse.core.runtime.preferences">
+        <initializer
+              class="com.nokia.s60tools.apiquery.shared.preferences.APIQueryPreferenceInitializer">
+        </initializer>
+     </extension>
+   		
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/resources/htmlReportStyles.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,94 @@
+  	<style type="text/css">
+
+	body {
+		background-color: white;
+		font-family: Verdana;
+		font-size: 10px;
+	}
+	p {
+		font-family="Verdana";
+		font-size: 10px;
+	}
+	p.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+	td {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: left;
+	}
+	td.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+
+	th {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}
+	th.properties {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;
+		width: 90px;		
+	}
+	
+	th.isUsedBy {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}	
+	th.isUsedBySorted {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;	
+		background-color: silver;	
+	}	
+	
+	caption {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal;
+		font-style: italic;
+		text-align: left;
+		
+	}	
+	dt {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal
+		text-align: left;
+	}	
+	
+	h1 {
+		font-family="Verdana";
+		font-size: 18px;
+	}		
+	h2 {
+		font-family="Verdana";
+		font-size: 16px;
+	}		
+	h3 {
+		font-family="Verdana";
+		font-size: 14px;
+	}		
+	h4 {
+		font-family="Verdana";
+		font-size: 12px;
+	}	
+ 	h5 {
+		font-family="Verdana";
+		font-size: 11px;
+	}
+
+
+
+	</style>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/schema/searchMethods.exsd	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,134 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="com.nokia.s60tools.apiquery">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="com.nokia.s60tools.apiquery" id="searchMethods" name="com.nokia.s60tools.apiquery.searchMethods"/>
+      </appInfo>
+      <documentation>
+         It can be used to add another serachmethod to query api information.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="searchMethod" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="searchMethod">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified name of the class that implements com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension
+ or subclass com.nokia.s60tools.apiquery.shared.searchmethod.AbstractSearchMethodExtension
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtension"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Unique source name
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  unique Id
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="isDefault" type="boolean" use="default" value="false">
+            <annotation>
+               <documentation>
+                  To use the current source as default source
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of Web extension point:
+
+  &amp;lt;extension
+         point=&amp;quot;com.nokia.s60tools.apiquery.searchMethods&amp;quot;&amp;gt;
+      &amp;lt;searchMethod
+            class=&amp;quot;com.nokia.s60tools.apiquery.web.searchmethod.WebServerSearchMethodExtension&amp;quot;
+            description=&amp;quot;Web Server&amp;quot;
+            id=&amp;quot;web&amp;quot;
+            isDefault=&amp;quot;true&amp;quot;/&amp;gt;
+   &amp;lt;/extension&amp;gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         The value of the class attribute must be a fully qualified name of the class that implements com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension or subclass  com.nokia.s60tools.apiquery.shared.searchmethod.AbstractSearchMethodExtension when developing a new serach method.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         APIQuery is provided with 3 serach methods :cache,web and excel sheets which are the extension of this plugin.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+ Copyright (c) 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;.
+      </documentation>
+   </annotation>
+
+</schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/APIQueryHelpContextIDs.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,51 @@
+/*
+* 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.apiquery;
+
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class APIQueryHelpContextIDs {
+
+	/**
+	 * The plug-in ID. Copy from APIQueryHelpActivator.PLUGIN_ID
+	 * to here to avoid runtime dependency to help project 
+	 */	 
+	private static final String API_QUERY_HELP_PROJECT_PLUGIN_ID = "com.nokia.s60tools.apiquery.help";//$NON-NLS-1$
+	
+  
+	/**
+	 * Context sensitive help id to API Query search tab
+	 */
+    public static final String API_QUERY_HELP_SEARCH_TAB = 
+  		  API_QUERY_HELP_PROJECT_PLUGIN_ID +".API_QUERY_HELP_SEARCH_TAB";//$NON-NLS-1$
+    
+    
+	/**
+	 * Context sensitive help id to API Query properties tab
+	 */
+    public static final String API_QUERY_HELP_PROPERTIES_TAB = 
+  		  API_QUERY_HELP_PROJECT_PLUGIN_ID +".API_QUERY_HELP_PROPERTIES_TAB";//$NON-NLS-1$
+    
+
+
+        
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/job/ActiveProjectQueryJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,732 @@
+/*
+* 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.apiquery.job;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+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.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 com.nokia.s60tools.apiquery.popup.actions.CheckProjectReport;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescriptionSearchResults;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.job.AbstractJob;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.util.SourceCodeParsingUtilities;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This class implements the Job for Active project query. 
+ *
+ */
+public class ActiveProjectQueryJob extends AbstractJob {
+
+	private static final String HEADERS_SEPARATOR = ","; //$NON-NLS-1$
+	
+	//
+	//Researched values for indicating progress persentages in different steps
+	//
+	private static final int PROGRESS_STEP_1_PERCENTAGE = 5;
+	private static final int PROGRESS_STEP_2_PERCENTAGE = 10;
+	private static final int PROGRESS_STEP_3_PERCENTAGE = 70;	
+	private static final int PROGRESS_STEP_4_PERCENTAGE = 95;
+	
+	/**
+	 * File types count in for project search
+	 */
+	public static final String [] FILE_TYPES={"c", "cpp", "h", "hpp", "inl"};//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+	/**
+	 * File types count in for project search
+	 */	
+	private Vector<String> fileTypes;
+	/**
+	 * File types count in for #include statements
+	 */
+	public static final String [] INCLUDE_TYPES={"h", "hpp"};	//$NON-NLS-1$ //$NON-NLS-2$
+	/**
+	 * File types count in for #include statements
+	 */
+	private Vector<String> includeTypes;
+	/**
+	 * Ingnoring folders named for project search
+	 */
+	public static final String [] IGNORE_FOLDERS={"tsrc", "internal"};	//$NON-NLS-1$ //$NON-NLS-2$
+	/**
+	 * Ingnoring folders named for project search
+	 */
+	private Vector<String> ignoreFolders;
+	
+	/**
+	 * 
+	 * HashMap containing information of used headers in this project
+	 * as <code>String (header name)</code> and <code>Vector (files including that header)</code> 
+	 * containig information of what files is using that header ()
+	 */	
+	private HashMap<String, Vector<IFile>>headersUsedInFiles;
+	
+	/**
+	 * filenames in project in lover case 
+	 */
+	private Vector<String> projectFileNames;
+	
+
+	/**
+	 * Collection to store returned API names and headers in those APIs
+	 * <code>header name, API name</code>
+	 */
+	Hashtable <String, String> headerBelongsToAPI ;	
+	
+	/**
+	 * Path where exported file will be located
+	 */
+	private IPath exportFilePath;	
+	
+	/**
+	 * Exported file
+	 */
+	private IFile generatedReportFile; 
+
+	
+	/**
+	 * Project for making the query for. 
+	 */
+	private final IProject selectedProject;
+	
+	/**
+	 * Semi-colon separated headers found in project files, search string
+	 */
+	private String searchString;
+
+	/**
+	 * 
+	 * @param name Jobs name
+	 * @param selectedProject Project for making the query for. 
+	 * @param exportFilePath Path where exported file will be located
+	 */
+	public ActiveProjectQueryJob(String name, IProject selectedProject, IPath exportFilePath) {
+		super(name);
+		this.selectedProject = selectedProject;
+		this.exportFilePath = exportFilePath;
+		
+		//Init lists  
+		init();		
+	}
+
+	/**
+	 * Initing headersUsedInFiles, projectFileNames, headerBelongsToAPI,
+	 * fileTypes, includeTypes and ignoreFolders
+	 *
+	 */
+	private void init() {
+		
+		headersUsedInFiles = new HashMap<String, Vector<IFile>>();
+		projectFileNames = new Vector<String>();				
+		headerBelongsToAPI = new Hashtable<String, String>();
+		
+		fileTypes = new Vector<String>(FILE_TYPES.length);		
+		for (int i = 0; i < FILE_TYPES.length; i++) {
+			fileTypes.add(FILE_TYPES[i]);
+		}
+		
+		includeTypes = new Vector<String>(INCLUDE_TYPES.length);		
+		for (int i = 0; i < INCLUDE_TYPES.length; i++) {
+			includeTypes.add(INCLUDE_TYPES[i]);
+		}
+		
+		ignoreFolders = new Vector<String>(IGNORE_FOLDERS.length);		
+		for (int i = 0; i < IGNORE_FOLDERS.length; i++) {
+			ignoreFolders.add(IGNORE_FOLDERS[i]);
+		}		
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+
+		IStatus status;
+
+		setMonitor(monitor);
+		ActiveProjectQueryJobManager.getInstance().registerJob(this);
+		APIQueryConsole.getInstance().println(Messages.getString("ActiveProjectQueryJob.StartingToRun_Msg") + super.getName(),  //$NON-NLS-1$
+				IConsolePrintUtility.MSG_NORMAL);		
+
+		try {
+			
+			//Start to do actual job
+			status = doQuery();		
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			status = new Status(IStatus.ERROR, this.getName(), IStatus.ERROR,
+					Messages.getString("ActiveProjectQueryJob.ErrorsOnJob_ErrMsg") + this.getName(), e); //$NON-NLS-1$
+		}
+
+		return status;
+
+	}
+	
+	
+	/**
+	 * Doing actual API Query
+	 * @return status how we succeeded
+	 */
+	private IStatus doQuery() {
+		
+//		 disable datasouce selection
+		MainView.enablePropTabcontents(false);
+		
+		getMonitor().beginTask(Messages.getString("ActiveProjectQueryJob.TaskStarted_Msg") , steps);		 //$NON-NLS-1$
+		APIQueryConsole.getInstance().println(Messages.getString("ActiveProjectQueryJob.APIQueryForProject_Msg") +getProjectName() +Messages.getString("ActiveProjectQueryJob.APIQueryForProject_OnProgress_Part2_Msg"), IConsolePrintUtility.MSG_NORMAL);		 //$NON-NLS-1$ //$NON-NLS-2$
+		
+		IStatus status = null;
+
+		try {
+			// Get files from p
+			IFile [] files = getProjectFiles();	
+			
+			progress(PROGRESS_STEP_1_PERCENTAGE, Messages.getString("ActiveProjectQueryJob.Progresbar_Step1_Msg")); //$NON-NLS-1$
+			foundHeadersFromFiles(files);
+			
+			//Generate search string (header1.h;header2.h;...)
+			searchString = generateSearchString();
+
+
+			progress(PROGRESS_STEP_2_PERCENTAGE, Messages.getString("ActiveProjectQueryJob.Progresbar_Step2_Msg")); //$NON-NLS-1$
+
+			
+			APIShortDescriptionSearchResults projectUsingAPIs = getAPIShortDescriptions(APIQueryParameters.QUERY_BY_HEADER_NAME);			
+			
+			// Did we succeed?
+			if(projectUsingAPIs.getSearchResults() != null){
+
+				// Something failed, e.g. no servers configured.				
+				if(projectUsingAPIs.hasErrors()){
+					String errMsg = Messages.getString("ActiveProjectQueryJob.APIQueryFailed_ErrMsg") +"\n" + projectUsingAPIs.getErrorMessages(); //$NON-NLS-1$ //$NON-NLS-2$
+					throw new QueryOperationFailedException(errMsg);
+				}								
+				
+				progress(PROGRESS_STEP_3_PERCENTAGE, Messages.getString("ActiveProjectQueryJob.Progresbar_Step3_Msg"));					 //$NON-NLS-1$
+				
+				//Getting details for all used APIs
+				/**
+				 * Collection for APIDetails used in selected project. API Name as key.
+				 */
+				Hashtable<String, APIDetails> projectUsingAPIDetails = getAPIDetails(projectUsingAPIs.getSearchResults());						
+
+				progress(PROGRESS_STEP_4_PERCENTAGE, Messages.getString("ActiveProjectQueryJob.Progresbar_Step4_Msg")); //$NON-NLS-1$
+				
+				//Get detailed information of apis
+				findHeadersFromAPIs(projectUsingAPIDetails);			
+				String report = generateReport(projectUsingAPIDetails);
+				generatedReportFile = doSave(report);
+					
+				status = Status.OK_STATUS;
+			}		
+			else{
+				status = new Status(IStatus.ERROR, this.getName(), IStatus.ERROR,
+						Messages.getString("ActiveProjectQueryJob.ErrorsOnJob_ErrMsg") + Messages.getString("ActiveProjectQueryJob.CouldNotGetAPISUmmaries_ErrMsg"), null); //$NON-NLS-1$ //$NON-NLS-2$
+			}				
+			
+			progress(PROGRESS_COMPLETED_PERCENTAGE,Messages.getString("ActiveProjectQueryJob.Progresbar_Done_Msg")); //$NON-NLS-1$
+			APIQueryConsole.getInstance().println(Messages.getString("ActiveProjectQueryJob.APIQueryForProject_Msg") +getProjectName() +Messages.getString("ActiveProjectQueryJob.APIQueryForProject_Compeleated_Msg"), IConsolePrintUtility.MSG_NORMAL);        	 //$NON-NLS-1$ //$NON-NLS-2$
+        	
+			//If we get some results, but there was also some errors
+			if(projectUsingAPIs.hasErrors()){
+				status = new Status(IStatus.WARNING, this.getName(), IStatus.ERROR,
+						projectUsingAPIs.getErrorMessages(), null);				
+			}
+        	
+		} catch (JobCancelledByUserException e) {
+			status = new Status(IStatus.CANCEL, this.getName(), IStatus.CANCEL,
+					e.getMessage(), e);
+
+		} catch (CoreException e) {
+			status = new Status(IStatus.ERROR, this.getName(), IStatus.ERROR,
+					Messages.getString("ActiveProjectQueryJob.ErrorsOnJob_ErrMsg") + e.getMessage(), e); //$NON-NLS-1$
+			e.printStackTrace();
+		} catch (IOException e) {
+			status = new Status(IStatus.ERROR, this.getName(), IStatus.ERROR,
+					Messages.getString("ActiveProjectQueryJob.ErrorsOnJob_ErrMsg") + e.getMessage(), e); //$NON-NLS-1$
+			e.printStackTrace();
+		}
+		 catch (Exception e) {
+			status = new Status(IStatus.ERROR, this.getName(), IStatus.ERROR,
+					Messages.getString("ActiveProjectQueryJob.ErrorsOnJob_ErrMsg") + e.getMessage(), e); //$NON-NLS-1$
+			e.printStackTrace();
+		}
+		 finally{
+			 getMonitor().done();
+				// enable data source selection
+				MainView.enablePropTabcontents(true);
+		 }
+		 
+		 return status;
+		 
+	}
+
+	/**
+	 * Searching headers from project files, using this.handleOneFile for each file
+	 * @param files
+	 * @throws JobCancelledByUserException
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private void foundHeadersFromFiles(IFile[] files) throws JobCancelledByUserException, CoreException, IOException {
+
+		for (int i = 0; i < files.length; i++) {
+			IFile file = files[i];			
+			InputStream in = file.getContents();
+			String [] fileIncludeLines = getFileIncludeLines(in);
+			in.close();
+			
+			handleOneFile(fileIncludeLines, file);
+			
+		}
+
+	}
+
+	/**
+	 * Gets search String, semi colon (;) separated list of
+	 * includes found in project 
+	 * @return
+	 */
+	private String generateSearchString() {
+		StringBuffer search = new StringBuffer();
+		String incl;
+		for (Iterator<String> it = headersUsedInFiles.keySet().iterator(); it.hasNext();) {
+			incl = it.next().trim();
+			search.append(incl);
+			search.append(APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR);
+		}
+		return search.toString();
+	}
+	
+	/**
+	 * Found all includes from file. Using this.addOneHeaderToIncludes to set includes.
+	 * @param fileIncludeLines
+	 */
+	private void handleOneFile(String [] fileIncludeLines, IFile file) {		
+		String line;		
+		for (int i = 0; i < fileIncludeLines.length; i++) {
+			line = fileIncludeLines[i];
+			//If it's a system include <>
+			if(line != null && line.trim().length() > 0){				
+				String include = SourceCodeParsingUtilities.parseIncludeFromLine(line);
+				if(include != null){
+					addOneHeaderToIncludes(include, file);
+				}
+
+			}
+		}	
+	}
+
+	/**
+	 * Adds one header to this.includes 
+	 * if include filetype matches INCLUDE_TYPES (this.includeTypes)
+	 * And header is not one of project files (this.projectFiles) 
+	 * @param header
+	 * @param fileName
+	 */
+	private void addOneHeaderToIncludes(String header, IFile file) {
+		//if user using wrong way SYSTEMINCLUDE and USERINCLUDE 
+		//a system header can be really a user include and vice versa
+		if(includeTypes.contains(
+				header.substring(header.indexOf(".") +1))//$NON-NLS-1$
+				&& !projectFileNames.contains(header.toLowerCase()))
+		{	
+			//If a header is already found and added to includes
+			//get Vector where is files using this header and add
+			//this file to that file list
+			if(headersUsedInFiles.containsKey(header)){
+				Vector<IFile> usedInFiles = headersUsedInFiles.get(header);
+				usedInFiles.add(file);
+				headersUsedInFiles.put(header, usedInFiles);
+			}
+			//if this was first time founding this header, creating new
+			//Vector and add current file to it and add this set to includes
+			else{
+				Vector<IFile> usedInFiles = new Vector<IFile>();
+				usedInFiles.add(file);
+				headersUsedInFiles.put(header, usedInFiles);
+			}			
+		}
+	}
+	
+
+	
+
+	/**
+	 * Found all files (file type is one of this.FILE_TYPES)
+	 * from project where this.selectedFile belongs
+	 * @return
+	 * @throws CoreException
+	 */
+	private IFile[] getProjectFiles() throws CoreException{
+		
+		Vector<IResource> projectFiles = new Vector<IResource>();	
+		IResource [] resources = selectedProject.members();
+		//Seek the project and found all files
+		searchFiles(projectFiles, resources);
+		IFile [] files = projectFiles.toArray(new IFile[0]);			
+		return files;
+		
+	}
+
+	/**
+	 * Search recursively all files from resource. If a resource is
+	 * a IFolder calls recursively it self to found all files under that 
+	 * folder. Ignoring this.IGNORE_FOLDERS (tsrc and internal) folders.
+	 * 
+	 * Adds all files to Vector this.projectFiles if file type found from 
+	 * this.FILE_TYPES
+	 * 
+	 * Saves fileNames to this.projectFileNames
+	 * 
+	 * @param resources
+	 * @throws CoreException
+	 */
+	private void searchFiles(Vector<IResource> v, IResource[] resources) throws CoreException {
+
+		for (int i = 0; i < resources.length; i++) {
+			if(resources[i] instanceof IFile){
+				IFile file = (IFile)resources[i];
+				if( fileTypes.contains( file.getFileExtension() ) ){
+					v.add(file);
+					projectFileNames.add(file.getName().toLowerCase());
+				}
+			}
+			else if(resources[i] instanceof IFolder){
+				IFolder folder = (IFolder)resources[i];
+				//Ignorin tsrc and internal folders, so headers from those
+				//folders is not included to search
+				if(!ignoreFolders.contains(folder.getName().toLowerCase())){
+					searchFiles(v, folder.members());
+				}
+			}						
+		}
+	}
+	
+	/**
+	 * Get lines from stream containing #include in the line,
+	 * ingnoring all other lines.
+	 * @param is
+	 * @return String[] of lines, each of them contains #include 
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private String [] getFileIncludeLines(InputStream is) throws CoreException,
+			IOException {
+
+		Vector<String> lines = new Vector<String>();
+		InputStreamReader isr = new InputStreamReader(is);
+		BufferedReader br = new BufferedReader(isr);
+		String line;
+		String include = "#include";//$NON-NLS-1$
+		while ((line = br.readLine()) != null) {
+			if(line.contains(include)){
+				lines.add(line);
+			}
+		}
+		// Closing buffers
+		br.close();
+		isr.close();
+		return lines.toArray(new String[0]);
+	}
+
+	public String getSearchString() {
+		return this.searchString;
+	}
+
+
+	/**
+	 * 
+	 * HashMap containing information of used headers in this project
+	 * as <code>String</code> and <code>Vector</code> containig information
+	 * of what files is using that header ()
+	 * 
+	 * @return HashMap<String, Vector<String>> where <code>String</code> is header name 
+	 * and <code>Vector</code> contains file names what includes that header
+	 */
+
+	public HashMap<String, Vector<IFile>> getHeadersUsedInFiles() {
+		return headersUsedInFiles;
+	}	
+	
+	/**
+	 * Starts query for the current identifier selection with 
+	 * the given query type.
+	 * @param queryType
+	 * @throws JobCancelledByUserException 
+	 * @throws CoreException 
+	 * @throws IOException 
+	 */
+	private APIShortDescriptionSearchResults getAPIShortDescriptions(final int queryType) throws JobCancelledByUserException, CoreException, IOException{
+	
+		String msg = Messages.getString("ActiveProjectQueryJob.Starting_Part1_Msg") //$NON-NLS-1$
+			+ APIQueryParameters.getDescriptionForQueryType(queryType)
+			+ Messages.getString("ActiveProjectQueryJob.Starting_Part2_Msg")  //$NON-NLS-1$
+			+ selectedProject.getName()+ Messages.getString("ActiveProjectQueryJob.Starting_Part3_Msg") //$NON-NLS-1$
+			+this.searchString + "'.";//$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS, msg);
+		APIQueryConsole.getInstance().println(msg, 
+				IConsolePrintUtility.MSG_NORMAL);	
+		
+		final APIQueryParameters params = new APIQueryParameters(queryType, searchString);
+		params.setQueryFromUI(false);
+
+		ISearchMethodExtension currSelExt = UserSettings.getInstance().getCurrentlySelectedSearchMethod();
+
+		APIShortDescriptionSearchResults projectUsingAPIs = currSelExt.runAPIQuery(params);
+		return projectUsingAPIs;	
+		
+	}
+
+
+	/**
+	 * put headername - API name pairs to this.headerBelongsToAPI
+	 * @param projectUsingAPIDetails Find headers from all APIs from table given
+	 * @throws JobCancelledByUserException
+	 */
+	private void findHeadersFromAPIs(Hashtable<String, APIDetails> projectUsingAPIDetails) throws JobCancelledByUserException {
+		String headersStr;
+		String [] headersTbl;
+		String headerName;
+
+		Vector<String> headers;	
+		
+		Set<String> keys = projectUsingAPIDetails.keySet();
+		//Looping all received API Summarys				
+
+		for (Iterator<String> iter = keys.iterator(); iter.hasNext();) {
+			String api = (String) iter.next();
+			if(api == null){
+				continue;
+			}
+			APIDetails details = projectUsingAPIDetails.get(api);
+				
+
+			if(details != null){				
+				
+				//Splitting headers string eg. "header1.h, header2.h" to table {"header1.h", header2.h}
+				//And putting those values to Vector
+				headersStr = details.getDetail(XMLUtils.DESCRIPTION_HEADERS).getValue();
+				headersTbl = headersStr.split(HEADERS_SEPARATOR);
+				headers = new Vector<String>(headersTbl.length);
+				for (int i = 0; i < headersTbl.length; i++) {
+					headerName = headersTbl[i].trim();
+					headers.add(headerName);
+					//Putting "header1.h", API Name" to used header and APIs, same API Name will be several time in map						
+					headerBelongsToAPI.put(headerName.toLowerCase(), api);
+				}
+				//Putting API used with all headers API contais to table
+
+			}
+			//When error occurs (there is no Details for API) just printing to console that there was no details
+			//This should not be happend so often (if never), but if occurs from time to time, checkin implementation
+			//and/or adding more error situation handling might needed.
+			else{
+				DbgUtility.println(DbgUtility.PRIORITY_CLASS, "Can't found or parse details for API: " +api );//$NON-NLS-1$
+				APIQueryConsole.getInstance().println(Messages.getString("ActiveProjectQueryJob.NoDetailsForAPI_Msg") +api,  //$NON-NLS-1$
+						IConsolePrintUtility.MSG_NORMAL);		
+				
+			}			
+		}
+	}
+	
+	/**
+	 * Getting API Details from selected search method
+	 * @param apis
+	 * @return
+	 * @throws QueryOperationFailedException 
+	 */
+	private Hashtable<String, APIDetails> getAPIDetails(Collection<APIShortDescription> apis) throws QueryOperationFailedException {
+		ISearchMethodExtension currSelExt = UserSettings.getInstance().getCurrentlySelectedSearchMethod();
+		Hashtable<String, APIDetails> details = currSelExt.getAPIDetails(apis);
+		return details;
+	}
+
+
+	/**
+	 * Putting pieces together. Collecting needed data from headersUsedInFiles and 
+	 * headerBelongsToAPI to send for CheckProjectReport
+	 * @return
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private String generateReport(Hashtable<String, APIDetails> projectUsingAPIDetails) throws CoreException, IOException{
+
+		
+		//API Name and headers what is used for that API in searched project
+		SortedMap<String, Vector<String>>usedHeaders = new TreeMap<String, Vector<String>>();
+		//API Name and files in searched project that is using that API		
+		Hashtable<String, Vector<IFile>>usingFiles = new Hashtable<String, Vector<IFile>>();		
+		
+		
+		Set<String> headersUsedInProject = headersUsedInFiles.keySet();
+		Vector<String> tmpUsedHeaders;
+		Vector<IFile> tmpUsingFiles;
+		String tmpAPIName;
+		int unknownAPIIndex = 0;
+		
+		
+		for (String header : headersUsedInProject) {
+			//API where this header belongs, was found with selected search method
+			if(headerBelongsToAPI.containsKey(header.toLowerCase())){
+				tmpAPIName = headerBelongsToAPI.get(header.toLowerCase());
+				//If current API is allready added to usedHeaders, just adding one 
+				//header that is using that API to collection
+				if(usedHeaders.containsKey(tmpAPIName)){
+					
+					tmpUsedHeaders = usedHeaders.get(tmpAPIName);
+					if(!tmpUsedHeaders.contains(header.toLowerCase())){
+						tmpUsedHeaders.add(header.toLowerCase());
+					}
+					usedHeaders.put(tmpAPIName, tmpUsedHeaders);
+
+					tmpUsingFiles = usingFiles.get(tmpAPIName);
+					tmpUsingFiles.addAll(headersUsedInFiles.get(header));
+					usingFiles.put(tmpAPIName, tmpUsingFiles);					
+				}
+				//Else this is first time for this API, so creating new Vectors to put in maps
+				else{					
+					tmpUsedHeaders = new Vector<String>();
+					if(!tmpUsedHeaders.contains(header.toLowerCase())){
+						tmpUsedHeaders.add(header.toLowerCase());
+					}
+					usedHeaders.put(tmpAPIName, tmpUsedHeaders);
+
+					tmpUsingFiles = new Vector<IFile>();
+					tmpUsingFiles.addAll(headersUsedInFiles.get(header));
+					usingFiles.put(tmpAPIName, tmpUsingFiles);					
+				}				
+			}
+			//Else API for this header cannot be found, setting it as "Unknown" API
+			else{
+				tmpAPIName = CheckProjectReport.UNKNOWN_API_NAME 
+					+CheckProjectReport.UNKNOWN_API_NAME_SEPARATOR 
+					+unknownAPIIndex;
+				unknownAPIIndex ++;
+				tmpUsedHeaders = new Vector<String>();
+				tmpUsedHeaders.add(header);
+				usedHeaders.put(tmpAPIName, tmpUsedHeaders);
+
+				tmpUsingFiles = new Vector<IFile>();
+				tmpUsingFiles.addAll(headersUsedInFiles.get(header));
+				usingFiles.put(tmpAPIName, tmpUsingFiles);					
+			}
+		}
+
+		
+		ISearchMethodExtension searchMethod = UserSettings.getInstance().getCurrentlySelectedSearchMethod();
+		//API Details to be added for report, parameters are given so it can be checked if Collection/Subsystem header topic are found to be added to report 
+		String [] apiDetailsToReport = searchMethod.getAPIDetailsToReport(usedHeaders.keySet(), projectUsingAPIDetails);	
+		CheckProjectReport report = new CheckProjectReport(usedHeaders, usingFiles, projectUsingAPIDetails, apiDetailsToReport, selectedProject);
+
+		return report.toHTML(getTitle());
+
+	}
+	
+	/**
+	 * Save the report
+	 * @param html
+	 * @return
+	 * @throws CoreException
+	 * @throws IOException
+	 */
+	private IFile doSave(String html) throws CoreException, IOException{
+		String containerName = exportFilePath.removeLastSegments(1).toOSString();
+		String fileName = exportFilePath.lastSegment();
+		
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IResource resource = root.findMember(new Path(containerName));
+		
+		IContainer container = (IContainer) resource;
+		final IFile file = container.getFile(new Path(fileName));
+		//Creating temp file because given API name must be found
+		InputStream stream = new ByteArrayInputStream(html.getBytes());		
+		if (file.exists()) {
+			file.setContents(stream, true, true, null);
+		} else {
+			file.create(stream, true, null);
+		}			
+		stream.close();
+		return file;
+		
+	}	
+
+	/**
+	 * get title to exported report header
+	 * @return title
+	 */
+	private String getTitle(){		
+		String title = Messages.getString("ActiveProjectQueryJob.Title_Project_Msg") +getProjectName() +Messages.getString("ActiveProjectQueryJob.Title_IsUsingFollowingAPIs_Msg"); //$NON-NLS-1$ //$NON-NLS-2$
+		return title;
+	}	
+	
+	/**
+	 * Get project name where report was saved
+	 * @return project name
+	 */
+	private String getProjectName() {
+		return selectedProject.getName();
+	}
+
+	/**
+	 * Get report file
+	 * @return file generated
+	 */
+	public IFile getGeneratedReportFile() {
+		return generatedReportFile;
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/job/ActiveProjectQueryJobManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,130 @@
+/*
+* 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.apiquery.job;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.ListenerList;
+
+import com.nokia.s60tools.apiquery.shared.job.IJobCompletionListener;
+import com.nokia.s60tools.apiquery.shared.job.IManageableJob;
+
+
+
+/**
+ * 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 deregister when completed.
+ */
+public class ActiveProjectQueryJobManager {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private ActiveProjectQueryJobManager 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 ActiveProjectQueryJobManager getInstance(){
+		if( instance == null ){
+			instance = new ActiveProjectQueryJobManager();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private ActiveProjectQueryJobManager() {
+		registeredJobs = new ArrayList<IManageableJob>();
+		listeners = new ListenerList();
+	}
+	
+	/**
+	 * Register job to manager
+	 * @param job
+	 */
+	void registerJob(IManageableJob job){
+		registeredJobs.add(job);
+	}
+
+	/**
+	 * Un register a job from manager
+	 * @param job
+	 */
+	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 all jobs registerd
+	 */
+	public void shutdown(){
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = (IManageableJob) iter.next();
+			job.forcedShutdown();			
+		}
+		registeredJobs.clear();
+		// Giving a moment for processes to really shutdwown
+		try {
+			Thread.sleep(500);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Add a listener
+	 * @param listener
+	 */
+	public void addListener(IJobCompletionListener listener){
+		listeners.add(listener);
+	}
+	
+	/**
+	 * Remove a listener
+	 * @param listener
+	 */
+	public void removeListener(IJobCompletionListener listener){
+		listeners.remove(listener);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckIdentifierAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,390 @@
+/*
+* 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.apiquery.popup.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.editors.text.TextFileDocumentProvider;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.SourceCodeParsingUtilities;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Runs API query on the identifier that user has selected from an editor.
+ */
+public class CheckIdentifierAction implements IObjectActionDelegate{
+	
+	//
+	// Static members
+	//
+	
+	/**
+	 * Common ID path for the all identifier actions
+	 */
+	private static final String ACTION_ID_PATH = "com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction."; //$NON-NLS-1$
+	
+	/**
+	 * Actions ID for 
+	 */
+	private static final String FOR_CPRS_KEY_NAME_ID = ACTION_ID_PATH + "CRPSKey"; //$NON-NLS-1$
+
+	/**
+	 * Actions ID for 
+	 */
+	private static final String FOR_LIB_NAME_ID = ACTION_ID_PATH + "LIBName"; //$NON-NLS-1$
+
+	/**
+	 * Actions ID for 
+	 */
+	private static final String FOR_HEADER_NAME_ID = ACTION_ID_PATH + "HeaderName"; //$NON-NLS-1$
+	
+	//
+	// Non-static members
+	//
+	
+	/**
+	 * The identifier that user has selected for the query, or multiple
+	 * identifiers separated with ; character.
+	 */
+	private String queryString;
+
+	
+	
+	/**
+	 * Constructor for Action1.
+	 */
+	public CheckIdentifierAction() {
+		super();
+	}
+
+	/**
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+	}
+
+	/**
+	 * @see IActionDelegate#run(IAction)
+	 */
+	public void run(IAction action) {
+		// Resolving the correct query type
+		if (action.getId().equals(FOR_CPRS_KEY_NAME_ID)){
+			startQuery(APIQueryParameters.QUERY_BY_CRPS_KEY_NAME);
+		} else if (action.getId().equals(FOR_LIB_NAME_ID)){
+			startQuery(APIQueryParameters.QUERY_BY_LIB_NAME);
+		} else if (action.getId().equals(FOR_HEADER_NAME_ID)){
+			startQuery(APIQueryParameters.QUERY_BY_HEADER_NAME);
+		}
+		else //if (action.getId().equals(FOR_HEADER_NAME_ID))
+			{
+			startQuery(APIQueryParameters.QUERY_BY_API_NAME);
+		}		
+	}
+	
+
+	/**
+	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		
+		// By default the action is disables
+		boolean isActionEnabled = false;
+		
+		try {
+			if(selection != null){
+				
+				// Parameter 'selection' is actually File-object instance
+				// of the selected file, but we are interested instead if
+				// We have an open editor, and text selection in there.
+								
+				IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+				IEditorPart activeEditor = activePage.getActiveEditor();
+				//Active editor can be Text Editor or FormEditor, in case of FormEditor it's really
+				//com.nokia.carbide.cpp.mmpEditor.MMPEditor, but that Class cannot be used outside of that package.
+				if(activeEditor != null && (activeEditor instanceof TextEditor || activeEditor instanceof FormEditor)){
+					
+					ISelectionProvider selectionProvider = activeEditor.getSite().getSelectionProvider();
+					
+					ISelection textSel = selectionProvider.getSelection();
+					if(textSel instanceof TextSelection){
+						TextSelection currEditorTextSel = (TextSelection) textSel;
+						int endLine = currEditorTextSel.getEndLine();
+						int startLine = currEditorTextSel.getStartLine();
+						boolean isMultipleLinesSelection = ((endLine - startLine) > 0);
+						String currSelStr = currEditorTextSel.getText().toString().trim();
+						
+						// Header name action is a special case among the other actions
+						if (action.getId().equals(FOR_HEADER_NAME_ID)){
+
+							IDocument doc = null;
+							if(activeEditor instanceof TextEditor){
+								// This is actually an instance of 'org.eclipse.cdt.internal.ui.editor.CEditor' 
+								// that extends org.eclipse.ui.editors.text.TextEditor								
+								TextEditor cEditor = (TextEditor) activeEditor;
+								doc =  getDocument(cEditor);
+							}else if(activeEditor instanceof FormEditor){
+								// This is actually an instance of com.nokia.carbide.cpp.mmpEditor.MMPEditor, 
+								// but that Class cannot be used outside of that package, and it extends FormEditor class.
+								FormEditor fEditor = (FormEditor)activeEditor;
+								doc =  getDocument(fEditor);
+							}
+							isActionEnabled = handleHeaderNameActionStateCheck(doc, startLine, isMultipleLinesSelection, currSelStr);
+						}
+						// Other action types get same kind of treatment.
+						else{
+							isActionEnabled = handleStateCheckForOtherActions(isMultipleLinesSelection, currSelStr);					
+						}
+						
+					} // if a text selection intance
+				} // if activeEditor is not null					
+			}// if selection is not null
+			
+		} catch (Exception e) {
+			// Just making easier to find out problems during dev. time.
+			e.printStackTrace();
+		}
+		
+		// Enabling/disabling the action
+		action.setEnabled(isActionEnabled);			
+		
+	}
+
+	/**
+	 * Checks the enable/disable state for other actions.
+	 * @param isMultipleLinesSelection <code>true</code> in case of multiline selection, otherwise <code>false</code>.
+	 * @param currSelStr	User's text selection from the editor.
+	 * @return Action's enablement state.
+	 */
+	private boolean handleStateCheckForOtherActions(boolean isMultipleLinesSelection, String currSelStr) {
+
+		boolean isActionEnabled = false;
+		
+		// For other actions, the valid selection is not empty 
+		// and not a selection of multiple lines.
+		if(currSelStr.length() > 0
+			&& 
+		   !isMultipleLinesSelection
+		   ){
+			// We have a valid selection => let's store it...
+			this.queryString = currSelStr;			
+			// ... and enable the action.
+			isActionEnabled = true;
+		}
+		return isActionEnabled;
+	}
+
+	/**
+	 * Checks the enable/disable state for header name action.
+	 * @param cEditor Text editor instance user for browsing editor contents, if needed.
+	 * @param startLine Start line for the curren selection (=line for current cursor location).
+	 * @param isMultipleLinesSelection <code>true</code> in case of multiline selection, otherwise <code>false</code>.
+	 * @param currSelStr	User's text selection from the editor.
+	 * @return Action's enablement state.
+	 */
+	private boolean handleHeaderNameActionStateCheck(IDocument doc, int startLine, boolean isMultipleLinesSelection, String currSelStr) {
+		
+		boolean isActionEnabled = false;
+		
+		// Checking if we have a selection containing text
+		if( currSelStr.length() > 0){
+			if(isMultipleLinesSelection){
+				// Parsing multiline selection for directives
+				if(checkSelectionForIncludeDirectives(currSelStr)){
+					isActionEnabled = true;
+				}
+			}
+			else{
+				// Otherwise regarding the selection as an identifier.
+				queryString = currSelStr;
+				isActionEnabled = true;
+			}
+		}
+		else{
+			// There is no selection made => parsing the current line
+			if(doc != null){
+				// Does the line contain any include directives?
+				if(checkForIncludeDirectiveFromGivenLine(doc, startLine)){
+					isActionEnabled = true;
+				}
+			}																
+		}
+		return isActionEnabled;
+	}
+		
+	/**
+	 * Checks if there is/are (an) include directive(s) in the given text selection
+	 * and stores the header names as the selected identifier(s).
+	 * @param selectedMultilineText Selected text to check for (may contain multiple lines)
+	 * @return <code>true</code> if a valid include definitions were stored.
+	 */
+	private boolean checkSelectionForIncludeDirectives(String selectedMultilineText) {
+		
+		boolean hasIncludeDirectives = false;
+		
+		String[] lineArr = selectedMultilineText.split("\n"); //$NON-NLS-1$
+		String headerFileName = null;
+		// Resettings the identifier storage string
+		queryString = ""; //$NON-NLS-1$
+		
+		for (int i = 0; i < lineArr.length; i++) {
+			String line = lineArr[i];
+			headerFileName = SourceCodeParsingUtilities.parseIncludeFromLine(line);
+			if(headerFileName != null){
+				hasIncludeDirectives = true;
+				// Incrementing the found directive into the identifier list
+				if(queryString.length() > 0){
+					queryString = queryString 
+					                    + APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR
+					                    + headerFileName;					
+				}
+				else{
+					queryString = headerFileName;
+				}
+			}
+		}
+		return hasIncludeDirectives;
+	}
+
+	/**
+	 * Checks if there is an include directive in the given line
+	 * and stores the header name as the selected identifier.
+	 * @param doc Document to check for.
+	 * @param lineno Line number in document to check for.
+	 * @return <code>true</code> if a valid include definitions was stored
+	 */
+	private boolean checkForIncludeDirectiveFromGivenLine(IDocument doc, int lineno) {
+
+		IRegion lineRegion;
+		try {
+			lineRegion = doc.getLineInformation(lineno);
+			String line = doc.get(lineRegion.getOffset(), lineRegion.getLength());
+			
+			if(SourceCodeParsingUtilities.hasIncludes(line)){
+				queryString = SourceCodeParsingUtilities.parseIncludeFromLine(line);
+				return true;
+			}
+		} catch (BadLocationException e) {
+			// Ignoring possible bad location exceptions 
+			// when this method returns false.
+		}
+		
+		return false;
+	}
+
+	/**
+	 * Returns the document interface for the currently active document 
+	 * in the given editor.
+	 * @param editor Editor to ask currently active document from. 
+	 * @return Document interface if found, otherwise <code>null</code>.
+	 */
+	private IDocument getDocument(TextEditor editor) {
+		
+		TextFileDocumentProvider  documentProvider = (TextFileDocumentProvider) editor.getDocumentProvider();
+		if(documentProvider != null){
+			return  documentProvider.getDocument(editor.getEditorInput());
+			}								
+		return null;
+	}
+	
+	/**
+	 * Returns the document interface for the currently active document 
+	 * in the given editor.
+	 * @param editor Editor to ask currently active document from. 
+	 * @return Document interface if found, otherwise <code>null</code>.
+	 */
+	private IDocument getDocument(FormEditor editor) {
+		try {
+			IEditorPart part = editor.getActiveEditor();
+			ITextEditor textEditor = (ITextEditor) part;
+			
+			TextFileDocumentProvider  documentProvider = (TextFileDocumentProvider) textEditor.getDocumentProvider();
+			if(documentProvider != null){
+				return  documentProvider.getDocument(editor.getEditorInput());
+			}
+		} catch (Exception e) {
+			// No operation if fails, just returning null, if document is null, false will return from handleHeaderNameActionStateCheck(...)
+			e.printStackTrace();
+		}								
+		return null;
+	}	
+
+	/**
+	 * Starts query for the current identifier selection with 
+	 * the given query type.
+	 * @param queryType
+	 */
+	private void startQuery(int queryType){
+		startQuery(queryType, false);
+	}
+	
+	/**
+	 * Starts query for the current identifier selection with 
+	 * the given query type.
+	 * @param queryType
+	 * @param useExactMatch <code>true</code> if search string will be searched with exact match 
+	 * instead of contains.
+	 */
+	private void startQuery(int queryType, boolean useExactMatch){
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS, "Starting '" //$NON-NLS-1$
+														+ APIQueryParameters.getDescriptionForQueryType(queryType)
+														+ "' query with identifier '"  //$NON-NLS-1$
+														+ this.queryString + "'.");  //$NON-NLS-1$
+		try {
+			MainView.runAPIQueryFromExternalClass(queryType, this.queryString, useExactMatch);
+		} catch (QueryOperationFailedException e) {
+			e.printStackTrace();
+			String errMsg = Messages.getString("CheckIdentifierAction.Query_Failed_From_Context_Menu_ErrorMsg") + e.getMessage(); //$NON-NLS-1$
+			APIQueryConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+			new APIQueryMessageBox(errMsg, SWT.ICON_ERROR | SWT.OK).open();			
+		}
+	}	
+
+	
+	/**
+	 * Run API Query action directly with using action class.
+	 * @param quertString queried string
+	 * @param queryType query type
+	 */
+	public void runAPIQuery(String quertString, int queryType) {
+		this.queryString = quertString;		
+		startQuery(queryType, true);		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckProjectAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,326 @@
+/*
+* 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.apiquery.popup.actions;
+
+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.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.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.s60tools.apiquery.job.ActiveProjectQueryJob;
+import com.nokia.s60tools.apiquery.servlets.APIQueryWebServerConfigurator;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.dialogs.OpenReportStatusDialog;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Check project action is invoked from <b>API Query > for Active Project</b> popup menu.
+ * The action finds all the identifier candidates from the project and used them 
+ * to form a query used to figure out which APIs the project is using. This
+ * action supports only projects with Carbide.c++ project nature.
+ */
+public class CheckProjectAction implements IObjectActionDelegate, IJobChangeListener {
+	
+
+	private static final String DEFAULT_EXPORT_FILENAME_SUFFIX = "-project_is_using_APIs.html"; //$NON-NLS-1$
+
+	/**
+	 * The project that user has selected from a project.
+	 */
+	IProject selectedProject;
+		
+	
+	/**
+	 * Constructor.
+	 */
+	public CheckProjectAction() {
+		super();
+
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+
+			final IPath path = openSaveAsDialog();
+			if(path == null){
+				return ;
+			}
+			
+			//When API Query for project is started, making sure that web server is running
+			APIQueryWebServerConfigurator.startServer(APIQueryWebServerConfigurator.Active_Project_Start);
+			
+			//Creating job, must be running inside of Runnable, because of UI Thread connections
+			final ActiveProjectQueryJob job = new ActiveProjectQueryJob(
+					Messages.getString("CheckProjectAction.APIQuery_JobName_Msg")+action.getText() +" (" + getProjectName()  //$NON-NLS-1$ //$NON-NLS-2$
+					+").", selectedProject, path); //$NON-NLS-1$
+		
+			job.setPriority(Job.DECORATE);
+			//Cant .join() to job because of deathlock @see .join() documentation.
+			job.addJobChangeListener(this);			
+			job.reportStartTime();
+			//Start to run
+			job.schedule();
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().println(e.getMessage(), 
+					 IConsolePrintUtility.MSG_ERROR);
+			showErrorDialog(Messages.getString("CheckProjectAction.CannotGenerateReport_ErrMsg")  //$NON-NLS-1$
+					+getProjectName() +". " +e.getMessage());			 //$NON-NLS-1$
+		}
+	}
+
+
+	/* (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) {
+		// Storing the selected file instance used for resolving the active project
+		StructuredSelection structSel = (StructuredSelection) selection;
+		Object elem = structSel.getFirstElement();
+		if(elem instanceof IProject){
+			 this.selectedProject = (IProject) elem;			
+		}
+		else if(elem instanceof IFile){
+			 this.selectedProject = ((IFile) elem).getProject();						
+		}
+		else if(elem instanceof IFolder){
+			 this.selectedProject = ((IFolder) elem).getProject();						
+		}
+		else{
+			action.setEnabled(false);
+			return;
+		}
+		action.setEnabled(true);
+	}
+	
+	
+	/**
+	 * Shows save as dialog and set this.exportFileName
+	 * @return IPath path if fileName was set, null if dialog was not epened or cancel was pushed
+	 *
+	 */
+	private IPath openSaveAsDialog() {
+		Shell shell = APIQueryPlugin.getCurrentlyActiveWbWindowShell();
+		SaveAsDialog saveAs = new SaveAsDialog(shell);
+		IFile file = selectedProject.getFile(getDefaultFileName());
+		saveAs.setOriginalFile(file);
+		
+		int status = saveAs.open();
+		if(status == SaveAsDialog.OK ){
+			IPath path = saveAs.getResult();
+			if(saveAs.getReturnCode() == SaveAsDialog.OK ){
+				return path;
+			}else{
+				return null;
+			}
+		}
+		else{
+			return null;
+		}
+	}
+	
+	
+	/**
+	 * Asking user if he/she want's to open created file or not
+	 * by opening a Dialog
+	 * @param newFile
+	 * @return
+	 */
+	private boolean openRequired(IFile newFile){
+		Shell sh = APIQueryPlugin.getCurrentlyActiveWbWindowShell();
+		String fileName = newFile.getName();
+		OpenReportStatusDialog in = new OpenReportStatusDialog(sh, fileName);
+		
+		in.open();
+		if( in.getReturnCode() == OpenReportStatusDialog.OK){
+			return true;
+		}
+		else{
+			return false;
+		}
+	}
+	
+	/**
+	 * Opens generated report to workspace
+	 * @param newFile
+	 * @throws CoreException
+	 */
+	private void openReport(final IFile newFile) throws CoreException{
+		
+		if(!openRequired(newFile)){
+			return;
+		}
+		
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		//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 (Exception e) {
+					//PartInitException may occur
+					e.printStackTrace();
+					Status status = new Status(IStatus.ERROR,
+							"com.nokia.s60tools.apiquery", 0, e.getMessage(), e); //$NON-NLS-1$
+	
+					throw new CoreException(status);
+				} 
+	
+			}
+		};	
+		workspace.run(runOpen, null, IWorkspace.AVOID_UPDATE, null);
+	}
+
+
+	/**
+	 * get default name export file to
+	 * @return filename
+	 */
+	private String getDefaultFileName() {
+		String name = getProjectName() +DEFAULT_EXPORT_FILENAME_SUFFIX;
+		return name;
+	}
+
+
+	/**
+	 * get project name
+	 * @return project name
+	 */
+	private String getProjectName() {
+		return selectedProject.getName();
+	}
+	
+	/**
+	 * Show an error Dialog
+	 * @param errMsg
+	 */
+	
+	private void showErrorDialog(String errMsg) {
+		APIQueryMessageBox mbox = new APIQueryMessageBox(errMsg, SWT.ICON_ERROR | SWT.OK);
+		mbox.open();
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 * 
+	 * When done, asking if user wants to open created file. If Cancelled, doing nothing,
+	 * if an error occurs, system will show an error dialog.
+	 * 
+	 */
+	public void done(IJobChangeEvent event) {
+
+		ActiveProjectQueryJob job = (ActiveProjectQueryJob) event.getJob();
+		
+		job.reportEndTime();
+		
+		IStatus status = job.getResult();
+		
+		if(status.getSeverity() == IStatus.OK){
+			final IFile file = job.getGeneratedReportFile();
+
+				
+			// Must do query in Runnable, because of UI actions from job
+			Runnable activeProjectQueryJobRunnable = new Runnable() {
+				public void run() {
+					try {
+						openReport(file);
+					} catch (CoreException e) {
+						APIQueryConsole.getInstance().println(Messages.getString("CheckProjectAction.UnableToOpenReport_ErrMsg") + e.getMessage(),  //$NON-NLS-1$
+								 IConsolePrintUtility.MSG_ERROR);
+						e.printStackTrace();
+					}
+				}
+			};
+
+			// Showing a visible message has to be done in its own thread
+			// in order not to cause invalid thread access
+			Display.getDefault().asyncExec(activeProjectQueryJobRunnable);				
+				
+		
+		}
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/CheckProjectReport.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,415 @@
+/*
+* 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.apiquery.popup.actions;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+
+import com.nokia.s60tools.apiquery.servlets.APIQueryWebServerConfigurator;
+import com.nokia.s60tools.apiquery.servlets.ReportActionConstants;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.common.ProductInfoRegistry;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+/**
+ * Class representing Actice Project API Query report.
+ * Initialize by constructor and ask for HTML or CSV -report.
+ *
+ */
+public class CheckProjectReport {
+
+	/**
+	 * &nbsp;
+	 */
+	private static final String HTML_WHITE_SPACE = "&nbsp;"; //$NON-NLS-1$
+
+	/**
+	 * _
+	 */
+	public static final String UNKNOWN_API_NAME_SEPARATOR = "_"; //$NON-NLS-1$
+
+	/**
+	 * Unknown
+	 */
+	public static final String UNKNOWN_API_NAME = Messages.getString("CheckProjectReport.Unknown_MSg"); //$NON-NLS-1$
+	
+	/**
+	 * API name, Headers which is used from that API
+	 */
+	private final SortedMap<String, Vector<String>> usedHeaders;
+	
+	/**
+	 * API name, Files which is using that API
+	 */
+	private final Hashtable<String, Vector<IFile>> usingFiles;
+
+	/**
+	 * <API Name, API Details> APIs which project is using
+	 */
+	private final Hashtable<String, APIDetails> projectUsingAPIDetails;
+	
+	/**
+	 * Fields to be added to report from APIDetails besides API Name, Used Headers and Using Files 
+	 */
+	String [] apiDetailsToReport  = null;
+
+	private final IProject selectedProject;
+	
+
+
+	/**
+	 * 
+	 * @param usedHeaders <API name, Headers which is used from that API>
+	 * @param usingFiles <API name, Files which is using that API>
+	 * @param projectUsingAPIDetails <API Name, API Details> APIs which project is using 
+	 * @throws IllegalArgumentException if usedHeaders and usingFiles is not same sized or argument is null.
+	 */
+	public CheckProjectReport(SortedMap<String, Vector<String>> usedHeaders, 
+			Hashtable<String, Vector<IFile>> usingFiles,
+			Hashtable<String, APIDetails> projectUsingAPIDetails, String [] apiDetailsToReport,
+			IProject selectedProject) 
+		throws IllegalArgumentException
+	{
+		if(usedHeaders == null || usingFiles == null || usedHeaders.size() != usingFiles.size()){
+			throw new IllegalArgumentException(
+					Messages.getString("CheckProjectReport.UsedHeader_ErrMsg")); //$NON-NLS-1$
+		}
+		this.usedHeaders = usedHeaders;
+		this.usingFiles = usingFiles;
+		this.projectUsingAPIDetails = projectUsingAPIDetails;
+		this.apiDetailsToReport = apiDetailsToReport;
+		this.selectedProject = selectedProject;
+		
+	}
+
+
+	/**
+	 * Generating report as HTML format
+	 * @param title
+	 * @return a report
+	 */
+	public String toHTML(String title) {
+		StringBuffer html = new StringBuffer();		
+		//Get API Names from used Headers keys
+		Set <String> apis = usedHeaders.keySet();
+		Vector<String> tmpVect;
+		
+		//Add HTML header to report
+		html.append(getHTMLHeader(title));
+		String note = Messages.getString("CheckProjectReport.NoteForReportLinks_Msg"); //$NON-NLS-1$
+		html.append("<p>" + note //$NON-NLS-1$
+				+ "</p>"); //$NON-NLS-1$
+		
+		html.append("<table border=\"1\" cellspacing=\"0\" cellpadding=\"1\">"); //$NON-NLS-1$
+		html.append("<tr><th>"); //$NON-NLS-1$
+		html.append(Messages.getString("CheckProjectReport.APIName_Msg")); //$NON-NLS-1$
+		html.append("</th>" ); //$NON-NLS-1$
+		//Adding titles to API Details information
+		for (int i = 0; i < apiDetailsToReport.length; i++) {
+			html.append("<th>"); //$NON-NLS-1$
+			html.append(apiDetailsToReport[i]);
+			html.append("</th>"); //$NON-NLS-1$
+		}
+		
+		html.append("<th>");//$NON-NLS-1$
+		html.append(Messages.getString("CheckProjectReport.UsedHeader_Msg")); //$NON-NLS-1$
+		html.append("</th><th>");//$NON-NLS-1$
+		html.append(Messages.getString("CheckProjectReport.UsingFile_Msg")); //$NON-NLS-1$
+		html.append("</th></tr>"); //$NON-NLS-1$
+		html.append("\n"); //$NON-NLS-1$
+		
+		String [] detailsToReport ;//For API Details
+		//Add all APIs used in project to report
+		for (String api : apis) {
+			html.append("<tr>"); //$NON-NLS-1$
+			
+			tmpVect = usedHeaders.get(api);
+			html.append("<td>"); //$NON-NLS-1$
+			//Adding API Name to html. If details for API could not be found, adding name this.UNKNOWN_API_NAME
+			if(!api.startsWith(UNKNOWN_API_NAME + UNKNOWN_API_NAME_SEPARATOR)){
+				
+				//Creating link for launching action to run API Query by API Name
+				html.append("<a href=\"" +getServletURL() +"?" +ReportActionConstants.PARAM_QUERY_FOR   //$NON-NLS-1$  //$NON-NLS-2$
+							+"=" +api  //$NON-NLS-1$
+							+"&" +ReportActionConstants.ACTION_QUERY_TYPE  //$NON-NLS-1$
+							+"=" +APIQueryParameters.QUERY_BY_API_NAME +"\">" +api +"</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+			//API Is unknown 
+			else{
+				html.append("<i>"); //$NON-NLS-1$
+				html.append(UNKNOWN_API_NAME);
+				html.append("</i>"); //$NON-NLS-1$
+			}
+			//Adding API Details to html
+			detailsToReport = getApiDetails(api);
+			for (int i = 0; i < detailsToReport.length; i++) {
+				html.append("<td>"); //$NON-NLS-1$
+				int searchMethodId = UserSettings.getInstance().getCurrentlySelectedSearchMethod().
+					getQueryTypeByAPIDetailNameInDetails(apiDetailsToReport[i]);
+				//If search method is supported
+				if(searchMethodId != -1 
+						&& UserSettings.getInstance().getCurrentlySelectedSearchMethod().isSupportedQueryType(searchMethodId)
+						&& !detailsToReport[i].equals(HTML_WHITE_SPACE)){
+					
+					String comma = ","; //$NON-NLS-1$
+					String [] items = detailsToReport[i].split(comma);
+					for (int j = 0; j < items.length; j++) {
+						
+						//Creating link for launching action to run API Query by a type
+						html.append("<a href=\"" +getServletURL() //$NON-NLS-1$
+								+"?" +ReportActionConstants.PARAM_QUERY_FOR  //$NON-NLS-1$
+								+"=" +items[j]  //$NON-NLS-1$
+								+"&" +ReportActionConstants.ACTION_QUERY_TYPE  //$NON-NLS-1$
+								+"=" +searchMethodId +"\">" +items[j] +"</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						if(j < (items.length-1)){
+							html.append(comma);
+						}
+					}
+					
+				}
+				//If current topic is not supported for API Query
+				else{
+					html.append(detailsToReport[i]);
+				}
+				html.append("</td>\n"); //$NON-NLS-1$
+			}
+			
+			html.append("</td>\n<td>"); //$NON-NLS-1$
+			//Adding "used headers" to html
+			for (String header : tmpVect) {
+				//Creating link for launching action to open file
+				html.append("<a href=\"" +getServletURL() //$NON-NLS-1$
+							+"?" +ReportActionConstants.ACTION_OPEN_USED_HEADER //$NON-NLS-1$
+							+"=" +header +getProjectNameParam() +"\">"); //$NON-NLS-1$ //$NON-NLS-2$
+				html.append(header);	
+				html.append("</a>"); //$NON-NLS-1$
+				html.append(" "); //$NON-NLS-1$
+			}
+			html.append("</td>\n<td>"); //$NON-NLS-1$
+			Vector<IFile> usingFileTmpVect = usingFiles.get(api);
+			
+			Vector<IFile> allreadyAdded = new Vector<IFile>();
+			//Adding "using files" to html
+			for (IFile file : usingFileTmpVect) {
+				//To prevent adding duplicates of same file
+				if(!allreadyAdded.contains(file)){
+					//Creating link for launching action to open file
+					html.append("<a href=\"" +getServletURL()  //$NON-NLS-1$
+							+"?" +ReportActionConstants.ACTION_OPEN_USING_FILE //$NON-NLS-1$
+							+"=" +file.getProjectRelativePath().toOSString() +getProjectNameParam() +"\">"); //$NON-NLS-1$ //$NON-NLS-2$
+					html.append(file.getName());	
+					html.append("</a>"); //$NON-NLS-1$
+					html.append(" "); //$NON-NLS-1$
+					allreadyAdded.add(file);
+				}
+				
+			}
+			html.append("</td>\n</tr>\n"); //$NON-NLS-1$
+		}
+		
+		html.append("</table>"); //$NON-NLS-1$
+		html.append("\n"); //$NON-NLS-1$
+
+		
+		//Add HTML end tags to report
+		html.append(getHTMLEndTags());
+		return html.toString();		
+	}
+	
+	private String getProjectNameParam(){
+		return "&" +ReportActionConstants.PARAM_PROJECT_NAME +"=" +selectedProject.getName(); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/**
+	 * Get URL for actio Servlet
+	 * @return http://[server]:[port]/[servlet]
+	 */
+	private String getServletURL(){
+		return "http://" +APIQueryWebServerConfigurator.WEB_SERVER_HOST  //$NON-NLS-1$
+			+":" +APIQueryWebServerConfigurator.WEB_SERVER_HTTP_PORT  //$NON-NLS-1$
+			+"/" +ReportActionConstants.SERVLET_NAME; //$NON-NLS-1$
+	}
+	
+	/**
+	 * get API Details to report. Founding API_DETAILS_TO_REPORT keys from
+	 * projectUsingAPIDetails by api.
+	 * @param api
+	 * @return
+	 */
+	private String[] getApiDetails(String api){
+		String[] detailsToReport = new String [apiDetailsToReport.length];
+		APIDetails details = projectUsingAPIDetails.get(api);
+		if(details != null){
+			APIDetailField field;
+			for (int i = 0; i < apiDetailsToReport.length; i++) {
+				field = details.getDetail(apiDetailsToReport[i]);
+				//To fill up empty HTML table columns, adding an white space (&nbsp;) 
+				//to detail where is no real data. This looks bettre in UI (HTML report)
+				if(field.getValue() != null && !field.getValue().trim().equals("")){ //$NON-NLS-1$
+					detailsToReport[i] = field.getValue();
+				}
+				//To avoid HTML table different behavior with empty slots, putting a white space to emtpy slots
+				else{
+					detailsToReport[i] = HTML_WHITE_SPACE;
+				}
+			}
+		}
+		else {
+			//To avoid HTML table different behavior with empty slots, putting a white space to emtpy slots
+			for (int i = 0; i < apiDetailsToReport.length; i++) {
+				detailsToReport[i] = HTML_WHITE_SPACE;
+			}
+		}		
+		return detailsToReport;
+	}
+	
+	/**
+	 * 
+	 * Not implemented.
+	 * 
+	 * Generate report in CSV format.
+	 * @return <code>null</code>
+	 */
+	public String toCSV() {
+		//Not implemented
+		return null;
+	}	
+	
+	/**
+	 * Writes this.toHTML() to file
+	 * @param title
+	 * @param fileName
+	 */
+	public void toHTMLFile(String title, String fileName ) {		
+		
+		try {
+			BufferedWriter out = new BufferedWriter(new FileWriter(
+					fileName));
+			out.write(toHTML(title));
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	/**
+	 * 
+	 * Not implemented until {@link #toCSV()} is implemented.
+	 * 
+	 * Writes this.toCSV() to file
+	 * @param title
+	 * @param fileName
+	 */
+	public void toCSVFile(String title, String fileName ) {		
+		
+		try {
+			BufferedWriter out = new BufferedWriter(new FileWriter(
+					fileName));
+			out.write(toCSV());
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * generating html header and opening body and adding title to it
+	 * @param title
+	 * @return
+	 */
+	private StringBuffer getHTMLHeader(String title){
+		StringBuffer b = new StringBuffer();
+		b.append("<html><head><title>"); //$NON-NLS-1$
+		b.append(title);
+		b.append("</title>\n"); //$NON-NLS-1$
+		b.append(getHTMLStyles());
+
+		b.append("\n</head><body>\n"); //$NON-NLS-1$
+		b.append("<h1>"); //$NON-NLS-1$
+		b.append(title);
+		b.append("</h1>\n"); //$NON-NLS-1$
+		return b;
+	}
+	/**
+	 * get body and html end tags
+	 * @return
+	 */
+	private StringBuffer getHTMLEndTags(){
+		StringBuffer b = new StringBuffer();
+		b.append("</body></html>"); //$NON-NLS-1$
+		return b;
+	}	
+	/**
+	 * get HTML style sheet 
+	 * @return styles
+	 */
+	private StringBuffer getHTMLStyles(){
+		
+		String cssPath = null;
+		
+		try {
+			//Get location for stylesheet file
+			cssPath = APIQueryPlugin.getDefault().getPluginInstallPath() +
+				File.separatorChar + ProductInfoRegistry.getResourcesRelativePath() 
+				+File.separatorChar + ProductInfoRegistry.getReportCSSFileName();
+			//return contents of the stylesheet file
+			return FileUtils.loadDataFromFile(cssPath);
+		} catch (Exception e) {
+			//FileNotFoundException or IOException may occur
+			e.printStackTrace();
+			APIQueryConsole.getInstance().println(
+					Messages.getString("CheckProjectReport.UnableToLoadCSS_Part1_ErrMsg") +cssPath +Messages.getString("CheckProjectReport.UnableToLoadCSS_Part2_ErrMsg") +e, //$NON-NLS-1$ //$NON-NLS-2$
+					APIQueryConsole.MSG_ERROR);
+			//If there was an error, returning dummy (hard coded) styles
+			return getDummyCSS();
+		} 
+		
+	}
+
+	/**
+	 * If there is something wrong, hard coded styles can be used
+	 * @return dummy styles
+	 */
+	private StringBuffer getDummyCSS() {
+		StringBuffer b = new StringBuffer();
+		b.append("<style type=\"text/css\">"); //$NON-NLS-1$
+		b.append("body {background-color: white; font-family: Verdana; font-size: 10px; }"); //$NON-NLS-1$
+		b.append("p { font-family=\"Verdana\"; font-size: 10px; }"); //$NON-NLS-1$
+		b.append("td { font-family=\"Verdana\"; font-size: 10px; text-align: left; }");	 //$NON-NLS-1$
+		b.append("th { font-family=\"Verdana\"; font-size: 10px; font-weight: bold; text-align: left; }"); //$NON-NLS-1$
+		b.append("dt { font-family=\"Verdana\"; font-size: 10px; font-weight: normal text-align: left; }");			 //$NON-NLS-1$
+		b.append("h1 { font-family=\"Verdana\"; font-size: 18px; }");  	 //$NON-NLS-1$
+		b.append("</style>"); //$NON-NLS-1$
+		return b;
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/OpenFileAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,410 @@
+/*
+* 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.apiquery.popup.actions;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.ICarbideBuildManager;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.job.FindFileFromFoldersJob;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+
+/**
+ * Action class for find and then open wanted file to Editor area. 
+ * File can be seeked under SDK include paths or
+ * under given project in Carbides Workspace.
+ */
+public class OpenFileAction implements IJobChangeListener{
+	
+	/**
+	 * Current default build configuration SDK ID. 
+	 */
+	private String sdkUniqueId = null;
+	private String fileName = null;
+	private String projectName;
+
+	/**
+	 * Opens file from given project in Carbide workspace.
+	 * @param fileName
+	 * @param projectName
+	 */
+	public void openFileFromProject(String fileName, String projectName) {
+
+		this.fileName = fileName;
+		this.projectName = projectName;
+		try {
+			
+			APIQueryConsole.getInstance().println(Messages.getString("OpenFileAction.StartingSeek_Msg_Part1") +fileName +Messages.getString("OpenFileAction.StartingSeek_Msg_Part2") +projectName +"'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			
+			IProject project = getProject(projectName);
+			
+			IResource[] members = project.members();
+		
+			Vector<IResource> files = getMatchingResources(fileName, members);
+			
+			if(!files.isEmpty()){
+				
+				//It should not be possible that there is multiple foundings for resource, because path is added when file was seeked
+				IResource res = files.get(0);									
+				IPath path = res.getFullPath();
+				URI uri = res.getLocationURI();
+				openFile(uri, path.lastSegment());
+			}else{
+				String message = Messages.getString("OpenFileAction.CannotFoundFile_ErrMsg_Part1") +fileName +Messages.getString("OpenFileAction.CannotFoundFile_ErrMsg_Part2") +projectName +"'."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				showErrorMessage(message);		
+
+			}
+		
+		} catch (Exception e) {
+			showUnexpectedErrorMsg(e);
+		}
+
+	}
+
+
+	/**
+	 * Logs and shows error message for unexpected error situations.
+	 * @param fileName
+	 * @param projectName
+	 * @param e {@link Exception}
+	 */
+ private void showUnexpectedErrorMsg(Exception e) {
+		e.printStackTrace();
+		String msg = Messages.getString("OpenFileAction.Unexpected_ErrMsg_Part1")+fileName +Messages.getString("OpenFileAction.Unexpected_ErrMsg_Part2") +projectName +"'."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		String consoleMsg = msg +Messages.getString("OpenFileAction.Unexpected_ErrMsg_Part3") +e; //$NON-NLS-1$
+		APIQueryConsole.getInstance().println(consoleMsg, APIQueryConsole.MSG_ERROR);
+		showErrorMessage(msg);
+	}
+
+
+
+	/**
+	 * Show an error message to user and logs same message to console.
+	 * @param message
+	 */
+	private void showErrorMessage(final String message) {
+		APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR);		
+		Runnable run = new Runnable(){
+			public void run(){
+				new APIQueryMessageBox(message,
+						SWT.ICON_ERROR | SWT.OK).open();
+				
+			}
+		};
+		Display.getDefault().asyncExec(run);
+	}
+	
+
+
+	/** 
+	 * Check recursively all folders inside given resources and seeks give file
+	 * @param fileName
+	 * @param members
+	 * @return resources found
+	 * @throws CoreException
+	 */
+	private Vector<IResource> getMatchingResources(String fileName,
+			IResource[] members) throws CoreException {
+		Vector<IResource> files = new Vector<IResource>();
+
+		for (int i = 0; i < members.length; i++) {
+			IResource res = members[i];
+			//If resource is folder, seeking all folders and files under it
+			if (res instanceof IFolder) {
+				IFolder fold = (IFolder) res;
+				IResource[] folderMembers = fold.members();
+				files.addAll(getMatchingResources(fileName, folderMembers));
+			}
+			//If resource is file, checking if thats file we are interest of
+			else if (res instanceof IFile) {
+
+				String name = res.getName();
+				//If file name match to resource name adding to
+				if (fileName.equalsIgnoreCase(name)) {
+					files.add(res);
+				}else if(fileName.equalsIgnoreCase(res.getProjectRelativePath().toOSString())){
+					files.add(res);
+				}
+			}
+			//Else we have no interest of resource
+		}
+		return files;
+	}
+	
+	/**
+	 * Open file given to Editor area. 
+	 * @param uri
+	 * @param fileName
+	 */
+	public void openFile(final URI uri, final String fileName) {		
+		
+		//Runnable to open new file
+		final Runnable runOpen = new Runnable() {
+			public void run() {
+				// do the actual work in here
+								
+				try {
+					IWorkbench workbench = PlatformUI.getWorkbench();
+					IWorkbenchPage page = APIQueryPlugin.getCurrentlyActivePage();
+					//Find default editor for that file
+					IEditorRegistry reg = workbench.getEditorRegistry();					
+					IEditorDescriptor editor = reg.getDefaultEditor(fileName);
+					//We open editor by it's ID
+					final String editorId = editor.getId();
+					//Opening file in editor
+					IDE.openEditor(page, uri, editorId, true);
+					
+				} catch (Exception e) {
+					showUnexpectedErrorMsg(e);
+				} 
+
+			}
+		};		
+		Display.getDefault().asyncExec(runOpen);
+	}	
+	
+
+	/**
+	 * Open file to Editor area
+	 * @param file
+	 * @throws URISyntaxException 
+	 */
+	private void openFile(File file) throws URISyntaxException {
+		String path = file.getAbsolutePath();
+		String uriStr = path.replace("\\", "/");; //$NON-NLS-1$ //$NON-NLS-2$
+		uriStr = "file://" + uriStr; //$NON-NLS-1$			
+		URI uri = new URI(uriStr);
+		openFile(uri, file.getName());
+	}	
+	
+	/**
+	 * Opens file from SDK. Projects default build configuration is used as SDK,
+	 * MMP files from that project is seeked, and file is seeked under inc paths found in 
+	 * MMP files.
+	 * 
+	 * File is opened or error message is shown when done.
+	 * 
+	 * @param fileName
+	 * @param projectName
+	 */
+	public void openFileFromSDK(String fileName, String projectName) {
+
+		this.fileName = fileName;
+		this.projectName = projectName;
+		try {
+			//Get project by name
+			IProject project = getProject(projectName);
+			//Gets Include paths for project. Header files must be found from includepaths.
+			List<File> paths = getIncludePaths(project);
+			APIQueryConsole.getInstance().println(
+					Messages.getString("OpenFileAction.TargetFound_Msg_Part1") +sdkUniqueId  //$NON-NLS-1$
+					+Messages.getString("OpenFileAction.TargetFound_Msg_Part2") +projectName  //$NON-NLS-1$
+					+Messages.getString("OpenFileAction.TargetFound_Msg_Part3") +fileName +"'."); //$NON-NLS-1$ //$NON-NLS-2$
+			
+			//Seeking paths where file(s) are found
+			//it will happened asynchronously, and when done, file will be opened.
+			findFiles(fileName, paths);
+			
+		} catch (QueryOperationFailedException e) {
+			showErrorMessage(e.getMessage());
+		}catch (Exception e) {
+			showUnexpectedErrorMsg(e);
+		}
+		
+
+	}
+
+
+	/**
+	 * Get include paths for project
+	 * @param project
+	 * @return absolutely include paths for project, found in MMP files.
+	 * @throws QueryOperationFailedException 
+	 */
+	private List<File> getIncludePaths(IProject project) throws QueryOperationFailedException {
+		List<File> paths = new ArrayList<File>();
+		
+		ICarbideBuildManager buildMgr = CarbideBuilderPlugin.getBuildManager();
+		ICarbideProjectInfo cpi = null;
+		if (buildMgr.isCarbideProject(project)){
+		  // check to make sure this is a Carbide project
+		  cpi = buildMgr.getProjectInfo(project);
+			// Get the default build configuration
+			ICarbideBuildConfiguration defaultConfig = cpi.getDefaultConfiguration();
+			sdkUniqueId = defaultConfig.getSDK().getUniqueId();
+			
+			List<File> _userPaths = new ArrayList<File>();
+			List<File> _systemPaths = new ArrayList<File>();
+			EpocEngineHelper.getProjectIncludePaths(cpi, defaultConfig, _userPaths, _systemPaths) ;
+			paths.addAll(_userPaths);
+			paths.addAll(_systemPaths);
+		}		
+		else{
+			throw new QueryOperationFailedException(Messages.getString("OpenFileAction.NotCarbideProject_ErrMsg_Part1") +projectName +Messages.getString("OpenFileAction.NotCarbideProject_ErrMsg_Part2")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		
+		return paths;
+	}
+
+	/**
+	 * Get project by name.
+	 * @param projectName
+	 * @return project
+	 * @throws CoreException 
+	 * @throws QueryOperationFailedException 
+	 */
+	private IProject getProject(String projectName) throws CoreException, QueryOperationFailedException {
+		IProject prj = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		if(!prj.exists()){
+			 throw new QueryOperationFailedException (Messages.getString("OpenFileAction.ProjectNotExist_ErrMsg_Part1") +projectName +Messages.getString("OpenFileAction.ProjectNotExist_ErrMsg_Part2")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if(!prj.isOpen()){
+			//If project is closed, just opening it before returning
+			prj.open(new NullProgressMonitor());
+		}
+		prj.getWorkspace();
+		return prj;
+	}
+
+
+	
+	/**
+	 * Find file under folders given
+	 * @param fileName
+	 * @param includePaths
+	 */
+	private void findFiles(String fileName, List<File> includePaths) {
+			//	System.out.println(Messages.getString("OpenFileAction.18")); //$NON-NLS-1$
+		FindFileFromFoldersJob job = new FindFileFromFoldersJob(Messages.getString("OpenFileAction.JobName_Msg") +fileName, includePaths, fileName, sdkUniqueId); //$NON-NLS-1$
+		job.setPriority(Job.DECORATE);
+		//Listener will be called when seeking is done
+		job.addJobChangeListener(this);
+		job.schedule();	
+		
+	}
+
+
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void done(IJobChangeEvent event) {
+
+		//
+		// When job is done, this will be called, and found file will be opened
+
+		try {
+			FindFileFromFoldersJob job = (FindFileFromFoldersJob) event
+					.getJob();
+			Collection<File> files = job.getFoundSourceFiles();
+
+			if (files.isEmpty()) {
+				String message = Messages.getString("OpenFileAction.CannotFoundFile_Msg_Part1") + fileName //$NON-NLS-1$
+						+ Messages.getString("OpenFileAction.CannotFoundFile_Msg_Part2") + sdkUniqueId //$NON-NLS-1$
+						+ "'."; //$NON-NLS-1$
+				showErrorMessage(message);
+			}
+			//Else we just open first file that we found
+			else{
+				File file = ((File[]) files.toArray(new File[0]))[0];
+				openFile(file);
+			}
+		} catch (Exception e) {
+			showUnexpectedErrorMsg(e);
+		}
+
+	}
+
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+		//Not needed
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+		//Not needed
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/popup/actions/QueryErrorInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.popup.actions;
+
+/**
+ * Simple class for storing error information returned query operations.
+ * This is needed because queries are runned inside a runnable and
+ * error info is got via try/catch, and the error information usage
+ * related needs to be done outside runnable where catch is made. 
+ * This class should stay with package private visibility.
+ */
+class QueryErrorInfo{		
+	/**
+	 * Error description is set on failure.
+	 */
+	private String errorDescription = new String();
+	
+	/**
+	 * Gets error description.
+	 * @return the errorDescription
+	 */
+	public String getErrorDescription() {
+		return errorDescription;
+	}
+
+	/**
+	 * Sets error description.
+	 * @param errorDescription the errorDescription to set
+	 */
+	public void setErrorDescription(String errorDescription) {
+		this.errorDescription = errorDescription;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/APIQueryWebServerConfigurator.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,169 @@
+/*
+* 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.apiquery.servlets;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Hashtable;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.http.jetty.JettyConfigurator;
+import org.eclipse.equinox.http.jetty.JettyConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.Bundle;
+
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Class for handling API Query Web server functionalities. E.g. start and stop Web Server.
+ */
+public class APIQueryWebServerConfigurator {
+
+	/**
+	 * Host where report server is running (localhost)
+	 */
+	public static final String WEB_SERVER_HOST = "localhost"; //$NON-NLS-1$
+	
+	/**
+	 * HTTP port to be used with running HTTP server
+	 */
+	public static final int WEB_SERVER_HTTP_PORT = 4191;
+			
+	/**
+	 * Name of the API Query Web Server
+	 */
+	private static final String API_QUERY_WEB_SERVER_NAME = "API Query Server"; //$NON-NLS-1$
+	
+	/**
+	 * 
+	 */
+public static final int Active_Project_Start  = 0;
+
+public static final int Carbide_Instance_start  =1;
+
+static boolean activeProjectStartedServer = false;
+
+
+	/**
+	 * Starts API Query Web Server. Web Server is used for launch actions in HTML report. 
+	 * Reports are created with Export report functionality (API Query for Active project).
+	 * @see JettyConfigurator#startServer(String, java.util.Dictionary)
+	 */
+public static void startServer(int msgdialogueCode) {
+		try {
+           
+		if (msgdialogueCode == Active_Project_Start) activeProjectStartedServer = true;
+			// Check if server is already running
+			if (allreadyRunning()) {
+				//Show the dialogue box
+				
+				if (msgdialogueCode==Carbide_Instance_start && APIQueryPlugin.isFirstLaunch&&!activeProjectStartedServer)
+				{
+					APIQueryPlugin.isFirstLaunch = false;					
+				MessageDialog.openInformation(APIQueryPlugin.getCurrentlyActiveWbWindowShell(), "APIQuery Plugin: Active Project Option Information", "Active project report links may not work. Close other Carbide.C++ instances and restart API Query plug-in.");
+				}
+				return;
+			}
+
+			Hashtable<String, Object> set = new Hashtable<String, Object>();
+			set.put(JettyConstants.HTTP_PORT, WEB_SERVER_HTTP_PORT);
+			JettyConfigurator.startServer(API_QUERY_WEB_SERVER_NAME, set);
+
+			Bundle bundle = Platform
+					.getBundle("org.eclipse.equinox.http.registry"); //$NON-NLS-1$
+
+			if (bundle.getState() == Bundle.RESOLVED) {
+				bundle.start(Bundle.START_TRANSIENT);
+			}
+			APIQueryConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("APIQueryWebServerConfigurator.StartServer_Msg_Part1")//$NON-NLS-1$ 
+									+ API_QUERY_WEB_SERVER_NAME
+									+ Messages
+											.getString("APIQueryWebServerConfigurator.StartServer_Msg_Part2")//$NON-NLS-1$ 
+									+ "http://" + WEB_SERVER_HOST + ":" + WEB_SERVER_HTTP_PORT //$NON-NLS-1$ //$NON-NLS-2$ 
+									+ Messages
+											.getString("APIQueryWebServerConfigurator.StartServer_Msg_Part3")); //$NON-NLS-1$
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			APIQueryConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("APIQueryWebServerConfigurator.StartServer_ErrMsg_Part1") + API_QUERY_WEB_SERVER_NAME + Messages.getString("APIQueryWebServerConfigurator.StartServer_ErrMsg_Part2") + e, APIQueryConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+
+		}
+	}	
+	
+	
+	
+	/**
+	 * Check if HTTP Server is already running
+	 * @return <code>true</code> if server is alreaydy running and <code>false</code> if not.
+	 */
+	private static boolean allreadyRunning() {
+		
+		
+		try {
+			//Servlet URL 
+			String servletURL = "http://" +WEB_SERVER_HOST  +":" +WEB_SERVER_HTTP_PORT + "/" + ReportActionConstants.SERVLET_NAME;
+			URL url = new URL(servletURL);
+			//Try to keep http connection alive
+			System.setProperty("http.keepAlive", "true");
+		
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-----> Reading URL: " + url.toString());
+			//Getting connection to check if server is running
+			HttpURLConnection con = (HttpURLConnection) url.openConnection();
+			if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
+				return true;
+			} 
+		
+		} catch (IOException e) {
+			// IOExeption occurs if HttpURLConnection is not alive 
+			//and when HttpURLConnection.getResponseCode() is called
+			//then we know that HTTP server is not up and running			
+		}
+		catch (Exception e) {
+			//No operation if something else happens, just returning false
+		}		
+		
+		return false;
+	}
+
+	/**
+	 * Stops API Query Web Server.
+	 * @see JettyConfigurator#stopServer(String)
+	 */
+	public static void stopServer(){
+		try {
+			JettyConfigurator.stopServer(API_QUERY_WEB_SERVER_NAME);
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryWebServerConfigurator.StoptServer_Msg_Part1") +API_QUERY_WEB_SERVER_NAME +Messages.getString("APIQueryWebServerConfigurator.StoptServer_Msg_Part2")); //$NON-NLS-1$ //$NON-NLS-2$
+		} catch (Exception e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryWebServerConfigurator.StoptServer_ErrMsg_Part1") +API_QUERY_WEB_SERVER_NAME +Messages.getString("APIQueryWebServerConfigurator.StoptServer_ErrMsg_Part2") +e, APIQueryConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/ReportActionConstants.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.servlets;
+
+
+/**
+ * Constants for {@link ReportActionServlet} and relative classes.
+ */
+public class ReportActionConstants {
+
+	
+	/**
+	 * Servlet name taking action request and forwards it to actions
+	 */
+	public static final String SERVLET_NAME = "reportAction"; //$NON-NLS-1$
+	
+	/**
+	 * Parameter name for API Query For
+	 */
+	public static final String PARAM_QUERY_FOR = "apiQueryFor"; //$NON-NLS-1$
+	
+	/**
+	 * Parameter name for API Query Type
+	 */
+	public static final String ACTION_QUERY_TYPE = "apiQueryType"; //$NON-NLS-1$
+	
+	/**
+	 * Parameter name for Open Used Header
+	 */
+	public static final String ACTION_OPEN_USED_HEADER = "openUsedHeader"; //$NON-NLS-1$
+	
+	/**
+	 * Parameter name for Open Using File
+	 */
+	public static final String ACTION_OPEN_USING_FILE = "openUsingFile"; //$NON-NLS-1$
+
+	/**
+	 * Name of the project what report stands for
+	 */
+	public static final String PARAM_PROJECT_NAME = "projectName"; //$NON-NLS-1$
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/servlets/ReportActionServlet.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.servlets;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.apiquery.popup.actions.CheckIdentifierAction;
+import com.nokia.s60tools.apiquery.popup.actions.OpenFileAction;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+
+/**
+ * Servlet that takes request from API Query report and forwards it to action.
+ * Web Server inside Carbide must be up and running when Servlet is executed.
+ * 
+ * The Web server is running when API Query {@link MainView} is alive. 
+ *  
+ * @see APIQueryWebServerConfigurator#startServer()
+ */
+public class ReportActionServlet extends HttpServlet implements Servlet {
+
+
+	/**
+	 * Default ID.
+	 */
+	private static final long serialVersionUID = 1L;
+
+
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+	 */
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+			throws ServletException, IOException {
+ 
+		String queryType = req.getParameter(ReportActionConstants.ACTION_QUERY_TYPE);
+		try {
+			String projectName;
+			if(req.getParameter(ReportActionConstants.ACTION_QUERY_TYPE) != null){
+				int type = 1;
+				if(queryType != null){
+					type = Integer.parseInt(queryType);
+				}
+				String searchString = (String) req.getParameter(ReportActionConstants.PARAM_QUERY_FOR);			
+				runAPIQueryFor(searchString, type);			
+			}
+			else if(req.getParameter(ReportActionConstants.ACTION_OPEN_USED_HEADER) != null){
+				String headerName = (String) req.getParameter(ReportActionConstants.ACTION_OPEN_USED_HEADER);
+				projectName = (String) req.getParameter(ReportActionConstants.PARAM_PROJECT_NAME);
+				openFileFromSDK(headerName, projectName);		
+			}
+			else if(req.getParameter(ReportActionConstants.ACTION_OPEN_USING_FILE) != null){
+				String fileName = (String) req.getParameter(ReportActionConstants.ACTION_OPEN_USING_FILE);
+				projectName = (String) req.getParameter(ReportActionConstants.PARAM_PROJECT_NAME);
+				openFileFromProject(fileName, projectName);
+			}
+			else{
+				String msg = Messages.getString("ReportActionServlet.NotSupportedAction_Msg"); //$NON-NLS-1$
+				APIQueryConsole.getInstance().println(msg);
+			}
+
+			
+			PrintWriter out = resp.getWriter();
+			//When actual servlet page is loaded (Action is launched) directing user back where come from
+			//by loading java script on body load.
+			out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + //$NON-NLS-1$
+			                                    "Transitional//EN\">\n" + //$NON-NLS-1$
+			            "<HTML>\n" + //$NON-NLS-1$
+			            "<HEAD><TITLE></TITLE></HEAD>\n" + //$NON-NLS-1$
+			            "<BODY onload=\"javascript:history.back()\">\n" + //$NON-NLS-1$
+			            "</BODY></HTML>"); //$NON-NLS-1$
+		} catch (NumberFormatException e) {
+			String msg = Messages.getString("ReportActionServlet.NotSupportedQueryType_ErrMsg_Part1") +queryType +Messages.getString("ReportActionServlet.NotSupportedQueryType_ErrMsg_Part2"); //$NON-NLS-1$ //$NON-NLS-2$
+			APIQueryConsole.getInstance().println(msg, APIQueryConsole.MSG_ERROR);
+			e.printStackTrace();
+		} catch (QueryOperationFailedException e) {
+			showErrorMessage(e.getMessage());
+		}
+
+	}
+	
+	/**
+	 * Shows on error message to user.
+	 * @param message
+	 */
+	private void showErrorMessage(final String message) {
+		Runnable run = new Runnable(){
+			public void run(){
+				new APIQueryMessageBox(message,
+						SWT.ICON_ERROR | SWT.OK).open();
+				
+			}
+		};
+		Display.getDefault().asyncExec(run);
+	}	
+
+
+	/**
+	 * Open File from project
+	 * @param fileName
+	 * @param projectName
+	 */
+	private void openFileFromProject(String fileName, String projectName) {
+		OpenFileAction action = new OpenFileAction();
+		action.openFileFromProject(fileName, projectName);
+	}
+	
+	/**
+	 * Open file from SDK
+	 * @param fileName
+	 * @param projectName
+	 */
+	private void openFileFromSDK(String fileName, String projectName) {
+		OpenFileAction action = new OpenFileAction();
+		action.openFileFromSDK(fileName, projectName);
+	}
+
+
+
+	/**
+	 * Runs API Query for selected String with selected type
+	 * @param searchString String to search for
+	 * @param type API Query type
+	 * @throws QueryOperationFailedException
+	 */
+	private void runAPIQueryFor(final String searchString, final int type) throws QueryOperationFailedException{
+		
+		ISearchMethodExtension currentlySelectedSearchMethod = UserSettings.getInstance().getCurrentlySelectedSearchMethod();
+		
+		//Check if search method is supported for selected type. Cannot really occur until
+		//some data source is giving API Query report details for API that some other Data source is not supporting
+		//and report is generated with different Data source that is currently in use.
+		boolean isSupported = currentlySelectedSearchMethod.isSupportedQueryType(type);		
+		if(!isSupported){
+			String msg = Messages.getString("ReportActionServlet.NotSupportedSearchMethod_ErrMsg_Part1") //$NON-NLS-1$
+			+ currentlySelectedSearchMethod.getAPIDetailNameInDetailsByQueryType(type)
+			+Messages.getString("ReportActionServlet.NotSupportedSearchMethod_ErrMsg_Part2") //$NON-NLS-1$
+			+ currentlySelectedSearchMethod.getExtensionInfo().getDescription()
+			+"'."; //$NON-NLS-1$
+			APIQueryConsole.getInstance().println(msg, APIQueryConsole.MSG_ERROR);
+			throw new QueryOperationFailedException(
+					msg);
+		}
+		
+				
+		//Runnable to run API Query action
+		final Runnable run = new Runnable() {
+			public void run() {
+				// do the actual work in here
+				try {
+					CheckIdentifierAction act = new CheckIdentifierAction();
+					act.runAPIQuery(searchString, type);
+				} catch (Exception e) {
+					e.printStackTrace();
+					String msg = Messages.getString("ReportActionServlet.Unexpected_ErrMsg_Part1")  //$NON-NLS-1$
+						+ searchString +Messages.getString("ReportActionServlet.Unexpected_ErrMsg_Part2") +type +Messages.getString("ReportActionServlet.Unexpected_ErrMsg_Part3") +e; //$NON-NLS-1$ //$NON-NLS-2$
+					APIQueryConsole.getInstance().println(msg, APIQueryConsole.MSG_ERROR);
+				}
+
+			}
+		};		
+		Display.getDefault().asyncExec(run);
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/settings/IUserSettingsListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.settings;
+
+/**
+ * Interface for the listeners that want to get user setting modifications events.
+ */
+public interface IUserSettingsListener {
+
+	/**
+	 * Notifies the listener that user settings have changed.
+	 */
+	public void userSettingsChanged();
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/settings/UserSettings.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.settings;
+
+import java.util.ArrayList;
+
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+
+
+/**
+ * Singleton class that is created on plugin
+ * startup, and is kept active as long as plugin is active.
+ * 
+ * The purpose of this class is store run-time instance
+ * of active user settings.
+ */
+public class UserSettings {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private UserSettings instance = null;
+
+	/**
+	 * Currently selected search method.
+	 */
+	private ISearchMethodExtensionInfo currentlySelectedSearchMethodInfo = null;
+	
+	/**
+	 * Listeners that can be attached for listening the changes in the user settings.
+	 */
+	private ArrayList<IUserSettingsListener> settingsListeners = new ArrayList<IUserSettingsListener>();
+	
+	/**
+	 * Public Singleton instance accessor.
+	 * @return Returns instance of this singleton class-
+	 */
+	public static UserSettings getInstance(){
+		if( instance == null ){
+			instance = new UserSettings();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private UserSettings() {
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS, "-- <<create>> --> " + getClass().getName()); //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets the search method that is currently selected by user.
+	 * @return Returns the currentlySelectedSearchMethodInfo, or
+	 *         <code>null</code> if not set.
+	 */
+	public ISearchMethodExtensionInfo getCurrentlySelectedSearchMethodInfo() {
+		return currentlySelectedSearchMethodInfo;
+	}
+
+	/**
+	 * Gets the currently selected search method.
+	 * @return The currently selected search method.
+	 */
+	public ISearchMethodExtension getCurrentlySelectedSearchMethod() {
+		ISearchMethodExtensionInfo currSelExtInfo =  getInstance().getCurrentlySelectedSearchMethodInfo();
+		String id = currSelExtInfo.getId();
+		ISearchMethodExtension currSelExt = SearchMethodExtensionRegistry.getInstance().getById(id);
+		return currSelExt;
+	}	
+	
+	/**
+	 * Sets the search method that is currently selected by user.
+	 * @param currentlySelectedSearchMethodInfo The currentlySelectedSearchMethodInfo to set.
+	 */
+	public void setCurrentlySelectedSearchMethodInfo(
+			ISearchMethodExtensionInfo currentlySelectedSearchMethodInfo) {
+		this.currentlySelectedSearchMethodInfo = currentlySelectedSearchMethodInfo;
+		settingsChanged();
+	}
+	
+	/**
+	 * Adds a user settings listener.
+	 * @param listener Setting listener to add.
+	 */
+	public void addUserSettingListener(IUserSettingsListener listener){
+		settingsListeners.add(listener);
+	}
+	
+	/**
+	 * Removes a user settings listener.
+	 * @param listener Setting listener to remove.
+	 */
+	public void removeUserSettingListener(IUserSettingsListener listener){
+		settingsListeners.remove(listener);
+	}
+	
+	/**
+	 * Notifies listeners that the settings has been changed.
+	 */
+	public void settingsChanged(){
+		for (IUserSettingsListener listener : settingsListeners) {
+			listener.userSettingsChanged();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/Product.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,45 @@
+/*
+* 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.apiquery.shared.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.apiquery.shared.common.product"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Product() {
+	}
+	/**
+	 * @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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/ProductInfoRegistry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.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 REPORT_CSS_FILE_NAME = Product.getString("ProductInfoRegistry.report_css_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 REPORT_CSS_FILE_NAME.
+	 */
+	public static String getReportCSSFileName() {
+		return 	REPORT_CSS_FILE_NAME;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/common/product.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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.Product_Name=API Query
+ProductInfoRegistry.Console_Window_Name_Postfix=Console
+ProductInfoRegistry.Images_Directory=icons
+ProductInfoRegistry.Resources_Relative_Path=resources
+ProductInfoRegistry.report_css_File_Name=htmlReportStyles.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIDetailField.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.datatypes;
+
+/**
+ * Stores a single field of information
+ * for API details.
+ */
+public class APIDetailField {
+
+	public static final String VALUE_FIELD_SEPARATOR = ", "; //$NON-NLS-1$
+
+	/**
+	 * Description for the detail field.
+	 */
+	private final String description;
+	/**
+	 * Value for the detail field.
+	 */
+	private String value;
+
+	/**
+	 * Constructor.
+	 * @param description Description for the detail field.
+	 * @param value Value for the detail field.
+	 */
+	public APIDetailField(String description, String value){
+		this.description = description;
+		this.value = value;
+		
+	}
+
+	/**
+	 * Gets the description of the field.
+	 * @return the description
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * Gets the value of the field.
+	 * @return the value
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * Appends new data to existing value string.
+	 * @param strToAppend String to be appended to existing value string.
+	 */
+	public void appendToExistingValue(String strToAppend) {
+		value = value + VALUE_FIELD_SEPARATOR + strToAppend;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIDetails.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.datatypes;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Stores API details information in the format
+ * that is directly used by UI components.
+ */
+public class APIDetails  implements Iterable<APIDetailField>{
+	
+	/**
+	 * Stores detail fields.
+	 */
+	private Map<String, APIDetailField> details;
+		
+	/**
+	 * Constructor.
+	 */
+	public APIDetails(){
+		//Linked hash map preserves the order of the fields 
+		//which is needed in this case. 
+		details = new LinkedHashMap<String, APIDetailField> ();
+	}
+	
+	/**
+	 * Adds a new field into API details.
+	 * @param description Description for the detail. 
+	 * @param value	Value for the detail.
+	 */
+	public void addOrUpdateField(String description, String value){
+		APIDetailField oldApiDetail = details.get(description);
+		if(oldApiDetail != null){
+			oldApiDetail.appendToExistingValue(value);
+		}
+		else{
+			details.put(description, new APIDetailField(description, value));			
+		}
+	}
+	
+	/**
+	 * Adds a new field into API details.
+	 * @param field to be added.
+	 */
+	public void addOrUpdateField(APIDetailField field){
+		APIDetailField oldApiDetail = details.get(field.getDescription());
+		if(oldApiDetail != null){
+			oldApiDetail.appendToExistingValue(field.getValue());
+		}
+		else{
+			details.put(field.getDescription(), field);			
+		}
+	}	
+	
+	/**
+	 * Gets the details as an iterator.
+	 * @return Iterator containing detail fields.
+	 */
+	public Iterator<APIDetailField> iterator(){
+		return details.values().iterator();		
+	}
+	
+	/**
+	 * Gets the keys. Can be used for getting fields by description this.getDetail(key)
+	 * @return Iterator containing detail fields.
+	 */
+	public Set<String> getKeys(){
+		return details.keySet();		
+	}	
+	
+	/**
+	 * Get value for for the description
+	 * @param description 
+	 * @return API Detail Field or new APIDetailField with given description and empty ("") value if not exist.
+	 * @see com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils 
+	 * 		public static variables for description keys.
+	 */
+	public APIDetailField getDetail(String description){
+		APIDetailField detail = details.get(description);
+		if(detail != null){
+			return detail;
+		}else{
+			return new APIDetailField(description,""); //$NON-NLS-1$
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIQueryParameters.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,243 @@
+/*
+* 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.apiquery.shared.datatypes;
+
+import java.util.ArrayList;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+
+/**
+ * Used to store parameters for an API query.
+ */
+public class APIQueryParameters {
+
+
+	//
+	// Query types
+	//
+	public static final int QUERY_BY_API_NAME = 1;
+	public static final int QUERY_BY_SUBSYSTEM_NAME = 2;
+	public static final int QUERY_BY_DLL_NAME = 3;
+	public static final int QUERY_BY_LIB_NAME = 4;
+	public static final int QUERY_BY_HEADER_NAME = 5;
+	public static final int QUERY_BY_CRPS_KEY_NAME = 6;
+	
+	/**
+	 * Search can contain multiple search items that can be
+	 * separated with this separator char.
+	 */
+	public static final String SEARCH_ITEM_SEPARATOR_CHAR = ";"; //$NON-NLS-1$
+	
+	/**
+	 * Query type.
+	 */
+	private final int queryType;
+	
+	/**
+	 * Search string used for the query.
+	 */
+	private final String searchString;
+	
+	/**
+	 * Is query from UI thread or not
+	 */
+	private boolean isQueryFromUI = true;
+	
+	/**
+	 * is API Details ment to add to Descriptions when search is done.
+	 */
+	private boolean isDetailsMentToAddToDescriptions = false;	
+	
+	/**
+	 * If Exact match shoud be used instead of contains when search results is gathered.
+	 */
+	boolean isExactMatchInUse = false;
+	
+	/**
+	 * Constructor.
+	 * @param queryType Query type.
+	 * @param searchString Search string used for the query.
+	 * @throws java.lang.IllegalArgumentException
+	 * @see java.lang.IllegalArgumentException
+	 */
+	public APIQueryParameters(int queryType, String searchString){
+		this.queryType = queryType;
+		this.searchString = searchString.trim();
+		validateArguments();
+	}
+
+
+	/**
+	 * @return the isQueryFromUI
+	 */
+	public boolean isQueryFromUI() {
+		return isQueryFromUI;
+	}
+
+
+	/**
+	 * @param isQueryFromUI the isQueryFromUI to set
+	 */
+	public void setQueryFromUI(boolean isQueryFromUI) {
+		this.isQueryFromUI = isQueryFromUI;
+	}
+
+
+	/**
+	 * Validating the parameter data.
+	 * @throws java.lang.IllegalArgumentException
+	 * @see java.lang.IllegalArgumentException
+	 */
+	private void validateArguments() {
+		if(queryType < 1 || queryType >6){
+			throw new IllegalArgumentException(Messages.getString("APIQueryParameters.UnsupportedQueryType_Msg") + queryType); //$NON-NLS-1$
+		}
+	}
+
+
+	/**
+	 * @return the queryType
+	 */
+	public int getQueryType() {
+		return queryType;
+	}
+
+
+	/**
+	 * @return the searchString
+	 */
+	public String getSearchString() {
+		return searchString;
+	}
+	
+	/**
+	 * Returns currently supported query types.
+	 * @return Array of integer constants for the currently
+	 *         supported query types.
+	 */
+	public static Integer[] getQueryTypes(){
+		ArrayList<Integer> queryTypesArr = new ArrayList<Integer>();
+		for (int i = QUERY_BY_API_NAME; i <= QUERY_BY_CRPS_KEY_NAME; i++) {
+			queryTypesArr.add(new Integer(i));
+		}
+		return queryTypesArr.toArray(new Integer[0]);
+	}
+	
+	/**
+	 * Maps query type to description.
+	 * @param queryType Query type constant.
+	 * @return Description for the given query type.
+	 */
+	public static String getDescriptionForQueryType(int queryType){
+		
+		String desc = null;
+		
+		switch (queryType) {
+		
+		case QUERY_BY_API_NAME:
+			desc = Messages.getString("APIQueryParameters.APIName_Msg"); //$NON-NLS-1$
+			break;
+
+		case QUERY_BY_SUBSYSTEM_NAME:
+			desc = Messages.getString("APIQueryParameters.SubsystemName_Msg"); //$NON-NLS-1$
+			break;
+
+		case QUERY_BY_DLL_NAME:
+			desc = Messages.getString("APIQueryParameters.DLLName_Msg"); //$NON-NLS-1$
+			break;
+
+		case QUERY_BY_LIB_NAME:
+			desc = Messages.getString("APIQueryParameters.LIBName_Msg"); //$NON-NLS-1$
+			break;
+
+		case QUERY_BY_HEADER_NAME:
+			desc = Messages.getString("APIQueryParameters.HeaderName_Msg"); //$NON-NLS-1$
+			break;
+
+		case QUERY_BY_CRPS_KEY_NAME:
+			desc = Messages.getString("APIQueryParameters.CR_PS_Name_Msg"); //$NON-NLS-1$
+			break;
+
+		default:
+			throw new IllegalArgumentException(Messages.getString("APIQueryParameters.QueryTypePart1_ErrMsg")  //$NON-NLS-1$
+					                           + queryType
+					                           + Messages.getString("APIQueryParameters.QueryTypePart2_ErrMsg") //$NON-NLS-1$
+					                           );
+		}
+		
+		return desc;
+	}
+		
+	
+	
+
+	/**
+	 * Maps query type to description.
+	 * @param queryType Query type constant as Integer object..
+	 * @return Description for the given query type.
+	 */
+	public static String getDescriptionForQueryType(Integer queryType){
+		return getDescriptionForQueryType(queryType.intValue());
+	}	
+	
+	/**
+	 * Gets default query type. 
+	 * @return Returns default query type.
+	 */
+	public static int getDefaultQueryType(){
+		// NOTE: This query type SHOULD be supported by ALL search methods.
+		return QUERY_BY_API_NAME;
+	}
+
+
+	/**
+	 * Check if {@link APIDetails} should be added to {@link APIShortDescription}:s when 
+	 * query is executed.
+	 * @return <code>true</code> if API Details should be added to Descriptions, <code>false</code> otherwise.
+	 */
+	public boolean isDetailsMentToAddToDescriptions() {
+		return isDetailsMentToAddToDescriptions ;
+	}
+	/**
+	 * Set if {@link APIDetails} should be added to {@link APIShortDescription}:s when 
+	 * query is executed.
+	 * @param <code>true</code> if {@link APIDetails} should be added to {@link APIShortDescription}:s when 
+	 * query is executed.
+	 */
+	public void setDetailsMentToAddToDescriptions(
+			boolean isDetailsMentToAddToDescriptions) {
+		this.isDetailsMentToAddToDescriptions = isDetailsMentToAddToDescriptions;
+	}
+	
+	/**
+	 * Check if exact match should be used instead of contain when search results are compared
+	 * @return the isExactMatchInUse <code>true</code> if exact match should be used, <code>false</code> otherwise.
+	 */
+	public boolean isExactMatchInUse() {
+		return isExactMatchInUse;
+	}
+
+
+	/**
+	 * Set if exact match should be used instead of contain when search results are compared.
+	 * @param isExactMatchInUse <code>true</code> if exact match should be used, <code>false</code> otherwise.
+	 */
+	public void setExactMatchInUse(boolean isExactMatchInUse) {
+		this.isExactMatchInUse = isExactMatchInUse;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIShortDescription.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,116 @@
+/*
+* 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.apiquery.shared.datatypes;
+
+import java.util.ArrayList;
+
+/**
+ * Stores information related to a single API Summary
+ * object to be shown in UI.
+ */
+public class APIShortDescription {
+
+	/**
+	 * Name of the API in question.
+	 */
+	private final String name;
+	
+	/**
+	 * Source this informatio summary is got from. 
+	 */
+	private final String source;
+
+	/**
+	 * Description for the source shown in the UI.
+	 */
+	private final String sourceDescription;
+	
+	private ArrayList<String> detailsShortData = null;
+
+
+	private APIDetails apiDetails = null;
+
+	/**
+	 * Constructor. 
+	 * @param name Name of the API.
+	 * @param source Source this information summary is got from. Can be used
+	 *               to find further details.
+	 * @param sourceDescription Description for the source shown in the UI.
+	 */
+	public APIShortDescription(String name, String source, String sourceDescription){
+		this.name = name;
+		this.source = source;
+		this.sourceDescription = sourceDescription;		
+	}
+
+	/**
+	 * @return the name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @return the source
+	 */
+	public String getSource() {
+		return source;
+	}
+
+	/**
+	 * @return the sourceDescription
+	 */
+	public String getSourceDescription() {
+		return sourceDescription;
+	}
+
+	/**
+	 * Set API Details for this Description
+	 * @param apiDetails
+	 */
+	public void setAPIDetails(APIDetails apiDetails) {
+		this.apiDetails = apiDetails;
+	}
+	
+	/**
+	 * Get API Details for this Description
+	 * @param apiDetails or <code>null</code> if not set.
+	 */
+	public APIDetails getAPIDetails() {
+		return apiDetails;
+	}
+
+	/**
+	 * Check if this Description has {@link APIDetails} added.
+	 * @return <code>true</code> if API Details is added, <code>false</code> otherwise.
+	 */
+	public boolean hasAPIDetails(){
+		return apiDetails != null;
+	}
+	
+	public  void addSerachedData (ArrayList<String> serachedData) {
+		
+		this.detailsShortData =serachedData;
+			}
+	
+public ArrayList<String>  	getSearchedData()
+{
+	return  detailsShortData;
+}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/APIShortDescriptionSearchResults.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,114 @@
+/*
+* 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.apiquery.shared.datatypes;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+
+/**
+ * Class for holding search results and search errors. 
+ */
+public class APIShortDescriptionSearchResults {
+	
+	public APIShortDescriptionSearchResults(){
+		searchResults = new ArrayList<APIShortDescription>();
+		searchErrors = new ArrayList<QueryOperationFailedException>();
+	}
+	
+	/**
+	 * Search results
+	 */
+	private Collection<APIShortDescription> searchResults = null;
+	
+	/**
+	 * Search errors
+	 */
+	private Collection<QueryOperationFailedException> searchErrors = null;
+
+	/**
+	 * @return the searchResults
+	 */
+	public Collection<APIShortDescription> getSearchResults() {
+		return searchResults;
+	}
+
+	/**
+	 * @param searchResults the searchResults to set
+	 */
+	public void addSearchResults(Collection<APIShortDescription> searchResults) {
+		//Can't add null to results
+		if(searchResults != null){
+			this.searchResults.addAll(searchResults);
+		}
+	}
+
+	/**
+	 * Get errors occurred when queries was executed 
+	 * @return the searchErrors
+	 */
+	public Collection<QueryOperationFailedException> getSearchErrors() {
+		return searchErrors;
+	}
+
+	/**
+	 * Add one search error.
+	 * @param searchError
+	 */
+	public void addSearchError(QueryOperationFailedException searchError) {
+
+		if(searchError != null){
+			this.searchErrors.add(searchError);
+		}
+	}
+	
+	/**
+	 * Check if there was some errors whit queries.
+	 * @return <code>true</code> if there was some errors <code>false</code> otherwise. 
+	 */
+	public boolean hasErrors(){
+		return !this.searchErrors.isEmpty();
+	}
+	
+	/**
+	 * Get all error messages. One message takes one line, so if there is many errors there is as many lines of text also.
+	 * @return Errors as list or empty string if there was not any.
+	 */
+	public String getErrorMessages(){
+		if(!hasErrors()){
+			return new String();
+		}
+		else{
+			StringBuffer errors = new StringBuffer();
+			int count = searchErrors.size();
+			int i = 0;
+			for (Iterator<QueryOperationFailedException> iterator = searchErrors.iterator(); iterator.hasNext();) {
+				QueryOperationFailedException err = (QueryOperationFailedException) iterator.next();
+				errors.append(err.getMessage());
+				if(count > 1 && i < (count - 1)){
+					errors.append("\n");//$NON-NLS-1$
+				}
+				i++;
+			}
+			return errors.toString();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/FieldMappingRules.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.datatypes;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+
+/**
+ * Stores field mapping rules that can be used to
+ * map API detail field descriptions to XML 
+ * and vice versa.
+ */
+public class FieldMappingRules {
+
+	/**
+	 * Storage for the mapping rules.
+	 */
+	Map <String, String> ruleMap;
+	
+	/**
+	 * Constructor
+	 */
+	public FieldMappingRules(){
+		ruleMap = new HashMap<String, String>();
+	}
+	
+	/**
+	 * Adds a new rule to the mapping rules.
+	 * @param mapFromStr String to map from.
+	 * @param mapToStr String to map into.
+	 */
+	public void addRule(String mapFromStr, String mapToStr){
+		ruleMap.put(mapFromStr, mapToStr);
+	}
+	
+	/**
+	 * Gets the string that was mapped into the given parameter string.
+	 * @param keyStr Key string to ask mapped result for.
+	 * @return Returns result string or throws <code>IllegalArgumentException</code>
+	 *         if no .
+	 * @throws java.lang.IllegalArgumentException
+	 * @see java.lang.IllegalArgumentException
+	 */
+	public String mapFrom(String keyStr){
+		String resultStr = ruleMap.get(keyStr);
+		if(resultStr == null){
+			throw new IllegalArgumentException(Messages.getString("FieldMappingRules.NoMappingRule_ErrMsg") + keyStr); //$NON-NLS-1$
+		}
+		return resultStr;
+	}
+	
+	/**
+	 * Returns key set that this field mapping rule instance 
+	 * has mapping rules for.
+	 * @return Set of String key values.
+	 */
+	public Set<String> getMapFromKeySet(){
+		return ruleMap.keySet();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/QueryErrorInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.datatypes;
+
+/**
+ * Simple class for storing error information returned query operations.
+ * This is needed because queries are runned inside a runnable and
+ * error info is got via try/catch, and the error information usage
+ * related needs to be done outside runnable where catch is made. 
+ * This class should stay with package private visibility.
+ */
+public class QueryErrorInfo{		
+	/**
+	 * Error description is set on failure.
+	 */
+	private String errorDescription = new String();
+	
+	/**
+	 * Gets error description.
+	 * @return the errorDescription
+	 */
+	public String getErrorDescription() {
+		return errorDescription;
+	}
+
+	/**
+	 * Sets error description.
+	 * @param errorDescription the errorDescription to set
+	 */
+	public void setErrorDescription(String errorDescription) {
+		this.errorDescription = errorDescription;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/XMLToUIMappingRules.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,132 @@
+/*
+* 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.apiquery.shared.datatypes;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Extends field mapping rules class by 
+ * including definitions for attributes.
+ */
+public class XMLToUIMappingRules extends FieldMappingRules {
+	
+	/**
+	 * Storage for attributes that are examined for a certain
+	 * element.
+	 */
+	private Map <String, Map<String, String>> attributeMap;
+	
+	/**
+	 * Storing rules that enforces that rule does not match 
+	 * unless the parent element also matches.
+	 * It is optional to set this restriction for a rule.
+	 */
+	private Map <String, String> parentElementRestrictionMap = null;	
+	
+
+	/**
+	 * Constructor.
+	 */
+	public XMLToUIMappingRules(){
+		super();
+		attributeMap = new HashMap<String, Map<String, String>>();
+		parentElementRestrictionMap = new HashMap<String, String>();
+	}
+
+	/**
+	 * Adds a new rule to the mapping rules including
+	 * a set of attribute names to be stored.
+	 * @param elementNameStr Element name string to map from.
+	 * @param mapToStr String to map into.
+	 * @param attributes Set of attribute names to be converted.
+	 */
+	public void addRule(String elementNameStr, String mapToStr, Map<String, String> attributes){
+		super.addRule(elementNameStr, mapToStr);
+		attributeMap.put(elementNameStr, attributes);
+	}
+
+	
+	/**
+	 * @return the attributeMap
+	 */
+	public Map<String, Map<String, String>> getAttributeMap() {
+		return attributeMap;
+	}
+
+	/**
+	 * Adds a new rule to the mapping rules.
+	 * @param mapFromStr String to map from.
+	 * @param mapToStr String to map into.
+	 * @param parentElementRestriction Rule matches only if the parent name matches. 
+	 */
+	public void addRule(String mapFromStr, String mapToStr, String parentElementRestriction){
+		this.parentElementRestrictionMap.put(mapFromStr, parentElementRestriction);
+		ruleMap.put(mapFromStr, mapToStr);
+	}
+
+	/**
+	 * Adds a new rule to the mapping rules including
+	 * a set of attribute names to be stored.
+	 * @param elementNameStr Element name string to map from.
+	 * @param mapToStr String to map into.
+	 * @param parentElementRestriction Rule matches only if the parent name matches. 
+	 * @param attributes Set of attribute names to be converted.
+	 */
+	public void addRule(String elementNameStr, String mapToStr, 
+			            String parentElementRestriction, Map<String, String> attributes){
+		super.addRule(elementNameStr, mapToStr);
+		this.parentElementRestrictionMap.put(elementNameStr, parentElementRestriction);
+		attributeMap.put(elementNameStr, attributes);
+	}
+	
+
+	/**
+	 * Gets parent element restriction for an element.
+	 * @param elementNameStr Element name.
+	 * @return parent element restriction or <code>null</code> if does not exist.
+	 */
+	public String getParentElementRestriction(String elementNameStr) {
+		return parentElementRestrictionMap.get(elementNameStr);
+	}
+	
+	/**
+	 * Check existence of parent element restriction for an element.
+	 * @param elementNameStr Element name.
+	 * @return <code>true</code> if has restriction, otherwise <code>false</code>.
+	 */
+	public boolean hasParentElementRestriction(String elementNameStr) {
+		return parentElementRestrictionMap.containsKey(elementNameStr);
+	}
+
+	/**
+	 * Return parent restrictions for conversion rules.
+	 * @return Parent restrictions for conversion rules.
+	 */
+	public Map<String, String> getParentElementRestrictionMap() {
+		return parentElementRestrictionMap;
+	}
+
+	/**
+	 * Get map for attribute header names
+	 * @return attribute headers or <code>null</code> if not set
+	 */
+	public Map <String,String> getAttributeNamesMap(String elementNameStr) {
+		return getAttributeMap().get(elementNameStr);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/AbstractEntry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,129 @@
+/*
+* 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.apiquery.shared.datatypes.config;
+
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+
+
+/**
+ * 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 AbstractEntry {
+
+	/**
+	 * User configurable id for the entry. The entries
+	 * are identified by there unique id per search method 
+	 * configuration storage.
+	 */
+	protected final String id;
+	/**
+	 * Set to <code>true</code> if user has selected this entry to
+	 * be part of the search, otherwise <code>false</code>,
+	 */
+	protected boolean isSelected;
+
+	/**
+	 * Constructor
+	 * @param id Entry id.that is unique per search method. 
+	 * @param isSelected Is the entry used for queries by default.
+	 */
+	protected AbstractEntry(String id, boolean isSelected){
+		this.id = id;
+		this.isSelected = isSelected;		
+	}
+	
+	/**
+	 * @return the id for the entry.
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @return the isSelected
+	 */
+	public boolean isSelected() {
+		return isSelected;
+	}
+
+	/**
+	 * Sets selection status for the entry 
+	 * and notifies storage about the modification.
+	 * @param isSelected the isSelected to set
+	 */
+	public void setSelected(boolean isSelected) {
+		this.isSelected = isSelected;
+		if(isSelected){
+			notifyModification(IConfigurationChangedListener.ENTRY_CHECKED);			
+		}
+		else{
+			notifyModification(IConfigurationChangedListener.ENTRY_UNCHECKED);			
+		}
+	}
+	
+	/**
+	 * Sets selection status for the entry 
+	 * and notifies storage about the modification.
+	 * @param isSelected the isSelected to set
+	 * @param dontNotifyListeners if <code>true</code> listeners will not be notified.
+	 */	
+	public void setSelected(boolean isSelected, boolean dontNotifyListeners) {
+		if(dontNotifyListeners){
+			this.isSelected = isSelected;
+		}
+		else {
+			setSelected(isSelected);
+		}
+	}	
+	
+	/**
+	 * Notifies storage object that this entry has been modified.
+	 * @param eventType Event type of the modification.
+	 */
+	protected void notifyModification(int eventType){
+		ISearchMethodExtensionInfo currSelExtInfo =  UserSettings.getInstance().getCurrentlySelectedSearchMethodInfo();
+		String id = currSelExtInfo.getId();
+		ISearchMethodExtension currSelExt = SearchMethodExtensionRegistry.getInstance().getById(id);
+		AbstractEntryStorage storage = currSelExt.getEntryStorageInstance();
+		storage.entryModified(this, eventType);
+	}
+	
+	/**
+	 * Calls template method to updates concrete type entry-specific data fields
+	 * and notifies listeners about the modification.
+	 * @param entryWithUpdatedData Entry with new data.
+	 */
+	public void updateDataFields(AbstractEntry entryWithUpdatedData){
+		updateEntryTypeSpecificDataFields(entryWithUpdatedData);
+		notifyModification(IConfigurationChangedListener.ENTRY_MODIFIED);
+	}	
+	
+	/**
+	 * The following template method updates concrete type entry-specific data fields.
+	 * @param entryWithUpdatedData Entry with new data.
+	 */
+	public abstract void updateEntryTypeSpecificDataFields(AbstractEntry entryWithUpdatedData);
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/AbstractEntryStorage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,261 @@
+/*
+* 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.apiquery.shared.datatypes.config;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+
+/**
+ * Abstract entry storage base class that contains only 
+ * the methods that are common for all entry types.
+ * 
+ * To be subclassed in order to create concrete entry storage.
+ */
+public abstract class AbstractEntryStorage {
+
+	/**
+	 * Entry storage Map.
+	 */
+	protected Map<String, AbstractEntry> entriesMap = new LinkedHashMap<String, AbstractEntry>();
+	/**
+	 * Configuration change listener list.
+	 */
+	protected ArrayList<IConfigurationChangedListener> configChangeListeners = new ArrayList<IConfigurationChangedListener>();
+
+	/**
+	 * Constructor
+	 */
+	protected AbstractEntryStorage(){		
+	}
+	
+	/**
+	 * Adds configuration change listener.
+	 * @param listener Configuration change listener.
+	 */
+	public void addConfigurationChangeListener(IConfigurationChangedListener listener) {
+		configChangeListeners.add(listener);
+	}
+
+	/**
+	 * Removes configuration change listener.
+	 * @param listener Configuration change listener.
+	 */
+	public void removeConfigurationChangeListener(IConfigurationChangedListener listener) {
+		configChangeListeners.remove(listener);
+	}
+
+	/**
+	 * Notifies listeners about the configuration change.
+	 * @param eventType Event type .
+	 */
+	public void notifyConfigurationChangeListeners(int eventType) {
+		for (IConfigurationChangedListener listener : configChangeListeners) {
+			listener.configurationChanged(eventType);
+		}
+	}
+
+	/**
+	 * Adds an entry to the storage.
+	 * @param entry Entry to be added.
+	 * @throws DuplicateEntryException 
+	 */
+	public void addEntry(AbstractEntry entry) throws DuplicateEntryException {
+		if(entriesMap.get(entry.getId()) != null){
+			String duplicateEntriesErrMsg = Messages.getString("AbstractEntryStorage.Duplicate_ErrMsg"); //$NON-NLS-1$
+			throw new DuplicateEntryException(duplicateEntriesErrMsg);
+		}
+		entriesMap.put(entry.getId(), entry);
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ENTRY_ADDED);
+	}
+
+	/**
+	 * Updates an entry to the storage.
+	 * @param entryWithNewData Entry object containing new data.
+	 * @throws EntryNotFoundException 
+	 */
+	public void updateEntry(AbstractEntry entryWithNewData) throws EntryNotFoundException {
+		AbstractEntry entryWithOldData = (AbstractEntry) entriesMap.get(entryWithNewData.getId());
+		if(entryWithOldData == null){
+			String nonExistingEntryMsg = Messages.getString("AbstractEntryStorage.NonExistingEntry_ErrMsg") + entryWithNewData.getId(); //$NON-NLS-1$
+			throw new EntryNotFoundException(nonExistingEntryMsg);
+		}
+		// Updating data fields (which triggers notification to configuration change listeners)
+		entryWithOldData.updateDataFields(entryWithNewData);
+	}	
+		
+	/**
+	 * Removes the given entry from the storage.
+	 * @param entry Entry.
+	 */
+	public void removeEntry(AbstractEntry entry) {
+		entriesMap.remove(entry.getId());
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ENTRY_REMOVED);		
+	}
+	
+	/**
+	 * Remove all entrys.
+	 */
+	public void removeAllEntrys() {
+		entriesMap.clear();
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRYS_REMOVED);		
+	}
+		
+
+	/**
+	 * Returns the iterator for the currently registered entries.
+	 * @return Returns the currently registered entries.
+	 */
+	public Collection<AbstractEntry> getEntries() {
+		return entriesMap.values();
+	}
+
+	/**
+	 * Gets the amount of currently registered entries.
+	 * @return Returns the amount of currently registered entries.
+	 */
+	public int getEntryCount() {
+		return getEntries().size();
+	}
+
+	/**
+	 * Gets the entry that matches with the given id.
+	 * @param entryId Id for the entry.
+	 * @return The entry matching the id or <code>null</code> if not found.
+	 */
+	public AbstractEntry getByEntryId(String entryId) {
+		for (AbstractEntry entry : getEntries()) {			
+			if(entry.getId().equals(entryId)){
+				return entry;
+			}
+		}
+		return null;
+	}
+
+	
+	/**
+	 * Returns those entries that are selected by used from entry storage.
+	 * @return Colletion of selected entries.
+	 */
+	public Collection<AbstractEntry> getSelectedEntriesCollection() {
+		ArrayList<AbstractEntry> selectedList = new ArrayList<AbstractEntry>();
+		for (Iterator<AbstractEntry> iter = getEntries().iterator(); iter.hasNext();) {
+			AbstractEntry entry = (AbstractEntry) iter.next();
+			if(entry.isSelected()){
+				selectedList.add(entry);
+			}
+		}
+		return selectedList;
+	}	
+	
+	/**
+	 * Returns those entries that are selected by used from entry storage.
+	 * @return Array of selected entries.
+	 */
+	public AbstractEntry[] getSelectedEntries() {
+		ArrayList<AbstractEntry> selectedList = new ArrayList<AbstractEntry>();
+		for (Iterator<AbstractEntry> iter = getEntries().iterator(); iter.hasNext();) {
+			AbstractEntry entry = (AbstractEntry) iter.next();
+			if(entry.isSelected()){
+				selectedList.add(entry);
+			}
+		}
+		return selectedList.toArray(new AbstractEntry[0]);
+	}
+
+	/**
+	 * Checks if the given entry is part of the storage.
+	 * @param entry Entry object.
+	 * @return <code>true</code> if part of the storage, otherwise <code>false</code>.
+	 */
+	public boolean contains(AbstractEntry entry) {
+		return entriesMap.containsKey(entry.getId());
+	}
+
+	/**
+	 * Informs storage that an entry has been modified. Storage
+	 * informs further the configuration listeners, if this
+	 * entry was part active configuration.
+	 * @param entry Entry object.
+	 * @param eventType Event type for modification.
+	 */
+	public void entryModified(AbstractEntry entry, int eventType) {
+		if(contains(entry)){
+			// Active configuration has been changed.
+			notifyConfigurationChangeListeners(eventType);
+		}
+	}
+
+	/**
+	 * Selects all stored entries and notifies listeners.
+	 */
+	public void selectAll() {
+		for (AbstractEntry entry : getEntries()) {
+			((AbstractEntry)entry).setSelected(true);
+		}
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRIES_CHECKED);
+	}
+
+	/**
+	 * Selects all stored entries and notifies listeners.
+	 */
+	public void deselectAll() {
+		for (AbstractEntry entry : getEntries()) {
+			((AbstractEntry)entry).setSelected(false);
+		}		
+		notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRIES_UNCHECKED);
+	}
+
+	/**
+	 * Selects all stored entries and notifies listeners.
+	 * @param notifyListenersOnlyWhenAllDeselected if <code>true</code> listeners will be
+	 * notified only when all entrys is deselected, not one by one when deselecting entrys.
+	 */
+	public void deselectAll(boolean notifyListenersOnlyWhenAllDeselected) {
+		
+		if(notifyListenersOnlyWhenAllDeselected){		
+			for (AbstractEntry entry : getEntries()) {
+				((AbstractEntry)entry).setSelected(false, true);
+			}		
+			notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRIES_UNCHECKED);
+		}else{
+			deselectAll();
+		}
+		
+	}	
+
+	/**
+	 * Saves the configuration into an external configuration file.
+	 * <b>Note</b>: Overwrites the contents of the external file.
+	 * @param destinationFileAbsolutePathName Absolute pathname for the external configuration file to be used.
+	 * @throws IOException 
+	 */
+	public abstract void save(String destinationFileAbsolutePathName) throws IOException;
+		
+	/**
+	 * Loads the configuration into an external configuration file.
+	 * @param storageFilePathName Absolute path name for the configuration file.
+	 * @throws IOException 
+	 */
+	public abstract void load(String storageFilePathName) throws IOException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/DuplicateEntryException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,53 @@
+/*
+* 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.apiquery.shared.datatypes.config;
+
+/**
+ * This exception might be raised by the search methods
+ * when query operation fails due to some reason. 
+ * 
+ * There might be several reasons for the failure such as:
+ * 
+ * - Missing or invalid configuration information to run 
+ *   the query operation.
+ * - Required data is not availabe (due to network restrictions, cached data
+ *   is missing from the local disk etc.) 
+ */
+public class DuplicateEntryException extends Exception {
+
+	/**
+	 * Serial versio UID.
+	 */
+	private static final long serialVersionUID = -4168668065952326532L;
+
+	/**
+	 * Default constructor is hidden from the user.
+	 */
+	@SuppressWarnings("unused")
+	private DuplicateEntryException(){
+		super();
+	}
+
+	/**
+	 * Only publicly available constructor is one with detailed error information.
+	 * @param errorMessage Detailed information about the error that caused the exception.
+	 */
+	public DuplicateEntryException(String errorMessage){
+		super(errorMessage);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/EntryNotFoundException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,53 @@
+/*
+* 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.apiquery.shared.datatypes.config;
+
+/**
+ * This exception might be raised by the search methods
+ * when query operation fails due to some reason. 
+ * 
+ * There might be several reasons for the failure such as:
+ * 
+ * - Missing or invalid configuration information to run 
+ *   the query operation.
+ * - Required data is not availabe (due to network restrictions, cached data
+ *   is missing from the local disk etc.) 
+ */
+public class EntryNotFoundException extends Exception {
+
+	/**
+	 * Serial versio UID.
+	 */
+	private static final long serialVersionUID = 803831180171819626L;
+
+	/**
+	 * Default constructor is hidden from the user.
+	 */
+	@SuppressWarnings("unused")
+	private EntryNotFoundException(){
+		super();
+	}
+
+	/**
+	 * Only publicly available constructor is one with detailed error information.
+	 * @param errorMessage Detailed information about the error that caused the exception.
+	 */
+	public EntryNotFoundException(String errorMessage){
+		super(errorMessage);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/datatypes/config/IConfigurationChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.datatypes.config;
+
+/**
+ * Interface for the services that needs to know if 
+ * configuration has been changed. 
+ */
+public interface IConfigurationChangedListener {
+	
+	/**
+	 * Entry  added event type. 
+	 */
+	public static final int ENTRY_ADDED = 0;
+	
+	/**
+	 * Entry  modified event type. 
+	 */
+	public static final int ENTRY_MODIFIED = 1;
+	
+	/**
+	 * Entry removed event type. 
+	 */
+	public static final int ENTRY_REMOVED = 2;
+	
+	/**
+	 * Entry selected event type. 
+	 */
+	public static final int ENTRY_CHECKED = 3;
+	
+	/**
+	 * Entry deselected event type. 
+	 */
+	public static final int ENTRY_UNCHECKED = 4;
+	
+	/**
+	 * All entries selected event type. 
+	 */
+	public static final int ALL_ENTRIES_CHECKED = 5;
+
+	/**
+	 * All entries deselected event type. 
+	 */
+	public static final int ALL_ENTRIES_UNCHECKED = 6;
+	
+	/**
+	 * All Entrys removed event type. 
+	 */
+	public static final int ALL_ENTRYS_REMOVED = 7;
+
+	/**
+	 * All Entrys updated event type. 
+	 */
+	public static final int ALL_ENTRYS_UPDATED = 8;	
+	
+	/**
+	 * All selected Entrys removed event type. 
+	 */
+	public static final int ALL_SELECTED_ENTRYS_REMOVED = 9;	
+	
+	/**
+	 * Configuration change notification method.
+	 * @param eventType One of the event types define in this interface.
+	 */
+	public void configurationChanged(int eventType);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/exceptions/QueryOperationFailedException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,76 @@
+/*
+* 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.apiquery.shared.exceptions;
+
+import java.util.Collection;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+
+/**
+ * This exception might be raised by the search methods
+ * when query operation fails due to some reason. 
+ * 
+ * There might be several reasons for the failure such as:
+ * 
+ * - Missing or invalid configuration information to run 
+ *   the query operation.
+ * - Required data is not availabe (due to network restrictions, cached data
+ *   is missing from the local disk etc.) 
+ */
+public class QueryOperationFailedException extends Exception {
+
+	/**
+	 * Serial versio UID.
+	 */
+	private static final long serialVersionUID = -8124615355279044581L;
+	
+	/**
+	 * API Query summarys for search if those was gathered before error occurred
+	 */
+	private Collection<APIShortDescription> summary = null;
+
+	/**
+	 * Default constructor is hidden from the user.
+	 */
+	@SuppressWarnings("unused")
+	private QueryOperationFailedException(){
+		super();
+	}
+
+	/**
+	 * Only publicly available constructor is one with detailed error information.
+	 * @param errorMessage Detailed information about the error that caused the exception.
+	 */
+	public QueryOperationFailedException(String errorMessage){
+		super(errorMessage);
+	}
+
+	/**
+	 * Set summarys for this exeption
+	 * @param summary
+	 */
+	public void setSummarys(Collection<APIShortDescription> summary) {
+		this.summary = summary;
+	}
+	/**
+	 * @return the summarys or <code>null</code> if not set
+	 */
+	public Collection<APIShortDescription> getSummarys() {
+		return summary;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/exceptions/XMLNotValidException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,58 @@
+/*
+* 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.apiquery.shared.exceptions;
+
+/**
+ * Thrown when invalid XML data is encountered.
+ */
+public class XMLNotValidException extends Exception {
+
+	private static final long serialVersionUID = -3037053770134709611L;
+	private String fileName = null;
+	
+	/**
+	 * Private hidden constructor.
+	 */
+	@SuppressWarnings("unused")
+	private XMLNotValidException(){
+		super();
+	}
+	/**
+	 * Public constructor coming always with descriptive message.
+	 */
+	public XMLNotValidException(String message){
+		super(message);
+	}
+
+	/**
+	 * Public constructor coming always with descriptive message.
+	 */
+	public XMLNotValidException(String message, String fileName){
+		super(message);
+		this.fileName = fileName;
+	}
+
+	/**
+	 * Get file name
+	 * @return file name or <code>null</code> if not set.
+	 */
+	public String getFileName() {
+		return fileName;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/AbstractJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,159 @@
+/*
+* 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.apiquery.shared.job;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Abstract implementation of {@link Job}. Implements few functionalities so sub classes
+ * can be written with less code.
+ */
+public abstract class AbstractJob extends Job implements IJobProgressStatus, IManageableJob{
+
+	protected static final int PROGRESS_COMPLETED_PERCENTAGE = 100;
+	protected int previousPercentage = 0;
+	private IProgressMonitor monitor = null;
+	private Process process = null;
+	private long runMethodStartTime; 
+	
+	protected int steps = 100; // percentage figure
+	
+	/**
+	 * Use only this constructor
+	 * 
+	 * @param name Job name (root component name)
+	 */
+	public AbstractJob(String name) {
+		super(name);		
+	}
+
+	/**
+	 * Get start time and print it
+	 * @return start time in ms (System.currentTimeMillis())
+	 */
+	public long reportStartTime(){
+		this.runMethodStartTime = System.currentTimeMillis();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+							"Job: '" +super.getName() + "' start time: "   //$NON-NLS-1$ //$NON-NLS-2$
+							+ new Date(runMethodStartTime).toString());	
+		return runMethodStartTime;	
+	}
+	
+	/**
+	 * count time taken since startTime, printing it
+	 * @param runMethodStartTime
+	 */
+	public void reportEndTime(){
+		long endTime = System.currentTimeMillis();		
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+				"Job " +super.getName() + " ended: " + new Date(endTime).toString());  //$NON-NLS-1$ //$NON-NLS-2$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+						  "TOTAL: "  //$NON-NLS-1$
+				           + (endTime-runMethodStartTime)/1000.0 + " seconds!"); //$NON-NLS-1$
+	}
+	
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.job.IJobProgressStatus#progress(int, java.lang.String)
+	 */
+	public void progress(int percentage, String prosessing) 
+		throws JobCancelledByUserException {
+				
+        if (isCanceled()){
+        	String msg = Messages.getString("AbstractJob.JobCancelled_Part1_ErrMsg") +super.getName() + Messages.getString("AbstractJob.JobCancelled_Part2_ErrMsg"); //$NON-NLS-1$ //$NON-NLS-2$
+		    throw new JobCancelledByUserException(msg);
+        }
+        //Making sure that there is no percentages higher than 100
+        if(percentage > PROGRESS_COMPLETED_PERCENTAGE){
+        	percentage = PROGRESS_COMPLETED_PERCENTAGE;
+        }
+        
+        monitor.subTask(percentage + Messages.getString("AbstractJob.Percentage_Complete_Msg")        		         //$NON-NLS-1$
+        		        + Messages.getString("AbstractJob.Prosessing_Msg") //$NON-NLS-1$
+        		        + prosessing);			
+        monitor.worked(percentage - previousPercentage);
+        previousPercentage = percentage;
+
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.job.IJobProgressStatus#isCanceled()
+	 */
+	public boolean isCanceled() {
+		return monitor.isCanceled();
+	}	
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.job.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		if(process != null){
+			process.destroy();
+			try {
+				process.waitFor();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}					
+		}
+	}
+
+
+	/**
+	 * Get Process
+	 * @return Process
+	 */
+	protected Process getProcess() {
+		return process;
+	}
+
+
+	/**
+	 * Set process
+	 * @param process
+	 */
+	protected void setProcess(Process process) {
+		this.process = process;
+	}
+
+	/**
+	 * Get progress monitor
+	 * @return
+	 */
+	protected IProgressMonitor getMonitor() {
+		return monitor;
+	}
+
+	/**
+	 * Set progress monitor to this Job
+	 * @param monitor
+	 */
+	protected void setMonitor(IProgressMonitor monitor) {
+		this.monitor = monitor;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/FindFileFromFoldersJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,235 @@
+/*
+* 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.apiquery.shared.job;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.resource.FileFinder;
+import com.nokia.s60tools.util.resource.IFileFinderObserver;
+
+/**
+ * Job for seeking header file from under SDK:s include paths given given. 
+ */
+public class FindFileFromFoldersJob extends AbstractJob implements IFileFinderObserver {
+
+
+	
+	/**
+	 * Total steps as double, to be able to count percentages.
+	 */
+	double stepsAsDouble = 1;
+
+	/**
+	 * Name of the file to be seeked
+	 */
+	private final String fileName;
+
+	/**
+	 * Paths where to seek the file
+	 */
+	private final List<File> paths;
+
+	/**
+	 * Unique ID of SDK where file is seeked.
+	 */
+	private final String sdkId;
+
+	/**
+	 * Collection holds files found to be returned for client.
+	 */
+	private Collection<File> foundFiles = null;
+	
+	
+	/**
+	 * Create a Job to seek .metaxml files under selected SDK.
+	 * @param name
+	 * @param sdkInformation
+	 */
+	public FindFileFromFoldersJob(String name, List<File> paths, String fileName, String sdkId) {
+		super(name);
+		this.paths = paths;
+		this.fileName = fileName;
+		this.sdkId = sdkId;
+		setUser(true);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		setMonitor(monitor);
+		try {			
+			reportStartTime();
+			FileFinder finder = new FileFinder(APIQueryConsole.getInstance());
+
+			String fileNames [] = new String[1];
+			fileNames[0] = fileName;
+			String [] folders = new String[paths.size()];
+			int i = 0;
+			for (Iterator<File> iterator = paths.iterator(); iterator.hasNext();) {
+				File file = (File) iterator.next();
+				folders[i] = file.getAbsolutePath();
+				i++;
+			}
+			finder.seekFilesFromFolders(this, fileNames, folders);
+			return Job.ASYNC_FINISH;
+		} catch (Exception e) {
+			IStatus status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,Messages.getString("FindFileFromFoldersJob.ErrorOnSeekin_StatusMsg_Part1") +fileName +Messages.getString("FindFileFromFoldersJob.ErrorOnSeekin_StatusMsg_Part2") +sdkId, e);  //$NON-NLS-1$ //$NON-NLS-2$
+			return status;
+		}
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#completed(int, java.util.Collection)
+	 */
+	public void completed(int exitValue, Collection<File> files) {
+
+		try {
+			if(isCanceled() || exitValue == IStatus.CANCEL){
+				interrupted(Messages.getString("FindFileFromFoldersJob.CancelledByUser_Msg"));  //$NON-NLS-1$
+			}
+			else if(exitValue == IStatus.OK){
+				handleSeekCompleatedOK(files);
+			}
+			else{
+				handleSeekCompleatedError(exitValue);
+			}
+			reportEndTime();
+		} catch (Exception e) {
+			//Handle file not found e.g. errors.
+			e.printStackTrace();
+			handleSeekCompleatedError(e);
+		}
+	}
+
+	/**
+	 * Handle Error situations after getting data
+	 * @param e
+	 */
+	private void handleSeekCompleatedError(Exception e) {
+		String message = Messages.getString("FindFileFromFoldersJob.ErrorSeekingFile_ErrMsg_Part1") +fileName +Messages.getString("FindFileFromFoldersJob.ErrorSeekingFile_ErrMsg_Part2") +sdkId;  //$NON-NLS-1$ //$NON-NLS-2$
+		APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR);
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,message, e);
+		
+		done(status);
+	}
+	
+	/**
+	 * Handle error return values
+	 * @param exitValue
+	 */
+	private void handleSeekCompleatedError(int exitValue) {
+		String message = Messages.getString("FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part1") +fileName +Messages.getString("FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part2") +sdkId + Messages.getString("FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part3") +exitValue;  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR);		
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,message, null);
+		
+		done(status);
+	}
+
+	/**
+	 * If status was OK, handling completed situation
+	 * @param files
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private void handleSeekCompleatedOK(Collection<File> files) throws FileNotFoundException, IOException {
+
+		//We are pretty much done, so marking that we are in 100% of progress, opening file found won't happen in this job anyway
+		progress(steps, Messages.getString("FindFileFromFoldersJob.FileFound_Progress_Msg_Part1") +fileName +Messages.getString("FindFileFromFoldersJob.FileFound_Progress_Msg_Part2"));  //$NON-NLS-1$ //$NON-NLS-2$
+		foundFiles = files;
+		reportEndTime();
+		done(Status.OK_STATUS);			
+	}
+
+
+	/**
+	 * Get file found in job
+	 * @return files found
+	 */
+	public Collection<File> getFoundSourceFiles(){
+		return foundFiles;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#interrupted(java.lang.String)
+	 */
+	public void interrupted(String reasonMsg) {
+		done(Status.CANCEL_STATUS);
+		super.cancel();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#isCancelled()
+	 */
+	public boolean isCanceled(){
+		return getMonitor().isCanceled();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.resource.IFileFinderObserver#beginTask(java.lang.String, int)
+	 */
+	public void beginTask(String name, int steps) {
+
+		//Its not allowed to dived with "0"
+		if(steps < 1){
+			steps = 1;
+		}
+		this.steps = steps;
+		stepsAsDouble = new Double(steps).doubleValue();
+		
+		getMonitor().beginTask(name, PROGRESS_COMPLETED_PERCENTAGE);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.job.AbstractJob#progress(int, java.lang.String)
+	 */
+	public void progress(int stepsCompleated, String prosessing) {
+
+        try {
+        	int persentage = (new Double( stepsCompleated / stepsAsDouble * 100)).intValue();
+        	
+			super.progress(persentage, prosessing);
+		} catch (JobCancelledByUserException e) {
+			e.printStackTrace();
+			done(Status.CANCEL_STATUS);
+		}
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IJobCompletionListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,37 @@
+/*
+* 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.apiquery.shared.job;
+
+import com.nokia.s60tools.apiquery.shared.job.IManageableJob;;
+
+
+
+/**
+ * Listener interface for object requiring information
+ * about successfull 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IJobProgressStatus.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.job;
+
+
+public interface IJobProgressStatus {
+	/**
+	 * 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.
+	 * @param processedItem Item that is currently under processing.
+	 * @throws JobCancelledByUserException 
+	 */
+	public void progress(int percentage, String processedItem) throws JobCancelledByUserException;
+
+	/**
+	 * Checks if job has been cancelld by the user.
+	 * @return Returns <code>true</code> if jobs has been cancelled by user, 
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isCanceled();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/IManageableJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,30 @@
+/*
+* 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.apiquery.shared.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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/job/JobCancelledByUserException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,32 @@
+/*
+* 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.apiquery.shared.job;
+
+/**
+ * {@link Exception} class for Job cancelled by User.
+ */
+public class JobCancelledByUserException extends Exception {
+
+	public JobCancelledByUserException(String msg) {
+		super(msg);
+	}
+
+
+	private static final long serialVersionUID = -235428303120175424L;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/plugin/APIQueryPlugin.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,532 @@
+/*
+* 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.apiquery.shared.plugin;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Properties;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWT;
+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.apiquery.settings.IUserSettingsListener;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.common.ProductInfoRegistry;
+import com.nokia.s60tools.apiquery.shared.resources.ImageKeys;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.dialogs.FirstTimePopUpDialog;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class APIQueryPlugin extends AbstractUIPlugin implements IUserSettingsListener {
+
+
+	/**
+	 * API Query plugin ID
+	 */
+	public static final String PLUGIN_ID ="com.nokia.s60tools.apiquery";//$NON-NLS-1$
+
+	/**
+	 * Extension point declared by this plugin the extender
+	 * plugins can use for adding new search methods.
+	 */
+	private static final String SEARCH_METHOD_EXTENSION_POINT_ID = "com.nokia.s60tools.apiquery.searchMethods"; //$NON-NLS-1$
+	
+	/**
+	 * Attribute for the extension point that store the name of the class
+	 * that implements a search method extension. 
+	 */
+	private static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$
+
+	/**
+	 * Default name for file to store user-configured server entries.  
+	 */
+	private static final String DATA_SOURCES_PROPERTIES_FILE_NAME = "datasources.properties"; //$NON-NLS-1$
+	
+	/**
+	 * Property name for getting selected data source
+	 */
+	private static final String DATA_SOURCES_PROPERTIES_SELECTED_DATA_SOURCE = "selected_datasource"; //$NON-NLS-1$
+	
+	/**
+	 * Absolute path name for the plug-in specific configuration file.
+	 */
+	private static String configFilePath;
+	
+	/**
+	 * Shared plugin instance.
+	 */
+	private static APIQueryPlugin plugin;
+	
+	/**
+	 * Plugin installation location.
+	 */
+	private static String pluginInstallLocation;
+	
+	/**
+	 * Data Source registry for storing the currently
+	 * installed search methods. The registry must be
+	 * alive as long as the plugin class is alive.
+	 */
+	private static SearchMethodExtensionRegistry smeRegistry = SearchMethodExtensionRegistry.getInstance();
+	
+	/**
+	 * User settings instance. The settings instance must be
+	 * alive as long as the plugin class is alive.
+	 */
+	private static UserSettings settings = UserSettings.getInstance();
+	
+	/**
+	 * Storing preferences
+	 */
+	private static IPreferenceStore prefsStore;
+	
+	static public boolean isFirstLaunch = false;
+	
+	/**
+	 * The constructor.
+	 */
+	public APIQueryPlugin() {
+		System.out.println("Plugin start");
+		isFirstLaunch = true;
+		plugin = this;
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS, "-- <<create>> --> " + getClass().getName()); //$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
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}
+	
+
+	
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		//This startup debug println has been left into the code in purpose
+		System.out.println("APIQuery Plugin STARTUP..."); //$NON-NLS-1$
+				
+		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$
+				
+		// Seeking for the plugins that extend the SEARCH_METHOD_EXTENSION_POINT_ID
+		fetchExistingSearchMethodExtensionInstances();
+
+		// User settings initialization has to be done after fetching search methods.
+		initializeUserSettings();	
+	
+		
+	}
+
+
+	
+	
+
+	/**
+	 * Returns runtime workspace directory path for the plugin, which
+	 * can be used e.g. to store plugin/workspace-specific configuration data.
+	 * 
+	 * @return Workspace directory path for the plugin.
+	 */
+	public static String getPluginWorkspacePath(){		
+		IPath runtimeWorkspacePath = plugin.getStateLocation();
+		runtimeWorkspacePath.makeAbsolute();		
+		return runtimeWorkspacePath.toOSString();
+	}	
+	
+	/**
+	 * Loading the previously stored user settings if any.
+	 */
+	private void initializeUserSettings() {
+		// In here will be implemented the load part of the functionality.
+		
+			try {
+				String wsPath = getPluginWorkspacePath();
+				configFilePath = wsPath + File.separator + DATA_SOURCES_PROPERTIES_FILE_NAME;
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Data Source's config file: " + configFilePath); //$NON-NLS-1$
+				File configFile = new File(configFilePath);
+				//If User setting has not been chaged, there is no configuration file
+				if(configFile.exists()){
+					Properties props = new Properties();
+					props.load( new FileInputStream(configFile));
+					String currentDataSource = props.getProperty(DATA_SOURCES_PROPERTIES_SELECTED_DATA_SOURCE);
+					DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Currently selected data source is: " +currentDataSource); //$NON-NLS-1$
+					
+					//Getting search extension by id
+					ISearchMethodExtension ext = smeRegistry.getById(currentDataSource);
+					//If no errors exist, saving currently selected Data Source to Runtime from propertie file.
+					if(ext != null){
+						ISearchMethodExtensionInfo info = ext.getExtensionInfo();
+						UserSettings.getInstance().setCurrentlySelectedSearchMethodInfo(info);
+					}
+					
+				}
+				//If there is no configuration file, we know that this is the first time
+				//user is starting application (at least in this work space, if user is cleaned workspace
+				//or created a new works space he/she might been started application before, but we can't know that).
+				else{
+					//Create a config file by calling userSettingsChanged()
+					userSettingsChanged();
+					//Launching first time popup (quick help)
+					FirstTimePopUpDialog.open(getCurrentlyActiveWbWindowShell());
+					
+				}
+			} catch (FileNotFoundException e) {
+				e.printStackTrace();
+				APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+	                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			} catch (IOException e) {
+				e.printStackTrace();
+				APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+	                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			}catch (Exception e) {
+				e.printStackTrace();
+				APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+	                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			}
+	}
+
+
+
+	/**
+	 * Seeking for the plugins that extend the SEARCH_METHOD_EXTENSION_POINT_ID
+	 * and registering them to the <code>SearchMethodExtensionRegistry</code>.
+	 */
+	private void fetchExistingSearchMethodExtensionInstances() {
+		
+		try {
+			
+			System.out.println("Fetching for search method extensions..."); //$NON-NLS-1$
+			// Searching for search method extensions
+			IExtensionRegistry extensionReg = Platform.getExtensionRegistry();
+			IExtensionPoint extPoint = extensionReg
+					.getExtensionPoint(SEARCH_METHOD_EXTENSION_POINT_ID);
+			IExtension[] searchMethods = extPoint.getExtensions();
+			for (int i = 0; i < searchMethods.length; i++) {
+				IExtension ext = searchMethods[i];
+				IConfigurationElement[] configElements = ext
+						.getConfigurationElements();
+				for (int j = 0; j < configElements.length; j++) {
+					IConfigurationElement configElem = configElements[j];
+					
+					String searchMethodClassFullName = configElem.getAttribute(CLASS_ATTRIBUTE);
+					
+					try {
+						// Creating search method extension intance
+						Object classInstance = configElem
+								.createExecutableExtension(CLASS_ATTRIBUTE);
+
+						ISearchMethodExtension searchMethod = (ISearchMethodExtension) classInstance;
+
+						System.out.println("Found search method: " //$NON-NLS-1$
+								+ searchMethod.getClass().getName());
+						
+						ISearchMethodExtensionInfo info = searchMethod.getExtensionInfo();
+
+						System.out.println("\t id: " + info.getId()); //$NON-NLS-1$
+						System.out.println("\t description: " //$NON-NLS-1$
+								+ info.getDescription());
+						
+						boolean isDefault =  info.isDefault();
+						System.out.println("\t isDefault: " //$NON-NLS-1$
+								+ isDefault);
+
+						// Adding the extension to local extension registry
+						smeRegistry.addExtension(searchMethod);
+					} catch (Exception e) {
+						APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Search_Method_Instantiate_Failed_Msg_Start")  //$NON-NLS-1$
+								+  searchMethodClassFullName
+								+ Messages.getString("APIQueryPlugin.Search_Method_Instantiate_Failed_Msg_End") //$NON-NLS-1$
+	                              + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+						e.printStackTrace();
+					}
+				}
+			}
+		} catch (Exception e) {
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Search_Method_Instantiate_Failed_Console_Msg") //$NON-NLS-1$
+                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		}
+		
+		if(!(smeRegistry.getExtensionCount() > 0)){
+			String errMsg = Messages.getString("APIQueryPlugin.No_Search_Method_Installed_ErrorMsg_Start")  //$NON-NLS-1$
+				            + ProductInfoRegistry.getProductName() + Messages.getString("APIQueryPlugin.No_Search_Method_Installed_ErrorMsg_End"); //$NON-NLS-1$
+			APIQueryConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+			new APIQueryMessageBox(errMsg, SWT.ICON_ERROR | SWT.OK).open();
+			throw new RuntimeException(errMsg);
+		}
+		
+		// Finding out the search method that is selected initally
+		setCurrentlySelectedSearchMethod(smeRegistry.getExtensions());
+		
+		
+		// Listening further changes in the user settings.
+		settings.addUserSettingListener(this);
+	}
+
+	/**
+	 * Sets the default search method as the currently selected search method
+	 * if there is no previous user preference.
+	 * @param searchMethodExtensions
+	 */
+	private void setCurrentlySelectedSearchMethod(Collection<ISearchMethodExtension> searchMethodExtensions) {
+
+		// Querying for the current user preference
+		ISearchMethodExtensionInfo userSelectedExtensionInfo = settings.getCurrentlySelectedSearchMethodInfo();
+		
+		// The result of the decision process is stored into the following variable 
+		ISearchMethodExtensionInfo selectedExtInfo = null;
+		
+		if(userSelectedExtensionInfo == null){
+			
+			// There were no previous user settings existing
+			
+			// If there is no existing user preference, we select
+			// among the available search methods.
+			//
+			// Current decision algorithm is to select the first one
+			// from the list that has default status. If no search
+			// methods with default status were not found settings,
+			// the last search method found is set as default.
+
+			for (ISearchMethodExtension ext : searchMethodExtensions) {
+				selectedExtInfo = ext.getExtensionInfo();
+				
+				if(selectedExtInfo.isDefault()){
+					break;
+				}
+			}
+		}
+		else{
+			
+			// There was a previous user preference
+			
+			// Browsing through the extension list and setting as default
+			// the search that has the id equal with the user preference. 
+			//
+			// If no search methods that match with the user preference			
+			// the last search method found is set as default.
+			
+			for (ISearchMethodExtension ext : searchMethodExtensions) {
+				selectedExtInfo = ext.getExtensionInfo();
+				
+				if(selectedExtInfo.hasEqualId(settings.getCurrentlySelectedSearchMethodInfo())){
+					break;
+				}
+			}
+			
+		}
+		
+		settings.setCurrentlySelectedSearchMethodInfo(selectedExtInfo);		
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		smeRegistry.notifyPluginShutdown();
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static APIQueryPlugin 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.apiquery.plugin", path); //$NON-NLS-1$
+	}
+	
+	/**
+	 * 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;
+	}
+	
+    /* (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() + "\\apiquery_tsk.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_APP_ICON, img );
+    	
+    	img = new Image( disp, getImagesPath() + "\\apiquery_wiz.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_APP_WIZARD_ICON, 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);		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.settings.IUserSettingsListener#userSettingsChanged()
+	 * Saves selected Data Source to configuration file.
+	 */
+	public void userSettingsChanged() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, getClass().getName() + ": User settings has been changed!"); //$NON-NLS-1$
+
+		//Saving selected Data Source Id to .properties file
+		try {
+			File configFile = new File(configFilePath);
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "API Query loading Data Source's configuration");				 //$NON-NLS-1$
+			Properties props = new Properties();
+			String value = UserSettings.getInstance().getCurrentlySelectedSearchMethodInfo().getId();
+			props.put(DATA_SOURCES_PROPERTIES_SELECTED_DATA_SOURCE, value);
+			props.store(new FileOutputStream(configFile), Messages.getString("APIQueryPlugin.DefaultDataSourceSelByUser_Msg") ); //$NON-NLS-1$
+		} catch (FileNotFoundException e) {
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		} catch (IOException e) {
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		}catch (Exception e) {
+			APIQueryConsole.getInstance().println(Messages.getString("APIQueryPlugin.Configuration_file_ErrMsg") //$NON-NLS-1$
+                    + e.getMessage() , IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferenceConstants.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.preferences;
+
+
+/**
+ * Class for storing keys to preferences.
+ */
+public class APIQueryPreferenceConstants {
+	
+	
+	
+	/**
+	 * <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 Show only API Names in search results
+	 */
+	public static final String SHOW_ONLY_APINAMES = "apiQueryShowOnlyApiNames"; //$NON-NLS-1$
+
+	/**
+	 * preference DB key for showing data source on results or not
+	 */
+	public static final String SHOW_DATASOURCE_IN_RESULTS = "apiQueryShowDataSourceInResults"; //$NON-NLS-1$
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferenceInitializer.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.preferences;
+
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+
+/**
+ * Class used to initialize default preference values.
+ */
+public class APIQueryPreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	public void initializeDefaultPreferences() {
+		
+		APIQueryPlugin.getPrefsStore().setDefault(APIQueryPreferenceConstants.SHOW_DATASOURCE_IN_RESULTS, true);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/preferences/APIQueryPreferences.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+
+/**
+ * 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 APIQueryPreferences {
+	
+
+
+	/**
+	 * Get "Show only API names" value
+	 * @return <code>true</code> if preference "Show only API names" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getShowOnlyAPINames(){
+		
+		String value = APIQueryPlugin.getPrefsStore().getString(APIQueryPreferenceConstants.SHOW_ONLY_APINAMES);
+		if(value != null && value.equalsIgnoreCase(APIQueryPreferenceConstants.TRUE)){
+			return true;
+		}else{
+			return false;
+		}
+		
+	}
+	
+	/**
+	 * Set "Show only API names" value 
+	 * @param isDontAskAgainChecked <code>true</code> if "Show only API names" is selected, <code>false</code> otherwise.
+	 */
+	public static void setShowOnlyAPINames(boolean isShowOnlyAPINamesChecked){
+		
+		IPreferenceStore store = APIQueryPlugin.getPrefsStore();
+
+		if(isShowOnlyAPINamesChecked){
+			store.setValue(APIQueryPreferenceConstants.SHOW_ONLY_APINAMES, APIQueryPreferenceConstants.TRUE);
+		}else{
+			store.setValue(APIQueryPreferenceConstants.SHOW_ONLY_APINAMES, APIQueryPreferenceConstants.FALSE);
+		}
+	}
+	
+	/**
+	 * Get "Show Data Source in results" value
+	 * @return <code>true</code> if preference "Show Data Source in results" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getShowDataSourceInResults(){
+		
+		boolean value = APIQueryPlugin.getPrefsStore().getBoolean(APIQueryPreferenceConstants.SHOW_DATASOURCE_IN_RESULTS);
+		return value;
+	
+	}
+	
+	/**
+	 * Set "Show Data Source in results" value 
+	 * @param isDontAskAgainChecked <code>true</code> if "Show Data Source in results" is selected, <code>false</code> otherwise.
+	 */
+	public static void setShowDataSourceInResults(boolean isShowDataSourceInResultsChecked){
+		
+		IPreferenceStore store = APIQueryPlugin.getPrefsStore();
+		store.setValue(APIQueryPreferenceConstants.SHOW_DATASOURCE_IN_RESULTS, isShowDataSourceInResultsChecked);
+	}	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/ImageKeys.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,27 @@
+/*
+* 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.apiquery.shared.resources;
+
+/**
+ * Lists the images keys used store and access images from plugin's image registry.
+ */
+public class ImageKeys {
+	public final static String IMG_APP_ICON = "APIQUERY_IMG_APP_ICON"; //$NON-NLS-1$	
+	public final static String IMG_APP_WIZARD_ICON = "APIQUERY_IMG_APP_WIZARD_ICON"; //$NON-NLS-1$	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/Messages.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+/*
+* 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.apiquery.shared.resources;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Class to get messages from localization file
+ */
+public class Messages {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.apiquery.shared.resources.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	/**
+	 * Get message by key
+	 * @param key
+	 * @return message
+	 */
+	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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/resources/messages.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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: 
+#
+#
+MainView.Search_Tab_Title=Search
+MainView.Properties_Tab_Title=Properties
+APIQueryPlugin.Configuration_file_ErrMsg=Failed to load/save Data Source configuration file - reason: 
+APIQueryPlugin.DefaultDataSourceSelByUser_Msg=Default Data Source, selected by user.
+APIQueryParameters.UnsupportedQueryType_Msg=Unsupported query type: 
+APIQueryParameters.SubsystemName_Msg=Subsystem name
+APIQueryParameters.HeaderName_Msg=Header name
+APIQueryParameters.CR_PS_Name_Msg=CR/P&&S key name
+APIQueryParameters.QueryTypePart1_ErrMsg=Given  query type '
+APIQueryParameters.QueryTypePart2_ErrMsg=' cannot be mapped to any description\!
+APIQueryPlugin.Search_Method_Instantiate_Failed_Msg_Start=Failed to instantiate '
+APIQueryPlugin.Search_Method_Instantiate_Failed_Msg_End=' search method extension - reason: 
+APIQueryPlugin.Search_Method_Instantiate_Failed_Console_Msg=Failed to fetch search method extensions - reason: 
+APIQueryPlugin.No_Search_Method_Installed_ErrorMsg_Start=There were no search method extension plugins installed. Cannot start 
+APIQueryPlugin.No_Search_Method_Installed_ErrorMsg_End=\ tool.
+XMLDataSAXHandler.XML_Parse_Error_ConsoleMsg=XML Parsing error encountered: 
+XMLDataSAXHandler.XML_Parse_FatalError_ConsoleMsg=XML Parsing fatal error encountered: 
+XMLDataSAXHandler.XML_Parse_Warning_ConsoleMsg=XML Parsing warning encountered: 
+SearchMethodExtensionRegistry.Failed_To_Add_Ext_ConsoleMsg=Failed to add extension\! 
+SearchMethodExtensionRegistry.Extension_Prefix=Extension '
+SearchMethodExtensionRegistry.Is_Registered_Already_MsgPostfix=' is registered already\!
+SearchMethodExtensionRegistry.Failed_To_Remove_Ext_ConsoleMsg=Failed to remove extension\! 
+CheckIdentifierAction.Query_Failed_From_Context_Menu_ErrorMsg=Failed to start API query from context menu: 
+SearchTabComposite.API_Query_ErrMsg=API query failed: 
+QueryTypeSelectionComposite.Query_By_Msg=Query by:
+QueryResultsComposite.SearchResults_Msg=Search results
+QueryResultsComposite.ShowOnlyAPINames_MSg=Show only API names
+QueryTypeSelectionComposite.Query_Type_Was_Not_Selected_Msg=Query type was not selected\!
+QueryTypeSelectionComposite.Not_Supported_ErrMsg=The query type is not supported by the currently selected search method.
+QueryResultsComposite.APIDetailsQueryFailde_ErrMsg=API details query failed: 
+QueryTypeSelectionComposite.Query_Type_Not_Available_ErrMsg=The query type is not available for the currently selected search method.
+FirstTimePopUpDialog.Title_Msg="API Query - Quick Help"
+FirstTimePopUpDialog.Topic_Msg=Welcome to use API Query!
+FirstTimePopUpDialog.Tool_Is_For_Msg=API Query is a tool for searching information about APIs.
+FirstTimePopUpDialog.Properties_Msg_Configure=To configure Data Sources, open the Properties tab at the bottom of the API Query view.
+FirstTimePopUpDialog.Properties_Msg_Option_Three_DataSources=Three types of Data Sources are currently available: %s, %s and %s.
+FirstTimePopUpDialog.Properties_Msg_Option_Two_DataSources=Two types of Data Sources are currently available: %s and %s.
+FirstTimePopUpDialog.Properties_Msg_Option_One_DataSources=One type of Data Source is currently available: %s.
+FirstTimePopUpDialog.Properties_Msg_WebDescription=There are three Web servers configured by default, but only two of them are enabled.
+FirstTimePopUpDialog.Seach_Msg=To search for APIs, type the query string into the Search string field on the Search tab. Leaving this field empty will search for all items, which may take a long time.
+FirstTimePopUpDialog.Results_Msg=When APIs are found, click the search results to get more detailed information about them.
+FirstTimePopUpDialog.Project_Query_Msg=API Query for one file or a whole project can be started by right-clicking the .c, .cpp, .h or .hpp file, or on the project/folder node in Package Explorer. API Query for a project will be saved to a file and it contains information about the APIs used in the project.
+FieldMappingRules.NoMappingRule_ErrMsg=No mapping rule was defined for key: 
+FindFileFromFoldersJob.CancelledByUser_Msg=Cancelled by user
+FindFileFromFoldersJob.ErrorOnSeekin_StatusMsg_Part1=Error seeking file: 
+FindFileFromFoldersJob.ErrorOnSeekin_StatusMsg_Part2=\ from SDK: 
+FindFileFromFoldersJob.ErrorSeekingFile_ErrMsg_Part1=Error seeking file: 
+FindFileFromFoldersJob.ErrorSeekingFile_ErrMsg_Part2=\ from SDK: 
+FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part1=Error seeking file: 
+FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part2=\ from SDK: 
+FindFileFromFoldersJob.ErrorSeekingFileWithValue_ErrMsg_Part3=. Exit value was: 
+FindFileFromFoldersJob.FileFound_Progress_Msg_Part1=File: '
+FindFileFromFoldersJob.FileFound_Progress_Msg_Part2=' found.
+FirstTimePopUpDialog.More_Information_Msg=More instructions are available in API Query help. To open the help, go to Help > Help Contents, then select Carbide Tools > API Query.
+ActiveProjectQueryJob.StartingToRun_Msg=Starting to run 
+ActiveProjectQueryJob.Title_Project_Msg=Project 
+ActiveProjectQueryJob.ErrorsOnJob_ErrMsg=Errors on job: 
+ActiveProjectQueryJob.TaskStarted_Msg=Started
+ActiveProjectQueryJob.APIQueryForProject_Msg=API query for project: '
+ActiveProjectQueryJob.APIQueryForProject_OnProgress_Part2_Msg=' on progress...
+ActiveProjectQueryJob.Progresbar_Step1_Msg=Searching included headers from project.
+ActiveProjectQueryJob.Progresbar_Step2_Msg=Getting information of used APIs.
+ActiveProjectQueryJob.Progresbar_Step3_Msg=Getting API Details from selected Search Method.
+ActiveProjectQueryJob.Progresbar_Step4_Msg=Generating report.
+ActiveProjectQueryJob.CouldNotGetAPISUmmaries_ErrMsg=Could not get API summaries.
+ActiveProjectQueryJob.Title_IsUsingFollowingAPIs_Msg=\ is using following APIs and headers in files
+ActiveProjectQueryJob.Progresbar_Done_Msg=Done
+ActiveProjectQueryJob.APIQueryForProject_Compeleated_Msg=' compleated.
+ActiveProjectQueryJob.Starting_Part1_Msg=Starting '
+ActiveProjectQueryJob.Starting_Part2_Msg=' query to project '
+ActiveProjectQueryJob.Starting_Part3_Msg=' with search string '
+ActiveProjectQueryJob.NoDetailsForAPI_Msg=No details for API: 
+ActiveProjectQueryJob.APIQueryFailed_ErrMsg=API query errors encountered for following reason(s):
+CheckProjectReport.Unknown_MSg=Unknown
+CheckProjectReport.APIName_Msg=API Name
+CheckProjectReport.NoteForReportLinks_Msg=Note: You can only open links from the report when the API Query Carbide.c++ Extension is running.
+CheckProjectReport.UsingFile_Msg=Using files
+CheckProjectReport.UsedHeader_ErrMsg=Used headers and Using files must be same sized and not null.
+CheckProjectAction.APIQuery_JobName_Msg=API Query 
+CheckProjectAction.CannotGenerateReport_ErrMsg=Cannot generate report for project: 
+CheckProjectAction.UnableToOpenReport_ErrMsg=Unable to open report, reason: 
+CheckProjectReport.UsedHeader_Msg=Used headers
+CheckProjectAction.ExportAPIQueryForProject_Msg=Export API Query for project
+CheckProjectReport.UnableToLoadCSS_Part1_ErrMsg=Unable to get stylesheet from: 
+CheckProjectReport.UnableToLoadCSS_Part2_ErrMsg=, error was: 
+APIQueryParameters.APIName_Msg=API name
+APIQueryParameters.DLLName_Msg=DLL name
+APIQueryParameters.LIBName_Msg=LIB name
+APIQueryWebServerConfigurator.StartServer_ErrMsg_Part1=Unable to start 
+APIQueryWebServerConfigurator.StartServer_ErrMsg_Part2=. Error was: 
+APIQueryWebServerConfigurator.StartServer_Msg_Part1=Web server: '
+APIQueryWebServerConfigurator.StartServer_Msg_Part2=' started and running on address: '
+APIQueryWebServerConfigurator.StartServer_Msg_Part3='. API Query report links are now functional.
+APIQueryWebServerConfigurator.StoptServer_ErrMsg_Part1=Unable to stop 
+APIQueryWebServerConfigurator.StoptServer_ErrMsg_Part2=. Error was: 
+APIQueryWebServerConfigurator.StoptServer_Msg_Part1=Web server: '
+APIQueryWebServerConfigurator.StoptServer_Msg_Part2=' stopped. API Query report links are now unfunctional.
+AbstractEntryStorage.Duplicate_ErrMsg=There cannot exist two entries with the same name
+AbstractJob.JobCancelled_Part1_ErrMsg=Job: 
+AbstractJob.JobCancelled_Part2_ErrMsg=\ cancelled by user.
+AbstractJob.Percentage_Complete_Msg=% complete.
+AbstractEntryStorage.NonExistingEntry_ErrMsg=Tried to update a non-existing entry: 
+AbstractSearchMethodExtension.UnknownHost_ErrMsg=Unknown host
+AbstractSearchMethodExtension.MalformedURL_ErrMsg=Malformed URL
+AbstractSearchMethodExtension.IOException_ErrMsg=I/O Exception
+AbstractSearchMethodExtension.InvalidXML_ErrMsg=Invalid XML
+AbstractJob.Prosessing_Msg=\ Processing: 
+AbstractSearchMethodExtension.UnexpectedException_ErrMsg=Unexpected exception
+AbstractSearchMethodExtension.NoServerEntries_ErrMsg=No server entries configured or selected in Properties-tab.
+AbstractUiFractionComposite.ParentDisplayNULL_ErrMsg=Parent's display is NULL\!\!\!
+OpenFileAction.18=DEBUG: find files
+OpenFileAction.CannotFoundFile_ErrMsg_Part1=File: '
+OpenFileAction.CannotFoundFile_ErrMsg_Part2=' can not be found from project: '
+OpenFileAction.CannotFoundFile_Msg_Part1=File: '
+OpenFileAction.CannotFoundFile_Msg_Part2=' can not be found under SDK: '
+OpenFileAction.JobName_Msg=Seek file: 
+OpenFileAction.NotCarbideProject_ErrMsg_Part1=Project: '
+OpenFileAction.NotCarbideProject_ErrMsg_Part2=' is not Carbide project.
+OpenFileAction.ProjectNotExist_ErrMsg_Part1=Project: '
+OpenFileAction.ProjectNotExist_ErrMsg_Part2=' does not exist.
+OpenFileAction.StartingSeek_Msg_Part1=Starting to seek file: '
+OpenFileAction.StartingSeek_Msg_Part2=' from project: '
+OpenFileAction.TargetFound_Msg_Part1=Target SDK: '
+OpenFileAction.TargetFound_Msg_Part2=' for project: '
+OpenFileAction.TargetFound_Msg_Part3=' found, starting to seek file: '
+OpenFileAction.Unexpected_ErrMsg_Part1=Unexpected error occurded when seeking file: '
+OpenFileAction.Unexpected_ErrMsg_Part2=' from project: '
+OpenFileAction.Unexpected_ErrMsg_Part3=\ Error was: 
+OpenReportStatusDialog.OpenReport_Msg=Open report
+OpenReportStatusDialog.DoYouWantOpenReport_Msg=Do you want to open created report 
+PropertiesTabComposite.DataSource_Msg=Data Source
+PropertiesTabComposite.ShowDataSourceInResults_Msg=Show Data Source in Search results
+QueryDefComposite.SearchString_Msg=Search string:
+QueryResultsComposite.APIDetails_MSg=API details:
+QueryDefComposite.Search_Msg=Search
+QueryResultsComposite.APIs_Msg=match
+QueryResultsComposite.Found_Msg=Found 
+QueryResultsComposite.UnableToGetAPIDetails_ErrMsg_Part1=Unable to get API Details for: '
+QueryResultsComposite.UnableToGetAPIDetails_ErrMsg_Part2='. Error was: 
+SearchTabUIFieldsMediator.APIListQueryFailed_ErrMsg=API list query errors encountered for following reason(s):
+QueryDefComposite.Context_ErrMsg=Unable to set Context sensitive Help ID:s, error was:
+ReportActionServlet.NotSupportedAction_Msg=API Query report action Servlet called with no valid action.
+ReportActionServlet.NotSupportedQueryType_ErrMsg_Part1=Errors in report, not supported query type: '
+ReportActionServlet.NotSupportedQueryType_ErrMsg_Part2='. Please rerun API Query for Active project.
+ReportActionServlet.NotSupportedSearchMethod_ErrMsg_Part1=Not supported search method: '
+ReportActionServlet.NotSupportedSearchMethod_ErrMsg_Part2=' for selected Data source: '
+ReportActionServlet.Unexpected_ErrMsg_Part1=Unexpected error occur when API Query was started for Search string: '
+ReportActionServlet.Unexpected_ErrMsg_Part2=' with search type: '
+ReportActionServlet.Unexpected_ErrMsg_Part3='. Error was: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/AbstractSearchMethodExtension.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,311 @@
+/*
+* 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.apiquery.shared.searchmethod;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.UnknownHostException;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescriptionSearchResults;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.exceptions.XMLNotValidException;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.shared.util.xml.XMLUtils;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Abstract class that provides common services for all search methods.
+ */
+public abstract class AbstractSearchMethodExtension implements ISearchMethodExtension, IExecutableExtension {
+
+	public static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
+	public static final String DESCRIPTION_ATTRIBUTE = "description"; //$NON-NLS-1$
+	public static final String IS_DEFAULT_ATTRIBUTE = "isDefault"; //$NON-NLS-1$
+		
+	private SearchMethodExtensionInfo extensionInfo;
+	
+	/**
+	 * The subclasses of this abstract class is created by using <code>createExecutableExtension</code>
+	 * method from <code>IConfigurationElement</code> class, and therefore
+	 * the constructor cannot have any parameters.
+	 * @see org.eclipse.core.runtime.IConfigurationElement#createExecutableExtension
+	 */
+	public AbstractSearchMethodExtension(){
+		extensionInfo = new SearchMethodExtensionInfo();
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
+	 */
+	public void setInitializationData(IConfigurationElement configElem, String classPropertyName, Object data) throws CoreException {
+		extensionInfo.setId(configElem.getAttribute(ID_ATTRIBUTE));
+		extensionInfo.setDescription(configElem.getAttribute(DESCRIPTION_ATTRIBUTE));
+		extensionInfo.setDefault(Boolean.parseBoolean(configElem.getAttribute(IS_DEFAULT_ATTRIBUTE)));
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getExtensionInfo()
+	 */
+	public SearchMethodExtensionInfo getExtensionInfo() {
+		return extensionInfo;
+	}
+
+	/**
+	 * Throws an exception for user with the given message.
+	 * @param errorMsg Main error message for the user.
+	 * @param detailedMsg More detailed message shown in parenthesis.
+	 * @throws QueryOperationFailedException 
+	 */
+	protected void queryFailed(String errorMsg, String detailedMsg) throws QueryOperationFailedException {
+		APIQueryConsole.getInstance().println(errorMsg, APIQueryConsole.MSG_ERROR);
+		String combinedMsg = getCombinedMessage(errorMsg, detailedMsg);
+				throw new QueryOperationFailedException(combinedMsg);
+	}
+
+
+	private String getCombinedMessage(String errorMsg, String detailedMsg) {
+		String combinedMsg = errorMsg + " (" + detailedMsg + ")."; //$NON-NLS-1$ //$NON-NLS-2$
+		return combinedMsg;
+	}
+	
+	/**
+	 * Throws an exception for user with the given message.
+	 * @param errorMsg Main error message for the user.
+	 * @param detailedMsg More detailed message shown in parenthesis.
+	 * @param QueryOperationFailedException
+	 * @throws QueryOperationFailedException 
+	 */
+	private void queryFailed(String errorMsg, String detailedMsg, QueryOperationFailedException e) throws QueryOperationFailedException {
+		APIQueryConsole.getInstance().println(errorMsg, APIQueryConsole.MSG_ERROR);
+		String combinedMsg = getCombinedMessage(errorMsg, detailedMsg);
+		QueryOperationFailedException ex = new QueryOperationFailedException(combinedMsg);
+		ex.setSummarys(e.getSummarys());
+		throw ex;
+	}	
+	
+	/**
+	 * Examines the type of throwable parameter, and adds appropriate
+	 * error message or default message, and forwards the information
+	 * for further processing.
+	 * @param throwable Throwable to be examined.
+	 * @throws QueryOperationFailedException 
+	 */
+	protected void examineAndHandleQueryFailureException(Throwable throwable) throws QueryOperationFailedException{
+		
+		String errMsg = Messages.getString("AbstractSearchMethodExtension.UnexpectedException_ErrMsg"); //$NON-NLS-1$
+		
+		if(throwable instanceof QueryOperationFailedException) {
+			errMsg = "Query error";
+			queryFailed(errMsg, throwable.getMessage(), (QueryOperationFailedException)throwable);
+		} else{
+			if (throwable instanceof UnknownHostException) {
+				errMsg = Messages.getString("AbstractSearchMethodExtension.UnknownHost_ErrMsg"); //$NON-NLS-1$
+			} 
+			else if(throwable instanceof MalformedURLException) {
+				errMsg = Messages.getString("AbstractSearchMethodExtension.MalformedURL_ErrMsg"); //$NON-NLS-1$
+			} 
+			else if(throwable instanceof IOException) {
+				errMsg = Messages.getString("AbstractSearchMethodExtension.IOException_ErrMsg"); //$NON-NLS-1$
+			}
+			else if(throwable instanceof XMLNotValidException) {
+				errMsg = Messages.getString("AbstractSearchMethodExtension.InvalidXML_ErrMsg"); //$NON-NLS-1$
+			} 
+			
+			queryFailed(errMsg, throwable.getMessage());
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#getAPIDetails(com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription)
+	 */
+	public APIDetails getAPIDetails(APIShortDescription summary) throws QueryOperationFailedException {
+		String detailsXMLData = null;
+		APIDetails details = null;
+		
+		try {		
+			detailsXMLData = getAPIDetailsAsXML(summary);			
+			details = XMLUtils.xmlToAPIDetails(detailsXMLData.toString());
+		} catch (Exception e) {
+			DbgUtility.println(DbgUtility.PRIORITY_CLASS, "###Errors on parsing API Details. API Name was: "  //$NON-NLS-1$
+					+summary.getName() +", API source was: " +summary.getSource());			 //$NON-NLS-1$
+			e.printStackTrace();
+			examineAndHandleQueryFailureException(e);
+		}		
+		
+		return details;				
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension#runAPIQuery(com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters)
+	 */
+	public APIShortDescriptionSearchResults runAPIQuery(APIQueryParameters parameters) {
+		
+		APIShortDescriptionSearchResults results = new APIShortDescriptionSearchResults();
+
+		// Making query for each configured and selected server entry.
+		AbstractEntry[] selEntryArr = getEntryStorageInstance().getSelectedEntries();			
+		
+		// Were any entries configured or selected?
+		if(selEntryArr.length == 0){
+			results.addSearchError(new QueryOperationFailedException(Messages.getString("AbstractSearchMethodExtension.NoServerEntries_ErrMsg"))); //$NON-NLS-1$
+			return results;
+		}
+		for (int i = 0; i < selEntryArr.length; i++) {
+			AbstractEntry entry = selEntryArr[i];
+			if(parameters.getSearchString().contains(APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR)){
+				//Adding results for results, if there was errors, adding error to results
+				try {
+					results.addSearchResults(handleMultiEntryQuery(parameters, entry));
+				} catch (QueryOperationFailedException e) {
+					results.addSearchError(e);
+					if(e.getSummarys() != null){
+						results.addSearchResults(e.getSummarys());
+					}
+				}
+			}else{
+				//Adding results for results, if there was errors, adding error to results				
+				try {
+					results.addSearchResults(handleSingleEntryQuery(parameters, entry));
+				} catch (QueryOperationFailedException e) {
+					results.addSearchError(e);
+					if(e.getSummarys() != null){
+						results.addSearchResults(e.getSummarys());
+					}
+				}
+			}
+		}
+		
+		return results;
+	}
+
+	/**
+	 * Handles API summary query for a given server entry.
+	 * @param parameters Query parameters.
+	 * @param srvEntry Entry to be query data from.
+	 * @return Collection of API summaries for the given server entry.
+	 * @throws QueryOperationFailedException
+	 */
+	protected abstract Collection<APIShortDescription> handleSingleEntryQuery(APIQueryParameters parameters, AbstractEntry entry) throws QueryOperationFailedException;
+
+	/**
+	 * Handles API summary query for a given server entry.
+	 * 
+	 * Used when search string contains multiple search strings semi-colon (;) separated. 
+	 * Eg. multiple headers as semi-colon separated.
+	 * 
+	 * Should call when <code>APIQueryParameters.getSearchString().contains(APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR)</code>
+	 * occurs.
+	 * 
+	 * @param parameters Query parameters. Where getSearchString() contains semi-colons.
+	 * @param srvEntry Entry to be query data from.
+	 * @return Collection of API summaries for the given server entry.
+	 * @throws QueryOperationFailedException
+	 */
+	protected abstract Collection<APIShortDescription> handleMultiEntryQuery(APIQueryParameters parameters, AbstractEntry entry) throws QueryOperationFailedException;
+		
+	
+	//
+	// Abstract methods to be defined by subclasses.
+	//
+	
+	/**
+	 * Gets API Details as XML formatted string for given summary.
+	 * Abstract method that must be implemented by all sub classes.
+	 * @param summary API summary data to get details for.
+	 * @return API Detail XML data as string. 
+	 */
+	protected abstract String getAPIDetailsAsXML(APIShortDescription summary) throws Exception; 
+	
+	/**
+	 * Handles API summary query for a given server entry.
+	 * @param parameters Query parameters.
+	 * @param srvEntry Entry to be query data from.
+	 * @return API summaries for the given server entry as XML formatted string.
+	 * @throws QueryOperationFailedException
+	 */
+	protected abstract String runAPIQueryForSingleEntryAndReturnXMLString(APIQueryParameters parameters, AbstractEntry entry) throws Exception;
+	
+	
+	/**
+	 * Web query job cancellat
+	 * @param parameters
+	 * @param progressMonitor
+	 * @return
+	 * @throws JobCancelledByUserException
+	 */
+		public APIShortDescriptionSearchResults runAPIQuery(APIQueryParameters parameters,IProgressMonitor progressMonitor)throws JobCancelledByUserException {
+		
+
+		
+		
+			APIShortDescriptionSearchResults results = new APIShortDescriptionSearchResults();
+		
+			// Making query for each configured and selected server entry.
+			AbstractEntry[] selEntryArr = getEntryStorageInstance().getSelectedEntries();
+			
+		
+			
+			
+			// Were any entries configured or selected?
+			if(selEntryArr.length == 0){
+				results.addSearchError(new QueryOperationFailedException(Messages.getString("AbstractSearchMethodExtension.NoServerEntries_ErrMsg"))); //$NON-NLS-1$
+				return results;
+			}
+			for (int i = 0; i < selEntryArr.length; i++) {
+				AbstractEntry entry = selEntryArr[i];
+				if(parameters.getSearchString().contains(APIQueryParameters.SEARCH_ITEM_SEPARATOR_CHAR)){
+					//Adding results for results, if there was errors, adding error to results
+					try {
+						results.addSearchResults(handleMultiEntryQuery(parameters, entry,progressMonitor));
+					} catch (QueryOperationFailedException e) {
+						results.addSearchError(e);
+					}
+				}else{
+					//Adding results for results, if there was errors, adding error to results				
+					try {
+						results.addSearchResults(handleSingleEntryQuery(parameters, entry,progressMonitor));
+					} catch (QueryOperationFailedException e) {
+						results.addSearchError(e);
+					}
+				}
+			}
+		
+				
+			return results;
+		}
+	
+	
+
+		protected abstract Collection<APIShortDescription> handleSingleEntryQuery(APIQueryParameters parameters, AbstractEntry entry,IProgressMonitor monitor) throws JobCancelledByUserException,QueryOperationFailedException;
+		protected abstract Collection<APIShortDescription> handleMultiEntryQuery(APIQueryParameters parameters, AbstractEntry entry,IProgressMonitor progressMonitor) throws QueryOperationFailedException,JobCancelledByUserException;
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ISearchMethodExtension.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,162 @@
+/*
+* 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.apiquery.shared.searchmethod;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Set;
+import org.eclipse.swt.widgets.Composite;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescriptionSearchResults;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+
+/**
+ * Interface that has to be implemnted by all 
+ * search method instances. 
+ */
+public interface ISearchMethodExtension {
+	
+	/**
+	 * Gets the extension info for the search method.
+	 * @return Returns extension info for the search method.
+	 */
+	ISearchMethodExtensionInfo getExtensionInfo();
+		
+	/**
+	 * This method is called when we do not need
+	 * the services of this extension. This gives
+	 * possibilities for the extension to make
+	 * any shutdown related operations it sees
+	 * as necessary.
+	 */
+	public void notifyExtensionShutdown();
+
+	/**
+	 * Returns the search method specific configuration UI as 
+	 * UI Composite that can be disposed and re-created whenever needed.
+	 * @param parent Parent composite for the created configuration UI.
+	 * @return Returns the search method specific configuration UI.
+	 */
+	public AbstractUiFractionComposite createExtensionConfigurationUi(Composite parent);
+
+	/**
+	 * Runs API Query with the given parameters. 
+	 * Throws <code>QueryOperationFailedException</code> if something failed
+	 * during query operation.
+	 * @param parameters Parameters guiding the query.
+	 * @return APIShortDescriptionSearchResults containing Collection of API summary objects 
+	 * 	for the APIs found based on the query and possible QueryOperationFailedException search errors Collection.
+	 */
+	public APIShortDescriptionSearchResults runAPIQuery(APIQueryParameters parameters);
+
+	/**
+	 * Gets API details for the given API.
+	 * Throws <code>QueryOperationFailedException</code> if something failed
+	 * during query operation.
+	 * @param summary API summary object to get details for. 
+	 * @return API details for the given summary object.
+	 * @throws QueryOperationFailedException
+	 */
+	public APIDetails getAPIDetails(APIShortDescription summary) throws QueryOperationFailedException;
+
+	/**
+	 * Gets API details for the given APIs.
+	 * Throws <code>QueryOperationFailedException</code> if something failed
+	 * during query operation.
+	 * @param list of API summary objects to get details for. 
+	 * @return API details for the given summary objects. Given API name as key and APIDetails as value.
+	 * If cant found or parse a Details, an empty Details is added to collection.
+	 * @throws QueryOperationFailedException
+	 */	
+	Hashtable<String, APIDetails> getAPIDetails(Collection<APIShortDescription> apis)  throws QueryOperationFailedException;
+
+	
+	/**
+	 * Can be used to check if a certain query type 
+	 * is supported by the search method.
+	 * @param queryType Query type defined in APIQueryParameters to be checked.
+	 * @return	<code>true</code> if the query type is supported, otherwise <code>false</code>.
+	 * @see	APIQueryParameters#QUERY_BY_API_NAME
+	 * @see APIQueryParameters#QUERY_BY_SUBSYSTEM_NAME
+	 * @see APIQueryParameters#QUERY_BY_DLL_NAME
+	 * @see APIQueryParameters#QUERY_BY_LIB_NAME
+	 * @see APIQueryParameters#QUERY_BY_HEADER_NAME
+	 * @see APIQueryParameters#QUERY_BY_CRPS_KEY_NAME	
+ 	 */
+	public boolean isSupportedQueryType(int queryType);
+	
+	/**
+	 * Returns search method specific configuration storage instance.
+	 * @return Data Source specific configuration storage instance.
+	 */
+	public AbstractEntryStorage getEntryStorageInstance();
+
+	/**
+	 * Get API details to show in report.
+	 * @return API Detail topics to be shown in report
+	 */
+	public String[] getAPIDetailsToReport(Set <String> usedAPIs, Hashtable<String, APIDetails> projectUsingAPIDetails);
+	
+	/**
+	 * Maps query type to API Detail topic in API Details.
+	 * @param queryType Query type constant.
+	 * @return Name of the API Detail.
+	 */	
+	public String getAPIDetailNameInDetailsByQueryType(int queryType);
+
+	/**
+	 * Maps API Detail topic in API Details to query type.
+	 * @param queryType Query type constant.
+	 * @return Query type int described in {@link APIQueryParameters} or -1 if not supported.
+	 */	
+	public int getQueryTypeByAPIDetailNameInDetails(String queryType);
+	
+	/**
+	 * 
+	 * @return true for web query and false for other data sources 
+	 */
+	public boolean isAsyncQueryPreferred();
+	
+	/**
+	 * if it's for a header serach,then should the headerlink be enabled so that user can click on it and open it.
+	 */
+	public boolean serachHeaderLinkEnable();
+	
+/**
+ * opens the supplied header file.Provide an implementation if headerlink is enabled.
+ * @param header : header name
+ * @param source : APIShortDescription.getSource()
+ * @return 0-successfully opened , 1-error
+ */
+	public int openHeaderFile(String headerName,String source);
+	
+	/*
+	 * 
+	 */
+	public String[] getHeaderSourceList();
+		
+	
+
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ISearchMethodExtensionInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,51 @@
+/*
+* 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.apiquery.shared.searchmethod;
+
+/**
+ * Stores the informative metadata for 
+ * a search method extension.
+ */
+public interface ISearchMethodExtensionInfo {
+	/**
+	 * Gets the id of the search method.
+	 * @return Id of the search method.
+	 */
+	public String getId();
+	
+	/**
+	 * Gets the description for the search method.
+	 * @return Description for the search method.
+	 */
+	public String getDescription();
+	
+	/**
+	 * Checks if this search method is the default one, unless
+	 * otherwise decided according user settings.
+	 * @return Returns <code>true</code> if this search method is the default one,
+	 *                 otherwise returns <code>false</code>.
+	 */
+	public boolean isDefault();
+	
+	/** 
+	 * Compares the Id's of the two search methods
+	 * @return <code>true</code> if the two search Ids match, otherwise <code>false</code>.
+	 */
+	public boolean hasEqualId(ISearchMethodExtensionInfo extInfo);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/SearchMethodExtensionInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,81 @@
+/*
+* 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.apiquery.shared.searchmethod;
+
+public class SearchMethodExtensionInfo  implements ISearchMethodExtensionInfo{
+
+	private String id;
+	private String description;
+	private boolean isDefault;
+
+	public SearchMethodExtensionInfo(){
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtensionInfo#getDescription()
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtensionInfo#getId()
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtensionInfo#isDefault()
+	 */
+	 public boolean isDefault() {
+		return isDefault;
+	}
+
+	/**
+	 * Sets the description.
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	/**
+	 * Sets the id.
+	 * @param id The id to set.
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	/**
+	 * Sets the isDefault status.
+	 * @param isDefault The isDefault to set.
+	 */
+	public void setDefault(boolean isDefault) {
+		this.isDefault = isDefault;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtensionInfo#hasEqualId(com.nokia.s60tools.apiquery.searchmethodregistry.ISearchMethodExtensionInfo)
+	 */
+	public boolean hasEqualId(ISearchMethodExtensionInfo extInfo) {
+		return this.getId().equalsIgnoreCase(extInfo.getId());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethod/ui/AbstractUiFractionComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,116 @@
+/*
+* 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.apiquery.shared.searchmethod.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Layout;
+
+import com.nokia.s60tools.apiquery.shared.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.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 implementd 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 implementd 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 implementd 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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/searchmethodregistry/SearchMethodExtensionRegistry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,170 @@
+/*
+* 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.apiquery.shared.searchmethodregistry;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+
+
+/**
+ * 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 store search method
+ * extensions that were found from the system.
+ */
+public class SearchMethodExtensionRegistry {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private SearchMethodExtensionRegistry instance = null;
+
+	/**
+	 * Listeners interested in job completions operations.
+	 */
+	private static Map<String, ISearchMethodExtension> extensions = Collections.synchronizedMap(new HashMap<String, ISearchMethodExtension>());
+	
+	/**
+	 * Public Singleton instance accessor.
+	 * @return Returns instance of this singleton class-
+	 */
+	public static SearchMethodExtensionRegistry getInstance(){
+		if( instance == null ){
+			instance = new SearchMethodExtensionRegistry();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private SearchMethodExtensionRegistry() {
+		DbgUtility.println(DbgUtility.PRIORITY_CLASS, "-- <<create>> --> " + getClass().getName()); //$NON-NLS-1$
+	}	
+	
+	/**
+	 * Add a new Search Method
+	 * @param extension
+	 */
+	public void addExtension(ISearchMethodExtension extension){
+		synchronized(extensions){
+			ISearchMethodExtensionInfo info = extension.getExtensionInfo();
+			String id = info.getId();
+			ISearchMethodExtension possibleDuplicate = extensions.get(id);			
+			if( possibleDuplicate != null ){				
+				String errMsg = Messages.getString("SearchMethodExtensionRegistry.Failed_To_Add_Ext_ConsoleMsg")  //$NON-NLS-1$
+						+ Messages.getString("SearchMethodExtensionRegistry.Extension_Prefix") //$NON-NLS-1$
+						+ id
+						+ Messages.getString("SearchMethodExtensionRegistry.Is_Registered_Already_MsgPostfix"); //$NON-NLS-1$
+				APIQueryConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+				throw new RuntimeException(errMsg);
+			}
+			extensions.put(id, extension);
+		} // synchronized
+	}
+	
+	/**
+	 * Remove a Search Method
+	 * @param extension
+	 */
+	public void removeExtension(ISearchMethodExtension extension){
+		synchronized(extensions){
+			ISearchMethodExtensionInfo info = extension.getExtensionInfo();
+			String id = info.getId();
+			ISearchMethodExtension possibleDuplicate = extensions.get(id);			
+			if( possibleDuplicate == null ){				
+				String errMsg = Messages.getString("SearchMethodExtensionRegistry.Failed_To_Remove_Ext_ConsoleMsg")  //$NON-NLS-1$
+					+ Messages.getString("SearchMethodExtensionRegistry.Extension_Prefix") //$NON-NLS-1$
+					+ id
+					+ Messages.getString("SearchMethodExtensionRegistry.Is_Registered_Already_MsgPostfix"); //$NON-NLS-1$
+				APIQueryConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+				throw new RuntimeException(errMsg);
+			}
+			extension.notifyExtensionShutdown();
+			extensions.remove(extension);
+		} // synchronized
+	}
+	
+	/**
+	 * Called before host plugin shutdown.  
+	 */
+	public void notifyPluginShutdown(){
+		for (ISearchMethodExtension ext : getExtensions()) {
+			ext.notifyExtensionShutdown();						
+		}
+	}
+	
+	/**
+	 * Returns the iterator for the currently registered extensions.
+	 * @return Returns the currently registered extensions.
+	 */
+	public Collection<ISearchMethodExtension> getExtensions(){
+		return extensions.values();
+	}
+	
+	/**
+	 * Gets the amount of currently registered extensions.
+	 * @return Returns the amount of currently registered extensions.
+	 */
+	public int getExtensionCount(){
+		return getExtensions().size();
+	}
+
+	/**
+	 * Gets the extension that matches with the given description.
+	 * @param extensionDescription Description of the search method.
+	 * @return The extension matching the description or <code>null</code> if not found.
+	 */
+	public ISearchMethodExtension getByDescription(String extensionDescription) {
+		for (ISearchMethodExtension ext : getExtensions()) {
+			ISearchMethodExtensionInfo extInfo = ext.getExtensionInfo();
+			if(extInfo.getDescription().equals(extensionDescription)){
+				return ext;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets the extension that matches with the given id.
+	 * @param id Id of the search method.
+	 * @return The extension matching the id or <code>null</code> if not found.
+	 */
+	public ISearchMethodExtension getById(String id) {
+		for (ISearchMethodExtension ext : getExtensions()) {
+			ISearchMethodExtensionInfo extInfo = ext.getExtensionInfo();
+			if(extInfo.getId().equals(id)){
+				return ext;
+			}
+		}
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/services/QueryServices.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.services;
+
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+
+public class QueryServices {
+	
+	/**
+	 * Enables the starting of API queries
+	 * also from the other plug-ins that should
+	 * not know anything about internal UI components.
+	 * However, this method must be called from an UI thread, or
+	 * use <code>Display.getDefault().asyncExec(...)</code> method
+	 * and pass runnable as parameter in order to schedule
+	 * query request to UI thread.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @throws QueryOperationFailedException 
+	 */
+	public static void runAPIQuery(int queryType, String queryString) throws QueryOperationFailedException{
+			MainView.runAPIQueryFromExternalClass(queryType,
+					queryString, false);			
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/settings/UserSettingListenerNotificator.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,30 @@
+/*
+* 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.apiquery.shared.settings;
+
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+
+public class UserSettingListenerNotificator {
+	
+	/**
+	 * Public interface to notify listeners that something is happend.
+	 */
+	public static void notifyListeners(){
+		UserSettings.getInstance().settingsChanged();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/AbstractEntryTableViewerUiComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,280 @@
+/*
+* 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.apiquery.shared.ui;
+
+import java.util.Collection;
+
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.widgets.Composite;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntry;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.AbstractEntryStorage;
+import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Common abstract base class for entry table viewer UI composites.
+ */
+public abstract class AbstractEntryTableViewerUiComposite extends AbstractUiFractionComposite implements ICheckStateListener, 
+																								IConfigurationChangedListener{
+	/**
+	 * Entry check state listener reference.
+	 * @see com.nokia.s60tools.apiquery.web.searchmethod.ui.IEntryCheckStateListener
+	 */
+	protected IEntryCheckStateListener entryCheckStateListener = null;
+	protected CheckboxTableViewer entriesViewer;
+
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 * @param style				The used style for the composite.
+	 */
+	public AbstractEntryTableViewerUiComposite(Composite parentComposite, int style) {
+		super(parentComposite, style);
+	}
+	
+	/**
+	 * Creates concrete entry viewer specific storage entry table viewer instance. 
+	 * @param parent Parent composite for the created composite.
+	 * @return New <code>CheckboxTableViewer</code> object instance.
+	 */
+	protected abstract CheckboxTableViewer createEntryTableViewer(Composite parent);
+	
+	/**
+	 * Gets concrete entry viewer specific storage instance.
+	 * @return 	Concrete entry viewer specific storage instance.
+	 */
+	protected abstract AbstractEntryStorage getEntryStorageInstance();
+	
+	/**
+	 * Gets concrete entry viewer specific viewer sorter.
+	 * @return 	Concrete entry viewer specific viewer sorter.
+	 */
+	protected abstract ViewerSorter createViewerSorter();
+
+	/**
+	 * Gets concrete entry viewer specific label provider.
+	 * @return 	Concrete entry viewer specific label provider.
+	 */
+	protected abstract IBaseLabelProvider createLabelProvider();
+
+	/**
+	 * Gets concrete entry viewer specific content provider.
+	 * @return 	Concrete entry viewer specific content provider.
+	 */
+	protected abstract IContentProvider createContentProvider();
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite#createControls()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		
+		// Concrete viewer instantiation is done by sub classes
+		entriesViewer = createEntryTableViewer(this);
+		
+		// As well as creation of concrete providers and concrete entry storage
+		IContentProvider entryContentProvider = createContentProvider();
+		entriesViewer.setContentProvider(entryContentProvider);
+		IBaseLabelProvider labelProvider = createLabelProvider();
+		entriesViewer.setLabelProvider(labelProvider);
+		entriesViewer.setInput(entryContentProvider);
+		ViewerSorter entrySorter = createViewerSorter();
+		entriesViewer.setSorter(entrySorter);
+		// Storing entry storage instance reference.
+		AbstractEntryStorage entryConfigStorage = getEntryStorageInstance();
+		// Adding checked statuses before adding check state listener...	
+		entriesViewer.setCheckedElements(entryConfigStorage.getSelectedEntries());
+		// ...and start listening for status changes.
+		entriesViewer.addCheckStateListener(this);
+		// Listening for configuration change events for enabling UI refresh
+		entryConfigStorage.addConfigurationChangeListener(this);
+	}
+
+	/**
+	 * Refreshes the entry UI.
+	 */
+	public void refresh() {
+		try {
+			entriesViewer.refresh();	
+			// Check state might have been changed due to refresh
+			notifyEntryCheckStateListener();
+		} catch (SWTException e) {
+			// We might get time-to-time non-fatal SWTException: Widget is disposed, 
+			// which can be ignored.
+		} catch (Exception e) {
+			// Stack trace is shown for other exceptions 
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Gets entry table viewer instance.
+	 * @return Entry table viewer instance.
+	 */
+	public TableViewer getEntryViewer() {
+		return entriesViewer;
+	}
+
+	/**
+	 * Adds check mark to all entries.
+	 */
+	private void checkAll() {		
+		// Removing possible earlier check status listener
+		entriesViewer.removeCheckStateListener(this);	
+		entriesViewer.setAllChecked(true);			
+		// and start listening for status changes again.
+		entriesViewer.addCheckStateListener(this);
+		if(entryCheckStateListener != null){
+			entryCheckStateListener.allEntriesChecked();
+		}
+	}
+
+	/**
+	 * Removes check mark from all entries.
+	 */
+	private void uncheckAll() {		
+		// Removing possible earlier check status listener
+		entriesViewer.removeCheckStateListener(this);
+		// Clearing all previous check marks
+		entriesViewer.setAllChecked(false);			
+		// and start listening for status changes again.
+		entriesViewer.addCheckStateListener(this);
+		if(entryCheckStateListener != null){
+			entryCheckStateListener.allEntriesUnchecked();
+		}
+	}
+
+	/**
+	 * Adds selection listener to the table viewer.
+	 */
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {		
+		entriesViewer.addSelectionChangedListener(listener);
+	}
+
+	/**
+	 * Removes selection listener fromthe table viewer.
+	 */
+	public void removeSelectionChangedListener(ISelectionChangedListener listener) {		
+		entriesViewer.removeSelectionChangedListener(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
+	 */
+	public void checkStateChanged(CheckStateChangedEvent event) {
+		// Updating checked state information for the entry
+		AbstractEntry entry = (AbstractEntry) event.getElement();
+		entry.setSelected(event.getChecked());
+		notifyEntryCheckStateListener();
+	}
+
+	public void configurationChanged(int eventType) {
+		// Updating check state information to UI
+		if(eventType == IConfigurationChangedListener.ALL_ENTRIES_CHECKED){
+			checkAll();			
+		}
+		else if(eventType == IConfigurationChangedListener.ALL_ENTRIES_UNCHECKED){
+			uncheckAll();
+		}
+		else{
+			// In other check cases UI must be refreshed...
+			refresh();
+			// ...before querying the latest information from storage
+			Collection<AbstractEntry> entryColl = getEntryStorageInstance().getEntries();
+			for (AbstractEntry entry : entryColl) {
+				entriesViewer.setChecked(entry, entry.isSelected());
+			}			
+		}
+		
+		// Refreshing UI always when configuration has been changed.
+		refresh();		
+	}
+
+	/**
+	 * Sets entry check state listener.
+	 * @param listener Listener to be set.
+	 */
+	public void setEntryCheckStateListener(IEntryCheckStateListener listener) {
+		entryCheckStateListener = listener;
+		// Checking and notifying the current check status for possible listeners
+		notifyEntryCheckStateListener();
+	}
+
+	/**
+	 * Checks current check status and notifies to listener
+	 * if such is set.		
+	 */
+	private void notifyEntryCheckStateListener() {
+		if(entryCheckStateListener != null){
+			int checkElemCount = entriesViewer.getCheckedElements().length;
+			int elemCount = entriesViewer.getTable().getItemCount();
+			if(checkElemCount == 0){
+				entryCheckStateListener.allEntriesUnchecked();				
+			}
+			else if(checkElemCount == elemCount){
+				entryCheckStateListener.allEntriesChecked();								
+			}
+			else{
+				entryCheckStateListener.someEntriesChecked();												
+			}
+		}
+	}
+
+	/**
+	 * Adds a listener for double-clicks for the entry viewer.
+	 * Call is delegated further to viewer class.
+	 * @param listener a double-click listener
+	 * @see org.eclipse.jface.viewers.StructuredViewer#addDoubleClickListener           
+	 */
+	public void addDoubleClickListener(IDoubleClickListener listener) {
+		entriesViewer.addDoubleClickListener(listener);
+	}
+
+	/**
+	 * Removes the given double-click listener from this viewer. 
+	 * Call is delegated further to viewer class.
+	 * @param listener a double-click listener
+	 * @see org.eclipse.jface.viewers.StructuredViewer#removeDoubleClickListener         
+	 */
+	public void removeDoubleClickListener(IDoubleClickListener listener) {
+		entriesViewer.removeDoubleClickListener(listener);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose(){
+		super.dispose();
+		AbstractEntryStorage entryConfigStorage = getEntryStorageInstance();
+		if(entryConfigStorage != null){
+			entryConfigStorage.removeConfigurationChangeListener(this);			
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/IEntryCheckStateListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,40 @@
+/*
+* 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.apiquery.shared.ui;
+
+/**
+ * Notifies listeners when ever either all
+ * or none of the items are checke in the UI.
+ */
+public interface IEntryCheckStateListener {
+	
+	 /**
+	 * All entries were checked. 
+	 */
+	public void allEntriesChecked();
+	
+	 /**
+	 * All entries were unchecked.
+	 */
+	public void allEntriesUnchecked();
+
+	/**
+	 * Some entries has been checked.
+	 */
+	public void someEntriesChecked();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/ui/dialogs/APIQueryMessageBox.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,132 @@
+/*
+* 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.apiquery.shared.ui.dialogs;
+
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.apiquery.shared.common.ProductInfoRegistry;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+
+/**
+ * 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 APIQueryMessageBox {
+
+	MessageBox msgBox;
+
+	/**
+	 * Constructor.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public APIQueryMessageBox(String message, int style){		
+		Shell sh = APIQueryPlugin.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 APIQueryMessageBox(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/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/LogUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.util;
+
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Miscellaneous logging utilities to be used as tracing aid in case of error 
+ * for which is otherwise hard to find information about the error in end-user environment
+ * unless properly logged also in production environment with exact error data.
+ */
+public class LogUtils {
+
+	/**
+	 * Logs error message and expection's stack trace to product console if we are running code 
+	 * in Eclipse workbench environment. If not (i.e running JUnit tests) 
+	 * catching the exceptions and ignoring them.
+	 * 
+	 * Logging done here because we loose important information because
+	 * cache data load is done inside job that looses stack trace. 
+	 * 
+	 * @param errorMsg Error message to log.
+	 * @param e Exception to log.
+	 */
+	public static void logStackTrace(final String errorMsg, final Exception e) {
+		try {
+			if(e != null) e.printStackTrace();
+			// Scheduling log task to UI thread.
+			Display.getDefault().asyncExec(new Runnable(){
+				public void run() {
+					APIQueryConsole.getInstance().println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+					if(e != null){
+						StackTraceElement[] stackTrace = e.getStackTrace();
+						APIQueryConsole.getInstance().printStackTrace(stackTrace);															
+					}
+				}				
+			});
+		} catch (Exception e2) {
+			// Ignoring possible errors due to not having workbench environment running.
+		}
+	}
+
+	/**
+	 * Logs internal error message to tool's console and throws run-time exception.
+	 * @param errMsg Error message to log and pass as message to runtime exception. 
+	 * @throws RuntimeException
+	 */
+	static public void logInternalErrorAndThrowException(String errMsg) throws RuntimeException {
+		APIQueryConsole.getInstance().println("INTERNAL ERROR: " + errMsg ); //$NON-NLS-1$
+		throw new RuntimeException(errMsg);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/SourceCodeParsingUtilities.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,101 @@
+/*
+* 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.apiquery.shared.util;
+
+/**
+ * Miscellaneous utilities for parsing source code.
+ */
+public class SourceCodeParsingUtilities {
+
+	/**
+	 * Parses header name from include directive line.
+	 * @param line Line to check for.
+	 * @return Name of the header file if found, otherwise <code>null</code>.
+	 */
+	public static String parseIncludeFromLine(String line) {
+		String include = null;
+		//If include is system inculde (#include <someapi.h>)
+		//This can be really a user include, if user has been using
+		//SYSTEMINCLUDE and USERINCLUDE in "wrong" ways
+		if(hasSystemInclude(line)){
+			include = line.substring(line.indexOf("<") +1, line.indexOf(">"));			 //$NON-NLS-1$ //$NON-NLS-2$
+			include = removeIncludePath(include);
+							
+		}
+		//If include is user inculde (#include "myapi.h")
+		//this can be really a system include, if user has been using 
+		//SYSTEMINCLUDE and USERINCLUDE in "wrong" ways
+		else if(hasUserInclude(line)){
+			include=line.substring(line.indexOf("\"") +1, line.lastIndexOf("\"")); //$NON-NLS-1$ //$NON-NLS-2$
+			include = removeIncludePath(include);
+		}
+		return include;
+	}
+
+	/**
+	 * Removes path from the include, if exists, and returns only header's basename.
+	 * @param include Absolute header path name.
+	 * @return Header's basename.
+	 */
+	private static String removeIncludePath(String include) {
+		if(include.contains("\\")){ //$NON-NLS-1$
+			include = include.substring(include.lastIndexOf("\\") + 1);  //$NON-NLS-1$
+		}
+		if(include.contains("/")){ //$NON-NLS-1$
+			include = include.substring(include.lastIndexOf("/") + 1);  //$NON-NLS-1$
+		}
+		return include;
+	}
+
+	/**
+	 * Checks if line contains include directive.
+	 * @param line Line to check for.
+	 * @return <code>true</code> if include was found.
+	 */
+	private static boolean hasInclude(String line) {
+		return line.contains("#include"); //$NON-NLS-1$
+	}
+
+	/**
+	 * Checks if line contains user include directive.
+	 * @param line Line to check for.
+	 * @return <code>true</code> if include was found.
+	 */
+	public static boolean hasUserInclude(String line) {
+		return hasInclude(line) && line.contains("\""); //$NON-NLS-1$
+	}
+
+	/**
+	 * Checks if line contains system include directive.
+	 * @param line Line to check for.
+	 * @return <code>true</code> if include was found.
+	 */
+	public static boolean hasSystemInclude(String line) {
+		return hasInclude(line) && line.contains("<") && line.contains(">"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * Checks if line contains system or user include directives.
+	 * @param line Line to check for.
+	 * @return <code>true</code> if an include was found.
+	 */
+	public static boolean hasIncludes(String line) {
+		return hasUserInclude(line) || hasSystemInclude(line);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/console/APIQueryConsole.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,82 @@
+/*
+* 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.apiquery.shared.util.console;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.apiquery.shared.common.ProductInfoRegistry;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.ImageKeys;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Singleton class that offers console printing
+ * services for the API Query product.
+ */
+public class APIQueryConsole extends AbstractProductSpecificConsole {
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private APIQueryConsole instance = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public APIQueryConsole getInstance(){
+		if(instance == null ){
+			instance = new APIQueryConsole();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private APIQueryConsole(){		
+	}
+			
+	/* (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 APIQueryPlugin.getImageDescriptorForKey(ImageKeys.IMG_APP_ICON);
+	}
+	
+	/**
+	 * Prints given stack trace element array contents to console as error message.
+	 * @param stackTrace stack trace to be printed into the console
+	 */
+	public void printStackTrace(StackTraceElement[] stackTrace) {
+		for (int i = 0; i < stackTrace.length; i++) {
+			StackTraceElement stackTraceElement = stackTrace[i];
+			String traceString = stackTraceElement.toString();
+			println(traceString, IConsolePrintUtility.MSG_ERROR);
+		}
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLDataSAXHandler.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,263 @@
+/*
+* 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.apiquery.shared.util.xml;
+
+import java.util.EmptyStackException;
+import java.util.LinkedHashMap;
+import java.util.ListIterator;
+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.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * SAX parser callback class that parses the XML into
+ * into XMLElementData object array. The set of elements
+ * and attributes to be parsed are specified in constructor.
+ * 
+ * This class can parse elements that do not themselves contain 
+ * any child elements. I.e. the elements to be parsed must be 
+ * of flat XML. The parsed elements themselves can, of course, 
+ * be contained by some parent element(s) that are not parsed 
+ * by this handler.
+ */
+public class XMLDataSAXHandler extends DefaultHandler{
+
+	/**
+	 * Set of element names we are interested in.
+	 * Other elements are ignored.
+	 */
+	private final Set<String> elemNameSet;
+	
+	/**
+	 * Vector for storing the parsed elements.
+	 */
+	private final Vector<XMLElementData> parsedElementsVector;
+	
+	/**
+	 * Flag is set to true when we are inside an element that is recognized.
+	 */
+	private boolean isInsideAcceptedElement = false;
+	
+	/**
+	 * Name for the element currently under parsing.
+	 */
+	private String parsedElementName = null;
+	
+	/**
+	 * Value for the element currently under parsing.
+	 */
+	private String parsedElementValue = null;
+
+	/**
+	 * Array for storing attribute data found for the element.
+	 */
+	private Map<String, String> parsedAttributeData = null;
+	
+	/**
+	 * Element -> Attribute set map containg attributes
+	 * that should be checked for the element.
+	 */
+	private final Map<String, Map<String, String>> attributeMap;
+
+	/**
+	 * Parent restrictions for the elements.
+	 */
+	private final Map<String, String> parentElementRestrictionMap;	
+
+	/**
+	 * Storing elements to stack in order to resolve parent
+	 * for the current element.
+	 */
+	private final Stack<String> elementStack;	
+
+	/**
+	 * Constructor.
+	 * @param elemNameSet Set of element names that this handler
+	 *                    will take into account.
+	 * @param attributeMap Element -> Attribute set map containg attributes
+	 *                     that should be checked for the element.
+	 * @param parentElementRestrictionMap Parent element restrictions for parsing.
+	 */
+	public XMLDataSAXHandler(Set<String> elemNameSet, Map<String,Map<String, String>> attributeMap, 
+			                 Map<String, String> parentElementRestrictionMap){
+		this.elemNameSet = elemNameSet;
+		this.attributeMap = attributeMap;
+		this.parentElementRestrictionMap = parentElementRestrictionMap;
+		parsedElementsVector = new Vector<XMLElementData>();
+		parsedAttributeData = new LinkedHashMap<String, String>(); 
+		elementStack = new Stack<String>();	
+	}
+
+	/* (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 localName, String qName, Attributes attributes) throws SAXException {
+		
+		
+		//Storing parent for the current element
+		String parentElement = null;
+		try {
+			parentElement = elementStack.peek();
+		} catch (EmptyStackException e) {
+			// Ignoring this exception
+		}
+		// Parent element is stored => We can add current element to stack.
+		elementStack.push(localName);
+		
+		if(elemNameSet.contains(localName)){
+			
+			// Checking if possible parent element 
+			// restriction should be taken into account.
+			boolean parentElementCheckOk = true; // By default there is no restrictions
+			String parentRestriction = parentElementRestrictionMap.get(localName);
+			if(parentRestriction != null){
+								
+				if(parentElement == null || (! parentElement.equalsIgnoreCase(parentRestriction))){
+					// Parent restriction is required, and does not match
+					parentElementCheckOk = false;
+				}
+			}		
+			
+			if(parentElementCheckOk){
+				// This is an element we are interested in
+				isInsideAcceptedElement = true;
+				parsedElementName = localName;
+				
+				// Checking for possible attributes
+				Map<String, String> attrMap = attributeMap.get(localName);
+				if(attrMap != null && attrMap.size() > 0){
+
+					Set<String> attrSet = attrMap.keySet();			
+					for (int i = 0; i < attributes.getLength(); i++) {
+						String attrName = attributes.getLocalName(i);				
+						if(attrSet.contains(attrName)){
+							String attrValue = attributes.getValue(i);
+							parsedAttributeData.put(attrMap.get(attrName), attrValue);
+						}
+					}//for
+				}				
+			}			
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+	 */
+	public void characters(char[] ch, int start, int length) throws SAXException {
+		String characterDataString = new String(ch, start, length);
+
+		if(isInsideAcceptedElement){
+			if(parsedElementValue == null){
+				parsedElementValue = characterDataString;				
+			}
+			else{
+				parsedElementValue = parsedElementValue + characterDataString;								
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void endElement(String uri, String localName, String qName) throws SAXException {
+		
+		elementStack.pop(); // Updating element stack
+		
+		if(isInsideAcceptedElement){
+			// Adding element into parsed elements
+			if(parsedElementValue == null){
+				// If element did not contain value => using an empty string instead
+				parsedElementValue = ""; //$NON-NLS-1$
+			}
+			parsedElementsVector.add(new XMLElementData(parsedElementName, 
+					                 					parsedElementValue,
+					                 					parsedAttributeData));
+			isInsideAcceptedElement = false;
+			parsedElementName = null;
+			parsedElementValue = null;
+			// For the next element there is competely new data object reserved
+			parsedAttributeData = new LinkedHashMap<String, String>();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
+	 */
+	public void error(SAXParseException e) throws SAXException {			
+		String xmlParseFailedUserMsg = Messages.getString("XMLDataSAXHandler.XML_Parse_Error_ConsoleMsg" //$NON-NLS-1$
+		                                                  + "( " + getCurrentParsePath() + ")");		 //$NON-NLS-1$ //$NON-NLS-2$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+				xmlParseFailedUserMsg);
+		APIQueryConsole.getInstance().println(xmlParseFailedUserMsg + e.getMessage(), APIQueryConsole.MSG_ERROR);
+		throw new SAXException(e.getMessage());			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
+	 */
+	public void fatalError(SAXParseException e) throws SAXException {
+		String xmlParseFailedUserMsg = Messages.getString("XMLDataSAXHandler.XML_Parse_FatalError_ConsoleMsg") //$NON-NLS-1$
+														  + "( " + getCurrentParsePath() + ")";  //$NON-NLS-1$ //$NON-NLS-2$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+				xmlParseFailedUserMsg);
+		APIQueryConsole.getInstance().println(xmlParseFailedUserMsg + e.getMessage(), APIQueryConsole.MSG_ERROR);
+		throw new SAXException(e.getMessage());			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
+	 */
+	public void warning(SAXParseException e) throws SAXException {
+		String xmlParseFailedUserMsg = Messages.getString("XMLDataSAXHandler.XML_Parse_Warning_ConsoleMsg" //$NON-NLS-1$ 
+				+ "( " + getCurrentParsePath() + ")");  //$NON-NLS-1$ //$NON-NLS-2$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+				xmlParseFailedUserMsg);
+		APIQueryConsole.getInstance().println(xmlParseFailedUserMsg + e.getMessage(), APIQueryConsole.MSG_WARNING);
+	} 
+	
+	/**
+	 * Element data that was parsed.
+	 * @return Elements parsed.
+	 */
+	public XMLElementData[] getParsedElements(){
+		return parsedElementsVector.toArray(new XMLElementData[0]);
+	}
+
+	/**
+	 * Returns current parse path based on the information stored in the stack.
+	 */
+	private String getCurrentParsePath(){
+		StringBuffer path = new StringBuffer("/"); //$NON-NLS-1$
+		for (ListIterator<String> iter = elementStack.listIterator(); iter.hasNext();) {
+			String elemName = (String) iter.next();
+			path.append(elemName + "/");			 //$NON-NLS-1$
+		}
+		return path.toString();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLElementData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.shared.util.xml;
+
+import java.util.Map;
+
+/**
+ * Stores data for a single XML element that
+ * has simple string content and no sub elements.
+ * Only attribute data is stored.
+ */
+public class XMLElementData {
+
+	/**
+	 * Content for the element.
+	 */
+	private final String elementContent;
+	
+	/**
+	 * Name of the element.
+	 */
+	private final String elementName;
+
+	/**
+	 * Attribute data for the element.
+	 */
+	private final Map<String, String> attrData;
+
+	public XMLElementData(String elementName, String elementContent, Map<String, String> attrData){
+		this.elementName = elementName;
+		this.elementContent = elementContent;
+		this.attrData = attrData;		
+	}
+
+	/**
+	 * @return the elementContent
+	 */
+	public String getElementContent() {
+		return elementContent;
+	}
+
+	/**
+	 * @return the elementName
+	 */
+	public String getElementName() {
+		return elementName;
+	}
+	
+	/**
+	 * @return the attrData
+	 */
+	public Map<String, String> getAttributes() {
+		return attrData;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/shared/util/xml/XMLUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,652 @@
+/*
+* 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.apiquery.shared.util.xml;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.XMLToUIMappingRules;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * XML Transformation utils for transforming XML data into
+ * object formats supported by user interface components.
+ * This class contains static utility methods of making 
+ * conversion.
+ */
+public class XMLUtils {
+	
+	//
+	//Public static variables to XML elements 
+	//These element names is not ment to show in UI, 
+	//but are element names only in XML document.
+	//
+	
+
+	/**
+	 * Element name in XML <code>api</code>
+	 */
+	public static final String API_ELEMENT = "api"; //$NON-NLS-1$ 
+	/**
+	 * Element name in XML <code>source</code>
+	 */
+	public static final String API_ELEMENT_SOURCE_ATTRIBUTE = "source"; //$NON-NLS-1$
+	/**
+	 * Element name in XML <code>filename</code>
+	 */
+	public static final String API_ELEMENT_FILENAME = "filename";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>name</code>
+	 */
+	public static final String API_ELEMENT_NAME = "name";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>clients</code>
+	 */
+	public static final String API_ELEMENT_CLIENTS = "clients";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>client_org</code>
+	 */
+	public static final String API_ELEMENT_CLIENT_ORG = "client_org";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>note</code>
+	 */
+	public static final String API_ELEMENT_NOTE = "note";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>owner</code>
+	 */
+	public static final String API_ELEMENT_OWNER = "owner";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>base_service</code>
+	 */
+	public static final String API_ELEMENT_BASE_SERVICE = "base_service";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>partner_contacts</code>
+	 */
+	public static final String API_ELEMENT_PARTNER_CONTACTS = "partner_contacts";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>partners</code>
+	 */
+	public static final String API_ELEMENT_PARTNERS = "partners";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>extended_sdk_removed</code>
+	 */
+	public static final String API_ELEMENT_EXTENDED_SDK_REMOVED = "extended_sdk_removed";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>extended_sdk_deprecated</code>
+	 */
+	public static final String API_ELEMENT_EXTENDED_SDK_DEPRECATED = "extended_sdk_deprecated";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>extended_sdk_since</code>
+	 */
+	public static final String API_ELEMENT_EXTENDED_SDK_SINCE = "extended_sdk_since";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>for_adaptation_removed</code>
+	 */
+	public static final String API_ELEMENT_FOR_ADAPTATION_REMOVED = "for_adaptation_removed";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>for_adaptation_deprecated</code>
+	 */
+	public static final String API_ELEMENT_FOR_ADAPTATION_DEPRECATED = "for_adaptation_deprecated";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>for_adaptation_since</code>
+	 */
+	public static final String API_ELEMENT_FOR_ADAPTATION_SINCE = "for_adaptation_since";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>removed</code>
+	 */
+	public static final String API_ELEMENT_REMOVED = "removed";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>deprecated</code>
+	 */
+	public static final String API_ELEMENT_DEPRECATED = "deprecated";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>subsystem</code>
+	 */
+	public static final String API_ELEMENT_SUBSYSTEM = "subsystem";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>other</code>
+	 */
+	public static final String API_ELEMENT_OTHER = "other";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>import_lib</code>
+	 */
+	public static final String API_ELEMENT_IMPORT_LIB = "import_lib";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>dll</code>
+	 */
+	public static final String API_ELEMENT_DLL = "dll";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>specification</code>
+	 */
+	public static final String API_ELEMENT_SPECIFICATION = "specification";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>adaptation</code>
+	 */
+	public static final String API_ELEMENT_ADAPTATION = "adaptation";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>private</code>
+	 */
+	public static final String API_ELEMENT_PRIVATE = "private";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>internal</code>
+	 */
+	public static final String API_ELEMENT_INTERNAL = "internal";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>domain</code>
+	 */
+	public static final String API_ELEMENT_DOMAIN = "domain";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>sdk</code>
+	 */
+	public static final String API_ELEMENT_SDK = "sdk";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>responsible</code>
+	 */
+	public static final String API_ELEMENT_RESPONSIBLE = "responsible";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>type</code>
+	 */
+	public static final String API_ELEMENT_TYPE = "type";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>purpose</code>
+	 */
+	public static final String API_ELEMENT_PURPOSE = "purpose";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>key_name</code>
+	 */
+	public static final String API_ELEMENT_KEY_NAME = "key_name";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>value</code>
+	 */
+	public static final String API_ELEMENT_VALUE = "value";//$NON-NLS-1$
+	/**
+	 * Element name in XML <code>header</code>
+	 */
+	public static final String API_ELEMENT_HEADER = "header";//$NON-NLS-1$	
+	
+	//
+	//Public static variables to UI elements.
+	//These variables matches to XML element names, but is ment to show in UI.	
+	//	
+	
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Clients</code>
+	 */
+	public static final String DESCRIPTION_CLIENTS = "Clients";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Client Org</code>
+	 */
+	public static final String DESCRIPTION_CLIENT_ORG = "Client Org";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Note</code>
+	 */
+	public static final String DESCRIPTION_NOTE = "Note";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Owner</code>
+	 */
+	public static final String DESCRIPTION_OWNER = "Owner";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Base service</code>
+	 */
+	public static final String DESCRIPTION_BASE_SERVICE = "Base service";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Partner contacts</code>
+	 */
+	public static final String DESCRIPTION_PARTNER_CONTACTS = "Partner contacts";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Partners</code>
+	 */
+	public static final String DESCRIPTION_PARTNERS = "Partners";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Extended SDK Removed</code>
+	 */
+	public static final String DESCRIPTION_EXTENDED_SDK_REMOVED = "Extended SDK Removed";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Extended SDK Deprecated</code>
+	 */
+	public static final String DESCRIPTION_EXTENDED_SDK_DEPRECATED = "Extended SDK Deprecated";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Extended SDK Since</code>
+	 */
+	public static final String DESCRIPTION_EXTENDED_SDK_SINCE = "Extended SDK Since";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>For Adaptation Removed</code>
+	 */
+	public static final String DESCRIPTION_FOR_ADAPTATION_REMOVED = "For Adaptation Removed";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>For Adaptation Deprecated</code>
+	 */
+	public static final String DESCRIPTION_FOR_ADAPTATION_DEPRECATED = "For Adaptation Deprecated";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Other</code>
+	 */
+	public static final String DESCRIPTION_OTHER = "Other";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>LIBs</code>
+	 */
+	public static final String DESCRIPTION_LIBS = "LIBs";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>DLLs</code>
+	 */
+	public static final String DESCRIPTION_DLLS = "DLLs";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Specification</code>
+	 */
+	public static final String DESCRIPTION_SPECIFICATION = "Specification";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Adaptation</code>
+	 */
+	public static final String DESCRIPTION_ADAPTATION = "Adaptation";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Responsible</code>
+	 */
+	public static final String DESCRIPTION_RESPONSIBLE = "Responsible";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Type</code>
+	 */
+	public static final String DESCRIPTION_TYPE = "Type";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Purpose</code>
+	 */
+	public static final String DESCRIPTION_PURPOSE = "Purpose";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Key Name</code>
+	 */
+	public static final String DESCRIPTION_KEY_NAME = "Key Name";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Subsystem</code>
+	 */
+	public static final String DESCRIPTION_SUBSYSTEM = "Subsystem";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Removed</code>
+	 */
+	public static final String DESCRIPTION_REMOVED = "Removed";	//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>For Adaptation Since</code>
+	 */
+	public static final String DESCRIPTION_FOR_ADAPTATION_SINCE = "For Adaptation Since";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Deprecated</code>
+	 */
+	public static final String DESCRIPTION_DEPRECATED = "Deprecated";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Private</code>
+	 */
+	public static final String DESCRIPTION_PRIVATE = "Private";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Internal</code>
+	 */
+	public static final String DESCRIPTION_INTERNAL = "Internal";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Domain</code>
+	 */
+	public static final String DESCRIPTION_DOMAIN = "Domain";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Sdk</code>
+	 */
+	public static final String DESCRIPTION_SDK = "Sdk";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>API Name</code>
+	 */
+	public static final String DESCRIPTION_API_NAME = "API Name";//$NON-NLS-1$ 
+	/**
+	 * XML element name ment to show in UI and used as key in object model <code>Headers</code>
+	 */
+	public static final String DESCRIPTION_HEADERS = "Headers";//$NON-NLS-1$ 
+
+	//
+	// Public service methods
+	//
+	
+	/**
+	 * Converts XML data to API details object.
+	 * @param dataStrXML XML formatted data.
+	 * @return API details object.
+	 * @throws IOException 
+	 */
+	public static APIDetails xmlToAPIDetails(String dataStrXML) throws IOException{
+		
+		XMLToUIMappingRules convRules = getAPIDetailsConversionRules();
+
+		return extractAPIDetailsData(dataStrXML, convRules);
+	}
+
+	/**
+	 * Get Conversion rules to get API Details from XML.
+	 * @return
+	 */
+	public static XMLToUIMappingRules getAPIDetailsConversionRules() {
+		XMLToUIMappingRules convRules = new XMLToUIMappingRules();
+		
+		//
+		// Defining mapping rules API details
+		//
+		
+		// API name field
+		convRules.addRule(API_ELEMENT_NAME, DESCRIPTION_API_NAME); //$NON-NLS-1$ //$NON-NLS-2$
+		// Headers field
+		Map<String, String> headerAttributes = new LinkedHashMap <String, String>();
+		headerAttributes.put(API_ELEMENT_FILENAME, API_ELEMENT_FILENAME); //$NON-NLS-1$ //$NON-NLS-2$
+		convRules.addRule(API_ELEMENT_HEADER, DESCRIPTION_HEADERS, headerAttributes); //$NON-NLS-1$ //$NON-NLS-2$
+		// Key field
+		Map<String, String> keyNameAttributes = new LinkedHashMap <String, String>();
+		keyNameAttributes.put(API_ELEMENT_VALUE, API_ELEMENT_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
+		convRules.addRule(API_ELEMENT_KEY_NAME, DESCRIPTION_KEY_NAME, keyNameAttributes); //$NON-NLS-1$ //$NON-NLS-2$
+		// Other fields
+		convRules.addRule(API_ELEMENT_PURPOSE, DESCRIPTION_PURPOSE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_TYPE, DESCRIPTION_TYPE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_RESPONSIBLE, DESCRIPTION_RESPONSIBLE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_SDK, DESCRIPTION_SDK, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_DOMAIN, DESCRIPTION_DOMAIN, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_INTERNAL, DESCRIPTION_INTERNAL, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_PRIVATE, DESCRIPTION_PRIVATE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_ADAPTATION, DESCRIPTION_ADAPTATION, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_SPECIFICATION, DESCRIPTION_SPECIFICATION, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_DLL, DESCRIPTION_DLLS, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_IMPORT_LIB, DESCRIPTION_LIBS, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_OTHER, DESCRIPTION_OTHER, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_SUBSYSTEM, DESCRIPTION_SUBSYSTEM, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_DEPRECATED, DESCRIPTION_DEPRECATED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_REMOVED, DESCRIPTION_REMOVED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_FOR_ADAPTATION_SINCE, DESCRIPTION_FOR_ADAPTATION_SINCE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_FOR_ADAPTATION_DEPRECATED, DESCRIPTION_FOR_ADAPTATION_DEPRECATED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_FOR_ADAPTATION_REMOVED, DESCRIPTION_FOR_ADAPTATION_REMOVED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_EXTENDED_SDK_SINCE, DESCRIPTION_EXTENDED_SDK_SINCE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_EXTENDED_SDK_DEPRECATED, DESCRIPTION_EXTENDED_SDK_DEPRECATED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_EXTENDED_SDK_REMOVED, DESCRIPTION_EXTENDED_SDK_REMOVED, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_PARTNERS, DESCRIPTION_PARTNERS, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_PARTNER_CONTACTS, DESCRIPTION_PARTNER_CONTACTS, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_BASE_SERVICE, DESCRIPTION_BASE_SERVICE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$
+		convRules.addRule(API_ELEMENT_OWNER, DESCRIPTION_OWNER, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_NOTE, DESCRIPTION_NOTE, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_CLIENT_ORG, DESCRIPTION_CLIENT_ORG, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		convRules.addRule(API_ELEMENT_CLIENTS, DESCRIPTION_CLIENTS, API_ELEMENT); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		return convRules;
+	}
+	
+	/**
+	 * Converts XML data to API details object.
+	 * @param dataStrXML XML formatted data.
+	 * @param sourceDescription Description for the source shown in the UI.
+	 * @return API details object.
+	 * @throws IOException 
+	 */
+	public static Collection<APIShortDescription> xmlToAPIShortDescription(String dataStrXML, String sourceDescription) throws IOException{
+		XMLToUIMappingRules convRules = new XMLToUIMappingRules();
+
+		//
+		// Defining mapping rules API summary
+		//
+		
+		// API field is the only element to be parsed
+		// The element data contains API name and 
+		// API_ELEMENT_SOURCE_ATTRIBUTE contains the
+		// source for accessing API details information.
+		Map<String, String> apiAttributes = new LinkedHashMap <String, String>();
+		apiAttributes.put(API_ELEMENT_SOURCE_ATTRIBUTE, API_ELEMENT_SOURCE_ATTRIBUTE); 
+		convRules.addRule(API_ELEMENT, "API", apiAttributes); //$NON-NLS-1$ 
+ 
+		return extractAPIShortDescriptionData(dataStrXML, convRules, sourceDescription);
+	}
+
+	/**
+	 * 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 replaceForbiddenCharacters(String in){
+		String out = in.replace("&","&#38;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("<","&#60;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace(">","&#62;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("\"","&#34;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("'","&#39;");			 //$NON-NLS-1$ //$NON-NLS-2$
+		return out;		
+	}
+	
+	//
+	// Internal classes
+	// 
+
+	
+	//
+	// Private methods for the class
+	//
+	
+	/**
+	 * Parses the given elements from the XML data
+	 * and returns the resulting elements. 
+	 * @param XMLData     XML data to be parser.
+	 * @param elemNameSet Set of element names that this handler
+	 *                    will take into account.
+	 * @param attributeMap Element -> Attribute set map containg a set of attributes
+	 *                     that should be checked for the element.
+	 * @return XML elements found. 
+	 * @throws IOException 
+	 */
+	public static XMLElementData[] parseXML(String XMLData, Set<String> elemNameSet, 
+			                                Map<String,Map<String, String>>attributeMap) throws IOException{
+		return parseXML(XMLData, elemNameSet, attributeMap, new HashMap<String, String>());
+	}
+	
+	/**
+	 * Parses the given elements from the XML data
+	 * and returns the resulting elements. 
+	 * @param XMLData     XML data to be parser.
+	 * @param elemNameSet Set of element names that this handler
+	 *                    will take into account.
+	 * @param attributeMap Element -> Attribute set map containg a set of attributes
+	 *                     that should be checked for the element.
+	 * @param parentElementRestrictionMap Parent element restrictions for parsing.
+	 * @return XML elements found. 
+	 * @throws IOException 
+	 */
+	public static XMLElementData[] parseXML(String XMLData, Set<String> elemNameSet, 
+			                                Map<String,Map<String, String>>attributeMap,
+			                                Map<String, String> parentElementRestrictionMap) throws IOException{
+		
+		// Creates SAX handler that takes information into generic data structure
+		XMLDataSAXHandler handler = new XMLDataSAXHandler(elemNameSet, attributeMap, parentElementRestrictionMap);
+		
+		// Triggering actual XML parsing
+		try {		
+			InputSource dataSource = createInputSourceFromString(XMLData);
+
+			XMLReader parser = XMLReaderFactory.createXMLReader();		
+						
+			
+			parser.setContentHandler(handler);
+			parser.setErrorHandler(handler);
+			
+			parser.parse(dataSource);
+						
+		} catch (SAXException e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().printStackTrace(e.getStackTrace());
+			throw new IOException ("XML parsing failed" + " (" + e.getMessage() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		} catch (IOException e) {
+			e.printStackTrace();
+			APIQueryConsole.getInstance().printStackTrace(e.getStackTrace());
+			throw e;
+		}				
+		
+		return handler.getParsedElements();
+	}
+	
+	/**
+	 * Creates input source from XML data string.
+	 * @param XMLData XML data string to be created input source from.
+	 * @return Input source from the given string.
+	 */
+	private static InputSource createInputSourceFromString(String XMLData){
+		StringReader rdr = new StringReader(XMLData);
+		return new InputSource(rdr); 
+	}
+		
+	/**
+	 * Parsed API summary objects from given XML data string.
+	 * @param XMLData XML data string to be parsed. 
+	 * @param mappingRules Mapping rules used to convert XML elements into 
+	 *                     corresponding descriptions.
+	 * @param sourceDescription Description for the source shown in the UI.
+	 * @return Collection of API summary objects extracted from the XML data.
+	 * @throws IOException 
+	 */
+	private static Collection<APIShortDescription> extractAPIShortDescriptionData(String XMLData, 
+																XMLToUIMappingRules mappingRules,
+																String sourceDescription) throws IOException{
+		
+		// Printing with loop-priority because there will be a lot of data printed out
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-"); //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "API Summary data: " + XMLData); //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-"); //$NON-NLS-1$
+		
+		ArrayList<APIShortDescription> summaryList = new ArrayList<APIShortDescription>();
+		
+		XMLElementData[] elementArr = parseXML(XMLData, 
+											   mappingRules.getMapFromKeySet(),
+											   mappingRules.getAttributeMap());
+
+		// Mapping data fields into corresponding API summary fields
+		for (int i = 0; i < elementArr.length; i++) {
+			// Validating first that we have data that we should have
+			if(! elementArr[i].getElementName().equals(API_ELEMENT)){
+				throw new RuntimeException("Internal error (XMLUtils): Invalid XML, expected '" + API_ELEMENT + "' element, but encountered: " + elementArr[i].getElementName()); //$NON-NLS-1$ //$NON-NLS-2$ 
+			}
+			if(elementArr[i].getAttributes().size() != 1){
+				throw new RuntimeException("Internal error (XMLUtils): Invalid XML, '" + API_ELEMENT + "' should be always attached with '" + API_ELEMENT_SOURCE_ATTRIBUTE + "' attribute"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+			}
+
+			// Converting values into API summary
+			String source = elementArr[i].getAttributes().get(API_ELEMENT_SOURCE_ATTRIBUTE);
+			String value = elementArr[i].getElementContent();	// API name			
+			summaryList.add(new APIShortDescription(value, source, sourceDescription));
+		}
+		
+		return summaryList;		
+	}
+
+	/**
+	 * Parsed API details object from given XML data string.
+	 * @param XMLData XML data string to be parsed. 
+	 * @param mappingRules Mapping rules used to convert XML elements into 
+	 *                     corresponding descriptions.
+	 * @return API details object extracted from the XML data.
+	 * @throws IOException 
+	 */
+	public static APIDetails extractAPIDetailsData(String XMLData, 
+													XMLToUIMappingRules mappingRules) throws IOException{
+
+		// Printing with loop-priority because there will be a lot of data printed out
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-"); //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "API Details data: " + XMLData); //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-"); //$NON-NLS-1$
+
+		APIDetails details = new APIDetails();
+		
+		XMLElementData[] elementArr = parseXML(XMLData, 
+											   mappingRules.getMapFromKeySet(),
+											   mappingRules.getAttributeMap(),
+											   mappingRules.getParentElementRestrictionMap());
+		
+		// Mapping data fields into corresponding API detail fields
+		for (int i = 0; i < elementArr.length; i++) {
+			XMLElementData data = elementArr[i];
+			String description = mappingRules.mapFrom(data.getElementName());
+			String value = ""; //$NON-NLS-1$
+			Map<String, String> attrData = data.getAttributes();
+			boolean wasNamedParameters = false;
+
+			//If there is some attributes...
+			if(attrData.size()> 0){
+				Map <String,String> attrNames = mappingRules.getAttributeNamesMap(data.getElementName());
+				
+				Set<String> keys = attrData.keySet();
+
+				// Attribute data overrides element data
+				// Attributes are used for <key_name>, and <header> elements.
+				boolean first = true;
+				
+				for (String key : keys) {
+					String attr = attrData.get(key);
+					String attrKey = getKeyByValue(key, attrNames);
+					
+					//set parameter description if has one!
+					if(attrNames != null && attrNames.containsValue(key) && !key.equals(attrKey)){
+						details.addOrUpdateField(key, attr);	
+						wasNamedParameters = true;
+					}	
+					//Comma separated values -->					
+					else if(first){
+						value = attr;													
+						first = false;
+					}else{
+						value = value + APIDetailField.VALUE_FIELD_SEPARATOR + attr;													
+					}																	
+				}
+				
+			}
+			else{
+				 value = data.getElementContent();
+			}
+			//If there was only attributes set as own rows, must be checked that if there was some other content as well
+			// Either addig or updating an existing field.
+			//If there was named parameters, and there was no non-named parameters, then element it self is
+			//not ment to occur in UI, only independent parameters.
+			if(!wasNamedParameters || value.trim().length() > 0){
+				details.addOrUpdateField(description, value);
+			}
+		}
+		
+		return details;
+	}
+
+	/**
+	 * Get XML element name by UI element name.
+	 * @param value
+	 * @param attrNames
+	 * @return
+	 */
+	private static String getKeyByValue(String value,
+			Map<String, String> attrNames) {
+		Set<String> keys = attrNames.keySet();
+		for (String key : keys) {
+			String value_ = attrNames.get(key);
+			if(value_.equals(value)){
+				return key;
+			}
+		}
+		return null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/actions/AbstractMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+
+/**
+ * Common abstract base class for all main view
+ * related actions.
+ */
+public abstract class AbstractMainViewAction extends Action {
+
+	/**
+	 * Reference to the view.
+	 */
+	MainView view;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public AbstractMainViewAction(MainView view) {
+		super();
+		this.view = view;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		view.updateActionButtonStates();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/actions/ToolsMenuAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,95 @@
+/*
+* 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.apiquery.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+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 {
+    		IWorkbenchPage page = window.getActivePage();
+    		
+    		// 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)){
+					// Found, restoring the view
+					IViewPart viewPart = reference.getView(true);
+					page.activate(viewPart);
+					return;
+				}
+			}
+    		
+    		// View was not found, opening it up as a new view.
+    		page.showView(MainView.ID);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			APIQueryConsole.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) {
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/dialogs/FirstTimePopUpDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,169 @@
+/*
+* 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.apiquery.ui.dialogs;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+
+/**
+ * Class for showing First time pop up dialog (Quick help).
+ * 
+ * This dialog is ment to open when API Query application 
+ * is started for the wery first time.
+ *
+ */
+public class FirstTimePopUpDialog {
+	
+	private static final String NEW_LINE = "\n\n"; //$NON-NLS-1$
+
+	/**
+	 * For checking if Web data source is available to build message, we need to check
+	 * id Web data source was found and we cannot have dependency to data source
+	 * plug-ins in main plug-in. Thats why we keep this duplicate ID here.
+	 */
+	private static final String WEB_DATASOURCE_ID = "web";
+	
+	/**
+	 * No construction, only static method to use.
+	 *
+	 */
+	private FirstTimePopUpDialog(){
+	}
+	
+	/**
+	 * Open the first time pop up dialog (quick help).
+	 *
+	 */
+	public static void open(Shell parent) {
+
+		StringBuffer msg = new StringBuffer();		
+
+		msg.append(Messages.getString("FirstTimePopUpDialog.Topic_Msg")); //$NON-NLS-1$
+		msg.append(NEW_LINE);
+		msg.append(Messages.getString("FirstTimePopUpDialog.Tool_Is_For_Msg")); //$NON-NLS-1$
+		
+		String dataSourcesMsg = getDataSourcesMsg();
+		
+		msg.append(NEW_LINE);
+		msg.append(dataSourcesMsg); 
+		msg.append(NEW_LINE);
+		msg.append(Messages.getString("FirstTimePopUpDialog.Seach_Msg")); //$NON-NLS-1$
+		msg.append(NEW_LINE);
+		msg.append(Messages.getString("FirstTimePopUpDialog.Results_Msg")); //$NON-NLS-1$
+		msg.append(NEW_LINE);
+		msg.append(Messages.getString("FirstTimePopUpDialog.Project_Query_Msg")); //$NON-NLS-1$
+		msg.append(NEW_LINE);
+		msg.append(Messages.getString("FirstTimePopUpDialog.More_Information_Msg")); //$NON-NLS-1$
+		
+		MessageDialog.openInformation(parent,
+				Messages.getString("FirstTimePopUpDialog.Title_Msg"),msg.toString());//$NON-NLS-1$
+	}
+
+	/**
+	 * Get part of the dialog messages where data sources are described. 
+	 * Message content depends on current data source configuration
+	 * @return msg to show in UI
+	 */
+	private static String getDataSourcesMsg() {
+				
+		//Message with 3 data sources will be:
+		//To configure Data Sources, open the Properties tab at the bottom of the API Query view. 
+		//Three types of Data Sources are currently available: 
+		//Web Server, API Metadata files from the SDK and Excel Interface Sheets. 
+		//There are three Web servers configured by default, but only two of them are enabled.		
+
+		SearchMethodExtensionRegistry smeRegistry = SearchMethodExtensionRegistry.getInstance();
+		int extensionCount = smeRegistry.getExtensionCount();
+		//If we have web data source or not
+		boolean isWeb = false;
+		
+		Collection<ISearchMethodExtension> extensions = smeRegistry.getExtensions();
+		String dataSourcesMsg = Messages.getString("FirstTimePopUpDialog.Properties_Msg_Configure"); //$NON-NLS-1$
+		dataSourcesMsg += " ";//$NON-NLS-1$
+		//If we have only one data source
+		if(extensionCount == 1){
+			dataSourcesMsg =Messages.getString("FirstTimePopUpDialog.Properties_Msg_Option_One_DataSources"); //$NON-NLS-1$
+			String ds1 = null;
+			for (Iterator<ISearchMethodExtension> iterator = extensions.iterator(); iterator.hasNext();) {
+				ISearchMethodExtension extension = (ISearchMethodExtension) iterator.next();
+				isWeb = isExtensionWeb(isWeb, extension);
+				ds1 = extension.getExtensionInfo().getDescription();
+			}		
+			dataSourcesMsg = String.format(dataSourcesMsg, ds1);
+			
+		}
+		//If we have 2 data sources available
+		else if(extensionCount == 2){
+			dataSourcesMsg = Messages.getString("FirstTimePopUpDialog.Properties_Msg_Option_Two_DataSources"); //$NON-NLS-1$
+			String ds1 = null;
+			String ds2 = null;
+			for (Iterator<ISearchMethodExtension> iterator = extensions.iterator(); iterator.hasNext();) {
+				ISearchMethodExtension extension = (ISearchMethodExtension) iterator.next();
+				isWeb = isExtensionWeb(isWeb, extension);
+				if(ds1 == null){
+					ds1 = extension.getExtensionInfo().getDescription();
+				}else{
+					ds2 = extension.getExtensionInfo().getDescription();
+				}
+			}		
+			dataSourcesMsg = String.format(dataSourcesMsg, ds1, ds2);
+		}
+		//if we have 3 data sources available
+		else{//else it will be 3, but just in case having just else case
+			dataSourcesMsg = Messages.getString("FirstTimePopUpDialog.Properties_Msg_Option_Three_DataSources"); //$NON-NLS-1$
+			String ds1 = null;
+			String ds2 = null;
+			String ds3 = null;
+			for (Iterator<ISearchMethodExtension> iterator = extensions.iterator(); iterator.hasNext();) {
+				ISearchMethodExtension extension = (ISearchMethodExtension) iterator.next();
+				isWeb = isExtensionWeb(isWeb, extension);
+				if(ds1 == null && ds2 == null){
+					ds1 = extension.getExtensionInfo().getDescription();
+				}else if(ds2 == null){
+					ds2 = extension.getExtensionInfo().getDescription();
+				}else {
+					ds3 = extension.getExtensionInfo().getDescription();
+				}
+			}		
+			dataSourcesMsg = String.format(dataSourcesMsg, ds1, ds2, ds3);
+		}
+		//If we have web data source, adding web data source information to the end
+		if(isWeb){
+			dataSourcesMsg += " ";//$NON-NLS-1$
+			dataSourcesMsg += Messages.getString("FirstTimePopUpDialog.Properties_Msg_WebDescription"); //$NON-NLS-1$
+		}
+		return dataSourcesMsg;
+	}	
+
+	/**
+	 * Checking if this is Web extension
+	 * @param isWebAllreadyFound boolean that indicates that web is already found
+	 * @param extension
+	 * @return <code>true</code> if is <code>false</code> otherwise
+	 */
+	private static boolean isExtensionWeb(boolean isWebAllreadyFound , ISearchMethodExtension extension) {
+		return isWebAllreadyFound || extension.getExtensionInfo().getId().equalsIgnoreCase(WEB_DATASOURCE_ID);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/dialogs/OpenReportStatusDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.ui.dialogs;
+
+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;
+
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+
+/**
+ * Simple dialog asking if user want to open created file or not.
+ *
+ */
+public class OpenReportStatusDialog extends StatusDialog {
+
+	private final String fileName;
+
+	/**
+	 * Open a Dialog
+	 * @param parent
+	 * @param fileName
+	 */
+	public OpenReportStatusDialog(Shell parent, String fileName) {
+		super(parent);
+		this.fileName = fileName;
+		init();
+
+	}
+
+	/**
+	 * Set title, default orientation and help not available
+	 */
+	private void init() {
+		setTitle(Messages.getString("OpenReportStatusDialog.OpenReport_Msg"));		 //$NON-NLS-1$
+		setHelpAvailable(false);
+		setDefaultOrientation(SWT.CENTER);
+	}
+	
+	/* (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(Messages.getString("OpenReportStatusDialog.DoYouWantOpenReport_Msg") +fileName +"?");				 //$NON-NLS-1$ //$NON-NLS-2$
+			
+		return composite;
+	} 	
+	
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/MainView.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,352 @@
+/*
+* 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.apiquery.ui.views.main;
+
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.jface.action.IToolBarManager;
+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.widgets.Composite;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.s60tools.apiquery.servlets.APIQueryWebServerConfigurator;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.ui.views.main.properties.PropertiesTabComposite;
+import com.nokia.s60tools.apiquery.ui.views.main.search.SearchTabComposite;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This class comprises the Main View of the API Query
+ * 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 MainView 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.apiquery.ui.views.main.MainView"; //$NON-NLS-1$
+		
+	
+	//
+	// Controls and related classes (providers etc.)
+	// 
+						
+	private CTabItem searchTab;
+	private CTabItem propertiesTab;
+
+static	private PropertiesTabComposite propertiesTabContents;
+	private SearchTabComposite searchTabContents;
+
+	/**
+	 * The constructor.
+	 */
+	public MainView() {
+		//Starting APIQuery WebServer
+		APIQueryWebServerConfigurator.startServer(APIQueryWebServerConfigurator.Carbide_Instance_start);		
+	}
+
+	
+	public  static  void enablePropTabcontents(boolean enable) 
+	  { 
+		  if(propertiesTabContents!=null)
+		  {
+		  if(enable)  propertiesTabContents.enablePropTabComponents();
+		  else propertiesTabContents.disablePropTabComponents();
+		  }
+			  
+			  
+	  }
+	
+	
+	
+	
+	
+	/**
+	 * This is called by framework when the controls for
+	 * the view should be created.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		try {
+
+			//
+			// 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...
+			CTabFolder mainViewTabFolder = new CTabFolder(
+					mainViewSashForm, SWT.BOTTOM);
+			//... search tab
+			createSearchTabControl(mainViewTabFolder);
+			//... properties tab
+			createPropertiesTabControl(mainViewTabFolder);
+
+			// Default selection for tab folder
+			mainViewTabFolder.setSelection(searchTab);
+
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+	}
+
+	
+	/**
+	 * Creates search tab.
+	 * @param parentTabFolder Parent tab folder.
+	 */
+	private void createSearchTabControl(CTabFolder parentTabFolder) {
+		SashForm searchTabSashForm = new SashForm(parentTabFolder, SWT.VERTICAL);		
+		searchTab = new CTabItem(parentTabFolder, SWT.NONE);
+		searchTab.setControl(searchTabSashForm);
+		searchTab.setText(Messages.getString("MainView.Search_Tab_Title"));		 //$NON-NLS-1$
+		createSearchTabContents(searchTabSashForm);
+	}
+
+	/**
+	 * Creates search tab contents. This can be also delegated to a class of its own.
+	 * @param parentComposite	Parent composite.
+	 */
+	private void createSearchTabContents(Composite parentComposite) {
+		// Contents creation is delegated to an external class
+		searchTabContents = new SearchTabComposite(parentComposite);	
+	}
+
+	/**
+	 * Creates properties tab.
+	 * @param parentTabFolder Parent tab folder.
+	 */
+	private void createPropertiesTabControl(CTabFolder parentTabFolder) {		
+		SashForm propertiesTabSashForm = new SashForm(parentTabFolder, SWT.VERTICAL);		
+		propertiesTab = new CTabItem(parentTabFolder, SWT.NONE);
+		propertiesTab.setControl(propertiesTabSashForm);
+		propertiesTab.setText(Messages.getString("MainView.Properties_Tab_Title")); //$NON-NLS-1$
+		createPropertiesTabContents(propertiesTabSashForm);
+	}
+	
+	/**
+	 * Creates properties tab contents.
+	 * @param parentComposite	Parent composite.
+	 */
+	private void createPropertiesTabContents(Composite parentComposite) {
+		// Contents creation is delegated to an external class
+		propertiesTabContents = new PropertiesTabComposite(parentComposite);	
+	}
+	
+	
+	/**
+	 * Focus request should be passed to the view's primary control.
+	 */
+	public void 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(){
+	}
+
+	/**
+	 * 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
+	}
+
+	/**
+	 * 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 MainView getViewInstance() throws PartInitException{
+		
+		IWorkbenchPage page = APIQueryPlugin.getCurrentlyActivePage();
+		return getViewInstance(page);
+		
+	}
+	/**
+	 * 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 MainView getViewInstance(IWorkbenchPage page) throws PartInitException{
+				
+		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);
+			}
+		}
+		// View was not opened
+		if(! viewAlreadyVisible){
+			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().inputUpdated();
+			
+		} catch (PartInitException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Enables the starting of API queries
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @param useExactMatch <code>true</code> if search string will be searched with exact match 
+	 * instead of contains.
+	 * @throws QueryOperationFailedException 
+	 */
+	public static void runAPIQueryFromExternalClass(int queryType, String queryString, boolean useExactMatch ) throws QueryOperationFailedException{
+		try {
+			
+			MainView view = getViewInstance();
+			view.runAPIQuery(queryType, queryString, useExactMatch);
+			
+		} catch (PartInitException e) {
+			e.printStackTrace();
+			throw new QueryOperationFailedException(e.getMessage());
+		}
+	}
+	
+	/**
+	 * Enables the starting of API queries
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @return collection of APIShortDescription objects or empty list if not found any
+	 * 	or null if MainView cannot found
+	 */
+	public static Collection<APIShortDescription> runActiveProjectQueryFromExternalClass(int queryType, String queryString){
+		try {
+			
+			MainView view = getViewInstance();
+			return view.runActiveProjectQuery(queryType, queryString);
+			
+		} catch (PartInitException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}	
+		
+	
+	/**
+	 * Starts API query operation programmatically.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 */
+	private Collection<APIShortDescription> runActiveProjectQuery(int queryType, String queryString){
+		return searchTabContents.runActiveProjectQuery(queryType, queryString);
+	}	
+	
+	
+	/**
+	 * Starts API query operation programmatically.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @param useExactMatch <code>true</code> if search string will be searched with exact match 
+	 * instead of contains.
+	 */
+	public void runAPIQuery(int queryType, String queryString, boolean useExactMatch){
+		searchTabContents.runAPIQuery(queryType, queryString, useExactMatch);
+	}
+	
+	/**
+	 * The view should refresh all its UI components in this method.
+	 */
+	private void inputUpdated() {		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- Dispose() --> " + getClass().getName());		 //$NON-NLS-1$
+		searchTabContents.dispose();
+		propertiesTabContents.dispose();
+		//Stopping APIQuery WebServer
+		APIQueryWebServerConfigurator.stopServer();		
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/properties/PropertiesTabComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,320 @@
+/*
+* 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.apiquery.ui.views.main.properties;
+
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.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.Layout;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.apiquery.APIQueryHelpContextIDs;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.preferences.APIQueryPreferences;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+public class PropertiesTabComposite extends AbstractUiFractionComposite {
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 1;
+	
+	private ComboViewer searchMethodsComboViewer;
+	private Group searchMethodSpecificUiFractionGroup;	
+	private AbstractUiFractionComposite searchMethodSpecificUiComposite;
+
+	private Button showDataSourceInResultsBtn;
+	
+	private static Object mutex = new Object();
+
+	private static int serachcount = 0;
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public PropertiesTabComposite(Composite parentComposite) {
+		super(parentComposite);
+	}
+	
+	
+public void enablePropTabComponents() {
+		
+
+		synchronized (mutex) {
+		if((--serachcount)<=0)serachcount=0;
+			
+			if (serachcount == 0) {
+				Display.getDefault().syncExec(new Runnable() {
+					public void run() {
+						try {
+						if (!searchMethodsComboViewer.getControl().isEnabled())
+							searchMethodsComboViewer.getControl().setEnabled(
+									true);
+						if (!searchMethodSpecificUiFractionGroup.isEnabled())
+							searchMethodSpecificUiFractionGroup
+									.setEnabled(true);
+						if (!showDataSourceInResultsBtn.isEnabled())
+							showDataSourceInResultsBtn.setEnabled(true);
+						}catch (Exception e) {
+						e.printStackTrace();
+						}
+					}
+				});
+			}
+		}
+
+	}
+
+	public void disablePropTabComponents() {
+
+		synchronized (mutex) {
+			serachcount++;
+
+			Display.getDefault().syncExec(new Runnable() {
+				public void run() {
+					try{
+					if (searchMethodsComboViewer.getControl().isEnabled())
+						searchMethodsComboViewer.getControl().setEnabled(false);
+					if (searchMethodSpecificUiFractionGroup.isEnabled())
+						searchMethodSpecificUiFractionGroup.setEnabled(false);
+					if (showDataSourceInResultsBtn.isEnabled())
+						showDataSourceInResultsBtn.setEnabled(false);
+					}catch (Exception e) {
+						e.printStackTrace();
+						// TODO: handle exception
+					}
+
+				}
+			});
+
+		}
+
+	}
+	
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayoutData()
+	 */
+	protected Object createLayoutData(){
+		return 	new GridData(GridData.FILL_HORIZONTAL);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		
+		// Setting layout information
+		Composite tabContentsComposite = new Composite(this, SWT.NONE);
+		  
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		tabContentsComposite.setLayout(gdl);
+		tabContentsComposite.setLayoutData(gd);
+		
+		// Creating controls
+		Label comboTitleLabel = new Label(tabContentsComposite, SWT.LEFT);
+		String searchMethodComboName = Messages.getString("PropertiesTabComposite.DataSource_Msg"); //$NON-NLS-1$
+		comboTitleLabel.setText(searchMethodComboName + ":");		 //$NON-NLS-1$
+		searchMethodsComboViewer = new ComboViewer(tabContentsComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+		
+		// Declared as 'final' in order to be able to use in anonymous class using the data 
+		final Combo cmb = searchMethodsComboViewer.getCombo();
+		cmb.setText(searchMethodComboName);
+		cmb.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+				
+		SearchMethodExtensionRegistry reg = SearchMethodExtensionRegistry.getInstance();
+		
+		int currentlySelectedMethodIndex = 0;
+		ISearchMethodExtensionInfo currSelInfo = UserSettings.getInstance().getCurrentlySelectedSearchMethodInfo();
+		
+		for (ISearchMethodExtension ext : reg.getExtensions()) {
+			ISearchMethodExtensionInfo info = ext.getExtensionInfo();
+			cmb.add(info.getDescription());
+			if(info.hasEqualId(currSelInfo)){
+				currentlySelectedMethodIndex = cmb.getItemCount()-1;
+			}
+			
+		}		
+		cmb.select(currentlySelectedMethodIndex);
+		
+		//Add button 
+		
+		String desc = Messages.getString("PropertiesTabComposite.ShowDataSourceInResults_Msg"); //$NON-NLS-1$ 
+		showDataSourceInResultsBtn = new Button(tabContentsComposite, SWT.CHECK);			
+		showDataSourceInResultsBtn.setText(desc);
+		boolean showDataSourceInResults = APIQueryPreferences.getShowDataSourceInResults();
+		showDataSourceInResultsBtn.setSelection(showDataSourceInResults);
+		showDataSourceInResultsBtn.addSelectionListener(new ShowDataSourceInResultsSelectionListener());
+		// Storing to Button array for later reference
+				
+		// Adding anonymous selection changed listener
+		// Possibly taken in future into its own class.
+		searchMethodsComboViewer.addSelectionChangedListener(new ISelectionChangedListener(
+		){
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+			 */
+			public void selectionChanged(SelectionChangedEvent event) {
+				int selIndx = cmb.getSelectionIndex();
+				SearchMethodExtensionRegistry smeReg = SearchMethodExtensionRegistry.getInstance();
+				ISearchMethodExtension ext = smeReg.getByDescription(cmb.getItem(selIndx));
+				if(ext != null){
+					UserSettings.getInstance().setCurrentlySelectedSearchMethodInfo(ext.getExtensionInfo());
+				}
+				updateGroupControlContentsBasedOnTheCurrentSelection();
+			}
+	
+		});
+		
+		// Adding group that will be populated by the search method-specific extensions.
+		
+		searchMethodSpecificUiFractionGroup = new Group(this, SWT.SHADOW_NONE);
+		searchMethodSpecificUiFractionGroup.setText(getGroupDescriptionBasedOnTheCurrentSelection());
+		GridLayout gdl2 = new GridLayout(cols, false);
+		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+		searchMethodSpecificUiFractionGroup.setLayout(gdl2);
+		searchMethodSpecificUiFractionGroup.setLayoutData(gd2);
+
+		// Adding Search method-specific UI fraction.
+		searchMethodSpecificUiComposite = getSearchMethodSpecifiUIFraction();
+		
+		setContextSensitiveHelpIDs(tabContentsComposite);
+	}
+
+	
+	/**
+	 * Class that listens button state changes and updates preferences and results composite
+	 */
+	private class ShowDataSourceInResultsSelectionListener implements SelectionListener{
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+
+			//Setting selection preferences
+			APIQueryPreferences.setShowDataSourceInResults(showDataSourceInResultsBtn.getSelection());
+			UserSettings.getInstance().settingsChanged();
+		}
+		
+	}
+	
+	/**
+	 * Set context sensitive help ids to components that can have focus	
+	 * @param cmb
+	 */
+	private void setContextSensitiveHelpIDs(Composite cmb) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(cmb, 
+				APIQueryHelpContextIDs.API_QUERY_HELP_PROPERTIES_TAB);
+	}
+	/**
+	 * Resolves the group area description based on the current selection.
+	 * @return Returns the group area description for the currently selected search method.
+	 */
+	private String getGroupDescriptionBasedOnTheCurrentSelection(){
+		return getSearchMethodDescriptionBasedOnTheCurrentSelection() + "s";		 //$NON-NLS-1$
+	}
+	
+	/**
+	 * Resolves the description for the current selection.
+	 * @return Returns the descriptipn for the current selection.
+	 */
+	private String getSearchMethodDescriptionBasedOnTheCurrentSelection(){
+		Combo cmb = searchMethodsComboViewer.getCombo();
+		return cmb.getItem(cmb.getSelectionIndex());		
+	}
+
+	/**
+	 * Updates the contents of the group area based on the current selection.
+	 */
+	private void updateGroupControlContentsBasedOnTheCurrentSelection(){
+		
+		// Updating UI description
+		searchMethodSpecificUiFractionGroup.setText(getGroupDescriptionBasedOnTheCurrentSelection());	
+
+		// Disposing existing UI and re-creating search method specifiv UI fraction.
+		if(searchMethodSpecificUiComposite != null){
+			searchMethodSpecificUiComposite.dispose();
+			searchMethodSpecificUiComposite = getSearchMethodSpecifiUIFraction();
+			searchMethodSpecificUiFractionGroup.layout(true);
+			int wHint = searchMethodSpecificUiComposite.getWidthHint();
+			int hHint = searchMethodSpecificUiComposite.getHeightHint();
+			Point size = searchMethodSpecificUiFractionGroup.computeSize(wHint, hHint);
+			searchMethodSpecificUiFractionGroup.setSize(size);
+		}
+	}
+	
+	/**
+	 * Created UI fraction for the currently selected search method.
+	 * @return UI fraction as AbstractUiFractionComposite. 
+	 */
+	private AbstractUiFractionComposite getSearchMethodSpecifiUIFraction(){
+		
+		String selectedExtDescription = getSearchMethodDescriptionBasedOnTheCurrentSelection();
+		SearchMethodExtensionRegistry smeReg = SearchMethodExtensionRegistry.getInstance();
+		ISearchMethodExtension selectedExtension = smeReg.getByDescription(selectedExtDescription);
+		
+		return selectedExtension.createExtensionConfigurationUi(searchMethodSpecificUiFractionGroup);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- Dispose() --> " + getClass().getName());		 //$NON-NLS-1$
+		
+		searchMethodsComboViewer.getCombo().dispose();
+		searchMethodSpecificUiFractionGroup.dispose();	
+		searchMethodSpecificUiComposite.dispose();
+		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/APIDataTaskList.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,49 @@
+/*
+ * 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.apiquery.ui.views.main.search;
+import java.util.Vector;
+
+/**
+ * Class that plays the role of the domain model in the TableViewerExample
+ * In real life, this class would access a persistent store of some kind.
+ * 
+ */
+
+//Data  Objects
+
+public class APIDataTaskList {
+
+	private Vector<APITask> tasks ;
+	public APIDataTaskList() {
+		super();
+		tasks = new Vector<APITask>();
+	}
+	public void addTask(APITask task)
+	{
+		tasks.add(task);
+	}
+
+	public Vector<APITask> getTasks() {
+		return tasks;
+	}
+
+	public void removeTaksList()
+	{
+		tasks = new Vector<APITask>();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/APITask.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,46 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+public class APITask {
+
+	private String[] Columns = null;	
+
+
+	
+	public APITask(String[] columnData) {
+
+		super();
+		Columns = columnData;
+		
+	}
+	
+
+	public String getColumnData(int index) {
+		return Columns[index];
+	}
+
+
+
+	public void setColumnData(String string, int index) {
+		Columns[index] = string;
+	}
+
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/DataLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,46 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+
+/**
+ * Label provider for the TableViewerExample
+ * 
+ * @see org.eclipse.jface.viewers.LabelProvider 
+ */
+public class DataLabelProvider 
+	extends LabelProvider
+	implements ITableLabelProvider {
+	
+	public String getColumnText(Object element, int columnIndex) {
+		APITask task = (APITask) element;
+		return  task.getColumnData(columnIndex);
+	}
+
+	 public Image getColumnImage(Object element, int columnIndex) {
+	 return null;
+	}
+	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/DataSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.apiquery.ui.views.main.search;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+
+/**
+ * Sorter for the results table viewer
+ */
+public class DataSorter extends ViewerSorter {
+
+	private int columnNum;
+	private int sortDirection;
+
+	public DataSorter(int dir, int criteria) {
+		this.sortDirection = dir;
+		this.columnNum = criteria;
+	}
+
+	public int compare(Viewer viewer, Object o1, Object o2) {
+		
+		int returnValue = 0;
+		
+		String s1 = ((APITask)o1).getColumnData(columnNum);
+		String s2 = ((APITask)o2).getColumnData(columnNum);
+		
+		returnValue = s1.compareTo(s2);
+		
+		if(sortDirection == SWT.UP)
+			return returnValue;
+		else
+			return returnValue * -1;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/IQueryDefCompositeListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,39 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+/**
+ * Defines interface for listening query action events
+ * from query search string definition UI composite.
+ */
+interface IQueryDefCompositeListener {
+	
+	/**
+	 * Notifies listener that the query string has been modified.
+	 * @param searchString Search string written by the user.
+	 */
+	public void queryModified(String searchString);
+	
+	/**
+	 * Notifies listener that the query is started by the user.
+	 * @param searchString Search string given by the user.
+ 	 * @param useExactMatch <code>true</code> if search string will be searched with exact match 
+	 * instead of contains.
+	 */
+	public void queryStarted(String searchString, boolean useExactMatch);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/IResultSettingsListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,31 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+/**
+ * Interface to pass Result view settings between mediator and composite classes
+ */
+public interface IResultSettingsListener {
+
+	/**
+	 * Call when result view setting is changed in UI from 
+	 * "Show only API names" to show results in query type centric way 
+	 * and vice versa.
+	 */
+	public void resultSettingsChanged();
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryDefComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,365 @@
+/*
+ * 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.apiquery.ui.views.main.search;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+import org.eclipse.jface.fieldassist.AutoCompleteField;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.swt.SWT;
+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.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.apiquery.APIQueryHelpContextIDs;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * UI composite that shows the search field and Search button in Search tab.
+ * 
+ */
+class QueryDefComposite extends AbstractUiFractionComposite implements
+		SelectionListener, ModifyListener {
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 2;
+
+	private static String CACHE_NAME = "Cache.txt";
+
+	/**
+	 * Group giving common layout and containing controls-
+	 */
+	private Group searchStringDefinitionGroup;
+
+	/**
+	 * Search string entering field.
+	 */
+	private Text searchStringTxtField;
+
+	/**
+	 * Action button for starting the query.
+	 */
+	private Button runQueryBtn;
+
+	/**
+	 * 
+	 */
+	private IQueryDefCompositeListener queryActionListener = null;
+	static DataOutputStream dos;
+	public static String cacheFileName = APIQueryPlugin.getPluginWorkspacePath() + File.separator + CACHE_NAME;
+	public static ArrayList<String> wordsCaches = new ArrayList<String>();
+	public AutoCompleteField auto;
+	
+	
+	/**
+	 * Constructor.
+	 * 
+	 * @param parentComposite
+	 *            Parent composite for the created composite.
+	 */
+	public QueryDefComposite(Composite parentComposite) {
+		super(parentComposite);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout
+	 * ()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seecom.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#
+	 * createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		return new GridData(GridData.FILL_HORIZONTAL);
+	}
+
+	/**
+	 * Set context sensitive help ids to components that can have focus
+	 * 
+	 */
+	private void setContextSensitiveHelpIds() {
+		try {
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(
+					searchStringTxtField,
+					APIQueryHelpContextIDs.API_QUERY_HELP_SEARCH_TAB);
+			PlatformUI.getWorkbench().getHelpSystem().setHelp(runQueryBtn,
+					APIQueryHelpContextIDs.API_QUERY_HELP_SEARCH_TAB);
+		} catch (Exception e) {
+			e.printStackTrace();
+			APIQueryConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("QueryDefComposite.Context_ErrMsg") + e, APIQueryConsole.MSG_ERROR); //$NON-NLS-1$
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls
+	 * ()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		searchStringDefinitionGroup = new Group(this, SWT.SHADOW_NONE);
+		searchStringDefinitionGroup.setText(Messages
+				.getString("QueryDefComposite.SearchString_Msg")); //$NON-NLS-1$
+
+		GridLayout gdl2 = new GridLayout(COLUMN_COUNT, false);
+		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+
+		searchStringDefinitionGroup.setLayout(gdl2);
+		searchStringDefinitionGroup.setLayoutData(gd2);
+
+		final int textFieldStyleBits = SWT.LEFT | SWT.SINGLE | SWT.BACKGROUND
+				| SWT.BORDER;
+		searchStringTxtField = new Text(searchStringDefinitionGroup,
+				textFieldStyleBits);
+		searchStringTxtField.setLayoutData((new GridData(
+				GridData.FILL_HORIZONTAL)));
+		searchStringTxtField.setEditable(true);
+		searchStringTxtField.addModifyListener(this);
+		searchStringTxtField.addSelectionListener(this);
+
+		runQueryBtn = new Button(searchStringDefinitionGroup, SWT.PUSH);
+		runQueryBtn.setText(Messages.getString("QueryDefComposite.Search_Msg")); //$NON-NLS-1$
+		runQueryBtn.addSelectionListener(this);
+
+		// Query enabled by default
+		enableQuery();
+
+		// if it really exists
+		if (!isFileExists(cacheFileName)) {
+			writeToFile(cacheFileName, " \n", false);
+		} else {// load the entries into the array list
+			fileToHashTable(cacheFileName, wordsCaches);
+		}
+
+		auto = new AutoCompleteField(searchStringTxtField, new TextContentAdapter(), getKeys());
+
+		setContextSensitiveHelpIds();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
+	 * .swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent event) {
+		if (event.widget == searchStringTxtField) {
+			// <code>widgetDefaultSelected</code> is typically called
+			// when ENTER is pressed in a single-line text.
+			if (queryActionListener != null) {
+				queryActionListener.queryStarted(searchStringTxtField.getText(), false);
+				String value = searchStringTxtField.getText();
+				putKey(value);
+				auto.setProposals(getKeys());
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
+	 * .events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		if (event.widget == runQueryBtn) {
+			if (queryActionListener != null) {
+				queryActionListener.queryStarted(searchStringTxtField.getText(), false);
+				String value = searchStringTxtField.getText();
+				putKey(value);
+				auto.setProposals(getKeys());
+			}
+			/*else if (event.widget == searchStringTxtField) {
+				// <code>widgetDefaultSelected</code> is typically called
+				// when ENTER is pressed in a single-line text.
+				if (queryActionListener != null) {
+					String value = searchStringTxtField.getText();
+					queryActionListener.queryStarted(
+							searchStringTxtField.getText(), false);
+					putKey(wordsCaches, value, cacheFileName);
+					//auto.setProposals(getKeys(wordsCaches));
+				}
+			}*/
+
+		}
+	}
+
+	/**
+	 * Adds listener that listens for query actions.
+	 * 
+	 * @param queryActionListener
+	 *            Query action listener.
+	 */
+	public void setCompositeListener(
+			IQueryDefCompositeListener queryActionListener) {
+		this.queryActionListener = queryActionListener;
+	}
+
+	/**
+	 * Disables query button.
+	 */
+	public void disableQuery() {
+		runQueryBtn.setEnabled(false);
+	}
+
+	/**
+	 * Enables query button.
+	 */
+	public void enableQuery() {
+		runQueryBtn.setEnabled(true);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events
+	 * .ModifyEvent)
+	 */
+	public void modifyText(ModifyEvent arg0) {
+		if (queryActionListener != null) {
+			queryActionListener.queryModified(searchStringTxtField.getText());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,"-- Dispose() --> " + getClass().getName());
+		searchStringDefinitionGroup.dispose();
+		searchStringTxtField.dispose();
+		runQueryBtn.dispose();
+	}
+
+	/**
+	 * Sets the query string.
+	 * 
+	 * @param queryString
+	 *            Query string to be set.
+	 */
+	public void setQueryString(String queryString) {
+		searchStringTxtField.setText(queryString);
+	}
+
+	public boolean writeToFile(String fileName, String dataLine, boolean isAppendMode) {
+
+		try {
+			File outFile = new File(fileName);
+			if (isAppendMode) {
+				dos = new DataOutputStream(new FileOutputStream(fileName, true));
+			} else {
+				dos = new DataOutputStream(new FileOutputStream(outFile));
+			}
+
+			dos.writeBytes(dataLine);
+			dos.close();
+		} catch (FileNotFoundException ex) {
+			return (false);
+		} catch (IOException ex) {
+			return (false);
+		}
+		return (true);
+
+	}
+
+	public boolean isFileExists(String fileName) {
+		File file = new File(fileName);
+		return file.exists();
+	}
+
+	public boolean deleteFile(String fileName) {
+		File file = new File(fileName);
+		return file.delete();
+	}
+
+	public void fileToHashTable(String fileName, ArrayList<String> arr) {
+		String inputLine;
+		try {
+			File inFile = new File(fileName);
+			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inFile)));
+			while ((inputLine = br.readLine()) != null) {
+				if(wordsCaches.indexOf(inputLine.trim())==-1)
+					wordsCaches.add(inputLine.trim());
+			}
+			br.close();
+		}
+		catch (FileNotFoundException ex) {
+			ex.printStackTrace();
+		} catch (IOException ex) {
+			ex.printStackTrace();
+		}
+	}
+
+	// puts key to both file and hash table
+	public void putKey(String value) {
+		if (wordsCaches.contains(value))
+			return;
+		wordsCaches.add(value.trim());
+		writeToFile(cacheFileName, value.trim() + "\n", true);
+	}
+
+	// readhashTableKeys
+	public String[] getKeys() {
+		return wordsCaches.toArray(new String[wordsCaches.size()]);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryResultsComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,925 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+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.browser.Browser;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.apiquery.APIQueryHelpContextIDs;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetailField;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIDetails;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.QueryErrorInfo;
+import com.nokia.s60tools.apiquery.shared.exceptions.QueryOperationFailedException;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.preferences.APIQueryPreferences;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+/**
+ * UI composite containing controls that show the query results.
+ */
+class QueryResultsComposite extends AbstractUiFractionComposite {
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 1;
+
+	/**
+	 * Search results label text to be shown for user.
+	 */
+	private static final String SEARCH_RESULTS_LABEL_TEXT = Messages
+			.getString("QueryResultsComposite.SearchResults_Msg"); //$NON-NLS-1$
+
+	private static final String SEARCH_RESULTS_LABEL_API_TEXT = Messages
+			.getString("QueryResultsComposite.APIs_Msg"); //$NON-NLS-1$
+
+	/**
+	 * Preferred size for the search result list control. Targeted currently to
+	 * show 10 items without need for scrolling.
+	 */
+	private final int SEARCH_RESULT_FIELD_HEIGHT = 150;
+
+	private TableViewer tableViewer;
+
+	private APIDataTaskList taskList = null;
+
+	// private APIShortDescription shortDescription = null;
+
+	//
+	// Setting static data section for HTML data shown in the browser component
+	//
+	private final String HTML_DATA_BODY_STYLE = "body {margin-left: 0px;margin-right: 0px;margin-top: 0px;margin-bottom: 0px;}"; //$NON-NLS-1$
+
+	private final String HTML_DATA_TABLE_STYLE = "table{border-collapse: collapse; font-family: Tahoma; font-size: 11px}"; //$NON-NLS-1$
+
+	private final String HTML_DATA_STYLE = "<style>" + HTML_DATA_BODY_STYLE + HTML_DATA_TABLE_STYLE + "</style>"; //$NON-NLS-1$ //$NON-NLS-2$
+
+	private final String HTML_DATA_HEAD = "<head>" + HTML_DATA_STYLE + "</head>"; //$NON-NLS-1$ //$NON-NLS-2$
+
+	private final String HTML_DATA_HEADER = "<html>" + HTML_DATA_HEAD + "<body>"; //$NON-NLS-1$ //$NON-NLS-2$
+
+	private final String HTML_DATA_FOOTER = "</body></html>"; //$NON-NLS-1$
+
+	private final String HTML_DATA_TABLE_START = "<table border=1 width=\"100%\" ><colgroup span=\"2\"><col width=\"30%\"></col><col width=\"70%\"></col></colgroup>"; //$NON-NLS-1$
+
+	private final String HTML_DATA_TABLE_END = "</table>"; //$NON-NLS-1$
+
+	private final String EMPTY_HTML_DOC = HTML_DATA_HEADER + HTML_DATA_FOOTER;
+
+	private static final String COMMA = ",";//$NON-NLS-1$
+
+	// boolean sourceNeeded = false;
+	// boolean onlyAPIInfo = false;
+	// int columns = 0;
+
+	int apiIndex = -1;
+
+	int otherFiledIndex = -1;
+
+	int sourceIndex = -1;
+
+	/**
+	 * Listener for changing how the results is shown
+	 */
+	private IResultSettingsListener resultSettingsListener;
+
+	/**
+	 * List item for showing list of APIs
+	 */
+	// private List searchResultList;
+	/**
+	 * Button to change how results are shown
+	 */
+	private Button showOnlyAPINamesBtn;
+
+	/**
+	 * Map that stores indexes for searchResults data by searchResultList name
+	 * (matches UI text to {@link APIShortDescription} id).
+	 */
+	private Map<String, Integer> searchResultIndexes;
+
+	/**
+	 * Label item to be updated with API count.
+	 */
+	Label searchResultsLabel;
+
+	/**
+	 * Summary data to be shown in the API list.
+	 */
+	private APIShortDescription[] searchResultData;
+
+	/**
+	 * Details data to be shown in browser control.
+	 */
+	private APIDetails details;
+
+	static int TABLE_STYLE_BITS = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL
+			| SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.RESIZE;
+
+	/**
+	 * Browser control for showing API details data.
+	 */
+	private Browser browserControl;
+
+	private APIQueryParameters params;
+
+	private Table table;
+	
+
+	String[] src = { "API NAME", "SUBSYSTEM NAME", " DLL NAME", "LIB NAME",
+			"HEADER NAME", "CRPS KEY NAME", " ", "SOURCE" };
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param parentComposite
+	 *            Parent composite for the created composite.
+	 */
+	public QueryResultsComposite(Composite parentComposite) {
+		super(parentComposite);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayoutData()
+	 */
+	protected Object createLayoutData() {
+		return new GridData(GridData.FILL_BOTH);
+	}
+
+	/**
+	 * Set context sensitive help ids to components that can have focus
+	 * 
+	 */
+	private void setContextSensitiveHelpIds() {
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(showOnlyAPINamesBtn,
+				APIQueryHelpContextIDs.API_QUERY_HELP_SEARCH_TAB);
+	}
+
+	private void createTableViewer() {
+
+		tableViewer = new TableViewer(table);
+		tableViewer.setUseHashlookup(true);
+
+	}
+
+	private void createTable(Composite parent, int numberOfColumns,
+			String[] columnNames) {
+
+		table = new Table(parent, TABLE_STYLE_BITS);
+
+		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+		gridData.heightHint = SEARCH_RESULT_FIELD_HEIGHT;
+		table.setLayoutData(gridData);
+		table.setLinesVisible(true);
+		table.setHeaderVisible(true);
+
+		table.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+			}
+
+			public void widgetSelected(SelectionEvent arg0) {
+				getAPIDetailsData();
+			}
+
+		});
+
+		int size = 150;
+		for (int i = 0; i < numberOfColumns; i++) {
+			TableColumn column = new TableColumn(table, SWT.LEFT, i);
+			column.setText(columnNames[i]);
+			column.setWidth(size);
+			size = size - 50;
+			final int j = i;
+			column.addListener(SWT.Selection, new Listener() {
+				public void handleEvent(Event event) {
+					TableColumn sortedColumn = table.getSortColumn();
+					TableColumn currentSelected = (TableColumn)event.widget;
+					
+					int dir = table.getSortDirection();
+					if(sortedColumn == currentSelected){
+						dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
+					}
+					else{
+						table.setSortColumn(currentSelected);
+						dir = SWT.UP;
+					}
+					
+					if(currentSelected == table.getColumn(j))
+					{
+						tableViewer.setSorter(new DataSorter(dir, j));
+					}
+					
+					table.setSortDirection(dir);
+				
+				}
+			});
+			
+		}
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		//
+		// Creating label and list for showing APIs found based on the query.
+		//
+		searchResultsLabel = new Label(this, SWT.HORIZONTAL | SWT.LEFT);
+		searchResultsLabel.setText(SEARCH_RESULTS_LABEL_TEXT + ":"); //$NON-NLS-1$
+
+		// final int listBoxStyleBits = SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL;
+		// searchResultList = new List(this, listBoxStyleBits);
+		createTable(this, 3, new String[] { " ", " ", " " });
+		createTableViewer();
+
+		searchResultIndexes = new HashMap<String, Integer>();
+		GridData listData1 = new GridData(GridData.FILL_HORIZONTAL);
+		listData1.heightHint = SEARCH_RESULT_FIELD_HEIGHT;
+		
+		//
+		// Creating button to change how the results are shown
+		//
+		String desc = Messages
+				.getString("QueryResultsComposite.ShowOnlyAPINames_MSg"); //$NON-NLS-1$ "Show only API names";
+		showOnlyAPINamesBtn = new Button(this, SWT.CHECK);
+		showOnlyAPINamesBtn.setText(desc);
+
+		showOnlyAPINamesBtn.setSelection(APIQueryPreferences
+				.getShowOnlyAPINames());
+		showOnlyAPINamesBtn
+				.addSelectionListener(new ShowOnlyAPINamesSelectionListener());
+
+		//
+		// Creating label and browser control for showing API details for the
+		// selected API.
+		//
+		Label apiDetailsLabel = new Label(this, SWT.HORIZONTAL | SWT.LEFT);
+		apiDetailsLabel.setText(Messages
+				.getString("QueryResultsComposite.APIDetails_MSg")); //$NON-NLS-1$
+
+		// Browser control does not seem to support SWT.BORDER style bit.
+		// Therefore need to add separate border component.
+		Composite browserBorder = new Composite(this, SWT.BORDER);
+		FillLayout borderLayout = new FillLayout(SWT.VERTICAL | SWT.HORIZONTAL);
+		browserBorder.setLayout(borderLayout);
+		browserBorder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		// Adding browser control
+		browserControl = new Browser(browserBorder, SWT.NONE);
+
+		browserControl.addLocationListener(new LocationListener() {
+
+			public void changed(LocationEvent arg0) {
+
+			}
+
+			public void changing(LocationEvent arg0) {
+
+				// //get the setting
+				final ISearchMethodExtension serachMethod = UserSettings
+						.getInstance().getCurrentlySelectedSearchMethod();
+
+				if (!arg0.location.contains("about:blank")) {
+
+					arg0.doit = false;
+					final String headerName = arg0.location.substring(2,
+							arg0.location.length()).trim();
+					String apidetailsName = "Name";
+					if (serachMethod.isAsyncQueryPreferred())
+						apidetailsName = "API Name";
+					APIDetailField det = details.getDetail(apidetailsName);
+
+					serachMethod.openHeaderFile(headerName, det.getValue()
+							.trim());
+
+				}
+			}
+		});
+
+		setContextSensitiveHelpIds();
+	}
+
+	/**
+	 * Class that listens button state changes and updates preferences and
+	 * results composite
+	 */
+	private class ShowOnlyAPINamesSelectionListener implements
+			SelectionListener {
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+
+			// Setting selection preferences
+			// APIQueryPreferences.setShowOnlyAPINames(showOnlyAPINamesBtn.getSelection());
+			// Update view, do not get information again from data source, but
+			// just update data
+			resultSettingsListener.resultSettingsChanged();
+
+		}
+
+	}
+
+	/**
+	 * Converts API details into html-data.
+	 * 
+	 * @param details
+	 *            API details object to be converted.
+	 * @return
+	 */
+	private String buildHtmlDataFromDetails(APIDetails details) {
+		StringBuffer htmlTextBuf = new StringBuffer();
+
+		htmlTextBuf.append(HTML_DATA_HEADER);
+
+		// Appending table start
+		htmlTextBuf.append(HTML_DATA_TABLE_START);
+
+		// Converting API details into html data
+		for (APIDetailField detailField : details) {
+			// System.out.println("datailValue" + detailField.getValue() + "
+			// getdesc" + detailField.getDescription());
+			convertSingleDetailField(detailField, htmlTextBuf);
+		}
+
+		// Appending table end
+		htmlTextBuf.append(HTML_DATA_TABLE_END);
+		htmlTextBuf.append(HTML_DATA_FOOTER);
+		
+
+		return htmlTextBuf.toString();
+	}
+
+	/**
+	 * @param field
+	 * @param htmlTextBuf
+	 */
+	private void convertSingleDetailField(APIDetailField field,
+			StringBuffer htmlTextBuf) {
+		String desc = field.getDescription();
+		String val = field.getValue();
+		// System.out.println("values" +val);
+
+		htmlTextBuf.append("<tr><td><b>"); //$NON-NLS-1$
+		htmlTextBuf.append(desc);
+		htmlTextBuf.append(":</b></td><td>"); //$NON-NLS-1$
+
+		boolean isSelectedSearchType = getIsSelectedSearchType(desc);
+		// String what user was set to be searched
+		String[] serachStrings = params.getSearchString().split(";");
+		String searchString = params.getSearchString();
+		// Checking if empty string was searched (empty search lists all)
+		boolean isEmptySearchString = false;
+		if (searchString == null || searchString.trim().equals("")) {//$NON-NLS-1$
+			isEmptySearchString = true;
+		}
+		boolean isValueContainingSearchString = false;
+
+		for (int i = 0; i < serachStrings.length; i++) {
+			String temp = serachStrings[i].trim();
+			isValueContainingSearchString = isValueContainingSearchString(val,
+					temp);
+			if (isValueContainingSearchString) {
+				searchString = temp;
+				break;
+			}
+		}
+
+		// get the setting
+		ISearchMethodExtension serachMethod = UserSettings.getInstance()
+				.getCurrentlySelectedSearchMethod();
+
+		// Checking search criteria and set matching search string as red when
+		// found
+		if (!isEmptySearchString && isSelectedSearchType
+				&& isValueContainingSearchString) {
+			String[] vals = val.split(COMMA);
+			for (int i = 0; i < vals.length; i++) {
+
+				if (vals[i].toLowerCase().indexOf(searchString.toLowerCase()) != -1) {
+					String s = "<font color=\"red\">" + vals[i] + "</font>";
+					if (params.getQueryType() == APIQueryParameters.QUERY_BY_HEADER_NAME
+							&& serachMethod.serachHeaderLinkEnable())
+						s = "<a href=\"file://" + vals[i] + "\">" + s + "</a>";
+					//System.out.println("link" + s);
+					htmlTextBuf.append(s);//$NON-NLS-1$ //$NON-NLS-2$
+				} else {
+					htmlTextBuf.append(vals[i]);
+				}
+				if (i < (vals.length - 1)) {
+					htmlTextBuf.append(COMMA);
+				}
+			}
+		} else {
+			htmlTextBuf.append(val);
+		}
+
+		htmlTextBuf.append("</td></tr>"); //$NON-NLS-1$
+
+	}
+
+	/**
+	 * Check if value contains search string (case in sensitive)
+	 * 
+	 * @param val
+	 * @param searchString
+	 * @return <code>true</code> if val contains searchString, false
+	 *         othrewise.
+	 */
+	private boolean isValueContainingSearchString(String val,
+			String searchString) {
+		return val != null
+				&& val.toLowerCase().contains(searchString.toLowerCase());
+	}
+
+	/**
+	 * Check if given string is same as selected search type
+	 * 
+	 * @param desc
+	 * @return <code>true</code> if is, <code>false</code> otherwise.
+	 */
+	private boolean getIsSelectedSearchType(String desc) {
+		// UI name in API Details for selected search type
+		String searchTypeInReport = UserSettings.getInstance()
+				.getCurrentlySelectedSearchMethod()
+				.getAPIDetailNameInDetailsByQueryType(params.getQueryType());
+		// Check if this value is same type as users search criteria
+		boolean isSelectedSearchType = searchTypeInReport
+				.equalsIgnoreCase(desc);
+		return isSelectedSearchType;
+	}
+
+	/**
+	 * Updates summary field with the queried data. If only one result was
+	 * found, API Details for that API is shown.
+	 * 
+	 * @param summaryDataColl
+	 *            API summary data to be shown.
+	 */
+	public void updateAPIShortDescriptionData(
+			Collection<APIShortDescription> summaryDataColl,
+			APIQueryParameters params) {
+
+	
+		// boolean sourceNeeded = false;
+		boolean onlyAPIInfo = false;
+
+		apiIndex = -1;
+		otherFiledIndex = -1;
+		sourceIndex = -1;
+
+		if (!params.isDetailsMentToAddToDescriptions()
+				|| params.getQueryType() == APIQueryParameters.QUERY_BY_API_NAME) {
+			onlyAPIInfo = true;
+		}
+
+		int columns = 1;
+
+		if (!onlyAPIInfo)
+			++columns;
+
+		if (APIQueryPreferences.getShowDataSourceInResults())
+			columns++;
+
+		int[] indicies = new int[3];
+
+		indicies[2] = src.length - 2;
+		
+		if (columns == 3) {
+			indicies[0] = (params.getQueryType() - 1);
+			indicies[1] = 0;
+			indicies[2] = src.length - 1;
+			otherFiledIndex = 0;
+			apiIndex = 1;
+			sourceIndex = 2;
+
+		} else if (columns == 2) {
+			if (APIQueryPreferences.getShowDataSourceInResults() && onlyAPIInfo) {
+
+				indicies[0] = 0;
+				indicies[1] = src.length - 1;
+
+				apiIndex = 0;
+				sourceIndex = 1;
+			} else {
+				indicies[0] = params.getQueryType() - 1;
+				indicies[1] = 0;
+				otherFiledIndex = 0;
+				apiIndex = 1;
+			}
+
+		}
+
+		else {
+			indicies[0] = 0;
+			indicies[1] = src.length - 2;	
+			apiIndex = 0;
+		}
+
+		
+		TableColumn[] tableColumns = table.getColumns();
+		for (int i = 0; i < tableColumns.length; i++) {
+			tableColumns[i].setText(src[indicies[i]]);
+
+		}
+
+		// add the contents to table
+
+		this.params = params;
+		// Clearing...
+		// searchResultList.removeAll();
+		searchResultIndexes.clear();
+
+		// Storing the data
+		searchResultData = summaryDataColl.toArray(new APIShortDescription[0]);
+		taskList = new APIDataTaskList();
+
+		// Populating the list
+		for (int i = 0; i < searchResultData.length; i++) {
+
+			APIShortDescription summary = searchResultData[i];
+			String shortUIText = summary.getName();
+
+			// Checking if Data source should add to item
+			if (APIQueryPreferences.getShowDataSourceInResults()) {
+
+				shortUIText += "   [" + summary.getSourceDescription() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+			}
+
+			// Checking from preferences should we show only API Names or also
+			// queried items
+			// if we want only API Names, just adding text to list. When API
+			// Name is search criteria, only API Names will be added anyway.
+			if (!params.isDetailsMentToAddToDescriptions()
+					|| params.getQueryType() == APIQueryParameters.QUERY_BY_API_NAME) {
+
+				taskList
+						.addTask(new APITask(
+								new String[] {
+										summary.getName(),
+										(APIQueryPreferences
+												.getShowDataSourceInResults()) ? summary
+												.getSourceDescription()
+												: " ", "  " }));
+
+				// searchResultList.add(shortUIText); //$NON-NLS-1$
+				// //$NON-NLS-2$
+				searchResultIndexes.put(shortUIText, new Integer(i));
+			}
+			// If details for query type is ment to add for list, getting items
+			// that match for query
+			else {
+				String[] queriedMatchingItems = getQueriedMatchingItemNames(
+						summary, params.getSearchString());
+				if (queriedMatchingItems != null) {
+					for (int j = 0; j < queriedMatchingItems.length; j++) {
+						taskList
+								.addTask(new APITask(
+										new String[] {
+												queriedMatchingItems[j],
+												summary.getName(),
+												(APIQueryPreferences
+														.getShowDataSourceInResults()) ? summary
+														.getSourceDescription()
+														: " " }));
+						String longUIText = "[" + queriedMatchingItems[j] + "] in " + shortUIText; //$NON-NLS-1$ //$NON-NLS-2$
+						// searchResultList.add(longUIText);
+						searchResultIndexes.put(longUIText, new Integer(i));
+
+					}
+				}
+			}// else
+		} // if
+
+		tableViewer.setContentProvider(new APIContentProvider());
+		tableViewer.setLabelProvider(new DataLabelProvider());
+
+		// The input for the table viewer is the instance of ExampleTaskList
+
+		tableViewer.setInput(taskList);
+
+		searchResultsLabel.setText(SEARCH_RESULTS_LABEL_TEXT
+				+ " (" + Messages.getString("QueryResultsComposite.Found_Msg") //$NON-NLS-1$ //$NON-NLS-2$
+				+ table.getItemCount() + " " //$NON-NLS-1$
+				+ SEARCH_RESULTS_LABEL_API_TEXT + "):"); //$NON-NLS-1$
+		searchResultsLabel.pack(); // Adjusting the label size to match new
+
+		// If we have only one result, that will be selected automatically
+		if (table.getItemCount() == 1) {
+			table.setSelection(0);
+			getAPIDetailsData();
+		}
+
+		// update the serachstring for the serached query
+
+	}
+
+	/**
+	 * @param summary
+	 * @param searchString
+	 * @return list of
+	 */
+	private String[] getQueriedMatchingItemNames(APIShortDescription summary,
+			String searchString) {
+
+		String[] ars = searchString.split(";");
+
+		ArrayList<String> results = new ArrayList<String>();
+		if (UserSettings.getInstance().getCurrentlySelectedSearchMethod()
+				.isAsyncQueryPreferred()) {
+
+			ArrayList<String> data = summary.getSearchedData();
+			for (int i = 0; i < data.size(); i++) {
+				for (int j = 0; j < ars.length; j++) {
+					if (data.get(i).toLowerCase().contains(
+							ars[j].trim().toLowerCase()))
+						results.add(data.get(i).trim());
+				}
+
+			}
+			return (String[]) results.toArray(new String[0]);
+		}
+
+		// Details can be allreay stored to summary, if so, we don't need to get
+		// details again
+		APIDetails det = null;
+		if (summary.hasAPIDetails()) {
+			det = summary.getAPIDetails();
+		} else {
+			try {
+				// Get currenty selected search method extension
+				// get api details
+				det = UserSettings.getInstance()
+						.getCurrentlySelectedSearchMethod().getAPIDetails(
+								summary);
+			} catch (QueryOperationFailedException e) {
+				APIQueryConsole
+						.getInstance()
+						.println(
+								Messages
+										.getString("QueryResultsComposite.UnableToGetAPIDetails_ErrMsg_Part1") + summary.getName() + Messages.getString("QueryResultsComposite.UnableToGetAPIDetails_ErrMsg_Part2") + e, APIQueryConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+				return null;
+			}
+		}
+
+		// ArrayList<String> results = new ArrayList<String>();
+
+		// Converting API details into fields and checking matching items by API
+		// Query params
+		for (APIDetailField field : det) {
+			// Checking if there matching items
+			String desc = field.getDescription();
+			String val = field.getValue();
+			boolean isSelectedSearchType = getIsSelectedSearchType(desc);
+			if (isSelectedSearchType) {
+				String[] vals = val.split(COMMA);
+				for (int i = 0; i < vals.length; i++) {
+					for (int j = 0; j < ars.length; j++) {
+						boolean isValueContainingSearchString = isValueContainingSearchString(
+								vals[i], ars[j].trim());
+						// Add matching item to results
+						if (isValueContainingSearchString) {
+							// System.out.println("values : "+ vals[i]);
+							results.add(vals[i].trim());
+						}
+					}
+				}
+			}
+
+		}
+		return (String[]) results.toArray(new String[0]);
+
+	}
+
+	/**
+	 * Gets API details for the API selected from the API list. Shows busy
+	 * cursor to user during the operation.
+	 */
+	private void getAPIDetailsData() {
+
+		final QueryErrorInfo errInfo = new QueryErrorInfo();
+
+		Runnable performAPIDetailsQueryRunnable = new Runnable() {
+			public void run() {
+				performAPIDetailsQuery(errInfo);
+			}
+		};
+
+		// Showing busy cursor during operation
+		Display d = APIQueryPlugin.getCurrentlyActiveWbWindowShell()
+				.getDisplay();
+		BusyIndicator.showWhile(d, performAPIDetailsQueryRunnable);
+
+		// Did we succeed?
+		if (details != null) {
+			// Populating browser control with the HTML formatted data.
+			browserControl.setText(buildHtmlDataFromDetails(details));
+		} else {
+			// Something failed
+			String errMsg = Messages
+					.getString("QueryResultsComposite.APIDetailsQueryFailde_ErrMsg") + errInfo.getErrorDescription(); //$NON-NLS-1$
+			APIQueryConsole.getInstance().println(errMsg,
+					APIQueryConsole.MSG_ERROR);
+			APIQueryMessageBox mbox = new APIQueryMessageBox(errMsg,
+					SWT.ICON_ERROR | SWT.OK);
+			mbox.open();
+		}
+	}
+
+	/**
+	 * Performs the actual API details query.
+	 * 
+	 * @param errInfo
+	 *            Error info to be filled in error situation.
+	 */
+	private void performAPIDetailsQuery(QueryErrorInfo errInfo) {
+
+		// details = null; // Resetting previous searches
+		// check if the details already in localstorage
+		// int currSelIndex = searchResultList.getSelectionIndex();
+
+		// details=(APIDetails)apiDetailsStorage.elementAt(currSelIndex);
+		// if(details!=null)return;
+
+		// Table data
+
+		TableItem[] ar = table.getSelection();
+		String shortUIText = ar[0].getText(apiIndex).trim();
+		if (sourceIndex != -1)
+			shortUIText += "   [" + ar[0].getText(sourceIndex).trim() + "]";
+		if (otherFiledIndex != -1)
+			shortUIText = "[" + ar[0].getText(0).trim() + "] in " + shortUIText;
+
+		// //////
+
+		// String s = searchResultList.getItems()[currSelIndex];
+		// System.out.println("Text in secrh res infices : " + s);
+		// Not getting ID from list directly, because same API can be there
+		// multiple times, ID is taken from indexes list
+		// int currShortDescIndex = searchResultIndexes.get(searchResultList
+		// .getItems()[currSelIndex]);
+
+		int currShortDescIndex = searchResultIndexes.get(shortUIText);
+
+		APIShortDescription summary = searchResultData[currShortDescIndex];
+		// shortDescription = summary;
+
+		// API Details can be already stored in summary, if so, we don't need
+		// get details again
+		if (summary.hasAPIDetails()) {
+			details = summary.getAPIDetails();
+		}
+		// Else get api details by using selected search method extension
+		else {
+			ISearchMethodExtension currSelExt = UserSettings.getInstance()
+					.getCurrentlySelectedSearchMethod();
+			try {
+				details = currSelExt.getAPIDetails(summary);
+				summary.setAPIDetails(details);
+			} catch (QueryOperationFailedException e) {
+				errInfo.setErrorDescription(e.getMessage());
+			}
+		}
+
+	}
+
+	/**
+	 * Clears all the previously shown data.
+	 */
+	public void clear() {
+		// Clearing summary data
+		// searchResultList.removeAll();
+		table.removeAll();
+		// taskList.removeTaksList();
+		// tableViewer.setInput(taskList);
+		// Clearing found APIs count
+		searchResultsLabel.setText(SEARCH_RESULTS_LABEL_TEXT + ":"); //$NON-NLS-1$
+		// Clearing details data
+		browserControl.setText(EMPTY_HTML_DOC);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"-- Dispose() --> " + getClass().getName()); //$NON-NLS-1$
+	}
+
+	/**
+	 * Check if show only api names is selected
+	 * 
+	 * @return <code>true</code> if Show only API names is selected
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean isShowOnlyAPINamesSelected() {
+		return showOnlyAPINamesBtn.getSelection();
+	}
+
+	/**
+	 * Adds listener that listens for result setting changes.
+	 * 
+	 * @param searchTabUIFieldsMediator
+	 *            Result settings changes listener
+	 */
+	public void setResultSettingsListener(
+			IResultSettingsListener resultSettingsListener) {
+		this.resultSettingsListener = resultSettingsListener;
+	}
+
+	/**
+	 * InnerClass that acts as a proxy for the ExampleTaskList providing content
+	 * for the Table. It implements the ITaskListViewer interface since it must
+	 * register changeListeners with the ExampleTaskList
+	 */
+	class APIContentProvider implements IStructuredContentProvider {
+
+		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+
+		}
+
+		public void dispose() {
+
+		}
+
+		// Return the tasks as an array of Objects
+		public Object[] getElements(Object parent) {
+			return taskList.getTasks().toArray();
+		}
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/QueryTypeSelectionComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,237 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+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.Group;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.apiquery.APIQueryHelpContextIDs;
+import com.nokia.s60tools.apiquery.settings.IUserSettingsListener;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtensionInfo;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.searchmethodregistry.SearchMethodExtensionRegistry;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * UI composite that shows the search type selections in Search tab.
+ *
+ */
+class QueryTypeSelectionComposite extends AbstractUiFractionComposite implements IUserSettingsListener{
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 3;
+	private Group queryTypeSelectionGroup;
+	private Map<Integer, Button> queryTypeBtnMap;
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public QueryTypeSelectionComposite(Composite parentComposite) {
+		super(parentComposite);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayoutData()
+	 */
+	protected Object createLayoutData(){
+		return 	new GridData(GridData.FILL_HORIZONTAL);
+	}
+	
+	/**
+	 * Set context sensitive help ids to components that can have focus
+	 *
+	 */
+	private void setContextSensitiveHelpIds(Button btn){
+	    PlatformUI.getWorkbench().getHelpSystem().setHelp(btn, 
+	    		APIQueryHelpContextIDs.API_QUERY_HELP_SEARCH_TAB);
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+				
+		queryTypeSelectionGroup = new Group(this, SWT.SHADOW_NONE);
+		queryTypeSelectionGroup.setText(Messages.getString("QueryTypeSelectionComposite.Query_By_Msg"));		 //$NON-NLS-1$
+		
+		GridLayout gdl2 = new GridLayout(COLUMN_COUNT, false);
+		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+				
+		queryTypeSelectionGroup.setLayout(gdl2);
+		queryTypeSelectionGroup.setLayoutData(gd2);
+
+		// Adding different query types
+		Integer[] queryTypesArr = APIQueryParameters.getQueryTypes();
+		int queryTypeCnt = queryTypesArr.length;
+
+		// Query buttons are store into an internal array for later reference
+		queryTypeBtnMap = new HashMap<Integer, Button>(queryTypeCnt);
+		
+		for (Integer queryType : queryTypesArr) {
+			String desc = APIQueryParameters.getDescriptionForQueryType(queryType);
+			Button queryBtn = new Button(queryTypeSelectionGroup, SWT.RADIO);			
+			queryBtn.setText(desc);
+			queryBtn.setSelection(false);			
+			// Storing to Button array for later reference
+			queryTypeBtnMap.put(queryType, queryBtn);
+			setContextSensitiveHelpIds(queryBtn);
+		}
+		
+		// Checking the statuses supported query types for currently
+		// selected search method.
+		checkSupportedQueryTypesAndUpdateUi();
+		
+		// Starting to listen user settings change events
+		UserSettings.getInstance().addUserSettingListener(this);
+	}
+
+	/**
+	 * Checks the statuses of currently supported query types and updates UI.
+	 */
+	private void checkSupportedQueryTypesAndUpdateUi() {
+		try {
+			// Setting enable and disable statuses for query types
+			ISearchMethodExtensionInfo currSelExtInfo =  UserSettings.getInstance().getCurrentlySelectedSearchMethodInfo();
+			String id = currSelExtInfo.getId();
+			ISearchMethodExtension currSelExt = SearchMethodExtensionRegistry.getInstance().getById(id);
+					
+			Set<Integer> queryTypesSet = queryTypeBtnMap.keySet();
+			for (Integer qType : queryTypesSet) {
+				Button btn = queryTypeBtnMap.get(qType);
+				boolean isSupported = currSelExt.isSupportedQueryType(qType);
+				btn.setSelection(false);
+				btn.setEnabled(isSupported);
+			}
+			
+			// Setting default query type that should be supported by all extensions.
+			// and therefore is always enabled and set as default selection.
+			// It is on the responsibility of extension developer to make
+			// sure that the default query type is supported.
+			int defaultQueryType = APIQueryParameters.getDefaultQueryType();
+			Button defQueryTypeBtn = queryTypeBtnMap.get(defaultQueryType);
+			defQueryTypeBtn.setEnabled(true);
+			defQueryTypeBtn.setSelection(true);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Gets query type for the currently selected query type.
+	 * @return Returns query type for the currently selected query type.
+	 */
+	public int getSelectedQueryType(){
+		Set<Integer> queryTypeSet = queryTypeBtnMap.keySet();
+		for (Integer queryType : queryTypeSet) {
+			Button btn = queryTypeBtnMap.get(queryType);
+			if(btn.getSelection()){
+				// This query type was selected
+				return queryType;
+			}
+		}
+		// We should never get into here
+		throw new RuntimeException(Messages.getString("QueryTypeSelectionComposite.Query_Type_Was_Not_Selected_Msg")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.settings.IUserSettingsListener#userSettingsChanged()
+	 */
+	public void userSettingsChanged() {
+		// Settings have changed which might mean that 
+		// the user has changed the currently used query type.
+		checkSupportedQueryTypesAndUpdateUi();		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose(){
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- Dispose() --> " + getClass().getName());		 //$NON-NLS-1$
+		queryTypeSelectionGroup.dispose();
+		Collection<Button> buttonsColl = queryTypeBtnMap.values();
+		for (Button btn : buttonsColl) {
+			btn.dispose();
+		}
+		queryTypeBtnMap.clear();
+		// Stopping the event listening
+		UserSettings.getInstance().removeUserSettingListener(this);
+	}
+
+	/**
+	 * Sets the query type if it is allowed for 
+	 * the currently selected search method.
+	 * @param queryType Query type to be set.
+	 */
+	public void setQueryType(int queryType) {
+		String errMsg = null;
+		Button btn = queryTypeBtnMap.get(queryType);
+		if(btn != null){
+			if(btn.isEnabled()){
+				deselectAllTypes();
+				btn.setSelection(true);
+				return;
+			}
+			else{
+				errMsg = Messages.getString("QueryTypeSelectionComposite.Not_Supported_ErrMsg");			 //$NON-NLS-1$
+			}
+		}
+		else{
+			errMsg = Messages.getString("QueryTypeSelectionComposite.Query_Type_Not_Available_ErrMsg");			 //$NON-NLS-1$
+		}
+		// We get here only if something fails
+		throw new IllegalArgumentException(errMsg);
+	}
+
+	/**
+	 * Clears all the query type selections.
+	 */
+	private void deselectAllTypes() {
+		for (Button btn : queryTypeBtnMap.values()) {
+			btn.setSelection(false);			
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/SearchTabComposite.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,172 @@
+/*
+* 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.apiquery.ui.views.main.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+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.Layout;
+
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ui.AbstractUiFractionComposite;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * UI composite that collecting all search tab composites to Search tab.
+ *
+ */
+public class SearchTabComposite extends AbstractUiFractionComposite {
+
+	/**
+	 * Amount of columns in the used grid layout.
+	 */
+	private final int COLUMN_COUNT = 1;
+	
+	/**
+	 * Reference to the ui fraction showing query types.
+	 */
+	private QueryTypeSelectionComposite queryTypeUiFraction;
+	
+	/**
+	 * Reference to the ui fraction showing search string related fields.
+	 */
+	private QueryDefComposite searchStringUiFraction;
+	
+	/**
+	 * Reference to the ui fraction showing query results.
+	 */
+	private QueryResultsComposite queryResultsUiFraction;
+	
+	/**
+	 * Mediator controlling logic between UI components.
+	 */
+	private SearchTabUIFieldsMediator mediator;
+
+	/**
+	 * Reference to the UI fraction showing result type selection
+	 */
+//	private ResultViewTypeSelectionComposite resultViewTypeSelectionUiFraction;
+	
+	/**
+	 * Constructor.
+	 * @param parentComposite	Parent composite for the created composite.
+	 */
+	public SearchTabComposite(Composite parentComposite) {
+		super(parentComposite);		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayout()
+	 */
+	protected Layout createLayout() {
+		return new GridLayout(COLUMN_COUNT, false);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createLayoutData()
+	 */
+	protected Object createLayoutData(){
+		return 	new GridData(GridData.FILL_HORIZONTAL);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.AbstractTabComposite#createControls()
+	 */
+	protected void createControls() {
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- createControls() --> " + getClass().getName()); //$NON-NLS-1$
+		queryTypeUiFraction = new QueryTypeSelectionComposite(this);
+		searchStringUiFraction = new QueryDefComposite(this);
+		queryResultsUiFraction = new QueryResultsComposite(this);
+//		resultViewTypeSelectionUiFraction =  new ResultViewTypeSelectionComposite(this);
+		
+		// Creating mediator class that handles co-operation between
+		// different search related UI parts
+		mediator = new SearchTabUIFieldsMediator(queryTypeUiFraction, searchStringUiFraction, 
+				                      queryResultsUiFraction);
+				
+	}
+
+	/**
+	 * Enables update starting of API queries
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @param useExactMatch <code>true</code> if search string will be searched with exact match 
+	 * instead of contains.
+	 */
+	public void runAPIQuery(int queryType, String queryString, boolean useExactMatch){
+		try {
+			queryTypeUiFraction.setQueryType(queryType);
+			searchStringUiFraction.setQueryString(queryString);
+			mediator.queryStarted(queryString, useExactMatch);			
+		} catch (Exception e) {
+			APIQueryMessageBox msgBox = new APIQueryMessageBox(
+					Messages.getString("SearchTabComposite.API_Query_ErrMsg") + e.getMessage() //$NON-NLS-1$
+					, SWT.ICON_ERROR | SWT.OK);
+			msgBox.open();		
+		}
+	}
+	
+	/**
+	 * Enables update starting of API queries
+	 * also from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @param queryType Query type.
+	 * @param queryString Query string.
+	 * @return collection of APIShortDescription objects or empty list if not found
+	 */
+	public Collection<APIShortDescription> runActiveProjectQuery(int queryType, String queryString){
+		try {
+			queryTypeUiFraction.setQueryType(queryType);
+			searchStringUiFraction.setQueryString(queryString);
+			return mediator.activeProjectQueryStarted(queryString);			
+		} catch (Exception e) {
+			APIQueryMessageBox msgBox = new APIQueryMessageBox(
+					Messages.getString("SearchTabComposite.API_Query_ErrMsg") + e.getMessage() //$NON-NLS-1$
+					, SWT.ICON_ERROR | SWT.OK);
+			msgBox.open();				
+		}
+		return new ArrayList<APIShortDescription>();
+	}	
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "-- Dispose() --> " + getClass().getName());		 //$NON-NLS-1$
+
+		queryTypeUiFraction.dispose();
+		searchStringUiFraction.dispose();
+		queryResultsUiFraction.dispose();
+		
+		// Releasing listeners used by mediator class
+		mediator.releaseListeners();
+		
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery/src/com/nokia/s60tools/apiquery/ui/views/main/search/SearchTabUIFieldsMediator.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,474 @@
+/*
+ * 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.apiquery.ui.views.main.search;
+
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.apiquery.settings.IUserSettingsListener;
+import com.nokia.s60tools.apiquery.settings.UserSettings;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIQueryParameters;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescription;
+import com.nokia.s60tools.apiquery.shared.datatypes.APIShortDescriptionSearchResults;
+import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException;
+import com.nokia.s60tools.apiquery.shared.plugin.APIQueryPlugin;
+import com.nokia.s60tools.apiquery.shared.resources.Messages;
+import com.nokia.s60tools.apiquery.shared.searchmethod.AbstractSearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.searchmethod.ISearchMethodExtension;
+import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox;
+import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole;
+import com.nokia.s60tools.apiquery.ui.views.main.MainView;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * Mediator class between the search tab's UI fields.
+ * Listens the actions and creates the query object, 
+ * performs the query, and controls the population
+ * of the fields used to query results. 
+ */
+class SearchTabUIFieldsMediator implements IQueryDefCompositeListener,
+		IUserSettingsListener, IResultSettingsListener {
+
+	/**
+	 * UI control used to set the query type.
+	 */
+	private final QueryTypeSelectionComposite queryTypeControl;
+
+	private final QueryResultsComposite queryResultsControl;
+
+	private final QueryDefComposite queryDefControl;
+
+	/**
+	 * Collection to store returned API summary data and errors.
+	 */
+	APIShortDescriptionSearchResults resultColl = null;
+
+	private APIQueryParameters params;
+
+	static Job prevWebSerachJob = null;
+
+	static Object prevQueryJobObjLock = new Object();
+
+	static String prevQueryString = null;
+
+	static public IProgressMonitor progressMonitor;
+
+	//	Web query job
+	class WebQueryJob extends Job {
+		private String searchString = null;
+
+		public WebQueryJob(String jobDescription, String searchString) {
+			super(jobDescription);
+			this.searchString = searchString;
+		}
+
+		protected IStatus run(IProgressMonitor monitor) {
+			try {
+				progressMonitor = monitor;
+				prevQueryString = searchString;
+				//start the progress operation
+				progressMonitor.beginTask("Web Query in progress... ",
+						IProgressMonitor.UNKNOWN);
+
+				performQuery(params,monitor);
+
+				if (monitor.isCanceled()) {
+
+					return Status.CANCEL_STATUS;
+				}
+
+				return Status.OK_STATUS;
+
+			}
+			catch (JobCancelledByUserException e)
+			{	
+				//System.out.println("Job cancelled");
+				return Status.CANCEL_STATUS;
+				
+			}
+
+			catch (Exception e) {
+
+				APIQueryMessageBox msgBox = new APIQueryMessageBox(
+						Messages
+								.getString("SearchTabComposite.API_Query_ErrMsg") + e.getMessage() //$NON-NLS-1$
+						, SWT.ICON_ERROR | SWT.OK);
+				msgBox.open();
+			} finally {
+				monitor.done();
+			}
+			return Status.CANCEL_STATUS;
+		}
+
+	}
+
+	class WebQueryJobListener extends JobChangeAdapter {
+
+		Display d = null;
+
+		String searchString = null;
+
+		WebQueryJobListener(Display d, String searchString) {
+			this.d = d;
+			this.searchString = searchString;
+		}
+
+		public void done(IJobChangeEvent event) {
+
+			synchronized (prevQueryJobObjLock) {
+
+				try {
+					//	if job done ,update the display with results
+					if (event.getResult().isOK()) {
+						updateResults(true, d, searchString);
+
+					}
+
+				} catch (Exception e) {
+
+					e.printStackTrace();
+
+				} finally {
+					// finally release
+					if (event.getJob() == prevWebSerachJob) {
+						prevWebSerachJob = null;
+
+					}
+				}
+
+			}
+
+		}
+	}
+
+	public SearchTabUIFieldsMediator(
+			QueryTypeSelectionComposite queryTypeControl,
+			QueryDefComposite queryDefControl,
+			QueryResultsComposite queryResultsControl) {
+		this.queryTypeControl = queryTypeControl;
+		this.queryDefControl = queryDefControl;
+		this.queryResultsControl = queryResultsControl;
+		// Registering to listen for query start actions
+		this.queryDefControl.setCompositeListener(this);
+		// Registering to listen for result view setting changes 
+		this.queryResultsControl.setResultSettingsListener(this);
+		// Starting to listen user settings change events
+		UserSettings.getInstance().addUserSettingListener(this);
+	}
+
+	/**
+	 * Performs the according the given parameters and
+	 * updates the UI components after the query.
+	 * @param params Parameters for the query.
+	 * @param errInfo Error info class for returning 
+	 *                error description in case if an error.
+	 */
+	private void performQuery(APIQueryParameters params) {
+		try { // disable datasource selection option from properites page
+			MainView.enablePropTabcontents(false);
+			resultColl = null; // Resetting previous searches.		
+			ISearchMethodExtension currSelExt = UserSettings.getInstance()
+					.getCurrentlySelectedSearchMethod();
+			resultColl = currSelExt.runAPIQuery(params);
+		} finally {
+
+			MainView.enablePropTabcontents(true);
+		}
+	}
+
+	/**
+	 * Runs <code>this.queryStarted(searchString)</code> and returns APIShortDescriptions
+	 * @param searchString semi-colon separated search criterias
+	 * @return all API Summarys matching semi-colon separated search criterias
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.search.IQueryDefCompositeListener#queryStarted(java.lang.String)
+	 */
+	public Collection<APIShortDescription> activeProjectQueryStarted(
+			String searchString) {
+		queryStarted(searchString, false);
+		return resultColl.getSearchResults();
+	}
+
+	/**
+	 * update the results page
+	 * 
+	 * @param syncDisp :
+	 *            for webquery jobs
+	 * @param d
+	 * @param queryString
+	 *            :Search string to be shown in the query serach string text box
+	 */
+	private void updateResults(boolean syncDisp, final Display d,
+			final String queryString) {
+
+	
+		// Did we succeed?
+		if (resultColl != null) {
+
+			if (syncDisp) {// for non UI thread
+				Runnable updateCompositeThread = new Runnable() {
+					public void run() {
+						// Setting queried data into UI control.
+						updateResultComposite();
+						// update the search string text box for this search
+						//queryDefControl.setQueryString(queryString);
+
+					}
+				};
+
+				// update the result composite page
+				d.syncExec(updateCompositeThread);
+
+			} else {
+				// Setting queried data into UI control.
+				updateResultComposite();
+			}
+		}
+
+		if (resultColl.hasErrors()) {
+		
+			// Something failed
+			// If there was some errors, but after all, there was also some
+			// results, giving warning dialog
+			// but if everything failed, then gbvgiving error dialog. So
+			// then is easier to make different if e.g. only one server was
+			// down but others works OK.
+			int messageType = resultColl.getSearchResults().isEmpty() ? APIQueryConsole.MSG_ERROR
+					: APIQueryConsole.MSG_WARNING;
+			int messageTypeIcon = resultColl.getSearchResults().isEmpty() ? SWT.ICON_ERROR
+					: SWT.ICON_WARNING;
+
+			final String errMsg = Messages
+					.getString("SearchTabUIFieldsMediator.APIListQueryFailed_ErrMsg") + "\n" + resultColl.getErrorMessages(); //$NON-NLS-1$ //$NON-NLS-2$
+			APIQueryConsole.getInstance().println(errMsg, messageType);
+			if (d == null) {
+				APIQueryMessageBox mbox = new APIQueryMessageBox(errMsg,
+						messageTypeIcon | SWT.OK);
+				mbox.open();
+			} else {
+				Runnable errormsg = new Runnable() {
+					public void run() {
+						MessageDialog.openError(d.getActiveShell(),
+								"API query", errMsg);
+					}
+				};
+
+				// update the result composite page
+				d.syncExec(errormsg);
+
+			}
+
+		}
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.search.IQueryDefCompositeListener#queryStarted(java.lang.String)
+	 */
+	public void queryStarted(String searchString, boolean useExactMatch) {
+
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"* Search started: " + searchString); //$NON-NLS-1$
+		int queryType = queryTypeControl.getSelectedQueryType();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				"** Query type as int: " + queryType); //$NON-NLS-1$
+		DbgUtility
+				.println(
+						DbgUtility.PRIORITY_OPERATION,
+						"** Query type descr: " + APIQueryParameters.getDescriptionForQueryType(queryType)); //$NON-NLS-1$	
+
+		params = new APIQueryParameters(queryType, searchString);
+		params.setDetailsMentToAddToDescriptions(!queryResultsControl
+				.isShowOnlyAPINamesSelected());
+		params.setExactMatchInUse(useExactMatch);
+
+		ISearchMethodExtension currSelExt = UserSettings.getInstance()
+				.getCurrentlySelectedSearchMethod();
+
+		// Showing busy cursor during operation
+		Display d = APIQueryPlugin.getCurrentlyActiveWbWindowShell()
+				.getDisplay();
+		if (currSelExt.isAsyncQueryPreferred()) {
+			// run as the back ground job only if it's a webquery
+
+			synchronized (prevQueryJobObjLock) {
+				//any query running
+				if (prevWebSerachJob != null) {
+					boolean cancel = true;
+					if (!progressMonitor.isCanceled()) {
+						//if job not cancelled yet,check if user wants to continue with new query
+						cancel = MessageDialog.openQuestion(APIQueryPlugin
+								.getCurrentlyActiveWbWindowShell(),
+								"Query Cancel",
+								"Do you want to cancel pervious apiquery for :"
+										+ prevQueryString
+										+ " and continue with new search?");
+					}
+
+					if (cancel) {
+
+						//already cancelled?
+						if (!progressMonitor.isCanceled()) {
+							if (progressMonitor != null)
+								progressMonitor
+										.setTaskName("In cancellation...........");
+							if (prevWebSerachJob != null)
+								prevWebSerachJob.cancel();
+						}
+						//set the job to null
+						prevWebSerachJob = null;
+
+						MainView.enablePropTabcontents(true);
+					}
+
+					else {
+						// end the new search
+						return;
+					}
+
+				}
+			}
+
+			prevWebSerachJob = new WebQueryJob("Web Query for search string: "
+					+ searchString, searchString);
+
+			prevWebSerachJob.addJobChangeListener(new WebQueryJobListener(d,
+					searchString));
+
+			prevWebSerachJob.setPriority(Job.SHORT);
+			prevWebSerachJob.setUser(true);
+			prevWebSerachJob.schedule(); // start as soon as possible
+
+		}
+
+		else {
+			Runnable performAPIDetailsQueryRunnable = new Runnable() {
+				public void run() {
+					performQuery(params);
+				}
+			};
+			// run with a busy indicator
+			BusyIndicator.showWhile(d, performAPIDetailsQueryRunnable);
+			updateResults(false, d, null);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.search.IQueryActionListener#queryModified(java.lang.String)
+	 */
+	public void queryModified(String searchString) {
+		// Currently we do not do anything when query string is modified.
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.settings.IUserSettingsListener#userSettingsChanged()
+	 */
+	public void userSettingsChanged() {
+		// Settings have changed which might mean that 
+		// the user has changed the currently used query type.
+		// => Therefore resetting previous query results
+		queryResultsControl.clear();
+	}
+
+	/**
+	 * Releases all the listeners. Called when parent UI composite
+	 * is disposed. If we have listeners in action after UI components
+	 * are disposed we will get "Widget is disposed" error.
+	 */
+	public void releaseListeners() {
+		UserSettings.getInstance().removeUserSettingListener(this);
+		queryDefControl.setCompositeListener(null);
+		queryResultsControl.setResultSettingsListener(null);
+	}
+
+	/**
+	 * Updates results composite 
+	 */
+	private void updateResultComposite() {
+		// Clearing old results
+		queryResultsControl.clear();
+
+		//Updating results composite
+		queryResultsControl.updateAPIShortDescriptionData(resultColl
+				.getSearchResults(), params);
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.apiquery.ui.views.main.search.IResultSettingsListener#resultSettingsChanged()
+	 */
+	public void resultSettingsChanged() {
+		//When request comes outside of this class, show only API names selection must be updated
+		params.setDetailsMentToAddToDescriptions(!queryResultsControl
+				.isShowOnlyAPINamesSelected());
+		updateResultComposite();
+	}
+	
+	/**
+	 * Performs the according the given parameters and updates the UI components
+	 * after the query.
+	 * 
+	 * @param params
+	 *            Parameters for the query.
+	 * @param errInfo
+	 *            Error info class for returning error description in case if an
+	 *            error.
+	 */
+	private void performQuery(APIQueryParameters params,IProgressMonitor progressmonitor) throws JobCancelledByUserException{
+		try { // disable datasource selection option from properites page
+			MainView.enablePropTabcontents(false);
+			resultColl = null; // Resetting previous searches.
+
+			ISearchMethodExtension currSelExt = UserSettings.getInstance()
+					.getCurrentlySelectedSearchMethod();
+		if (	currSelExt.isAsyncQueryPreferred())
+		{
+			
+		Object obj =	UserSettings.getInstance()
+			.getCurrentlySelectedSearchMethod();
+		
+		resultColl =  ((AbstractSearchMethodExtension)obj).runAPIQuery(params, progressMonitor);
+		 
+		
+		   
+		}
+		else
+		{
+		   
+			resultColl = currSelExt.runAPIQuery(params);
+		}
+
+			// enable dataSelection source feature
+		} finally {
+
+			MainView.enablePropTabcontents(true);
+		}
+	}
+	
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.carbide.extensions.appdep</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>
Binary file srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/Carbide_Image.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,20 @@
+#
+# 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 the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+bin.includes = feature.xml,\
+               appdep_32x32.png,\
+               license.txt,\
+               Carbide_Image.png
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/build.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,191 @@
+  
+<project name="com.nokia.s60tools.appdep" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="DependencyExplorer"/>
+  <property name="project.name" value="com.nokia.s60tools.extensions.appdep" />
+  <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.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"/>
+  </target>
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+  <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.plugins">
+		<!-- 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">
+  
+  	<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>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<!-- Files to analyze -->
+			<fileset dir="${ant.project.name}/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/srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/feature.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.appdep"
+      label="Carbide.c++ Extensions - Dependency Explorer"
+      version="2.4.4.qualifier"
+      provider-name="Nokia"
+      plugin="com.nokia.carbide.cpp">
+
+   <description>
+      Dependency Explorer is a tool for analysing static dependencies between components.
+   </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 url="license.txt">
+      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;.
+Part of the graphics of the program are from Eclipse 3.1 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
+GNU Binutils - c++filt
+This Nokia Product includes Open Source Software. Certain software
+included in this Nokia Product is licensed and distributed under
+GNU General Public License (GPL), the GNU Lesser General Public
+License 
+(LGPL, a.k.a. the GNU Library General Public License) and/ or
+other 
+copyright licenses, disclaimers and notices containing obligation
+or 
+permission to provide the source code of such software with the
+binary / executable form delivery of the said software. 
+The source code is delivered to you in accordance with the referred
+license terms and conditions in the media attached to this document.
+The exact license terms of GPL and LGPL and said certain other
+licenses, 
+as well as the required copyright and other notices, permissions
+and 
+acknowledgements are reproduced in and delivered to you as part
+of 
+the referred source code.
+   </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.sdk" version="1.3.1" match="greaterOrEqual"/>
+      <import plugin="com.nokia.s60tools.util" version="1.4.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.cdt.core"/>
+      <import plugin="org.eclipse.cdt.ui"/>
+      <import plugin="org.eclipse.search"/>
+      <import plugin="com.nokia.s60tools.ui" version="1.4.0" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.appdep"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.appdep.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/srcanaapps/depexplorer/com.nokia.carbide.extensions.appdep/license.txt	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,23 @@
+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".
+
+
+GNU Binutils - c++filt
+This Nokia Product includes Open Source Software. Certain software 
+included in this Nokia Product is licensed and distributed under 
+GNU General Public License (GPL), the GNU Lesser General Public License 
+(LGPL, a.k.a. the GNU Library General Public License) and/ or other 
+copyright licenses, disclaimers and notices containing obligation or 
+permission to provide the source code of such software with the 
+binary / executable form delivery of the said software. 
+The source code is delivered to you in accordance with the referred 
+license terms and conditions in the media attached to this document. 
+The exact license terms of GPL and LGPL and said certain other licenses, 
+as well as the required copyright and other notices, permissions and 
+acknowledgements are reproduced in and delivered to you as part of 
+the referred source code.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.classpath	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+bin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.appdep.help</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.s60tools.pclint.pclintAuditor</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.s60tools.pclint.pclintNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/.settings/org.eclipse.jdt.core.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+#Mon Aug 18 15:45:18 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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 1.5.0_10-b03 (Sun Microsystems Inc.)
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Dependency Explorer Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.appdep.help; singleton:=true
+Bundle-Version: 2.4.4.qualifier
+Bundle-Activator: com.nokia.s60tools.appdep.help.HelpPlugin
+Bundle-Vendor: Nokia
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/about.html	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,13 @@
+<!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" type="text/css" rel="stylesheet"></head>
+<body lang="en-us">
+<h2>About This Content</h2>
+<p>November 26, 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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/book.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,185 @@
+/*	
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
+reserved. License: http://www.symbianfoundation.org/legal/sfl-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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,8 @@
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+               *.xml,\
+               about.html,\
+               book.css
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/contexts.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+<context id="APPDEP_MAIN_VIEW">
+ <description>Dependency Explorer's Main View</description>	   
+ <topic label="Managing SDKs" href="html/tasks/manage_platforms.htm" />    	
+ <topic label="Selecting SDK" href="html/tasks/selecting_platform.htm" />    	
+ <topic label="Selecting components" href="html/tasks/selecting_platform.htm#select_components" />    	
+ <topic label="Analysing components" href="html/tasks/analyse_component.htm" />    	
+ <topic label="Exporting the report" href="html/tasks/export_report.htm" />    	
+ <topic label="Locating components" href="html/tasks/locate_component.htm"/> 
+ <topic label="Finding for components" href="html/tasks/search_comp.htm"/>
+ <topic label="Searching for components and functions" href="html/tasks/search.htm"/>
+ <topic label="Toolbar" href="html/references/toolbar.htm" />    	
+</context>	  
+    
+<context id="APPDEP_COMPONENT_LIST_VIEW">
+ <description>Dependency Explorer's Component List View</description>	   
+ <topic label="Is Used By... -action" href="html/tasks/analyse_component.htm#usedby" />    	
+</context>	  
+
+<context id="APPDEP_IMPORTED_FUNCTIONS">
+ <description>Imported Functions Tab</description>	   
+ <topic label="Checking imported functions" href="html/tasks/check_imp_func.htm"/>
+ <topic label="Searching for components and functions" href="html/tasks/search.htm"/>
+ <topic label="Viewing source file" href="html/tasks/view_source.htm"/>
+ <topic label="Viewing source file in project" href="html/tasks/view_source_file_in_project.htm"/>
+ <topic label="Viewing method call locations" href="html/tasks/view_method_call_locations.htm"/>
+</context>    
+     		     
+<context id="APPDEP_EXPORTED_FUNCTIONS">
+ <description>Exported Functions Tab</description>	   
+ <topic label="Checking exported functions" href="html/tasks/check_exp_func.htm"/>
+ <topic label="Searching for components and functions" href="html/tasks/search.htm"/>
+ <topic label="Viewing source file" href="html/tasks/view_source.htm"/>
+ <topic label="Viewing source file in project" href="html/tasks/view_source_file_in_project.htm"/>
+</context>    
+     		     
+<context id="APPDEP_PROPERTIES">
+ <description>Properties Tab</description>	   
+ <topic label="Checking Component Properties" href="html/tasks/check_comp_prop.htm"/>
+</context>    
+     		     
+<context id="APPDEP_DIALOG_ADD_SIS_FILES">
+ <description>SIS File Selection</description>	   
+ <topic label="Adding SIS files" href="html/tasks/selecting_platform.htm#add_sis"/>
+</context>    
+     		     
+<context id="APPDEP_WIZARD_PAGE_SDK_SELECT">
+ <description>SDK and Build Target Selection</description>	   
+ <topic label="Selecting an SDK" href="html/tasks/selecting_platform.htm"/>
+</context>    
+     		     
+<context id="APPDEP_WIZARD_PAGE_BUILD_TARGET_SELECT">
+ <description>SDK and Build Target Selection</description>	   
+ <topic label="Selecting build targets" href="html/tasks/selecting_platform.htm#build_target_selection"/>
+</context>    
+     		     
+<context id="APPDEP_WIZARD_PAGE_CACHE_GEN_OPT">
+ <description>Cache Generation Options</description>	   
+ <topic label="Defining cache generation options" href="html/tasks/selecting_platform.htm#generate_cache"/>
+</context>    
+     		     
+<context id="APPDEP_WIZARD_PAGE_COMP_SELECT">
+ <description>Component Selection</description>	   
+ <topic label="Selecting components" href="html/tasks/selecting_platform.htm#select_components"/>
+</context>    
+     		     
+<context id="APPDEP_FIND_DIALOG">
+ <description>Finding Components</description>	   
+ <topic label="Finding for components" href="html/tasks/search_comp.htm"/>
+</context>    
+     		     
+<context id="APPDEP_LOCATE_COMPONENT_DIALOG">
+ <description>Locating Components</description>	   
+ <topic label="Locating components" href="html/tasks/locate_component.htm"/>
+</context>    
+     		     
+<context id="APPDEP_SEARCH_DIALOG">
+ <description>Searching Components and Functions</description>	   
+ <topic label="Searching for components and functions" href="html/tasks/search.htm"/>
+</context>    
+     		     
+<context id="APPDEP_PREF_PAGE">
+ <description>Setting Preferences</description>	   
+ <topic label="Setting preferences" href="html/tasks/setting_preferences.htm"/>
+</context>    
+     		     
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/appendix.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Appendix: Static Dependencies to Dynamic Data</title>
+<link href="../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Appendix: Static Dependencies to Dynamic Data</h2>
+<p>In ARM EABI binary model used in Symbian OS 9.x the compiler generates exports for runtime type information (RTTI) and virtual tables. With c++filt _ZTI maps to typeinfo for and _ZTV maps to vtable for. Those exports are actually data - they will never be "called" in a functional sense. They will be used to fill in values in the corresponding tables for derived classes, if there are any in the calling DLL.</p>
+
+<p>Those objects are automatically exported, even though they are not nameable in C++. The compiler will expect these symbols to exist when compiling code which needs them (for example, constructors for derived classes), and generates them when it compiles a "key function" for the class. These symbols are added automatically when the EABI def files are frozen - they are automatic exports.</p>
+
+<p>The LIB format for import libraries is restricted and does not contain these exports in the symbol table. Therefore it is always recommended to prefer DSO format over LIB which does not have this limitation when analyzing content of import libraries. Ordinals in the symbol table form a continuous sequence from 1 to n and therefore cannot contain any  holes. If LIB files contain holes, the content of those is unknown. Exports related to runtime type information and virtual tables can also be in the end of symbol table so with LIB files size of symbol table can be reported incorrectly.</p>
+
+<p>Source: <i>Definitive Guide on the Technical Intricacies of Compatibility</i>, 2006, Peter Harper, Symbian LTC.</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/component.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Component</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Component</h2>
+<p>Dependency Explorer can be used to search and analyse DLL and EXE components and their dependencies on other components and functions.</p>
+<p class="note"><strong>NOTE</strong> It is not possible to reverse engineer a DLL file to an import library file that is required when analyzing dependencies.</p>
+
+<h3><a name="3rd_party"></a>Third-party and in-house components</h3>
+<p>Additional components such as third-party or in-house components are handled in the same way as other SDK components. When an application has been compiled from sources, it can be analysed by Dependency Explorer once the cache has been updated. If just binaries and/or import libraries are available, you can copy them to their respective directories under the <i>\epoc32\release</i> directory and take into use after a cache update. </p>
+<p>Symbian OS Installation Files (SIS) can be added conveniently on the Dependency Explorer user interface. For instructions, see <a href="../tasks/selecting_platform.htm#add_sis">Adding SIS files</a>.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/selecting_platform.htm#select_components">Selecting components</a></li>
+	<li><a href="../tasks/analyse_component.htm">Analysing components</a></li>
+	<li><a href="../tasks/check_comp_prop.htm">Checking component properties</a></li>
+	<li><a href="../tasks/search_comp.htm">Finding components</a></li>
+	<li><a href="../tasks/locate_component.htm">Locating components</a></li>
+	<li><a href="../tasks/search.htm">Searching for components and functions</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/concepts.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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 name="LASTUPDATED" content="06/17/05 11:09:43">
+<title>Concepts</title>
+<link rel="StyleSheet" href="../../book.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF">
+<h2>Concepts</h2>
+<p>The following concepts provide information on Dependency Explorer terminology and processes:</p>
+<ul>
+  <li><a href="platform.htm">Software Development Kit (SDK)</a></li>
+  <li><a href="component.htm">Component</a></li>
+  <li><a href="function.htm">Function</a></li>
+  <li><a href="properties.htm">Properties</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>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/function.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Function</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Function</h2> <p>Dependency Explorer can be used to generate a list
+of all functions that a component is using  (Imported functions), and also
+the functions the component provides (Exported functions)<?Pub Caret>.</p> <h5>
+Related tasks</h5> <ul>
+<li><a href="../tasks/check_imp_func.htm">Checking imported functions</a></li>
+<li><a href="../tasks/check_exp_func.htm">Checking exported functions</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/platform.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Software Development Kit (SDK)</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Software Development Kit (SDK)</h2>
+<p>Dependency Explorer is used to analyse components in S60 or custom platforms included within Software Development Kits (SDKs). SDKs contain the tools, documentation and code examples that support the development of applications.</p>
+<p>To install SDKs to Carbide.c++, go to <b>Window > Preferences > Carbide.c++ > SDK Preferences > Add New SDK</b>, and select the SDK to be added. </p>
+<p class="note"><b class="note">NOTE</b> To get full advantage of Dependency Explorer, consider the following when adding SDKs.</p>
+<p>You can analyse Symbian OS SDKs with this tool.</p>
+
+<p>If you install Symbian SDK, you can analyse dependencies to the components you have
+developed yourself, and to the system library components that are directly used by your
+components. In this case, it is enough to have dynamic shared object (.dso) and/or import
+library (.lib) files available for the system libraries included in the analysis. The existence
+of system library components themselves is not required.
+If you need in-depth analysis of the available component, you need to install a platform SDK.
+</p>
+
+<p>For more information, see <b>SDK Support</b> under the general Carbide.c++ help.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/manage_platforms.htm">Managing SDKs</a></li>
+	<li><a href="../tasks/selecting_platform.htm">Selecting SDKs</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/concepts/properties.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,14 @@
+<!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>Properties</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Properties</h2>  <p>In addition to analysing components, Dependency
+Explorer can also be used to display the properties information of a component.
+</p>  <?Pub Caret><p>The properties displayed include Directory, Filename,
+Binary format, Secure ID, Vendor ID, UID1, UID2, UID3, Capabilities, Min and
+Max Heap Size, Stack Size and DLL ref table count.</p> <h5>Related tasks</h5> <ul>
+<li><a href="../tasks/check_comp_prop.htm">Checking component properties</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/GS_index.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,12 @@
+<!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 Dependency Explorer
+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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/overview.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Overview</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Overview</h2>
+<p>Dependency Explorer is a tool for analysing static dependencies within Symbian OS SDKs. It can be used to analyse the components and functions that a component is using, or to see which components are using a specific function or component. Dependency Explorer is capable of handling third-party components just like any other SDK components.</p>
+<p>The tool generates a cache file by reading the data from all binaries and import libraries within a release, by using an external compiler tool set. The use of a cache file is a fast way to make a dependency review, such as which dependencies a binary has, or to generate dependency lists to a component or a function. The tool can also be used to view the properties of a binary.</p>
+<p>The core of Dependency Explorer is a command line tool that has a UI integrated with Carbide.c++ IDE.</p>
+
+<p><b>NOTE!</b> Dependency Explorer does not support emulator environment (winscw) because of the different binary formats in Symbian OS and Windows environments. To check dependencies in an emulator environment, use any dependency analysis tool for Windows (for example, <a href="http://www.dependencywalker.com/" target="_new">Dependency Walker</a>).</p>
+
+<h3>Elftran</h3>
+<p>Elftran is a Symbian tool that Dependency Explorer Carbide.c++ Extension uses to read binary data as header information and the DLL reference table from an <i>E32ImageFile</i>.</p> 
+<p>Note that there are two versions of this tool:</p>
+<ul> 
+<li><i>Elftran.exe</i>: used by default, supports the GCCE and RVCT toolchains (used in Symbian OS 9.x).</li>
+<li><i>Petran.exe</i>: supports the GCC toolchain only (used in Symbian OS versions prior to 9.x).</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/gettingstarted/walk_through.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Basic walk-through</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h3>Basic walk-through</h3>
+<p>To launch the Dependency Explorer Carbide.c++ Extension, you can either: </p>
+<ul>
+<li>Select the <b>Dependency Explorer</b> item in the <b>Carbide</b> menu (this starts automatically the <b>SDK Selection</b> wizard), or</li>
+<li>Go to the <b>Window > Show View > Other...</b> menu, where the tool can be found under the <b>Carbide Extensions</b> category.</li>
+</ul>
+
+<p>Before you start, ensure there are components to be analysed.</p>
+<ul>
+<li>Install the necessary SDKs to Carbide.c++. Symbian OS SDKs are recommended for extensive analysis.  For instructions, see <a href="../tasks/manage_platforms.htm">Managing SDKs</a>.</li>
+</ul>
+
+<p>Component dependency analysis involves the following steps: </p>
+<ol>
+<li><a href="../tasks/selecting_platform.htm">Select the SDK and build targets to be analysed</a>.</li>
+<li>(Optional) If needed, add third-party components such as Symbian OS Installation (SIS) files for analysis. For instructions, see <a href="../tasks/selecting_platform.htm#add_sis">Add SIS files</a>.</li>
+<li>(Optional) <a href="../tasks/selecting_platform.htm#generate_cache">Generate cache</a> for the build targets within the SDKs.</li>
+<li><a href="../tasks/selecting_platform.htm#select_components">Select the components</a> to be analysed.</li>
+<li><a href="../tasks/analyse_component.htm">Analyse the components</a> to see, for example, which other components are using the selected one. 
+<p>You can also do the following: <a href="../tasks/check_comp_prop.htm">check the component's properties</a>, <a href="../tasks/check_imp_func.htm">check its imported functions</a>, <a href="../tasks/check_exp_func.htm">check its exported functions</a>, <a href="..\tasks\locate_component.htm">locate components</a>, <a href="../tasks/search_comp.htm"> find components</a>, <a href="..\tasks\search.htm">search for components and functions</a>, <a href="..\tasks\view_source.htm">view the source file</a>, <a href="..\tasks\view_source_file_in_project.htm">view the source file in project</a>, and <a href="..\tasks\view_method_call_locations.htm">view method call locations</a>.</p></li>
+<li><p>Finally, to share the results of your analysis, <a href="../tasks/export_report.htm">export a report</a> as an HTML file.</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>
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/images/green_fade_left_68_165_28.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,2 @@
+a#appdep img { background-image : url(appdep.gif); }
+a#appdep:hover img { background-image : url(appdep_hov.gif); }
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,6 @@
+
+overview.appdep = html/intro/appdep.gif
+overview.appdep:hover = html/intro/appdep_hov.gif
+
+whatsnew.appdep = html/intro/appdep.gif
+whatsnew.appdep:hover = html/intro/appdep_hov.gif
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/appdep_hov.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/book.css	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,186 @@
+/*	
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights
+reserved. License: http://www.symbianfoundation.org/legal/sfl-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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/overviewAppDepExtContent.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<introContent>
+<!-- Extension to the Whats New page. -->
+
+	<extensionContent 
+		id="com.nokia.s60tools.appdep.help-overview" 
+		alt-style="appdep.properties" 
+		style="appdep.css" 
+		path="overview/@">
+		
+		<group 
+			id="content-group" 
+			style-id="content-group">
+			
+			<link 
+				label="Dependency Explorer Overview" 
+	       		url="http://org.eclipse.ui.intro/showHelpTopic?id=/com.nokia.s60tools.appdep.help/html/gettingstarted/overview.htm" 
+				id="appdep">
+				style-id="content-link" 
+          		<text>Learn about Dependency Explorer and what it can do to improve your development efforts.</text>
+			</link>
+			
+		</group>
+		
+	</extensionContent>
+  
+</introContent>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/intro/whatsnewAppDepExtContent.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<introContent>
+<!-- Extension to the Whats New page. -->
+
+	<extensionContent 
+		id="com.nokia.s60tools.appdep.help-whatsnew" 
+		alt-style="appdep.properties" 
+		style="appdep.css" 
+		path="whatsnew/@">
+		
+		<group 
+			id="content-group" 
+			style-id="content-group">
+			
+			<link 
+				label="Dependency Explorer release notes" 
+	       		url="http://org.eclipse.ui.intro/showHelpTopic?id=/com.nokia.s60tools.appdep.help/html/release_notes.htm" 
+				id="appdep">
+				style-id="content-link" 
+          		<text>Learn about what's new in Dependency Explorer for this release.</text>
+			</link>
+			
+		</group>
+		
+	</extensionContent>
+  
+</introContent>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/legal.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>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>
+
+<h5>LICENSE</h5>
+<p>Part of the graphics of the program are from Eclipse 3.1 platform and CDT project in Eclipse community, which are made available under the terms of the Eclipse Public License v1.0.</p>
+<p>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></p>
+
+<h5>GNU Binutils - c++filt</h5>
+<p>This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under GNU General Public License (GPL), the GNU Lesser General Public License (LGPL, a.k.a. the GNU Library General Public License) and/or other copyright licenses, disclaimers and notices containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms of GPL and LGPL and said certain other licenses, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/references.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,14 @@
+<!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>References</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body bgcolor="#FFFFFF"><h2>References</h2> <p>The following references are
+available for this tool:</p><ul>
+<li><a href="warnings_and_errors.htm">Messages and notifications</a></li>
+<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>
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/add_sis_files.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/bin_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/bin_obj_link.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/collapse_tree.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/context_menu.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/de_toolbar.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/expand_subtree.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/expand_tree.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/find.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_back.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_home.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/go_into.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/search.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/select_new_root.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/select_new_sdk.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/toolbar.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/screenshots/update_cache.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/toolbar.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,129 @@
+<!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 Dependency Explorer view contains the following items:</p>
+<p><img src="..\references\screenshots\toolbar.png"></p>
+<p>You can access context menus by right-clicking a node or a component in the Dependency Explorer main view, or by clicking the small arrow on the toolbar.</p>
+
+<h3>SDK and component management</h3>
+
+<table width="616" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="19*">
+<col width="106*">
+<col width="248*"></colgroup>
+<tbody>
+
+<tr>
+<th height="19">Button</th>
+<th align="center">Name</th>
+<th height="19">When to use? </th>
+</tr>
+
+<tr>
+<td><img src="screenshots\select_new_sdk.png"></td>
+<td>Select an SDK</td>
+<td>Opens the <b>SDK Selection</b> wizard page. Use it to change the SDK, build targets, and SIS files you want to analyse. </td>
+</tr>
+
+<tr>
+<td><img src="screenshots\select_new_root.png"></td>
+<td>Select a new root Component</td>
+<td>Opens the <b>Component Selection</b> page. Use it to change the root component for analysis.</td>
+</tr>
+
+<tr>
+<td><img src="screenshots\update_cache.png"></td>
+<td>Update cache</td>
+<td>Updates the cache for your currently selected build targets. </td>
+</tr>
+
+<tr>
+<td><img src="screenshots\find.png"></td>
+<td>Find</td>
+<td>Opens the <b>Find Components</b> dialog, in which you can search for components in the hierarchy. </td>
+</tr>
+
+<tr>
+<td><img src="screenshots\search.png"></td>
+<td>Search</td>
+<td>Opens the <b>Search</b> dialog which can be used for searching for components, imported functions and exported functions from a selected SDK. The default search scope used for the search dialog is based on the view from which the search action is started.</td>
+</tr>
+
+</tbody>
+</table>
+
+
+<h3>Component navigation</h3>
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="19*">
+<col width="103*">
+<col width="242*"></colgroup>
+<tbody>
+
+<tr>
+<th>Button</th>
+<th align="center">Name</th>
+<th>When to use? </th>
+</tr>
+
+<tr>
+<td><img src="screenshots\expand_tree.png"></td>
+<td>Expand All</td>
+<td>Expands the entire hierarchy under a selected node or a component.<p></p>Tip: To expland only a specific subtree, select the following from the component's context menu: <img src="screenshots\expand_subtree.png">This option is useful in cases when the overall hierarchy is very long.</td>
+</tr>
+
+<tr>
+<td><img src="screenshots\collapse_tree.png"></td>
+<td>Collapse All</td>
+<td>Collapses the entire component hierarchy. </td>
+</tr>
+
+<tr>
+<td><img src="screenshots\go_home.png"></td>
+<td>Go Home</td>
+<td><b>Go Home</b> action goes back to the top level in the component tree.<p></p>This action is available only if the <b>Go Into</b> action has been performed previously.
+</td>
+</tr>
+
+<tr>
+<td><img src="screenshots\go_back.png"></td>
+<td>Go Back</td>
+<td>Goes back up one level in the component tree. <p></p> This action is available only if the <b>Go Into</b> action has been performed previously. </td>
+</tr>
+
+<tr>
+<td><img src="screenshots\go_into.png"></td>
+<td>Go Into</td>
+<td>Drills into the selected subtree or into the lower levels of the component hierarchy. <p></p>This action is only available for the component nodes that have children (marked with:<img src="screenshots/bin_obj.png">) .</td>
+</tr>
+
+</tbody>
+</table>
+
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/component.htm">Component</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/selecting_platform.htm">Selecting SDKs</a></li>
+	<li><a href="../tasks/analyse_component.htm">Analysing components</a></li>
+	<li><a href="../tasks/search_comp.htm">Finding components</a></li>
+	<li><a href="../tasks/search.htm">Searching for components and functions</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/references/warnings_and_errors.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,89 @@
+<!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>Messages and notifications</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Messages and notifications</h2>
+<p>The following table lists the messages that may be displayed when selecting build targets and creating cache for SDK components or SIS files in Dependency Explorer.</p>
+<p></p>
+
+<table width="772" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+	<col width="89*">
+	<col width="93*">
+	<col width="105*"></colgroup>
+<thead>
+<tr bgcolor="#D0D0D0">
+	<th height="28"><b>Problem</b></th>
+	<th><b>Explanation</b></th>
+	<th height="28"><b>Action</b></th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td><code class="code">All selected targets must have components</code></td>
+<td>The selected build target does not have any components to generate the cache from. </td>
+<td>Build components for the SDK or select another SDK. </td>
+</tr>
+
+<tr>
+<td><code class="code">All selected targets must use same default toolchain</code></td>
+<td>GCC and GCCE/RVCT toolchain binaries cannot be mixed because they use different toolchain tools for creating cache files. <p></p> If selecting GCCE and ARMV* targets, the CSL Arm toolchain is used by default to generate the cache for both. </td>
+<td>Select the build targets from either group: <p></p><i>GCC toolchain:</i> ARMI, ARMV4, THUMB, and targets starting with M. <p></p><i>GCCE/RVCT toolchain: </i> other target types</td>
+</tr>
+
+<tr>
+<td><code class="code">All selected targets must be supported</code></td>
+<td>If you have unselected the <b>Show only supported and non-empty target builds</b> check box, the wizard lists all targets, also unsupported ones. </td>
+<td>Select the <b>Show only supported and non-empty target builds</b> check box. Then select your target builds from the available ones. </td>
+</tr>
+
+<tr>
+<td><code class="code">Cache generation failed for [build + release].</code></td>
+<td>Check the console log for details. <p></p>For example, this message is shown when the <i>dumpsis.exe</i> utility cannot find the necessary files for decompiling the SIS file. </td>
+<td>Ensure you have the correct version of <i>dumpsis.exe</i>:   <p></p> Download a Symbian OS 9.2 SDK. From its <i>\epoc32\tools</i> directory, copy the <i>dumpsis.exe</i> file to the <i>\epoc32\tools</i> directory of the SDK you are using.</td>
+</tr>
+
+<tr>
+<td><code class="code">Cache generation cannot be ongoing for selected targets
+</code></td>
+<td>The process is currently running in the background. </td>
+<td>Wait until the cache has been generated, and the <b>Next</b> and <b>Finish </b> buttons are enabled again. </td>
+</tr>
+
+<tr>
+<td><code class="code">Caches must be up-to-date for selected targets</code></td>
+<td>The data in the selected cache has become outdated. </td>
+<td>Do either of the following: <p></p>Click <b>Finish</b> to start the cache update. <p>Or: </p>Click <b>Next</b> to specify the update options. </td>
+</tr>
+
+<tr>
+<td><code class="code">Caches must have been generated for selected targets</code></td>
+<td>If one or more of the selected build targets is marked with a yellow symbol, cache generation is needed. </td>
+<td>Do either of the following: <p></p>Click <b>Finish</b> to start the cache generation.<p>Or: </p>Click <b>Next</b> to specify the generation options.</td>
+</tr>
+
+<tr>
+<td><code class="code">Caches indices must be created for selected targets</code></td>
+<td>The cache index generation is currently running in the background. </td>
+<td>Wait until the index has been created, and the <b>Next</b> and <b>Finish</b> buttons are enabled again. </td>
+</tr>
+
+<tr>
+<td><code class="code">Only Symbian OS 9.x SIS files are supported.</code></td>
+<td>The selected SIS file is created for Symbian OS v8.1b. Only Symbian OS v9.x SIS files are supported.</td>
+<td>Select another file. The supported Symbian OS v9.x edition is typically identified in the file name. </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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/release_notes.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,269 @@
+<!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 bgcolor="#FFFFFF">
+
+<h2>Release Notes</h2> 
+<h4>Dependency Explorer &ndash; Version 2.4.4</h4>
+<p>Released 26th 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>Dependency Explorer is a tool for analysing static dependencies between  components. In addition to resolving static dependencies, the tool can also display the functions that are used from each component. Core functionality is implemented in a command line runnable executable. Dependency Explorer offers Carbide.c++ integration that provides a graphical user interface for the command line tool.</p>
+<p>The Dependency Explorer tool can be started either by selecting the <b>Carbide > Dependency Explorer</b> menu item or via <b>Window > Show View > Other...</b> under <b>Carbide Extensions</b> category.</p>
+
+<h3><a name="features"></a>Main features</h3>
+<ul>
+<li>UI for generating cache files that store the component dependency information. Cache files are updated incrementally after the first-time creation.</li>
+<li>UI for selecting SDK/Build target(s) and components to be analyzed for dependencies. A search field for finding a matching component in the component selection page.</li>
+<li>UI for showing a dependency hierarchy for the analysed component.</li>
+<li>UI for showing the functions that have been imported from the component selected in the dependency hierarchy (ordinal, name, and offset).</li>
+<li>UI for showing the functions that have been exported from the component selected in the dependency hierarchy (ordinal, name).</li>
+<li>New <b>Add SIS files</b> dialog enables adding SIS files from multiple different folder locations</li>.
+<li>The AddSISFile toolbar option enables adding SIS files & updation of cache for the selected SDK & target</li>.
+<li>Two UI options for showing component properties (dialog and properties tab). </li>
+<li>"Is Used By..." context menu both in the component hierarchy tree and in the Imported Functions pane, and Component List view that displays those components that are using the selected component/function. The toolbar shows which kind of search was used to generate the component list.</li>
+<li>Information from the Component List view and from Imported Functions tab can be copied to the clipboard.</li>
+<li>Find dialog that enables finding components from the dependency tree based on a given name (or part of the component name).</li>
+<li>Possibility to analyze components from Symbian OS Installation (SIS) files together with an existing build targets.</li>
+<li>Update Cache action that enables quick cache update for the currently selected build targets.</li>
+<li><b>Searching for components and functions</b> feature enables searching of components, imported functions and exported functions from the currently selected build target cache(s). Search results can be copied to clipboard for further processing, and double-clicking of a search result item opens the corresponding component as a new root component.</li>
+<li><b>Locating components</b> feature enables showing also component tree for the components that are dependent upon based on generic component name (for example <i>hal.dll</i>). Those components do not exist as such in cache data but may have multiple concrete implementations (for example <i>hal.dll</i> has multiple implementations <i>_h4hrp_hal.dll, _template_hal.dll, _h2_hal.dl</i>l etc.). There are two options for locating components:
+<ul>
+<li>Locating manually from component list by selecting <b>Locate Component...</b> action from context menu (user-bind)</li>
+<li>Defining known component prefixes (for example <i>_h4hrp_</i>) in the preferences page and correct component instances are located automatically (auto-bind).</li>
+</ul></li>
+<li><b>Viewing source file</b> feature adds an action to Imported and Exported Functions tabs. The action opens up for viewing the source file that implements the currently selected function.</li>
+<li><b>Viewing source file in project</b> feature adds an action to Imported and Exported Functions tabs. The action opens up for viewing the project and source file that implements the currently selected function.</li>
+<li><b>Viewing method call locations</b> feature adds an action to Imported Functions tab. The action opens up the project for the component that uses the currently selected function, and searches for all instances where the selected function is called from the component.</li>
+<li>Context-sensitive help.</li>
+<li>Dependency Explorer comes with a command line tool version of <i>appdep.exe</i> and <i>cfilt.exe</i>. Both executables can be found in a delivery jar-package from
+the directory <i>com.nokia.s60tools.appdep_X.Y.Z\os\win32\x86
+</i>, in which <i>X.Y.Z</i> is the current build number for Dependency Explorer.
+Both executables are copied at run-time to the directory <i>
+\configuration\org.eclipse.osgi\bundles\{DIR}\1\.cp\os\win32\x86</i>, in
+which <i>{DIR}</i> is the workstation-specific directory name.</li>
+<li>Supports Symbian OS versions 6.x-9.x. </li>
+<li>Supports GCC toolchain<ul>
+<li>for targets ARMI, ARMV4, THUMB and targets starting with M. </li>
+</ul></li>
+<li>Supports GCCE toolchain (tested with CSL Arm Toolchain, 2005-05-19/Sourcery G++ Lite for ARM SymbianOS Toolchain, 2008.1.0.126) and RVCT 2.2/3.0/3.1 toolchain (tested with 2.2 Build 503)<ul>
+<li>for other targets types.</li>
+</ul></li>
+<li>Does not support WIN* or TOOLS* target types.</li>
+</ul>  
+
+<h3><a name="newfeatures"></a>What's new</h3>
+<ul>
+<li>Fix: Fixed the issue with the features <b>Show Source File</b> and <b>Show Method Call Locations</b>
+on non symbian code base like QT & Orbit.</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, Windows XP</li>
+<li>RVCT or GCCE Toolchain (GCC toolchain optional, needed for ARMI, ARMV4,
+and THUMB targets)</li>
+<li>Carbide.c++ v2.0.2, or newer</li>
+<li>Minimum SDK build PC.</li>
+<li>Normal SDK build PC.</li>
+</ul>  Additional requirements: <ul>
+<li>Carbide.c++ with all its prerequisites have to be installed prior to installation.
+See the file readme\readme_sdks.html under the Carbide.c++ installation directory
+for prerequisites. (ActivePerl-5.6.1.635, and at least one Symbian
+SDK needs to be installed.)</li>
+<li>The analysed Symbian SDKs must include epoc32\tools\elftran.exe executable which is used
+  to extract dependency data from the component binaries in Symbian OS 9.x targets and petran.exe
+  to extract data for Symbian OS versions prior to 9.x.
+</li>
+<li><i>Dumpsis.exe</i> executable is needed for decompiling SIS files. It
+is available from Symbian 9.2 onwards.  However, this executable also works
+in 9.1 SDKs and can be copied to the epoc32\tools\ directory from a 9.2 SDK's
+directory.</li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+<li>The official Carbide.c++ version for this tool is v2.0 (which has been
+used for testing). The tool should otherwise work on top of v1.3, except for
+the <b>Viewing method call locations</b> functionality that works only on
+top of v2.0.</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>
+<ul>
+<li>Method <span class="code">lastModified()</span> of Java class file does
+not always give  correct results. For details, see <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4860999">
+http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4860999</a>. Therefore,
+cache update check ignores all the time stamp differences that are exactly
+one hour greater than time stamps stored in the Dependency Explorer cache
+file. After the enhancement of allowing two second tolerance in component
+modification timestamps, the timestamp differences between 59 minutes 58 seconds
+and 1 hour 2 seconds are ignored when checking the need for a cache update.
+</li>
+<li>'SIS file analysis' feature cannot be used against targets that do not have any binaries 
+  i.e. in addition for having a SIS file one must have a target that has at least a single 
+  built component. Workaround for the issue is to build a single component e.g. into armv5 target, 
+  after which it is possible to run analysis against SIS file. It is possible to select any target 
+  type (armv5, gcce, ...) along with SIS file because it cannot be checked beforehand that 
+  the selected target is the same that is used to build SIS file from (which is of course
+  what is wanted/needed for correct dependency analysis).</li>
+<li><b>Show Source File</b> functionality fails in case signature keyword order differs between cache data and map file data.
+    For instance, if method signature in cache file is of format <code>Math::Frac(double&, double const&)</code> and signature
+    in map file is of format <code>Math::Frac(double&, const double&)</code> matching function is not found from map file because
+    the different keyword ordering. There is no workaround for this issue.
+</li>
+</ul>
+
+<h3>Version history</h3>
+<h5>Version 2.4.2 &ndash; 26th August 2009 and Version 2.4.3 &ndash; 14th October 2009</h5>
+<ul>
+<li>Fix: If you change the SDK and the build target selection when you already have a component under analysis,
+  and you select a component that has the exactly same name than the previously analysed component, the dependency 
+  data is not reloaded for the new component. However, when you click nodes in the component tree, you will get function and
+  component property data from the new SDK. The workaround is to select another component, and then reselect
+  the component that was under analysis previously.</li>
+<li>Fix: If you in the <b>Add SIS files</b> dialog add two or more SIS files that contain components with exactly the same name, the loading
+  of cache data fails right after you select a component under analysis. This happens because all SIS files are currently considered as a single build target that cannot have duplicate components. The workaround is to separately analyse those SIS files that have overlapping components.
+</li>
+</ul>  
+
+
+<h5>Version 2.4.0 &ndash; 29th April 2009 and Version 2.4.1 &ndash; 18th June 2009</h5>
+<ul>
+<li>Feature: New <b>Build Target Selection</b> wizard page</li> 
+	<ul>
+	<li>offers now more information on the shown targets (type, component count, and status text),</li>
+	<li>filters out by default unusable targets (non-supported and empty ones),</li>
+	<li>offers separate modes for selecting either Release (urel) or Debug targets (udeb), preventing mixing of them unintentionally, and</li>
+	<li>offers access to the Add SIS files dialog instead of having a separate wizard page for adding SIS files.</li>
+	</ul>
+<li>Feature: New <b>Add SIS files</b> dialog enables adding SIS files from multiple different folder locations</li>.
+<li>Change: <b>Component Selection</b> wizard page enhancements</li>
+	<ul>
+	<li>the page contains now more data columns (name, target, and data modified), and</li>
+	<li>the search field does "contains string" search instead of earlier "starts with" search.</li>
+	</ul>
+<li>Change: SDK Selection wizard usability has been improved by splitting it into two separate pages: </b>SDK Selection</b> and <b>Build Target Selection</b> wizard pages.</li>	
+<li>Change: Other enhancements</li>
+	<ul>
+	<li>Toolbar and menu actions are now disabled whenever they cannot be used (except for the Update cache action in which disabling is not regarded as a viable solution because it requires hard disk polling).</li>
+    <li>The <b>Cache Generation Options</b> wizard page shows now version number for the currently used RVCT toolchain.</li> 
+	<li>The executable <i>elftran.exe</i> is now used for Symbian OS 9.x targets for dumping dependency data from binaries.</li>
+	<li>If after using the <b>Locating components</b> feature it is possible to resolve earlier missing imported function names from exported functions data, it is done automatically.</li>
+	<li>The name column sort in the <b>Component List</b> view (opened after an Is Used By query) ignores case, that is, now all components starting with the same letter are listed one after the other regardless of the case.</li> 	  
+	</ul>	
+<li>Fix: Bundled a new <i>appdep.exe</i> command-line program with the following fixes
+	<ul>
+	<li><i>appdep.exe</i> uses now <i>petran.exe</i> for GCC toolchain targets and <i>elftran.exe</i> for other targets.</li>
+	<li><i>appdep.exe</i> parses now function data correctly also from libraries containing the hyphen character (-) in the library name (e.g. from library named <i>libdbus-utils{000a0000}[20010154].dll</i>).</li>
+	</ul> 
+<li>Fix: Fixed the issue causing the "Cache data re-load failed" error message. Also improved error logging in case a similar error occurs later on in a newer SDK environment not yet foreseen.</li>  
+</ul>  
+
+
+<h5>Version 2.3.0 &ndash; 20th February 2009</h5>
+<ul>
+<li>Change: Double-click in 'Component List' view sets selected component as new root component if 'Don't ask' checkbox
+  is selected under 'Confirm set as new root action' group from preferences. Otherwise, it is confirmed if a user
+  really wants to set clicked component as new root component.</li>
+<li>Fix: Fixed the following bug in Component Selection dialog: "When selecting component for the first time, if one scrolls down and tries 
+  to select a component, what actually gets selected is the component that would have got selected without scrolling down".   
+  The original behavior was implemented because the original wish was to be able to move between fields with tab, and after focus 
+  is moved to component list, it would be possible to "Finish" the component selection by just pressing enter key. After the bug fix
+  this is no more possible. The workaround to mimic this with fixed implementation: start dialog, press tab key for activating
+  first component, select right arrow key for component selection, and press enter key to finish the dialog.</li>
+<li>Fix: Fixed the following issue: "'Show Source File' functionality fails when multiple targets are selected simultaneously 
+  (e.g. when armv5+armv6 urel targets are selected)." Also other show source functionality related actions work
+  now also when multiple targets are selected.</li>
+</ul>  
+
+
+<h5>Version 2.2.2 &ndash; 24th October 2008, Version 2.2.3 &ndash; 7th January 2009, and Version 2.2.4 &ndash; 15th January 2009</h5>
+<ul>
+<li>Change: In <b>Viewing source file</b> feature added better heuristic for finding source file and correct function 
+  location from the opened source file.</li>
+</ul>
+
+<h5>Version 2.2.1 &ndash; 11th September 2008</h5>
+<ul>
+<li>Feature: <b>Searching for components and functions</b> feature enables searching
+of components, imported functions and exported functions from the currently
+selected target platform cache(s). Search results can be copied to clipboard
+for further processing, and double-clicking of a search result item opens
+the corresponding component as a new root component.</li>
+<li>Feature: <b>Locating components</b> feature enables showing also component tree
+for the components that are dependent upon based on generic component name
+(for example <i>hal.dll</i>). Those components do not exist as such in cache
+data but may have multiple concrete implementations (for example <i>hal.dll
+</i> has multiple implementations <i>_h4hrp_hal.dll, _template_hal.dll, _h2_hal.dl
+</i>l etc.). There are two options for locating components:
+	<ul>
+	<li>Locating manually from component list by selecting <b>Locate Component...</b> action from context menu (user-bind)</li>
+	<li>Defining known component prefixes (for example <i>_h4hrp_</i>) in the preferences page and correct component instances are located automatically (auto-bind).</li>
+	</ul>
+</li>
+<li>Feature: <b>Viewing source file</b> feature adds an action to Imported and Exported
+Functions tabs. The action opens up for viewing the source file that implements
+the currently selected function.</li>
+<li>Feature: <b>Viewing source file in project</b> feature adds an action to Imported
+and Exported Functions tabs. The action opens up for viewing the project and
+source file that implements the currently selected function.</li>
+<li>Feature: <b>Viewing method call locations</b> feature adds an action to Imported
+Functions tab. The action opens up the project for the component that uses
+the currently selected function, and searches for all instances where the
+selected function is called from the component.</li>
+<li>Change: Building of cache indices is a bit faster than in previous releases.</li>
+<li>Change: New data model for storing and handling cache data offers faster 'Is Used
+By...' queries than in previous releases.</li>
+</ul>
+
+
+<h5>Version 2.1.7 &ndash; 29th April 2008</h5>
+<ul>
+<li>Feature: Added support for selecting and using multiple target platforms. </li>
+<li>Feature: Added the <b>Find</b> dialog that enables finding components from the dependency tree based on a given name (or part of the component name). </li>
+<li>Feature: Added the possibility to analyse components from Symbian OS Installation (SIS) files together with an existing target platform. </li>
+<li>Feature: Added <b>Update Cache</b> action that enables quick cache update for the currently selected target platforms.</li>
+<li>Change: Allowing two second tolerance in component modification times before a
+component is regarded as changed and therefore, the cache file needs to be
+updated. This is because if the cache file has been generated with a different
+operating system, the time stamps may not be exactly same.</li>
+<li>Doc: Added support for context-sensitive help.</li>
+</ul>
+
+<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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/analyse_component.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,57 @@
+<!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>Analysing components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Analysing components</h2>
+<p>To get started with the analysis, select a component to view its dependency information. All the components that the selected component is using are displayed in the Dependency Explorer view.</p>
+<p><img src="screenshots/shot_depview.png"></p>
+<ul>
+<li><img src="screenshots/bin_obj.png"> When you double-click a component node that has children, the hierarchy of that node only is displayed. </li>
+<li><img src="screenshots/bin_obj_link.png"> When you double-click a component link node, the component node that the link node refers to is highlighted on the main hierarchy. </li>
+</ul>
+
+<h3>Is Used By...<a name="usedby"></a></h3>
+<p>To analyse which components are using the selected component or function, do the following: </p>
+<ol>
+<li>Right-click the component or function. </li>
+<li>From the pop-up menu, select <b>Is Used By...</b>.</li>
+<li>When the analysis is finished, the results are displayed on the <b>Component List</b> tab.
+<p><img src="screenshots\sample_used_by_components.png"></p></li>
+<li>(Optional) To generate and save the findings as an HTML report, right-click anywhere on the tab and select <b>Export report...</b> For more information on reports, see <a href="../tasks/export_report.htm">Exporting the report</a>.</li>
+</ol>
+
+<h3>Changing the component to be analysed</h3>
+<p>To change the component you want to analyse, do any of the following: </p>
+<ul>
+<li>Right-click a node in the hierarchy and select <b>Set As New Root Component</b>. </li>
+<li>Double-click the root component (for example, <i>notepad.exe</i> in the above example), and choose a different one in the <b>Component Selection</b> page.</li>
+<li>Click the <b>Select a New Root Component</b> button on the toolbar and choose a component in the <b>Component Selection</b> page. </li>
+</ul>
+<p><b>Tip:</b> Dependency Explorer notifies you if the cache for your current build target has become outdated since it was first generated. You can update it by clicking <b>Yes</b> in the confirmation dialog, or update it at any time by clicking the <b>Update cache</b> button on the toolbar. The cache is updated with the default options.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="check_comp_prop.htm">Checking component properties</a></li>
+	<li><a href="check_imp_func.htm">Checking imported functions</a></li>
+	<li><a href="check_exp_func.htm">Checking exported functions</a></li>
+	<li><a href="export_report.htm">Exporting the report</a></li>
+</ul>
+
+<h5>Related references</h5><ul>
+	<li><a href="../references/toolbar.htm">Toolbar</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/component.htm">Component</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_comp_prop.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,39 @@
+<!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>Checking component properties</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Checking component properties</h2>
+<p>The properties displayed for components are: Directory, Filename, Binary format, Secure ID, Vendor ID, UID1, UID2, UID3, Capabilities, Min and Max Heap Size, Stack Size and DLL ref table count.</p>
+
+<p>To view the properties:</p>
+<ol>
+<li>Select the component in the Dependency Explorer view. </li>
+<li>Do either of the following: <ul>
+<li>Click the <b>Component Properties</b> tab. <p><img src="screenshots/shot_properties.png"></p></li>
+<li>Right-click the component and from the pop-up menu, select <b>Properties</b>. The properties are displayed in a separate window:
+<p><img src="screenshots/shot_properties_pop.png"></p></li>
+</ul>
+</li>
+<li>(Optional) To copy the information to clipboard, right-click the properties and select <b>Copy</b>.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/component.htm">Component</a></li>
+	<li><a href="../concepts/properties.htm">Properties</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="export_report.htm">Exporting the report</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_exp_func.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Checking exported functions</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Checking exported functions</h2>
+<p>You can view which functions have been exported from the component. The information about exported functions consists of an ordinal number and a name. </p>
+<p>To view the exported functions of a component:</p>
+<ol>
+<li>Select the component in the Dependency Explorer view.  </li>
+<li>Click the <b>Exported Functions</b> tab. <p>The functions provided by the component are listed in the tab.</p>
+<p><img src="screenshots/shot_export_functions.png"></p></li>
+<li>(Optional) To copy the information to the clipboard, right-click anywhere on the list and select <b>Copy</b>.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/function.htm">Function</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="export_report.htm">Exporting the report</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/check_imp_func.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Checking imported functions</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Checking imported functions</h2> 
+
+<p>You can view which functions have been imported to the component. The information about imported functions consists of an ordinal number, a name and an offset value.</p>
+<p>To view the imported functions of a component:</p>
+<ol>
+<li>Select the component in the Dependency Explorer view.  </li>
+<li>Click the <b>Imported Functions</b> tab. <p>The functions used by the component are listed in the tab.</p>
+<p><img src="screenshots/shot_import_functions.png"></p></li>
+<li>(Optional) To copy the information to clipboard, right-click anywhere on the list and select <b>Copy</b>.</li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/function.htm">Function</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="export_report.htm">Exporting the report</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/export_report.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Exporting the report</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Exporting the report</h2>
+<p>Dependency Explorer offers a functionality to share the results of the analysis by exporting them as an HTML file. The exported report shows the structure of the component tree and lists the properties information, as well as the exported and imported functions of all the components.</p>
+<p>To export a report:</p>
+<ol>
+<li>Right-click a component and from the pop-up menu, select <b>Export report...</b>
+<p>The content of the report is generated based on the component that was clicked. If you selected the root component, the report will include the entire tree hierarchy. If the selected component was from a lower level, the report will only include the component tree hierarchy from that component downwards.</p></li>
+<li>In the <b>Export Report</b> dialog, specify the location for the report and click <b>Save</b>. </li>
+</ol>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/function.htm">Function</a></li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/analyse_component.htm">Analysing 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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/locate_component.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Locating components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Locating components</h2>
+<p>To locate components:</p>
+<ol>
+<li>Right-click a component in the component tree, (for example <i>hal.dll</i>) from <b>Select an SDK > arm5 Release > inetprotutil.dll > bafl.dll > hal.dll</b></li>
+<li>Select <b>Locate Component...</b> The <b>Select concrete component</b> dialog opens showing all alternatives that contain the<i> hal.dll</i> substring:
+<ul>
+	<li>_h2_hal.dll</li>
+	<li>_h4hrp_hal.dll</li>
+	<li>_integrator_cm1136_hal.dll</li>
+	<li>_template_hal.dll</li>
+</ul>
+</li>
+<li> Select the desired concrete component for <i>hal.dll</i>, and click <b>OK</b>. The component you selected, appears in the component tree. Now you can analyse the component in more detail. For more information, see <a href="../tasks/analyse_component.htm">Analysing components</a>.<p>If you are familiar with prefixes, you can use the <b>Open prefix preferences</b> option. Adding a prefix helps you in locating components without manual searching.</p></li>
+<li>Click the <b>Open prefix preferences</b> link if you want to define a prefix or prefixes for the component.</li>
+<li><b>Add</b> or <b>Remove</b> a prefix in the <b>Component prefix search order</b> box, and define the search order using the <b>Up</b> and <b>Down</b> buttons.</li>
+<li><p><b>Note!</b> You can change the prefix preferences. For instructions, see <a href="..\tasks\setting_preferences.htm">Setting preferences</a>.</p></li>
+<li>After setting the prefix preference, click <b>Apply > OK.</b></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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/manage_platforms.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Managing SDKs</title>
+<link href="../../book.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Managing SDKs</h2>
+<p>Before you can start analysing components in Dependency Explorer, install the necessary SDKs to Carbide.c++. For guidelines on what to install, see the recommendations in <a href="../concepts/platform.htm">Software Development Kit (SDK)</a>.</p>
+
+<ul>
+<li>To install SDKs, go to the <b>Window > Preferences > Carbide.c++ > SDK Preferences > Add New SDK</b> menu, and select the item to be added. </li>
+<li>To view the installed SDKs, double-click the root node in the Dependency Explorer view:
+<p><img src="screenshots\shot_doubleclick.png"></p>
+<p>The available items are listed in the <b>SDK Selection</b> wizard:</p>
+<p><img src="screenshots\shot_platform_select.png"></p></li>
+<li>To change the SDK being viewed at any time, click <img src="screenshots/shot_reselect_2.png"> on the Dependency Explorer toolbar.</li>
+</ul>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="selecting_platform.htm">Selecting SDKs</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/platform.htm">Software Development Kit (SDK)</a></li>
+	<li><a href="../appendix.htm">Appendix: Static Dependencies to Dynamic Data</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+Thumbs.db
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/add_sis_files_1.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/bin_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/bin_obj_link.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/build_target_selection.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/cache_generation.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/expand_collapse_context_menu.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/expand_collapse_toolbar.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/find_components.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/navigation_btns_context_menu.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/navigation_btns_toolbar.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_component_analysis.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_red_green.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sample_used_by_components.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/sdk_sel_wizard.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/select_new_root.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_change_platform.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_component_select.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_depview.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_doubleclick.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_export_functions.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_import_functions.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_platform_select.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_properties.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_properties_pop.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_1.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_2.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_reselect_3.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_root_comp.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/screenshots/shot_used_by.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/search.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Searching for components and functions</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Searching for components and functions</h2>
+<p>The <b>Search...</b> function can be used for searching for components, imported functions and exported functions from a selected SDK. The default search scope used for the search dialog is based on the view from which the search action is started.</p>
+<p>To search components and functions:</p>
+<ol>
+<li>Right-click a component in the component tree or an imported or exported function in the <b>Imported Functions</b> or <b>Exported Functions</b> tab.</li>
+<li>Write a search string in the<b> Search string</b> field.</li>
+<li>Select the search target: (<b>Components</b>, <b>Imported functions</b>, or <b>Exported functions</b>).</li>
+<li>Define the match types:
+<ul>
+<li><b>Contains</b>: Matches when the search string is included in the object name.</li>
+<li><b>Starts With</b>: Matches when the object name starts with the search string.</li>
+<li><b>Ends With</b>: Matches when the object name ends with the search string.</li>
+<li><b>Exact Match</b>: Matches when the object name and the search string equals.</li>
+<li><b>Regular Expression</b>: Matches when the search string as regular expression matches with the object name.</li>
+</ul>
+<p><b>Note!</b> The <b>Case sensitive</b> check box can be used for other match types except for the <b>Regular Expression</b> type.</p>
+<p><b>Note!</b> For <b>Imported</b> and <b>Exported Functions'</b> <b>Contains</b> and <b>Regular Expression</b> search types, use the full function name, <i>prefix::baseName(parameterlist)</i> for matching, but for other search types, use the function's base name only. For example, the full method name is <i>CEikAppUi::CreateFileL(TDesC16 const&amp;)</i>, but the function base name is <i>CreateFileL</i>.</p></li>
+<li>Click <b>Search</b>.</li>
+<li>Double-click a search result from the list, and it appears in the corresponding component, imported function, or exported function in the main view. If the component is not already existing in component tree, it is opened as a root component. If you check the <b>Confirm set as new root in Search dialog</b> check box, the component is automatically set as a new root without confirmation, and the confirmation is not asked anymore. Note that you can also change the preferences. For instructions on changing preferences, see <a href="..\tasks\setting_preferences.htm">Setting preferences</a>.
+<p>Now you can analyse the component or function in more detail. For more information, see <a href="..\tasks\analyse_component.htm">Analysing components</a>.</p></li>
+<li>(Optional) You can copy the search result by right-clicking it and selecting <b>Copy</b>.</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/search_comp.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,43 @@
+<!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>Finding components</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Finding components</h2>
+<p>You can search for currently selected components in the Dependency Explorer main view. Note that <b>Find Components</b> can be used only in the component tree.</p>
+<p>If you want to search for components, imported functions and/or exported functions from a selected SDK, see <a href="..\tasks\search.htm">Searching for components and functions</a>.</p>
+
+<ol>
+<li>To find components from component tree, do any of the following:
+<ul>
+<li>Right-click a component node and select <b>Find...</b></li>
+<li>Click the <b>Find</b> button on the Dependency Explorer toolbar. </li>
+<li>Press CTRL + F.</li>
+</ul>
+<p>The <b>Find Component</b> dialog is displayed.</p>
+<p><img src="screenshots\find_components.png"></p></li>
+<li>In the dialog, enter the search criteria for a component.
+<ul>
+<li>Search words are case-insensitive. <p><b>Example:</b> <i>cone</i>, <i>Cone</i> and <i>CONE</i> all return the same results. </p></li>
+<li>The search will find all components that contain the search criteria.
+<p><b>Example:</b> <i>co</i> returns <i>cone.dll</i>, <i>eikcore.dll</i>, <i>eikcoctl.dll</i> and so on.</p></li>
+<li>Wildcard characters (such as the asterisk *) are not needed. </li>
+</ul></li>
+<li>Click <b>Find Next</b>.<p>The first match that meets the criteria is highlighted on the component hierarchy, and its usage details are displayed on the <b>Imported Functions</b>, <b>Exported Functions</b> and <b>Component Properties</b> tabs. </p></li>
+</ol>
+
+<p>To continue looking for more components from the lower levels of the hierarchy, click <b>Find Next</b> again. A message is displayed when there are no more results to show.</p>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/component.htm">Component</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/selecting_platform.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,127 @@
+<!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>Selecting SDKs</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Selecting SDKs</h2>    
+<p>Before you start, make sure you have installed the necessary Software Development Kits (SDKs) to Carbide.c++. For instructions, see <a href="../tasks/manage_platforms.htm">Managing SDKs</a>.</p>
+<p>To select SDKs, target builds, SIS files, and components for analysis, do the following:</p>
+<ol>
+	<li><a href="#select_sdk">Select an SDK and build targets</a>.</li>
+	<li>(Optional) <a href="#add_sis">Add SIS files</a>.</li>
+	<li>(Optional) <a href="#generate_cache">Generate cache</a>.</li>
+	<li><a href="#select_components">Select components</a>.</li>
+</ol>
+
+
+<h3 id="select_sdk">Select an SDK and build targets</h3>
+<ol>
+<li>Double-click the root component icon to select the SDK whose components you want to analyse.
+<p><img src="screenshots\shot_doubleclick.png"></p></li>
+<li>The <b>SDK Selection</b> wizard page is displayed, listing the Symbian OS SDKs currently installed to Carbide.c++. Select an SDK and click <b>Next</b>.
+<p><img src="screenshots\sdk_sel_wizard.png"></p></li>
+<li><a name="build_target_selection"></a>The <b>Build Target Selection</b> wizard page is displayed, listing the build targets available for the selected SDK. Select the targets you want to view. You can sort the list of build targets by target type, component count, or status.
+<p>You can switch between the debug and release targets with the <b>Show debug build targets instead of release targets</b> option, and you can filter out empty items with the <b>Show only supported and non-empty targets</b> option. You can also add SIS files by clicking <b>Add SIS files</b>. For more information, see <a href="#add_sis">(Optional) Add SIS files</a>.<p>
+<p><b>Note:</b> A cache is a list of components included in a particular SDK. The coloured lights in the <b>Status</b> column indicate the cache status:</p>
+<ul>
+<li><b>Red</b> means that this build target cannot be selected because the target is empty or it is not supported. If you select any targets with the red light, the wizard cannot continue.</li>
+<li><b>Yellow</b> means that you need to generate or update a cache for this build target.</li>
+<li><b>Green</b> means that the cache is ready.</li>
+</ul>
+<p><img src="screenshots\build_target_selection.png"></p>
+</li>
+</ol>
+<p>After selecting an SDK and build targets, do any of the following, depending on the case:</p>
+<ul>
+<li>To add SIS files, click <b>Add SIS Files</b>. See <a href="#add_sis">(Optional) Add SIS files</a>.</li>
+<li>If caches have already been generated for all of the selected build targets, click <b>Next</b> to proceed to the <b>Component Selection</b>. See <a href="#select_components">Select components</a>.</li>
+<li>To generate or update a cache with the default settings, click <b>Finish</b> to generate or update a cache and then proceed to the <b>Component Selection</b>. See <a href="#select_components">Select components</a>.</li>
+<li>To modify the cache generation settings, click <b>Next</b> to proceed to the <b>Cache Generation</b>. See <a href="#generate_cache">Generate cache</a>.</li>
+</ul>
+
+
+<h3 id="add_sis">(Optional) Add SIS files</h3>
+<p>Symbian OS Installation Files (SIS) can be analysed in Dependency Explorer together with SDK components. For more information, see <a href="../concepts/component.htm#3rd_party">Third-party and in-house components</a>.</p>
+
+<p>The following SIS files are supported:</p>
+<ul>
+	<li>Files created with an SDK built on top of Symbian OS 9.x.</li>
+	<li>Files created for S60 3rd Edition Feature Pack 1 and onwards.</li>
+</ul>
+
+<p>To add a SIS file for analysis, do the following: </p>
+<ol>
+<li>Click <b>Add SIS files</b> in the <b><a href="#build_target_selection">Build Target Selection</a></b> page of the SDK Selection wizard. The Add SIS file dialog is displayed.</li>
+<li>To locate the SIS files from your computer, click <b>Add</b> and select one or more files to add. </li>
+<li>To add the files to the wizard, click <b>Open</b>.
+<p>Supported files are listed on the page, as shown in the example below:</p>
+<p><img src="screenshots\add_sis_files_1.png"></p></li>
+<li>Click <b>OK</b>. If your selection is not valid, a notification is displayed. For help in troubleshooting, see <a href="../references/warnings_and_errors.htm">Messages and notifications </a>.</li>
+</ol>
+
+<p>After adding SIS files, do any of the following, depending on the case:</p>
+<ul>
+<li>If caches have already been generated for all of the selected build targets, click <b>Next</b> to proceed to the <b>Component Selection</b>. See <a href="#select_components">Select components</a>.</li>
+<li>To generate or update a cache with the default settings, click <b>Finish</b> to generate or update a cache and then proceed to the <b>Component Selection</b>. See <a href="#select_components">Select components</a>.</li>
+<li>To modify the cache generation settings, click <b>Next</b> to proceed to the <b>Cache Generation</b>. See <a href="#generate_cache">Generate cache</a>.</li>
+</ul>
+
+
+<h3 id="generate_cache">(Optional) Generate cache</h3>
+<p>If you added SIS files, note that during the cache generation, Dependency Explorer checks that all the needed files for SIS handling are available. If the process is stopped, check the console log for errors and refer to <a href="../references/warnings_and_errors.htm">Messages and notifications</a> for help.</p>
+
+<p>To generate cache, do the following:</p>
+<ol>
+<li><a name="cache_gen_options"></a>If you selected to change the cache generation options in the <b><a href="#build_target_selection">Build Target Selection</a></b> page of the SDK Selection wizard, the <b>Cache Generation</b> page of the wizard is displayed. Modify the following fields as needed and click <b>Finish</b>.
+<ul>
+<li><b>Toolchain</b> - Specifies the compiler tool set that is used to read exports from import libraries in the release. Normally, the default value (CSL Arm Toolchain) should be used but this can be changed in case of a problem.
+<p>Note that using the RealView Compilation Tools (RVCT) toolchain to read .dso files may be slow, due to RVCT licence server checks with each file.</p></li>
+<li><b>Import library type</b> - Specifies which types of import libraries within the release are used to get exports.
+<ul>
+<li>Dynamic shared object (.dso) - A shared import library type which also contains information about dynamic dependencies.</li>
+<li>Import library (.lib) - Regular type of import library. This should only be used in case of problems or if dynamic shared objects (.dso) are not available.</li>
+</ul></li>
+</ul>
+<p><img src="screenshots\cache_generation.png"></p>
+</li>
+<li>Wait until Dependency Explorer generates the cache for the components. Note that this may take several minutes.</li>
+</ol>
+<p>After generating caches, click <b>Yes</b> to proceed to <b>Component Selection</b>. See <a href="#select_components.htm">Select components</a>.</p>
+
+
+<h3 id="select_components">Select components</h3>
+<p>Before you can select components for analysis, the necessary SDKs and SIS files must be installed, and caches generated for them. For details, see <a href="#select_sdk">Select an SDK and build targets</a>, <a href="#add_sis">Add SIS files</a>, and <a href="#generate_cache">Generate cache</a>.</p>
+
+<p>To select components, do the following:</p>
+<ol>
+<li>In the <b>Component Selection</b> page, select one or more components for analysis. You can sort the list by name, build target, and modification date and time.
+<p>To find the desired component, either browse the list manually or enter a substring of the component name in the <b>Search</b> field.</p>
+<p><img src="screenshots\shot_component_select.png"></p></li>
+<li>(Optional) To view components that belong to SIS files, select the <b>Show only components from SIS files</b> check box.</li>
+<li>Click <b>Finish</b>. <p>The dependencies of the component are listed in the Dependency Explorer view.</p></li>
+</ol>
+
+<p>You can now analyse the currently listed components in more detail. See <a href="../tasks/analyse_component.htm">Analysing components</a>.</p>
+<p><b>Tip:</b> Dependency Explorer notifies you if the cache for your current build target selection has become outdated since it was first generated. You can update it by clicking <b>Yes</b> in the confirmation dialog, or update it at any time by clicking the <b>Update cache</b> button on the toolbar. The cache is updated with default options.</p>
+
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/analyse_component.htm">Analysing components</a></li>
+</ul>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../concepts/platform.htm">Software Development Kit (SDK)</a></li>
+	<li><a href="../appendix.htm">Appendix: Static Dependencies to Dynamic Data</a></li>
+	<li><a href="../concepts/component.htm">Component</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/setting_preferences.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Setting preferences</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body><h2>Setting preferences</h2><p>To set the Dependency Explorer preferences:
+</p><ol>
+<li>Select <b>Window > Preferences... > Carbide Extensions > Dependency Explorer
+Preferences</b>.</li>
+<li>Use the <b>Add</b> or <b>Remove</b> button in defining the prefix in the <b>
+Component prefix search order</b> box, and define the search order using the <b>
+Up</b> and <b>Down</b> buttons.</li>
+<li>If you check the <b>Confirm set as new root action</b> check
+box, the component is automatically set as a new root without confirmation
+whenever the set as new root action is invoked due to double-click event,
+and the confirmation is not asked anymore.</li>
+<li>After setting the prefix preferences, click <b>Apply > OK.</b></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>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/tasks.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+<!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>Tasks</title>
+<link rel="StyleSheet" href="../../book.css" type="text/css"/>
+</head>
+<body bgcolor="#FFFFFF">
+<h2>Tasks</h2>
+<p>Entries in this section tell you how to perform the tasks available in Dependency Explorer.</p>
+<p>Topics in this section include:</p>
+<ul>
+	<li><a href="manage_platforms.htm">Managing SDKs</a></li>
+	<li><a href="selecting_platform.htm">Selecting SDKs</a></li>
+	<li><a href="setting_preferences.htm">Setting preferences</a></li>
+	<li><a href="locate_component.htm">Locating components</a></li>
+	<li><a href="analyse_component.htm">Analysing components</a></li>
+	<li><a href="check_comp_prop.htm">Checking component properties</a></li>
+	<li><a href="check_imp_func.htm">Checking imported functions</a></li>
+	<li><a href="check_exp_func.htm">Checking exported functions</a></li>        	
+	<li><a href="search_comp.htm">Finding components</a></li>
+	<li><a href="search.htm">Searching for components and functions</a></li>
+	<li><a href="view_source.htm">Viewing source files</a></li>
+	<li><a href="view_source_file_in_project.htm">Viewing source file in project</a></li>
+	<li><a href="view_method_call_locations.htm">Viewing method call locations</a></li>
+	<li><a href="export_report.htm">Exporting the report</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_method_call_locations.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Viewing method call locations</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Viewing method call locations</h2>
+<p>With the <b>Show Method Call Locations</b> function, you can open the source file <i>(*.cpp)</i> locations in which the selected method is called in the using DLL/EXE, that is, the parent component in the component tree.</p>
+<p>To view method call locations:</p>
+<ol>
+<li>In the <b>Dependency Explorer</b> view, select <b>Imported Functions</b>.</li>
+<li>Right-click the desired method, and select <b>Show Method Call Locations.</b> The <b>Search</b> view opens.</li>
+<li>Double-click a method in the <b>Search</b> view. 
+<p>References to the method you chose, are highlighted in the editor area.</p>
+<p>You can use the toolbar in <b>Search</b> view for checking the next and previous matches, removing all or selected matches, re-run the current search, view previous searches, and pin the search view.</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_source.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Viewing source files</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Viewing source files</h2>
+<p>The <b>Show Source File</b> function can be used for opening a header/source code file to the Carbide.c++ editor area and locating the method name from the source file.</p>
+<p>Show Source File adds an action to <b>Imported</b> and <b>Exported Functions</b> tabs. The action opens up for viewing the source file that implements the currently selected function.</p><p>To view source files:</p>
+<ol>
+<li>Right-click a method in the <b>Imported Functions</b> or <b>Exported Functions</b> tab, and select <b>Show Source File</b>.</li>
+<li>See the Carbide.c++ editor area for the method names.<p>You can see the related method names in the <b>Outline</b> view.</p></li>
+<li>By right-clicking a method name in the <b>Outline</b> view, you can:
+	<ul>
+		<li>Open Declaration</li>
+		<li>Open Type Hierarchy</li>
+		<li>Open Call Hierarchy</li>
+		<li>Open Include Browser</li>
+		<li>Refactor
+			<ul>
+				<li>Rename...</li>
+				<li>Hide Method...</li>
+			</ul>
+		</li>
+		<li>Declarations
+			<ul>
+				<li>Workspace</li>
+				<li>Project</li>
+				<li>Working Set...</li>
+			</ul>
+		</li>
+		<li>References
+			<ul>
+				<li>Workspace</li>
+				<li>Project</li>
+				<li>Working Set...</li>
+			</ul>
+		</li>
+		<li>Toggle Breakpoint</li>
+	</ul>
+</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/view_source_file_in_project.htm">Viewing source file in project</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/tasks/view_source_file_in_project.htm	Sat Jan 09 10:04:11 2010 +0530
@@ -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>Viewing source file in project</title>
+<link href="../../book.css" type="text/css" rel="stylesheet"></head>
+<body>
+
+<h2>Viewing source file in project</h2>
+<p>You can open a header or source code file belonging to a particular project in the Carbide.c++ workspace, and locate the method name from the source file.</p>
+<p>To view source file in project:</p>
+<ol>
+<li>Right-click a method in the <b>Imported Functions</b> or <b>Exported Functions</b> tab, and select <b>Show Source File In Project.</b>
+<p>Dependency Explorer searches the project which the source file in question belongs to, and opens the project automatically in Carbide.c++ workspace based on the <i>bld.inf</i> file. The source file in question opens from this particular project.</p>
+<p>The related method names are displayed in the <b>Outline</b> view.</p></li>
+<li>You can edit the file belonging to a project, and save the changes.</li>
+</ol>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/view_source.htm">Viewing source files</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/html/toc.html	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,58 @@
+<!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>
+
+<h2>Dependency Explorer Online Help</h2>
+
+<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></p>
+<p><a href="concepts/concepts.htm">Concepts</a></p>
+<ul>
+	<li><a href="concepts/platform.htm">Software Development Kit (SDK)</a></li>
+	<li><a href="concepts/component.htm">Component</a></li>
+	<li><a href="concepts/function.htm">Function</a></li>
+	<li><a href="concepts/properties.htm">Properties</a></li>
+</ul>
+<p></p>
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/manage_platforms.htm">Managing SDKs</a></li>
+	<li><a href="tasks/selecting_platform.htm">Selecting SDKs</a></li>
+	<li><a href="tasks/setting_preferences.htm">Setting preferences</a></li>
+	<li><a href="tasks/locate_component.htm">Locating components</a></li>
+	<li><a href="tasks/analyse_component.htm">Analysing components</a></li>
+	<li><a href="tasks/check_comp_prop.htm">Checking component properties</a></li>
+	<li><a href="tasks/check_imp_func.htm">Checking imported functions</a></li>
+	<li><a href="tasks/check_exp_func.htm">Checking exported functions</a></li>
+	<li><a href="tasks/search_comp.htm">Finding components</a></li>
+	<li><a href="tasks/search.htm">Searching for components and functions</a></li>
+	<li><a href="tasks/view_source.htm">Viewing source files</a></li>
+	<li><a href="tasks/view_source_file_in_project.htm">Viewing source file in project</a></li>
+	<li><a href="tasks/view_method_call_locations.htm">Viewing method call locations</a></li>
+	<li><a href="tasks/export_report.htm">Exporting the report</a></li>
+</ul>
+<p></p>
+<p><a href="references/references.htm">References</a></p>
+<ul>
+	<li><a href="references/warnings_and_errors.htm">Messages and notifications</a></li>
+	<li><a href="references/toolbar.htm">Toolbar</a></li>
+</ul>
+<p></p>
+<p><a href="appendix.htm">Appendix: Static Dependencies to Dynamic Data</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. 
+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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/index.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,222 @@
+<?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 third party components" >
+		<topic href="html/concepts/component.htm" />
+	</entry>
+
+	<entry keyword="adding SIS files" >
+		<topic href="html/tasks/selecting_platform.htm#add_sis" />
+	</entry>
+
+	<entry keyword="analysing components" >
+		<topic href="html/tasks/analyse_component.htm" />
+	</entry>
+	
+	<!-- BBBBBBBB -->
+	
+	<!-- CCCCCCCC -->	
+	
+	<entry keyword="cache generation options" >
+		<topic href="html/tasks/selecting_platform.htm#generate_cache" />
+	</entry>
+
+	<entry keyword="checking component properties" >
+		<topic href="html/tasks/check_comp_prop.htm" />
+	</entry>
+	
+	<entry keyword="checking exported functions" >
+		<topic href="html/tasks/check_exp_func.htm" />
+	</entry>
+
+	<entry keyword="checking imported functions" >
+		<topic href="html/tasks/check_imp_func.htm" />
+	</entry>
+
+	<entry keyword="component navigation" >
+		<topic href="html/references/toolbar.htm" />
+	</entry>
+	
+	<entry keyword="components, overview" >
+
+		<topic href="html/concepts/component.htm" />
+
+		<entry keyword="analysing" >
+			<topic href="html/tasks/analyse_component.htm" />
+		</entry>
+
+		<entry keyword="searching" >
+			<topic href="html/tasks/search_comp.htm" />
+		</entry>
+
+		<entry keyword="selecting" >
+			<topic href="html/tasks/selecting_platform.htm#select_components.htm" />
+		</entry>
+
+		<entry keyword="properties" >
+			<topic href="html/tasks/check_comp_prop.htm" />
+		</entry>
+
+	</entry>
+	
+	<!-- DDDDDDDD -->	
+
+	<entry keyword="dependency analysis" >
+		<topic href="html/gettingstarted/overview.htm" />
+	</entry> 
+
+	<entry keyword="Dependency Explorer, overview" >
+		<topic href="html/gettingstarted/overview.htm" />
+
+		<entry keyword="basic walk-through" >
+			<topic href="html/gettingstarted/walk_through.htm" />
+		</entry>
+
+	</entry>
+	
+	<!-- EEEEEEEE -->	
+	
+	<entry keyword="exporting reports" >
+		<topic href="html/tasks/export_report.htm" />
+	</entry>
+
+	<entry keyword="exported functions" >
+		<topic href="html/tasks/check_exp_func.htm" />
+	</entry>
+	
+	<!-- FFFFFFFF -->
+	
+	<entry keyword="functions, overview" >
+		<topic href="html/concepts/function.htm" />
+
+		<entry keyword="exported" >
+			<topic href="html/tasks/check_exp_func.htm" />
+		</entry>
+
+		<entry keyword="imported" >
+			<topic href="html/tasks/check_imp_func.htm" />
+		</entry>
+
+	</entry>
+
+	<entry keyword="finding, components" >
+		<topic href="html/tasks/search_comp.htm" />
+	</entry>
+
+	
+	<!-- GGGGGGGG -->	
+
+	<entry keyword="generating cache" >
+		<topic href="html/tasks/selecting_platform.htm#generate_cache" />
+	</entry>
+
+	<!-- HHHHHHHH -->	
+	
+	<!-- IIIIIIII -->
+
+	<entry keyword="imported functions" >
+		<topic href="html/tasks/check_imp_func.htm" />
+	</entry>
+	
+	<!-- JJJJJJJJ -->
+	
+	<!-- KKKKKKKK -->
+	
+	<!-- LLLLLLLL -->
+	
+	<!-- MMMMMMMM -->
+
+	<entry keyword="managing SDKs" >
+		<topic href="html/tasks/manage_platforms.htm" />
+	</entry>
+
+	<!-- NNNNNNNN -->
+	
+	<!-- OOOOOOOO -->
+	
+	<!-- PPPPPPPP -->
+
+	<entry keyword="platforms, cache generation" >
+		<topic href="html/tasks/selecting_platform.htm#generate_cache" />
+	</entry>
+
+	<entry keyword="properties, components" >
+		<topic href="html/concepts/properties.htm" />
+	</entry>
+	
+	<!-- QQQQQQQQ -->
+	
+	<!-- RRRRRRRR -->
+
+	<entry keyword="Release Notes" >
+		<topic href="html/release_notes.htm" />
+	</entry>
+
+	<entry keyword="report, dependencies" >
+		<topic href="html/tasks/export_report.htm" />
+	</entry>
+
+	<!-- SSSSSSSS -->
+
+	<entry keyword="SDKs, overview" >
+		<topic href="html/concepts/platform.htm" />
+		</entry>
+
+	<entry keyword="selecting SDK" >
+		<topic href="html/tasks/selecting_platform.htm" />
+	</entry>
+
+	<entry keyword="searching, components" >
+		<topic href="html/tasks/search_comp.htm" />
+	</entry>
+
+	<entry keyword="SIS files, adding" >
+		<topic href="html/tasks/selecting_platform.htm#add_sis" />
+	</entry>
+
+
+	<!-- TTTTTTTT -->
+
+	<entry keyword="target platforms" >
+		<topic href="html/tasks/selecting_platform.htm" />
+	</entry>
+	
+	<entry keyword="third party components" >
+		<topic href="html/concepts/component.htm" />
+	</entry>
+	
+	<!-- UUUUUUUU -->
+	
+	<!-- VVVVVVVV -->
+	
+	<!-- WWWWWWWW -->
+	
+	<!-- XXXXXXXX -->
+	
+	<!-- YYYYYYYY -->
+	
+	<!-- ZZZZZZZZ -->
+
+</index>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/toc.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Dependency Explorer" 
+	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="Dependency Explorer" 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 label="Getting Started" href="html/gettingstarted/GS_index.htm">
+      <anchor id="gettingstarted"/>
+   </topic>
+   
+   <topic label="Concepts" href="html/concepts/concepts.htm">
+      <anchor id="concepts"/>
+   </topic>
+   
+   <topic label="Tasks" href="html/tasks/tasks.htm" >
+      <anchor id="tasks"/>
+   </topic>
+
+   <topic label="References" href="html/references/references.htm">
+      <anchor id="references"/>
+   </topic>
+  
+   <topic label="Appendix: Static Dependencies to Dynamic Data" href="html/appendix.htm" />
+   <topic label="Legal" href="html/legal.htm" />
+      
+	</topic>
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocconcepts.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts" link_to="toc.xml#concepts" > 
+	<topic label="Software Development Kit (SDK)" href="html/concepts/platform.htm" />
+	<topic label="Component" href="html/concepts/component.htm" />
+	<topic label="Function" href="html/concepts/function.htm" />
+	<topic label="Properties" href="html/concepts/properties.htm" />
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocgettingstarted.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Getting started" link_to="toc.xml#gettingstarted"> 
+	
+	<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/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/tocreferences.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="References" link_to="toc.xml#references" > 
+	<topic label="Messages and notifications" href="html/references/warnings_and_errors.htm" />
+	<topic label="Toolbar" href="html/references/toolbar.htm" />
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep.help/toctasks.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks" link_to="toc.xml#tasks"> 
+	
+	<topic label="Managing SDKs" href="html/tasks/manage_platforms.htm" />
+	<topic label="Selecting SDKs" href="html/tasks/selecting_platform.htm" />
+	<topic label="Setting preferences" href="html/tasks/setting_preferences.htm" />
+	<topic label="Locating components" href="html/tasks/locate_component.htm" />
+	<topic label="Analysing components" href="html/tasks/analyse_component.htm" />
+	<topic label="Checking component properties" href="html/tasks/check_comp_prop.htm" />
+	<topic label="Checking imported functions" href="html/tasks/check_imp_func.htm" />
+	<topic label="Checking exported functions" href="html/tasks/check_exp_func.htm" />
+	<topic label="Finding components" href="html/tasks/search_comp.htm" />
+	<topic label="Searching for components and functions" href="html/tasks/search.htm" />
+	<topic label="Viewing source files" href="html/tasks/view_source.htm" />
+	<topic label="Viewing source file in project" href="html/tasks/view_source_file_in_project.htm" />
+	<topic label="Viewing method call locations" href="html/tasks/view_method_call_locations.htm" />
+	<topic label="Exporting the report" href="html/tasks/export_report.htm" />
+
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.classpath	Sat Jan 09 10:04:11 2010 +0530
@@ -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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.cvsignore	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1 @@
+bin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.project	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.nokia.s60tools.appdep</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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.core.resources.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,4 @@
+#Wed Apr 04 13:57:31 EEST 2007
+eclipse.preferences.version=1
+encoding//src/com/nokia/s60tools/appdep/common/Product.properties=8859_1
+encoding//src/com/nokia/s60tools/appdep/resources/messages.properties=8859_1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.jdt.core.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,7 @@
+#Mon Aug 18 15:46:07 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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/.settings/org.eclipse.jdt.ui.prefs	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,3 @@
+#Thu Sep 28 10:20:18 EEST 2006
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<templates/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/META-INF/MANIFEST.MF	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - Dependency Explorer
+Bundle-SymbolicName: com.nokia.s60tools.appdep; singleton:=true
+Bundle-Version: 2.4.4.qualifier
+Bundle-Activator: com.nokia.s60tools.appdep.plugin.AppDepPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ com.nokia.s60tools.sdk;bundle-version="1.3.1",
+ com.nokia.s60tools.util;bundle-version="1.4.0",
+ com.nokia.s60tools.ui;bundle-version="1.4.0",
+ org.eclipse.ui.ide,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.jface.text,
+ org.eclipse.cdt.core,
+ org.eclipse.cdt.ui,
+ org.eclipse.search
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Nokia
+Export-Package: com.nokia.s60tools.appdep,
+ com.nokia.s60tools.appdep.common,
+ com.nokia.s60tools.appdep.core,
+ com.nokia.s60tools.appdep.core.data,
+ com.nokia.s60tools.appdep.core.job,
+ com.nokia.s60tools.appdep.core.model,
+ com.nokia.s60tools.appdep.exceptions,
+ com.nokia.s60tools.appdep.export,
+ com.nokia.s60tools.appdep.locatecomponent,
+ com.nokia.s60tools.appdep.plugin,
+ com.nokia.s60tools.appdep.search,
+ com.nokia.s60tools.appdep.ui.views.data,
+ com.nokia.s60tools.appdep.util
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/about.html	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,994 @@
+<!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>November 26, 2009</p>
+<h3>Copyright</h3>
+<p>
+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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+</p>
+<p>
+Part of the graphics of the program are from Eclipse 3.1 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 
+</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.1 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>
+<p>Certain software included in this Product is licensed and distributed
+under <i style="">GNU General Public License (GPL),</i> <i>the GNU Lesser
+General Public License (LGPL, a.k.a. the GNU Library General Public License)
+</i> and/ or other copyright licenses, disclaimers and notices containing
+obligation or permission to provide the source code of such software with
+the binary / executable form delivery of the said software. The source code
+is delivered to you in accordance with the referred license terms and conditions
+in this same installation package. The exact license terms of GPL and LGPL
+and said certain other licenses, as well as the required copyright and other
+notices, permissions and acknowledgements are reproduced in and delivered
+to you as part of the referred source code and below. <br> <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GNU GENERAL
+PUBLIC LICENSE<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Version 2, June 1991<br> <br> &nbsp;Copyright (C) 1989, 1991 Free Software
+Foundation, Inc.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+59 Temple Place, Suite 330, Boston, MA&nbsp; 02111-1307&nbsp; USA<br> &nbsp;Everyone
+is permitted to copy and distribute verbatim copies<br> &nbsp;of this license
+document, but changing it is not allowed.<br> <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Preamble<br> <br> &nbsp; The licenses
+for most software are designed to take away your<br> freedom to share and
+change it.&nbsp; By contrast, the GNU General Public<br> License is intended
+to guarantee your freedom to share and change free<br> software--to make sure
+the software is free for all its users.&nbsp; This<br> General Public License
+applies to most of the Free Software<br> Foundation's software and to any
+other program whose authors commit to<br> using it.&nbsp; (Some other Free
+Software Foundation software is covered by<br> the GNU Library General Public
+License instead.)&nbsp; You can apply it to<br> your programs, too.<br> <br> &nbsp;
+When we speak of free software, we are referring to freedom, not<br> price.&nbsp;
+Our General Public Licenses are designed to make sure that you<br> have the
+freedom to distribute copies of free software (and charge for<br> this service
+if you wish), that you receive source code or can get it<br> if you want it,
+that you can change the software or use pieces of it<br> in new free programs;
+and that you know you can do these things.<br> <br> &nbsp; To protect your
+rights, we need to make restrictions that forbid<br> anyone to deny you these
+rights or to ask you to surrender the rights.<br> These restrictions translate
+to certain responsibilities for you if you<br> distribute copies of the software,
+or if you modify it.<br> <br> &nbsp; For example, if you distribute copies
+of such a program, whether<br> gratis or for a fee, you must give the recipients
+all the rights that<br> you have.&nbsp; You must make sure that they, too,
+receive or can get the<br> source code.&nbsp; And you must show them these
+terms so they know their<br> rights.<br> <br> &nbsp; We protect your rights
+with two steps: (1) copyright the software, and<br> (2) offer you this license
+which gives you legal permission to copy,<br> distribute and/or modify the
+software.<br> <br> &nbsp; Also, for each author's protection and ours, we
+want to make certain<br> that everyone understands that there is no warranty
+for this free<br> software.&nbsp; If the software is modified by someone else
+and passed on, we<br> want its recipients to know that what they have is not
+the original, so<br> that any problems introduced by others will not reflect
+on the original<br> authors' reputations.<br> <br> &nbsp; Finally, any free
+program is threatened constantly by software<br> patents.&nbsp; We wish to
+avoid the danger that redistributors of a free<br> program will individually
+obtain patent licenses, in effect making the<br> program proprietary.&nbsp;
+To prevent this, we have made it clear that any<br> patent must be licensed
+for everyone's free use or not licensed at all.<br> <br> &nbsp; The precise
+terms and conditions for copying, distribution and<br> modification follow.<br>  <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GNU GENERAL PUBLIC LICENSE<br> &nbsp;&nbsp;
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION<br> <br> &nbsp;
+0. This License applies to any program or other work which contains<br> a
+notice placed by the copyright holder saying it may be distributed<br> under
+the terms of this General Public License.&nbsp; The "Program", below,<br> refers
+to any such program or work, and a "work based on the Program"<br> means either
+the Program or any derivative work under copyright law:<br> that is to say,
+a work containing the Program or a portion of it,<br> either verbatim or with
+modifications and/or translated into another<br> language.&nbsp; (Hereinafter,
+translation is included without limitation in<br> the term "modification".)&nbsp;
+Each licensee is addressed as "you".<br> <br> Activities other than copying,
+distribution and modification are not<br> covered by this License; they are
+outside its scope.&nbsp; The act of<br> running the Program is not restricted,
+and the output from the Program<br> is covered only if its contents constitute
+a work based on the<br> Program (independent of having been made by running
+the Program).<br> Whether that is true depends on what the Program does.<br> <br> &nbsp;
+1. You may copy and distribute verbatim copies of the Program's<br> source
+code as you receive it, in any medium, provided that you<br> conspicuously
+and appropriately publish on each copy an appropriate<br> copyright notice
+and disclaimer of warranty; keep intact all the<br> notices that refer to
+this License and to the absence of any warranty;<br> and give any other recipients
+of the Program a copy of this License<br> along with the Program.<br> <br> You
+may charge a fee for the physical act of transferring a copy, and<br> you
+may at your option offer warranty protection in exchange for a fee.<br> <br> &nbsp;
+2. You may modify your copy or copies of the Program or any portion<br> of
+it, thus forming a work based on the Program, and copy and<br> distribute
+such modifications or work under the terms of Section 1<br> above, provided
+that you also meet all of these conditions:<br> <br> &nbsp;&nbsp;&nbsp; a)
+You must cause the modified files to carry prominent notices<br> &nbsp;&nbsp;&nbsp;
+stating that you changed the files and the date of any change.<br> <br> &nbsp;&nbsp;&nbsp;
+b) You must cause any work that you distribute or publish, that in<br> &nbsp;&nbsp;&nbsp;
+whole or in part contains or is derived from the Program or any<br> &nbsp;&nbsp;&nbsp;
+part thereof, to be licensed as a whole at no charge to all third<br> &nbsp;&nbsp;&nbsp;
+parties under the terms of this License.<br> <br> &nbsp;&nbsp;&nbsp; c) If
+the modified program normally reads commands interactively<br> &nbsp;&nbsp;&nbsp;
+when run, you must cause it, when started running for such<br> &nbsp;&nbsp;&nbsp;
+interactive use in the most ordinary way, to print or display an<br> &nbsp;&nbsp;&nbsp;
+announcement including an appropriate copyright notice and a<br> &nbsp;&nbsp;&nbsp;
+notice that there is no warranty (or else, saying that you provide<br> &nbsp;&nbsp;&nbsp;
+a warranty) and that users may redistribute the program under<br> &nbsp;&nbsp;&nbsp;
+these conditions, and telling the user how to view a copy of this<br> &nbsp;&nbsp;&nbsp;
+License.&nbsp; (Exception: if the Program itself is interactive but<br> &nbsp;&nbsp;&nbsp;
+does not normally print such an announcement, your work based on<br> &nbsp;&nbsp;&nbsp;
+the Program is not required to print an announcement.)<br>  <br> These requirements
+apply to the modified work as a whole.&nbsp; If<br> identifiable sections
+of that work are not derived from the Program,<br> and can be reasonably considered
+independent and separate works in<br> themselves, then this License, and its
+terms, do not apply to those<br> sections when you distribute them as separate
+works.&nbsp; But when you<br> distribute the same sections as part of a whole
+which is a work based<br> on the Program, the distribution of the whole must
+be on the terms of<br> this License, whose permissions for other licensees
+extend to the<br> entire whole, and thus to each and every part regardless
+of who wrote it.<br> <br> Thus, it is not the intent of this section to claim
+rights or contest<br> your rights to work written entirely by you; rather,
+the intent is to<br> exercise the right to control the distribution of derivative
+or<br> collective works based on the Program.<br> <br> In addition, mere aggregation
+of another work not based on the Program<br> with the Program (or with a work
+based on the Program) on a volume of<br> a storage or distribution medium
+does not bring the other work under<br> the scope of this License.<br> <br> &nbsp;
+3. You may copy and distribute the Program (or a work based on it,<br> under
+Section 2) in object code or executable form under the terms of<br> Sections
+1 and 2 above provided that you also do one of the following:<br> <br> &nbsp;&nbsp;&nbsp;
+a) Accompany it with the complete corresponding machine-readable<br> &nbsp;&nbsp;&nbsp;
+source code, which must be distributed under the terms of Sections<br> &nbsp;&nbsp;&nbsp;
+1 and 2 above on a medium customarily used for software interchange; or,<br> <br> &nbsp;&nbsp;&nbsp;
+b) Accompany it with a written offer, valid for at least three<br> &nbsp;&nbsp;&nbsp;
+years, to give any third party, for a charge no more than your<br> &nbsp;&nbsp;&nbsp;
+cost of physically performing source distribution, a complete<br> &nbsp;&nbsp;&nbsp;
+machine-readable copy of the corresponding source code, to be<br> &nbsp;&nbsp;&nbsp;
+distributed under the terms of Sections 1 and 2 above on a medium<br> &nbsp;&nbsp;&nbsp;
+customarily used for software interchange; or,<br> <br> &nbsp;&nbsp;&nbsp;
+c) Accompany it with the information you received as to the offer<br> &nbsp;&nbsp;&nbsp;
+to distribute corresponding source code.&nbsp; (This alternative is<br> &nbsp;&nbsp;&nbsp;
+allowed only for noncommercial distribution and only if you<br> &nbsp;&nbsp;&nbsp;
+received the program in object code or executable form with such<br> &nbsp;&nbsp;&nbsp;
+an offer, in accord with Subsection b above.)<br> <br> The source code for
+a work means the preferred form of the work for<br> making modifications to
+it.&nbsp; For an executable work, complete source<br> code means all the source
+code for all modules it contains, plus any<br> associated interface definition
+files, plus the scripts used to<br> control compilation and installation of
+the executable.&nbsp; However, as a<br> special exception, the source code
+distributed need not include<br> anything that is normally distributed (in
+either source or binary<br> form) with the major components (compiler, kernel,
+and so on) of the<br> operating system on which the executable runs, unless
+that component<br> itself accompanies the executable.<br> <br> If distribution
+of executable or object code is made by offering<br> access to copy from a
+designated place, then offering equivalent<br> access to copy the source code
+from the same place counts as<br> distribution of the source code, even though
+third parties are not<br> compelled to copy the source along with the object
+code.<br>  <br> &nbsp; 4. You may not copy, modify, sublicense, or distribute
+the Program<br> except as expressly provided under this License.&nbsp; Any
+attempt<br> otherwise to copy, modify, sublicense or distribute the Program
+is<br> void, and will automatically terminate your rights under this License.<br> However,
+parties who have received copies, or rights, from you under<br> this License
+will not have their licenses terminated so long as such<br> parties remain
+in full compliance.<br> <br> &nbsp; 5. You are not required to accept this
+License, since you have not<br> signed it.&nbsp; However, nothing else grants
+you permission to modify or<br> distribute the Program or its derivative works.&nbsp;
+These actions are<br> prohibited by law if you do not accept this License.&nbsp;
+Therefore, by<br> modifying or distributing the Program (or any work based
+on the<br> Program), you indicate your acceptance of this License to do so,
+and<br> all its terms and conditions for copying, distributing or modifying<br> the
+Program or works based on it.<br> <br> &nbsp; 6. Each time you redistribute
+the Program (or any work based on the<br> Program), the recipient automatically
+receives a license from the<br> original licensor to copy, distribute or modify
+the Program subject to<br> these terms and conditions.&nbsp; You may not impose
+any further<br> restrictions on the recipients' exercise of the rights granted
+herein.<br> You are not responsible for enforcing compliance by third parties
+to<br> this License.<br> <br> &nbsp; 7. If, as a consequence of a court judgment
+or allegation of patent<br> infringement or for any other reason (not limited
+to patent issues),<br> conditions are imposed on you (whether by court order,
+agreement or<br> otherwise) that contradict the conditions of this License,
+they do not<br> excuse you from the conditions of this License.&nbsp; If you
+cannot<br> distribute so as to satisfy simultaneously your obligations under
+this<br> License and any other pertinent obligations, then as a consequence
+you<br> may not distribute the Program at all.&nbsp; For example, if a patent<br> license
+would not permit royalty-free redistribution of the Program by<br> all those
+who receive copies directly or indirectly through you, then<br> the only way
+you could satisfy both it and this License would be to<br> refrain entirely
+from distribution of the Program.<br> <br> If any portion of this section
+is held invalid or unenforceable under<br> any particular circumstance, the
+balance of the section is intended to<br> apply and the section as a whole
+is intended to apply in other<br> circumstances.<br> <br> It is not the purpose
+of this section to induce you to infringe any<br> patents or other property
+right claims or to contest validity of any<br> such claims; this section has
+the sole purpose of protecting the<br> integrity of the free software distribution
+system, which is<br> implemented by public license practices.&nbsp; Many people
+have made<br> generous contributions to the wide range of software distributed<br> through
+that system in reliance on consistent application of that<br> system; it is
+up to the author/donor to decide if he or she is willing<br> to distribute
+software through any other system and a licensee cannot<br> impose that choice.<br> <br> This
+section is intended to make thoroughly clear what is believed to<br> be a
+consequence of the rest of this License.<br>  <br> &nbsp; 8. If the distribution
+and/or use of the Program is restricted in<br> certain countries either by
+patents or by copyrighted interfaces, the<br> original copyright holder who
+places the Program under this License<br> may add an explicit geographical
+distribution limitation excluding<br> those countries, so that distribution
+is permitted only in or among<br> countries not thus excluded.&nbsp; In such
+case, this License incorporates<br> the limitation as if written in the body
+of this License.<br> <br> &nbsp; 9. The Free Software Foundation may publish
+revised and/or new versions<br> of the General Public License from time to
+time.&nbsp; Such new versions will<br> be similar in spirit to the present
+version, but may differ in detail to<br> address new problems or concerns.<br> <br> Each
+version is given a distinguishing version number.&nbsp; If the Program<br> specifies
+a version number of this License which applies to it and "any<br> later version",
+you have the option of following the terms and conditions<br> either of that
+version or of any later version published by the Free<br> Software Foundation.&nbsp;
+If the Program does not specify a version number of<br> this License, you
+may choose any version ever published by the Free Software<br> Foundation.<br> <br> &nbsp;
+10. If you wish to incorporate parts of the Program into other free<br> programs
+whose distribution conditions are different, write to the author<br> to ask
+for permission.&nbsp; For software which is copyrighted by the Free<br> Software
+Foundation, write to the Free Software Foundation; we sometimes<br> make exceptions
+for this.&nbsp; Our decision will be guided by the two goals<br> of preserving
+the free status of all derivatives of our free software and<br> of promoting
+the sharing and reuse of software generally.<br> <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NO WARRANTY<br> <br> &nbsp; 11.
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY<br> FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.&nbsp; EXCEPT WHEN<br> OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES<br> PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED<br> OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF<br> MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE.&nbsp; THE ENTIRE RISK AS<br> TO THE
+QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.&nbsp; SHOULD THE<br> PROGRAM
+PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,<br> REPAIR
+OR CORRECTION.<br> <br> &nbsp; 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE
+LAW OR AGREED TO IN WRITING<br> WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
+WHO MAY MODIFY AND/OR<br> REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+LIABLE TO YOU FOR DAMAGES,<br> INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
+OR CONSEQUENTIAL DAMAGES ARISING<br> OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED<br> TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY<br> YOU OR THIRD PARTIES OR A FAILURE OF
+THE PROGRAM TO OPERATE WITH ANY OTHER<br> PROGRAMS), EVEN IF SUCH HOLDER OR
+OTHER PARTY HAS BEEN ADVISED OF THE<br> POSSIBILITY OF SUCH DAMAGES.<br> <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END OF TERMS AND CONDITIONS<br>  <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; How to Apply These Terms to Your New Programs<br> <br> &nbsp;
+If you develop a new program, and you want it to be of the greatest<br> possible
+use to the public, the best way to achieve this is to make it<br> free software
+which everyone can redistribute and change under these terms.<br> <br> &nbsp;
+To do so, attach the following notices to the program.&nbsp; It is safest<br> to
+attach them to the start of each source file to most effectively<br> convey
+the exclusion of warranty; and each file should have at least<br> the "copyright"
+line and a pointer to where the full notice is found.<br> <br> &nbsp;&nbsp;&nbsp;
+&lt;one line to give the program's name and a brief idea of what it does.><br> &nbsp;&nbsp;&nbsp;
+Copyright (C) &lt;year>&nbsp; &lt;name of author><br> <br> &nbsp;&nbsp;&nbsp;
+This program is free software; you can redistribute it and/or modify<br> &nbsp;&nbsp;&nbsp;
+it under the terms of the GNU General Public License as published by<br> &nbsp;&nbsp;&nbsp;
+the Free Software Foundation; either version 2 of the License, or<br> &nbsp;&nbsp;&nbsp;
+(at your option) any later version.<br> <br> &nbsp;&nbsp;&nbsp; This program
+is distributed in the hope that it will be useful,<br> &nbsp;&nbsp;&nbsp;
+but WITHOUT ANY WARRANTY; without even the implied warranty of<br> &nbsp;&nbsp;&nbsp;
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the<br> &nbsp;&nbsp;&nbsp;
+GNU General Public License for more details.<br> <br> &nbsp;&nbsp;&nbsp; You
+should have received a copy of the GNU General Public License<br> &nbsp;&nbsp;&nbsp;
+along with this program; if not, write to the Free Software<br> &nbsp;&nbsp;&nbsp;
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA&nbsp; 02111-1307&nbsp;
+USA<br> <br> <br> Also add information on how to contact you by electronic
+and paper mail.<br> <br> If the program is interactive, make it output a short
+notice like this<br> when it starts in an interactive mode:<br> <br> &nbsp;&nbsp;&nbsp;
+Gnomovision version 69, Copyright (C) year name of author<br> &nbsp;&nbsp;&nbsp;
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.<br> &nbsp;&nbsp;&nbsp;
+This is free software, and you are welcome to redistribute it<br> &nbsp;&nbsp;&nbsp;
+under certain conditions; type `show c' for details.<br> <br> The hypothetical
+commands `show w' and `show c' should show the appropriate<br> parts of the
+General Public License.&nbsp; Of course, the commands you use may<br> be called
+something other than `show w' and `show c'; they could even be<br> mouse-clicks
+or menu items--whatever suits your program.<br> <br> You should also get your
+employer (if you work as a programmer) or your<br> school, if any, to sign
+a "copyright disclaimer" for the program, if<br> necessary.&nbsp; Here is
+a sample; alter the names:<br> <br> &nbsp; Yoyodyne, Inc., hereby disclaims
+all copyright interest in the program<br> &nbsp; `Gnomovision' (which makes
+passes at compilers) written by James Hacker.<br> <br> &nbsp; &lt;signature
+of Ty Coon>, 1 April 1989<br> &nbsp; Ty Coon, President of Vice<br> <br> This
+General Public License does not permit incorporating your program into<br> proprietary
+programs.&nbsp; If your program is a subroutine library, you may<br> consider
+it more useful to permit linking proprietary applications with the<br> library.&nbsp;
+If this is what you want to do, use the GNU Library General<br> Public License
+instead of this License. &nbsp;&nbsp; <br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
+GNU LESSER GENERAL PUBLIC LICENSE<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Version 2.1, February 1999<br> <br> &nbsp;Copyright (C) 1991, 1999 Free Software
+Foundation, Inc.<br> &nbsp;&nbsp;&nbsp;&nbsp; 59 Temple Place, Suite 330,
+Boston, MA&nbsp; 02111-1307&nbsp; USA<br> &nbsp;Everyone is permitted to copy
+and distribute verbatim copies<br> &nbsp;of this license document, but changing
+it is not allowed.<br> <br> [This is the first released version of the Lesser
+GPL.&nbsp; It also counts<br> &nbsp;as the successor of the GNU Library Public
+License, version 2, hence<br> &nbsp;the version number 2.1.]<br> <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Preamble<br> <br> &nbsp;
+The licenses for most software are designed to take away your<br> freedom
+to share and change it.&nbsp; By contrast, the GNU General Public<br> Licenses
+are intended to guarantee your freedom to share and change<br> free software--to
+make sure the software is free for all its users.<br> <br> &nbsp; This license,
+the Lesser General Public License, applies to some<br> specially designated
+software packages--typically libraries--of the<br> Free Software Foundation
+and other authors who decide to use it.&nbsp; You<br> can use it too, but
+we suggest you first think carefully about whether<br> this license or the
+ordinary General Public License is the better<br> strategy to use in any particular
+case, based on the explanations below.<br> <br> &nbsp; When we speak of free
+software, we are referring to freedom of use,<br> not price.&nbsp; Our General
+Public Licenses are designed to make sure that<br> you have the freedom to
+distribute copies of free software (and charge<br> for this service if you
+wish); that you receive source code or can get<br> it if you want it; that
+you can change the software and use pieces of<br> it in new free programs;
+and that you are informed that you can do<br> these things.<br> <br> &nbsp;
+To protect your rights, we need to make restrictions that forbid<br> distributors
+to deny you these rights or to ask you to surrender these<br> rights.&nbsp;
+These restrictions translate to certain responsibilities for<br> you if you
+distribute copies of the library or if you modify it.<br> <br> &nbsp; For
+example, if you distribute copies of the library, whether gratis<br> or for
+a fee, you must give the recipients all the rights that we gave<br> you.&nbsp;
+You must make sure that they, too, receive or can get the source<br> code.&nbsp;
+If you link other code with the library, you must provide<br> complete object
+files to the recipients, so that they can relink them<br> with the library
+after making changes to the library and recompiling<br> it.&nbsp; And you
+must show them these terms so they know their rights.<br> <br> &nbsp; We protect
+your rights with a two-step method: (1) we copyright the<br> library, and
+(2) we offer you this license, which gives you legal<br> permission to copy,
+distribute and/or modify the library.<br> <br> &nbsp; To protect each distributor,
+we want to make it very clear that<br> there is no warranty for the free library.&nbsp;
+Also, if the library is<br> modified by someone else and passed on, the recipients
+should know<br> that what they have is not the original version, so that the
+original<br> author's reputation will not be affected by problems that might
+be<br> introduced by others.<br>  <br> &nbsp; Finally, software patents pose
+a constant threat to the existence of<br> any free program.&nbsp; We wish
+to make sure that a company cannot<br> effectively restrict the users of a
+free program by obtaining a<br> restrictive license from a patent holder.&nbsp;
+Therefore, we insist that<br> any patent license obtained for a version of
+the library must be<br> consistent with the full freedom of use specified
+in this license.<br> <br> &nbsp; Most GNU software, including some libraries,
+is covered by the<br> ordinary GNU General Public License.&nbsp; This license,
+the GNU Lesser<br> General Public License, applies to certain designated libraries,
+and<br> is quite different from the ordinary General Public License.&nbsp;
+We use<br> this license for certain libraries in order to permit linking those<br> libraries
+into non-free programs.<br> <br> &nbsp; When a program is linked with a library,
+whether statically or using<br> a shared library, the combination of the two
+is legally speaking a<br> combined work, a derivative of the original library.&nbsp;
+The ordinary<br> General Public License therefore permits such linking only
+if the<br> entire combination fits its criteria of freedom.&nbsp; The Lesser
+General<br> Public License permits more lax criteria for linking other code
+with<br> the library.<br> <br> &nbsp; We call this license the "Lesser" General
+Public License because it<br> does Less to protect the user's freedom than
+the ordinary General<br> Public License.&nbsp; It also provides other free
+software developers Less<br> of an advantage over competing non-free programs.&nbsp;
+These disadvantages<br> are the reason we use the ordinary General Public
+License for many<br> libraries.&nbsp; However, the Lesser license provides
+advantages in certain<br> special circumstances.<br> <br> &nbsp; For example,
+on rare occasions, there may be a special need to<br> encourage the widest
+possible use of a certain library, so that it becomes<br> a de-facto standard.&nbsp;
+To achieve this, non-free programs must be<br> allowed to use the library.&nbsp;
+A more frequent case is that a free<br> library does the same job as widely
+used non-free libraries.&nbsp; In this<br> case, there is little to gain by
+limiting the free library to free<br> software only, so we use the Lesser
+General Public License.<br> <br> &nbsp; In other cases, permission to use
+a particular library in non-free<br> programs enables a greater number of
+people to use a large body of<br> free software.&nbsp; For example, permission
+to use the GNU C Library in<br> non-free programs enables many more people
+to use the whole GNU<br> operating system, as well as its variant, the GNU/Linux
+operating<br> system.<br> <br> &nbsp; Although the Lesser General Public License
+is Less protective of the<br> users' freedom, it does ensure that the user
+of a program that is<br> linked with the Library has the freedom and the wherewithal
+to run<br> that program using a modified version of the Library.<br> <br> &nbsp;
+The precise terms and conditions for copying, distribution and<br> modification
+follow.&nbsp; Pay close attention to the difference between a<br> "work based
+on the library" and a "work that uses the library".&nbsp; The<br> former contains
+code derived from the library, whereas the latter must<br> be combined with
+the library in order to run.<br>  <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
+GNU LESSER GENERAL PUBLIC LICENSE<br> &nbsp;&nbsp; TERMS AND CONDITIONS FOR
+COPYING, DISTRIBUTION AND MODIFICATION<br> <br> &nbsp; 0. This License Agreement
+applies to any software library or other<br> program which contains a notice
+placed by the copyright holder or<br> other authorized party saying it may
+be distributed under the terms of<br> this Lesser General Public License (also
+called "this License").<br> Each licensee is addressed as "you".<br> <br> &nbsp;
+A "library" means a collection of software functions and/or data<br> prepared
+so as to be conveniently linked with application programs<br> (which use some
+of those functions and data) to form executables.<br> <br> &nbsp; The "Library",
+below, refers to any such software library or work<br> which has been distributed
+under these terms.&nbsp; A "work based on the<br> Library" means either the
+Library or any derivative work under<br> copyright law: that is to say, a
+work containing the Library or a<br> portion of it, either verbatim or with
+modifications and/or translated<br> straightforwardly into another language.&nbsp;
+(Hereinafter, translation is<br> included without limitation in the term "modification".)<br> <br> &nbsp;
+"Source code" for a work means the preferred form of the work for<br> making
+modifications to it.&nbsp; For a library, complete source code means<br> all
+the source code for all modules it contains, plus any associated<br> interface
+definition files, plus the scripts used to control compilation<br> and installation
+of the library.<br> <br> &nbsp; Activities other than copying, distribution
+and modification are not<br> covered by this License; they are outside its
+scope.&nbsp; The act of<br> running a program using the Library is not restricted,
+and output from<br> such a program is covered only if its contents constitute
+a work based<br> on the Library (independent of the use of the Library in
+a tool for<br> writing it).&nbsp; Whether that is true depends on what the
+Library does<br> and what the program that uses the Library does.<br> &nbsp; <br> &nbsp;
+1. You may copy and distribute verbatim copies of the Library's<br> complete
+source code as you receive it, in any medium, provided that<br> you conspicuously
+and appropriately publish on each copy an<br> appropriate copyright notice
+and disclaimer of warranty; keep intact<br> all the notices that refer to
+this License and to the absence of any<br> warranty; and distribute a copy
+of this License along with the<br> Library.<br> <br> &nbsp; You may charge
+a fee for the physical act of transferring a copy,<br> and you may at your
+option offer warranty protection in exchange for a<br> fee.<br>  <br> &nbsp;
+2. You may modify your copy or copies of the Library or any portion<br> of
+it, thus forming a work based on the Library, and copy and<br> distribute
+such modifications or work under the terms of Section 1<br> above, provided
+that you also meet all of these conditions:<br> <br> &nbsp;&nbsp;&nbsp; a)
+The modified work must itself be a software library.<br> <br> &nbsp;&nbsp;&nbsp;
+b) You must cause the files modified to carry prominent notices<br> &nbsp;&nbsp;&nbsp;
+stating that you changed the files and the date of any change.<br> <br> &nbsp;&nbsp;&nbsp;
+c) You must cause the whole of the work to be licensed at no<br> &nbsp;&nbsp;&nbsp;
+charge to all third parties under the terms of this License.<br> <br> &nbsp;&nbsp;&nbsp;
+d) If a facility in the modified Library refers to a function or a<br> &nbsp;&nbsp;&nbsp;
+table of data to be supplied by an application program that uses<br> &nbsp;&nbsp;&nbsp;
+the facility, other than as an argument passed when the facility<br> &nbsp;&nbsp;&nbsp;
+is invoked, then you must make a good faith effort to ensure that,<br> &nbsp;&nbsp;&nbsp;
+in the event an application does not supply such function or<br> &nbsp;&nbsp;&nbsp;
+table, the facility still operates, and performs whatever part of<br> &nbsp;&nbsp;&nbsp;
+its purpose remains meaningful.<br> <br> &nbsp;&nbsp;&nbsp; (For example,
+a function in a library to compute square roots has<br> &nbsp;&nbsp;&nbsp;
+a purpose that is entirely well-defined independent of the<br> &nbsp;&nbsp;&nbsp;
+application.&nbsp; Therefore, Subsection 2d requires that any<br> &nbsp;&nbsp;&nbsp;
+application-supplied function or table used by this function must<br> &nbsp;&nbsp;&nbsp;
+be optional: if the application does not supply it, the square<br> &nbsp;&nbsp;&nbsp;
+root function must still compute square roots.)<br> <br> These requirements
+apply to the modified work as a whole.&nbsp; If<br> identifiable sections
+of that work are not derived from the Library,<br> and can be reasonably considered
+independent and separate works in<br> themselves, then this License, and its
+terms, do not apply to those<br> sections when you distribute them as separate
+works.&nbsp; But when you<br> distribute the same sections as part of a whole
+which is a work based<br> on the Library, the distribution of the whole must
+be on the terms of<br> this License, whose permissions for other licensees
+extend to the<br> entire whole, and thus to each and every part regardless
+of who wrote<br> it.<br> <br> Thus, it is not the intent of this section to
+claim rights or contest<br> your rights to work written entirely by you; rather,
+the intent is to<br> exercise the right to control the distribution of derivative
+or<br> collective works based on the Library.<br> <br> In addition, mere aggregation
+of another work not based on the Library<br> with the Library (or with a work
+based on the Library) on a volume of<br> a storage or distribution medium
+does not bring the other work under<br> the scope of this License.<br> <br> &nbsp;
+3. You may opt to apply the terms of the ordinary GNU General Public<br> License
+instead of this License to a given copy of the Library.&nbsp; To do<br> this,
+you must alter all the notices that refer to this License, so<br> that they
+refer to the ordinary GNU General Public License, version 2,<br> instead of
+to this License.&nbsp; (If a newer version than version 2 of the<br> ordinary
+GNU General Public License has appeared, then you can specify<br> that version
+instead if you wish.)&nbsp; Do not make any other change in<br> these notices.<br>  <br> &nbsp;
+Once this change is made in a given copy, it is irreversible for<br> that
+copy, so the ordinary GNU General Public License applies to all<br> subsequent
+copies and derivative works made from that copy.<br> <br> &nbsp; This option
+is useful when you wish to copy part of the code of<br> the Library into a
+program that is not a library.<br> <br> &nbsp; 4. You may copy and distribute
+the Library (or a portion or<br> derivative of it, under Section 2) in object
+code or executable form<br> under the terms of Sections 1 and 2 above provided
+that you accompany<br> it with the complete corresponding machine-readable
+source code, which<br> must be distributed under the terms of Sections 1 and
+2 above on a<br> medium customarily used for software interchange.<br> <br> &nbsp;
+If distribution of object code is made by offering access to copy<br> from
+a designated place, then offering equivalent access to copy the<br> source
+code from the same place satisfies the requirement to<br> distribute the source
+code, even though third parties are not<br> compelled to copy the source along
+with the object code.<br> <br> &nbsp; 5. A program that contains no derivative
+of any portion of the<br> Library, but is designed to work with the Library
+by being compiled or<br> linked with it, is called a "work that uses the Library".&nbsp;
+Such a<br> work, in isolation, is not a derivative work of the Library, and<br> therefore
+falls outside the scope of this License.<br> <br> &nbsp; However, linking
+a "work that uses the Library" with the Library<br> creates an executable
+that is a derivative of the Library (because it<br> contains portions of the
+Library), rather than a "work that uses the<br> library".&nbsp; The executable
+is therefore covered by this License.<br> Section 6 states terms for distribution
+of such executables.<br> <br> &nbsp; When a "work that uses the Library" uses
+material from a header file<br> that is part of the Library, the object code
+for the work may be a<br> derivative work of the Library even though the source
+code is not.<br> Whether this is true is especially significant if the work
+can be<br> linked without the Library, or if the work is itself a library.&nbsp;
+The<br> threshold for this to be true is not precisely defined by law.<br> <br> &nbsp;
+If such an object file uses only numerical parameters, data<br> structure
+layouts and accessors, and small macros and small inline<br> functions (ten
+lines or less in length), then the use of the object<br> file is unrestricted,
+regardless of whether it is legally a derivative<br> work.&nbsp; (Executables
+containing this object code plus portions of the<br> Library will still fall
+under Section 6.)<br> <br> &nbsp; Otherwise, if the work is a derivative of
+the Library, you may<br> distribute the object code for the work under the
+terms of Section 6.<br> Any executables containing that work also fall under
+Section 6,<br> whether or not they are linked directly with the Library itself.<br>  <br> &nbsp;
+6. As an exception to the Sections above, you may also combine or<br> link
+a "work that uses the Library" with the Library to produce a<br> work containing
+portions of the Library, and distribute that work<br> under terms of your
+choice, provided that the terms permit<br> modification of the work for the
+customer's own use and reverse<br> engineering for debugging such modifications.<br> <br> &nbsp;
+You must give prominent notice with each copy of the work that the<br> Library
+is used in it and that the Library and its use are covered by<br> this License.&nbsp;
+You must supply a copy of this License.&nbsp; If the work<br> during execution
+displays copyright notices, you must include the<br> copyright notice for
+the Library among them, as well as a reference<br> directing the user to the
+copy of this License.&nbsp; Also, you must do one<br> of these things:<br> <br> &nbsp;&nbsp;&nbsp;
+a) Accompany the work with the complete corresponding<br> &nbsp;&nbsp;&nbsp;
+machine-readable source code for the Library including whatever<br> &nbsp;&nbsp;&nbsp;
+changes were used in the work (which must be distributed under<br> &nbsp;&nbsp;&nbsp;
+Sections 1 and 2 above); and, if the work is an executable linked<br> &nbsp;&nbsp;&nbsp;
+with the Library, with the complete machine-readable "work that<br> &nbsp;&nbsp;&nbsp;
+uses the Library", as object code and/or source code, so that the<br> &nbsp;&nbsp;&nbsp;
+user can modify the Library and then relink to produce a modified<br> &nbsp;&nbsp;&nbsp;
+executable containing the modified Library.&nbsp; (It is understood<br> &nbsp;&nbsp;&nbsp;
+that the user who changes the contents of definitions files in the<br> &nbsp;&nbsp;&nbsp;
+Library will not necessarily be able to recompile the application<br> &nbsp;&nbsp;&nbsp;
+to use the modified definitions.)<br> <br> &nbsp;&nbsp;&nbsp; b) Use a suitable
+shared library mechanism for linking with the<br> &nbsp;&nbsp;&nbsp; Library.&nbsp;
+A suitable mechanism is one that (1) uses at run time a<br> &nbsp;&nbsp;&nbsp;
+copy of the library already present on the user's computer system,<br> &nbsp;&nbsp;&nbsp;
+rather than copying library functions into the executable, and (2)<br> &nbsp;&nbsp;&nbsp;
+will operate properly with a modified version of the library, if<br> &nbsp;&nbsp;&nbsp;
+the user installs one, as long as the modified version is<br> &nbsp;&nbsp;&nbsp;
+interface-compatible with the version that the work was made with.<br> <br> &nbsp;&nbsp;&nbsp;
+c) Accompany the work with a written offer, valid for at<br> &nbsp;&nbsp;&nbsp;
+least three years, to give the same user the materials<br> &nbsp;&nbsp;&nbsp;
+specified in Subsection 6a, above, for a charge no more<br> &nbsp;&nbsp;&nbsp;
+than the cost of performing this distribution.<br> <br> &nbsp;&nbsp;&nbsp;
+d) If distribution of the work is made by offering access to copy<br> &nbsp;&nbsp;&nbsp;
+from a designated place, offer equivalent access to copy the above<br> &nbsp;&nbsp;&nbsp;
+specified materials from the same place.<br> <br> &nbsp;&nbsp;&nbsp; e) Verify
+that the user has already received a copy of these<br> &nbsp;&nbsp;&nbsp;
+materials or that you have already sent this user a copy.<br> <br> &nbsp;
+For an executable, the required form of the "work that uses the<br> Library"
+must include any data and utility programs needed for<br> reproducing the
+executable from it.&nbsp; However, as a special exception,<br> the materials
+to be distributed need not include anything that is<br> normally distributed
+(in either source or binary form) with the major<br> components (compiler,
+kernel, and so on) of the operating system on<br> which the executable runs,
+unless that component itself accompanies<br> the executable.<br> <br> &nbsp;
+It may happen that this requirement contradicts the license<br> restrictions
+of other proprietary libraries that do not normally<br> accompany the operating
+system.&nbsp; Such a contradiction means you cannot<br> use both them and
+the Library together in an executable that you<br> distribute.<br>  <br> &nbsp;
+7. You may place library facilities that are a work based on the<br> Library
+side-by-side in a single library together with other library<br> facilities
+not covered by this License, and distribute such a combined<br> library, provided
+that the separate distribution of the work based on<br> the Library and of
+the other library facilities is otherwise<br> permitted, and provided that
+you do these two things:<br> <br> &nbsp;&nbsp;&nbsp; a) Accompany the combined
+library with a copy of the same work<br> &nbsp;&nbsp;&nbsp; based on the Library,
+uncombined with any other library<br> &nbsp;&nbsp;&nbsp; facilities.&nbsp;
+This must be distributed under the terms of the<br> &nbsp;&nbsp;&nbsp; Sections
+above.<br> <br> &nbsp;&nbsp;&nbsp; b) Give prominent notice with the combined
+library of the fact<br> &nbsp;&nbsp;&nbsp; that part of it is a work based
+on the Library, and explaining<br> &nbsp;&nbsp;&nbsp; where to find the accompanying
+uncombined form of the same work.<br> <br> &nbsp; 8. You may not copy, modify,
+sublicense, link with, or distribute<br> the Library except as expressly provided
+under this License.&nbsp; Any<br> attempt otherwise to copy, modify, sublicense,
+link with, or<br> distribute the Library is void, and will automatically terminate
+your<br> rights under this License.&nbsp; However, parties who have received
+copies,<br> or rights, from you under this License will not have their licenses<br> terminated
+so long as such parties remain in full compliance.<br> <br> &nbsp; 9. You
+are not required to accept this License, since you have not<br> signed it.&nbsp;
+However, nothing else grants you permission to modify or<br> distribute the
+Library or its derivative works.&nbsp; These actions are<br> prohibited by
+law if you do not accept this License.&nbsp; Therefore, by<br> modifying or
+distributing the Library (or any work based on the<br> Library), you indicate
+your acceptance of this License to do so, and<br> all its terms and conditions
+for copying, distributing or modifying<br> the Library or works based on it.<br> <br> &nbsp;
+10. Each time you redistribute the Library (or any work based on the<br> Library),
+the recipient automatically receives a license from the<br> original licensor
+to copy, distribute, link with or modify the Library<br> subject to these
+terms and conditions.&nbsp; You may not impose any further<br> restrictions
+on the recipients' exercise of the rights granted herein.<br> You are not
+responsible for enforcing compliance by third parties with<br> this License.<br>  <br> &nbsp;
+11. If, as a consequence of a court judgment or allegation of patent<br> infringement
+or for any other reason (not limited to patent issues),<br> conditions are
+imposed on you (whether by court order, agreement or<br> otherwise) that contradict
+the conditions of this License, they do not<br> excuse you from the conditions
+of this License.&nbsp; If you cannot<br> distribute so as to satisfy simultaneously
+your obligations under this<br> License and any other pertinent obligations,
+then as a consequence you<br> may not distribute the Library at all.&nbsp;
+For example, if a patent<br> license would not permit royalty-free redistribution
+of the Library by<br> all those who receive copies directly or indirectly
+through you, then<br> the only way you could satisfy both it and this License
+would be to<br> refrain entirely from distribution of the Library.<br> <br> If
+any portion of this section is held invalid or unenforceable under any<br> particular
+circumstance, the balance of the section is intended to apply,<br> and the
+section as a whole is intended to apply in other circumstances.<br> <br> It
+is not the purpose of this section to induce you to infringe any<br> patents
+or other property right claims or to contest validity of any<br> such claims;
+this section has the sole purpose of protecting the<br> integrity of the free
+software distribution system which is<br> implemented by public license practices.&nbsp;
+Many people have made<br> generous contributions to the wide range of software
+distributed<br> through that system in reliance on consistent application
+of that<br> system; it is up to the author/donor to decide if he or she is
+willing<br> to distribute software through any other system and a licensee
+cannot<br> impose that choice.<br> <br> This section is intended to make thoroughly
+clear what is believed to<br> be a consequence of the rest of this License.<br> <br> &nbsp;
+12. If the distribution and/or use of the Library is restricted in<br> certain
+countries either by patents or by copyrighted interfaces, the<br> original
+copyright holder who places the Library under this License may add<br> an
+explicit geographical distribution limitation excluding those countries,<br> so
+that distribution is permitted only in or among countries not thus<br> excluded.&nbsp;
+In such case, this License incorporates the limitation as if<br> written in
+the body of this License.<br> <br> &nbsp; 13. The Free Software Foundation
+may publish revised and/or new<br> versions of the Lesser General Public License
+from time to time.<br> Such new versions will be similar in spirit to the
+present version,<br> but may differ in detail to address new problems or concerns.<br> <br> Each
+version is given a distinguishing version number.&nbsp; If the Library<br> specifies
+a version number of this License which applies to it and<br> "any later version",
+you have the option of following the terms and<br> conditions either of that
+version or of any later version published by<br> the Free Software Foundation.&nbsp;
+If the Library does not specify a<br> license version number, you may choose
+any version ever published by<br> the Free Software Foundation.<br>  <br> &nbsp;
+14. If you wish to incorporate parts of the Library into other free<br> programs
+whose distribution conditions are incompatible with these,<br> write to the
+author to ask for permission.&nbsp; For software which is<br> copyrighted
+by the Free Software Foundation, write to the Free<br> Software Foundation;
+we sometimes make exceptions for this.&nbsp; Our<br> decision will be guided
+by the two goals of preserving the free status<br> of all derivatives of our
+free software and of promoting the sharing<br> and reuse of software generally.<br> <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NO WARRANTY<br> <br> &nbsp;
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO<br> WARRANTY
+FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.<br> EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR<br> OTHER PARTIES
+PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY<br> KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE<br> IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR<br> PURPOSE.&nbsp; THE ENTIRE RISK AS TO THE
+QUALITY AND PERFORMANCE OF THE<br> LIBRARY IS WITH YOU.&nbsp; SHOULD THE LIBRARY
+PROVE DEFECTIVE, YOU ASSUME<br> THE COST OF ALL NECESSARY SERVICING, REPAIR
+OR CORRECTION.<br> <br> &nbsp; 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE
+LAW OR AGREED TO IN<br> WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
+WHO MAY MODIFY<br> AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
+LIABLE TO YOU<br> FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
+OR<br> CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE<br> LIBRARY
+(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING<br> RENDERED INACCURATE
+OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A<br> FAILURE OF THE LIBRARY
+TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF<br> SUCH HOLDER OR OTHER PARTY
+HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH<br> DAMAGES.<br> <br> &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END OF TERMS AND CONDITIONS<br>  <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+How to Apply These Terms to Your New Libraries<br> <br> &nbsp; If you develop
+a new library, and you want it to be of the greatest<br> possible use to the
+public, we recommend making it free software that<br> everyone can redistribute
+and change.&nbsp; You can do so by permitting<br> redistribution under these
+terms (or, alternatively, under the terms of the<br> ordinary General Public
+License).<br> <br> &nbsp; To apply these terms, attach the following notices
+to the library.&nbsp; It is<br> safest to attach them to the start of each
+source file to most effectively<br> convey the exclusion of warranty; and
+each file should have at least the<br> "copyright" line and a pointer to where
+the full notice is found.<br> <br> &nbsp;&nbsp;&nbsp; &lt;one line to give
+the library's name and a brief idea of what it does.><br> &nbsp;&nbsp;&nbsp;
+Copyright (C) &lt;year>&nbsp; &lt;name of author><br> <br> &nbsp;&nbsp;&nbsp;
+This library is free software; you can redistribute it and/or<br> &nbsp;&nbsp;&nbsp;
+modify it under the terms of the GNU Lesser General Public<br> &nbsp;&nbsp;&nbsp;
+License as published by the Free Software Foundation; either<br> &nbsp;&nbsp;&nbsp;
+version 2.1 of the License, or (at your option) any later version.<br> <br> &nbsp;&nbsp;&nbsp;
+This library is distributed in the hope that it will be useful,<br> &nbsp;&nbsp;&nbsp;
+but WITHOUT ANY WARRANTY; without even the implied warranty of<br> &nbsp;&nbsp;&nbsp;
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the GNU<br> &nbsp;&nbsp;&nbsp;
+Lesser General Public License for more details.<br> <br> &nbsp;&nbsp;&nbsp;
+You should have received a copy of the GNU Lesser General Public<br> &nbsp;&nbsp;&nbsp;
+License along with this library; if not, write to the Free Software<br> &nbsp;&nbsp;&nbsp;
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA&nbsp; 02111-1307&nbsp;
+USA<br> <br> Also add information on how to contact you by electronic and
+paper mail.<br> <br> You should also get your employer (if you work as a programmer)
+or your<br> school, if any, to sign a "copyright disclaimer" for the library,
+if<br> necessary.&nbsp; Here is a sample; alter the names:<br> <br> &nbsp;
+Yoyodyne, Inc., hereby disclaims all copyright interest in the<br> &nbsp;
+library `Frob' (a library for tweaking knobs) written by James Random Hacker.<br> <br> &nbsp;
+&lt;signature of Ty Coon>, 1 April 1990<br> &nbsp; Ty Coon, President of Vice<br> <br> That's
+all there is to it!<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <br> &nbsp;&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GNU Free Documentation
+License<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; Version 1.2, November
+2002<br> <br> <br> &nbsp;Copyright (C) 2000,2001,2002&nbsp; Free Software
+Foundation, Inc.<br> &nbsp;&nbsp;&nbsp;&nbsp; 59 Temple Place, Suite 330,
+Boston, MA&nbsp; 02111-1307&nbsp; USA<br> &nbsp;Everyone is permitted to copy
+and distribute verbatim copies<br> &nbsp;of this license document, but changing
+it is not allowed.<br> <br> <br> 0. PREAMBLE<br> <br> The purpose of this
+License is to make a manual, textbook, or other<br> functional and useful
+document "free" in the sense of freedom: to<br> assure everyone the effective
+freedom to copy and redistribute it,<br> with or without modifying it, either
+commercially or noncommercially.<br> Secondarily, this License preserves for
+the author and publisher a way<br> to get credit for their work, while not
+being considered responsible<br> for modifications made by others.<br> <br> This
+License is a kind of "copyleft", which means that derivative<br> works of
+the document must themselves be free in the same sense.&nbsp; It<br> complements
+the GNU General Public License, which is a copyleft<br> license designed for
+free software.<br> <br> We have designed this License in order to use it for
+manuals for free<br> software, because free software needs free documentation:
+a free<br> program should come with manuals providing the same freedoms that
+the<br> software does.&nbsp; But this License is not limited to software manuals;<br> it
+can be used for any textual work, regardless of subject matter or<br> whether
+it is published as a printed book.&nbsp; We recommend this License<br> principally
+for works whose purpose is instruction or reference.<br> <br> <br> 1. APPLICABILITY
+AND DEFINITIONS<br> <br> This License applies to any manual or other work,
+in any medium, that<br> contains a notice placed by the copyright holder saying
+it can be<br> distributed under the terms of this License.&nbsp; Such a notice
+grants a<br> world-wide, royalty-free license, unlimited in duration, to use
+that<br> work under the conditions stated herein.&nbsp; The "Document", below,<br> refers
+to any such manual or work.&nbsp; Any member of the public is a<br> licensee,
+and is addressed as "you".&nbsp; You accept the license if you<br> copy, modify
+or distribute the work in a way requiring permission<br> under copyright law.<br> <br> A
+"Modified Version" of the Document means any work containing the<br> Document
+or a portion of it, either copied verbatim, or with<br> modifications and/or
+translated into another language.<br> <br> A "Secondary Section" is a named
+appendix or a front-matter section of<br> the Document that deals exclusively
+with the relationship of the<br> publishers or authors of the Document to
+the Document's overall subject<br> (or to related matters) and contains nothing
+that could fall directly<br> within that overall subject.&nbsp; (Thus, if
+the Document is in part a<br> textbook of mathematics, a Secondary Section
+may not explain any<br> mathematics.)&nbsp; The relationship could be a matter
+of historical<br> connection with the subject or with related matters, or
+of legal,<br> commercial, philosophical, ethical or political position regarding<br> them.<br> <br> The
+"Invariant Sections" are certain Secondary Sections whose titles<br> are designated,
+as being those of Invariant Sections, in the notice<br> that says that the
+Document is released under this License.&nbsp; If a<br> section does not fit
+the above definition of Secondary then it is not<br> allowed to be designated
+as Invariant.&nbsp; The Document may contain zero<br> Invariant Sections.&nbsp;
+If the Document does not identify any Invariant<br> Sections then there are
+none.<br> <br> The "Cover Texts" are certain short passages of text that are
+listed,<br> as Front-Cover Texts or Back-Cover Texts, in the notice that says
+that<br> the Document is released under this License.&nbsp; A Front-Cover
+Text may<br> be at most 5 words, and a Back-Cover Text may be at most 25 words.<br> <br> A
+"Transparent" copy of the Document means a machine-readable copy,<br> represented
+in a format whose specification is available to the<br> general public, that
+is suitable for revising the document<br> straightforwardly with generic text
+editors or (for images composed of<br> pixels) generic paint programs or (for
+drawings) some widely available<br> drawing editor, and that is suitable for
+input to text formatters or<br> for automatic translation to a variety of
+formats suitable for input<br> to text formatters.&nbsp; A copy made in an
+otherwise Transparent file<br> format whose markup, or absence of markup,
+has been arranged to thwart<br> or discourage subsequent modification by readers
+is not Transparent.<br> An image format is not Transparent if used for any
+substantial amount<br> of text.&nbsp; A copy that is not "Transparent" is
+called "Opaque".<br> <br> Examples of suitable formats for Transparent copies
+include plain<br> ASCII without markup, Texinfo input format, LaTeX input
+format, SGML<br> or XML using a publicly available DTD, and standard-conforming
+simple<br> HTML, PostScript or PDF designed for human modification.&nbsp;
+Examples of<br> transparent image formats include PNG, XCF and JPG.&nbsp;
+Opaque formats<br> include proprietary formats that can be read and edited
+only by<br> proprietary word processors, SGML or XML for which the DTD and/or<br> processing
+tools are not generally available, and the<br> machine-generated HTML, PostScript
+or PDF produced by some word<br> processors for output purposes only.<br> <br> The
+"Title Page" means, for a printed book, the title page itself,<br> plus such
+following pages as are needed to hold, legibly, the material<br> this License
+requires to appear in the title page.&nbsp; For works in<br> formats which
+do not have any title page as such, "Title Page" means<br> the text near the
+most prominent appearance of the work's title,<br> preceding the beginning
+of the body of the text.<br> <br> A section "Entitled XYZ" means a named subunit
+of the Document whose<br> title either is precisely XYZ or contains XYZ in
+parentheses following<br> text that translates XYZ in another language.&nbsp;
+(Here XYZ stands for a<br> specific section name mentioned below, such as
+"Acknowledgements",<br> "Dedications", "Endorsements", or "History".)&nbsp;
+To "Preserve the Title"<br> of such a section when you modify the Document
+means that it remains a<br> section "Entitled XYZ" according to this definition.<br> <br> The
+Document may include Warranty Disclaimers next to the notice which<br> states
+that this License applies to the Document.&nbsp; These Warranty<br> Disclaimers
+are considered to be included by reference in this<br> License, but only as
+regards disclaiming warranties: any other<br> implication that these Warranty
+Disclaimers may have is void and has<br> no effect on the meaning of this
+License.<br> <br> <br> 2. VERBATIM COPYING<br> <br> You may copy and distribute
+the Document in any medium, either<br> commercially or noncommercially, provided
+that this License, the<br> copyright notices, and the license notice saying
+this License applies<br> to the Document are reproduced in all copies, and
+that you add no other<br> conditions whatsoever to those of this License.&nbsp;
+You may not use<br> technical measures to obstruct or control the reading
+or further<br> copying of the copies you make or distribute.&nbsp; However,
+you may accept<br> compensation in exchange for copies.&nbsp; If you distribute
+a large enough<br> number of copies you must also follow the conditions in
+section 3.<br> <br> You may also lend copies, under the same conditions stated
+above, and<br> you may publicly display copies.<br> <br> <br> 3. COPYING IN
+QUANTITY<br> <br> If you publish printed copies (or copies in media that commonly
+have<br> printed covers) of the Document, numbering more than 100, and the<br> Document's
+license notice requires Cover Texts, you must enclose the<br> copies in covers
+that carry, clearly and legibly, all these Cover<br> Texts: Front-Cover Texts
+on the front cover, and Back-Cover Texts on<br> the back cover.&nbsp; Both
+covers must also clearly and legibly identify<br> you as the publisher of
+these copies.&nbsp; The front cover must present<br> the full title with all
+words of the title equally prominent and<br> visible.&nbsp; You may add other
+material on the covers in addition.<br> Copying with changes limited to the
+covers, as long as they preserve<br> the title of the Document and satisfy
+these conditions, can be treated<br> as verbatim copying in other respects.<br> <br> If
+the required texts for either cover are too voluminous to fit<br> legibly,
+you should put the first ones listed (as many as fit<br> reasonably) on the
+actual cover, and continue the rest onto adjacent<br> pages.<br> <br> If you
+publish or distribute Opaque copies of the Document numbering<br> more than
+100, you must either include a machine-readable Transparent<br> copy along
+with each Opaque copy, or state in or with each Opaque copy<br> a computer-network
+location from which the general network-using<br> public has access to download
+using public-standard network protocols<br> a complete Transparent copy of
+the Document, free of added material.<br> If you use the latter option, you
+must take reasonably prudent steps,<br> when you begin distribution of Opaque
+copies in quantity, to ensure<br> that this Transparent copy will remain thus
+accessible at the stated<br> location until at least one year after the last
+time you distribute an<br> Opaque copy (directly or through your agents or
+retailers) of that<br> edition to the public.<br> <br> It is requested, but
+not required, that you contact the authors of the<br> Document well before
+redistributing any large number of copies, to give<br> them a chance to provide
+you with an updated version of the Document.<br> <br> <br> 4. MODIFICATIONS<br> <br> You
+may copy and distribute a Modified Version of the Document under<br> the conditions
+of sections 2 and 3 above, provided that you release<br> the Modified Version
+under precisely this License, with the Modified<br> Version filling the role
+of the Document, thus licensing distribution<br> and modification of the Modified
+Version to whoever possesses a copy<br> of it.&nbsp; In addition, you must
+do these things in the Modified Version:<br> <br> A. Use in the Title Page
+(and on the covers, if any) a title distinct<br> &nbsp;&nbsp; from that of
+the Document, and from those of previous versions<br> &nbsp;&nbsp; (which
+should, if there were any, be listed in the History section<br> &nbsp;&nbsp;
+of the Document).&nbsp; You may use the same title as a previous version<br> &nbsp;&nbsp;
+if the original publisher of that version gives permission.<br> B. List on
+the Title Page, as authors, one or more persons or entities<br> &nbsp;&nbsp;
+responsible for authorship of the modifications in the Modified<br> &nbsp;&nbsp;
+Version, together with at least five of the principal authors of the<br> &nbsp;&nbsp;
+Document (all of its principal authors, if it has fewer than five),<br> &nbsp;&nbsp;
+unless they release you from this requirement.<br> C. State on the Title page
+the name of the publisher of the<br> &nbsp;&nbsp; Modified Version, as the
+publisher.<br> D. Preserve all the copyright notices of the Document.<br> E.
+Add an appropriate copyright notice for your modifications<br> &nbsp;&nbsp;
+adjacent to the other copyright notices.<br> F. Include, immediately after
+the copyright notices, a license notice<br> &nbsp;&nbsp; giving the public
+permission to use the Modified Version under the<br> &nbsp;&nbsp; terms of
+this License, in the form shown in the Addendum below.<br> G. Preserve in
+that license notice the full lists of Invariant Sections<br> &nbsp;&nbsp;
+and required Cover Texts given in the Document's license notice.<br> H. Include
+an unaltered copy of this License.<br> I. Preserve the section Entitled "History",
+Preserve its Title, and add<br> &nbsp;&nbsp; to it an item stating at least
+the title, year, new authors, and<br> &nbsp;&nbsp; publisher of the Modified
+Version as given on the Title Page.&nbsp; If<br> &nbsp;&nbsp; there is no
+section Entitled "History" in the Document, create one<br> &nbsp;&nbsp; stating
+the title, year, authors, and publisher of the Document as<br> &nbsp;&nbsp;
+given on its Title Page, then add an item describing the Modified<br> &nbsp;&nbsp;
+Version as stated in the previous sentence.<br> J. Preserve the network location,
+if any, given in the Document for<br> &nbsp;&nbsp; public access to a Transparent
+copy of the Document, and likewise<br> &nbsp;&nbsp; the network locations
+given in the Document for previous versions<br> &nbsp;&nbsp; it was based
+on.&nbsp; These may be placed in the "History" section.<br> &nbsp;&nbsp; You
+may omit a network location for a work that was published at<br> &nbsp;&nbsp;
+least four years before the Document itself, or if the original<br> &nbsp;&nbsp;
+publisher of the version it refers to gives permission.<br> K. For any section
+Entitled "Acknowledgements" or "Dedications",<br> &nbsp;&nbsp; Preserve the
+Title of the section, and preserve in the section all<br> &nbsp;&nbsp; the
+substance and tone of each of the contributor acknowledgements<br> &nbsp;&nbsp;
+and/or dedications given therein.<br> L. Preserve all the Invariant Sections
+of the Document,<br> &nbsp;&nbsp; unaltered in their text and in their titles.&nbsp;
+Section numbers<br> &nbsp;&nbsp; or the equivalent are not considered part
+of the section titles.<br> M. Delete any section Entitled "Endorsements".&nbsp;
+Such a section<br> &nbsp;&nbsp; may not be included in the Modified Version.<br> N.
+Do not retitle any existing section to be Entitled "Endorsements"<br> &nbsp;&nbsp;
+or to conflict in title with any Invariant Section.<br> O. Preserve any Warranty
+Disclaimers.<br> <br> If the Modified Version includes new front-matter sections
+or<br> appendices that qualify as Secondary Sections and contain no material<br> copied
+from the Document, you may at your option designate some or all<br> of these
+sections as invariant.&nbsp; To do this, add their titles to the<br> list
+of Invariant Sections in the Modified Version's license notice.<br> These
+titles must be distinct from any other section titles.<br> <br> You may add
+a section Entitled "Endorsements", provided it contains<br> nothing but endorsements
+of your Modified Version by various<br> parties--for example, statements of
+peer review or that the text has<br> been approved by an organization as the
+authoritative definition of a<br> standard.<br> <br> You may add a passage
+of up to five words as a Front-Cover Text, and a<br> passage of up to 25 words
+as a Back-Cover Text, to the end of the list<br> of Cover Texts in the Modified
+Version.&nbsp; Only one passage of<br> Front-Cover Text and one of Back-Cover
+Text may be added by (or<br> through arrangements made by) any one entity.&nbsp;
+If the Document already<br> includes a cover text for the same cover, previously
+added by you or<br> by arrangement made by the same entity you are acting
+on behalf of,<br> you may not add another; but you may replace the old one,
+on explicit<br> permission from the previous publisher that added the old
+one.<br> <br> The author(s) and publisher(s) of the Document do not by this
+License<br> give permission to use their names for publicity for or to assert
+or<br> imply endorsement of any Modified Version.<br> <br> <br> 5. COMBINING
+DOCUMENTS<br> <br> You may combine the Document with other documents released
+under this<br> License, under the terms defined in section 4 above for modified<br> versions,
+provided that you include in the combination all of the<br> Invariant Sections
+of all of the original documents, unmodified, and<br> list them all as Invariant
+Sections of your combined work in its<br> license notice, and that you preserve
+all their Warranty Disclaimers.<br> <br> The combined work need only contain
+one copy of this License, and<br> multiple identical Invariant Sections may
+be replaced with a single<br> copy.&nbsp; If there are multiple Invariant
+Sections with the same name but<br> different contents, make the title of
+each such section unique by<br> adding at the end of it, in parentheses, the
+name of the original<br> author or publisher of that section if known, or
+else a unique number.<br> Make the same adjustment to the section titles in
+the list of<br> Invariant Sections in the license notice of the combined work.<br> <br> In
+the combination, you must combine any sections Entitled "History"<br> in the
+various original documents, forming one section Entitled<br> "History"; likewise
+combine any sections Entitled "Acknowledgements",<br> and any sections Entitled
+"Dedications".&nbsp; You must delete all sections<br> Entitled "Endorsements".<br> <br> <br> 6.
+COLLECTIONS OF DOCUMENTS<br> <br> You may make a collection consisting of
+the Document and other documents<br> released under this License, and replace
+the individual copies of this<br> License in the various documents with a
+single copy that is included in<br> the collection, provided that you follow
+the rules of this License for<br> verbatim copying of each of the documents
+in all other respects.<br> <br> You may extract a single document from such
+a collection, and distribute<br> it individually under this License, provided
+you insert a copy of this<br> License into the extracted document, and follow
+this License in all<br> other respects regarding verbatim copying of that
+document.<br> <br> <br> 7. AGGREGATION WITH INDEPENDENT WORKS<br> <br> A compilation
+of the Document or its derivatives with other separate<br> and independent
+documents or works, in or on a volume of a storage or<br> distribution medium,
+is called an "aggregate" if the copyright<br> resulting from the compilation
+is not used to limit the legal rights<br> of the compilation's users beyond
+what the individual works permit.<br> When the Document is included in an
+aggregate, this License does not<br> apply to the other works in the aggregate
+which are not themselves<br> derivative works of the Document.<br> <br> If
+the Cover Text requirement of section 3 is applicable to these<br> copies
+of the Document, then if the Document is less than one half of<br> the entire
+aggregate, the Document's Cover Texts may be placed on<br> covers that bracket
+the Document within the aggregate, or the<br> electronic equivalent of covers
+if the Document is in electronic form.<br> Otherwise they must appear on printed
+covers that bracket the whole<br> aggregate.<br> <br> <br> 8. TRANSLATION<br> <br> Translation
+is considered a kind of modification, so you may<br> distribute translations
+of the Document under the terms of section 4.<br> Replacing Invariant Sections
+with translations requires special<br> permission from their copyright holders,
+but you may include<br> translations of some or all Invariant Sections in
+addition to the<br> original versions of these Invariant Sections.&nbsp; You
+may include a<br> translation of this License, and all the license notices
+in the<br> Document, and any Warranty Disclaimers, provided that you also
+include<br> the original English version of this License and the original
+versions<br> of those notices and disclaimers.&nbsp; In case of a disagreement
+between<br> the translation and the original version of this License or a
+notice<br> or disclaimer, the original version will prevail.<br> <br> If a
+section in the Document is Entitled "Acknowledgements",<br> "Dedications",
+or "History", the requirement (section 4) to Preserve<br> its Title (section
+1) will typically require changing the actual<br> title.<br> <br> <br> 9.
+TERMINATION<br> <br> You may not copy, modify, sublicense, or distribute the
+Document except<br> as expressly provided for under this License.&nbsp; Any
+other attempt to<br> copy, modify, sublicense or distribute the Document is
+void, and will<br> automatically terminate your rights under this License.&nbsp;
+However,<br> parties who have received copies, or rights, from you under this<br> License
+will not have their licenses terminated so long as such<br> parties remain
+in full compliance.<br> <br> <br> 10. FUTURE REVISIONS OF THIS LICENSE<br> <br> The
+Free Software Foundation may publish new, revised versions<br> of the GNU
+Free Documentation License from time to time.&nbsp; Such new<br> versions
+will be similar in spirit to the present version, but may<br> differ in detail
+to address new problems or concerns.&nbsp; See<br> http://www.gnu.org/copyleft/.<br> <br> Each
+version of the License is given a distinguishing version number.<br> If the
+Document specifies that a particular numbered version of this<br> License
+"or any later version" applies to it, you have the option of<br> following
+the terms and conditions either of that specified version or<br> of any later
+version that has been published (not as a draft) by the<br> Free Software
+Foundation.&nbsp; If the Document does not specify a version<br> number of
+this License, you may choose any version ever published (not<br> as a draft)
+by the Free Software Foundation.<br> <br> <br> ADDENDUM: How to use this License
+for your documents<br> <br> To use this License in a document you have written,
+include a copy of<br> the License in the document and put the following copyright
+and<br> license notices just after the title page:<br> <br> &nbsp;&nbsp;&nbsp;
+Copyright (c)&nbsp; YEAR&nbsp; YOUR NAME.<br> &nbsp;&nbsp;&nbsp; Permission
+is granted to copy, distribute and/or modify this document<br> &nbsp;&nbsp;&nbsp;
+under the terms of the GNU Free Documentation License, Version 1.2<br> &nbsp;&nbsp;&nbsp;
+or any later version published by the Free Software Foundation;<br> &nbsp;&nbsp;&nbsp;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.<br> &nbsp;&nbsp;&nbsp;
+A copy of the license is included in the section entitled "GNU<br> &nbsp;&nbsp;&nbsp;
+Free Documentation License".<br> <br> If you have Invariant Sections, Front-Cover
+Texts and Back-Cover Texts,<br> replace the "with...Texts." line with this:<br> <br> &nbsp;&nbsp;&nbsp;
+with the Invariant Sections being LIST THEIR TITLES, with the<br> &nbsp;&nbsp;&nbsp;
+Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.<br> <br> If
+you have Invariant Sections without Cover Texts, or some other<br> combination
+of the three, merge those two alternatives to suit the<br> situation.<br> <br> If
+your document contains nontrivial examples of program code, we<br> recommend
+releasing these examples in parallel under your choice of<br> free software
+license, such as the GNU General Public License,<br> to permit their use in
+free software.<small><small><br></small></small></p>
+<p># Copyright (c) 1987 Regents of the University of California.</p>
+<p># All rights reserved.</p>
+<p>#</p>
+<p># Redistribution and use in source and binary forms are permitted</p>
+<p># provided that the above copyright notice and this paragraph are</p>
+<p># duplicated in all such forms and that any documentation,</p>
+<p># advertising materials, and other materials related to such</p>
+<p># distribution and use acknowledge that the software was developed</p>
+<p># by the University of California, Berkeley. The name of the</p>
+<p># University may not be used to endorse or promote products derived</p>
+<p># from this software without specific prior written permission.</p>
+<p># THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR</p>
+<p># IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED</p>
+<p># WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+<p></p>
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/build.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,25 @@
+#
+# 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 the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               icons/,\
+               os/,\
+               about.html,\
+               resources/,\
+               .
+source.. = src/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/ccbuild.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.appdep" 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.appdep"/>
+	<property name="feature.project.name" value="com.nokia.carbide.extensions.appdep"/>
+	<property name="feature.name" value="DependencyExplorer"/>
+		
+	<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.appdep.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.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="${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}"/>
+	</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"/>
+			
+			<!-- XML output -->
+			<formatter type="html" toFile="${reports.folder}/report.pmd.html"/>
+			
+			<!-- 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">
+		<!-- Create JAR -->
+		<delete dir="binaries"/>
+		<mkdir dir="binaries"/>
+		
+		<copy todir="binaries" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}">
+							<include name="com/**"/>
+					    <include name="icons/**"/>
+					    <include name="META-INF/**"/>
+					    <include name="os/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="resources/**"/> 
+				</fileset>
+		</copy>
+		
+		<zip destfile="${binaries.folder}/${jar.filename}" basedir="binaries" />
+	</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="${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="${binaries.folder}/nightly_builds/${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}"/>
+		   	
+    		<!-- Normal class files -->
+    		<pathelement path="${binaries.folder}/${jar.filename}"/>
+    		
+		   	<!-- 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" />
+	   	<jvmarg value="-D_S60TOOLS_WS_PATH=C:\hudson\jobs\Dependency Explorer\workspace\trunk" />
+			<jvmarg value="-Xms32m" />
+			<jvmarg value="-Xmx512m" />
+			
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.appdep.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" />
+            	<html outfile="${reports.emma}/coverage.html" />
+        	</report>
+	    </emma>
+	     
+	<copy todir="${binaries.folder}/reports" failonerror="true" overwrite="true">
+			<fileset dir="${reports.folder}" />
+	</copy>
+	    
+	<exec executable="svn" dir="${binaries.folder}/reports">
+			<arg line="add *"/>
+	</exec>
+	<exec executable="svn" dir="${binaries.folder}/reports/emma">
+			<arg line="add *"/>
+	</exec>
+	<exec executable="svn" dir="${binaries.folder}/reports">
+			<arg line="commit -m 'Updated reports.'"/>
+		</exec>
+	</target>
+	
+	<!-- Clean target -->
+	<target name="clean" description="Clean">
+		<delete>
+			<fileset dir="binaries"/>
+			<fileset dir="com"/>
+			<fileset dir="instr"/>
+		</delete>
+	</target>
+	
+	<target name="cc" depends="jar, analyze, feature, test, clean" description="Build, instrument, run unit tests and analyze code"/>
+</project>
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/appdep.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/appdep_wizard_banner.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_bind.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_error.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_link.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/bin_obj_warning.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cache_update.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cache_warning.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/cached_target.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/collapse_all.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/expand_all.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/expand_subtree.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/find.PNG has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/folder_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/folder_obj_err.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/function_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/is_used_by_action.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/new_root_action.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/non_cached_target.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/not_supported_target.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/root_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/root_obj_error.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/search.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/select_sdk_action.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_green_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_red_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/traffic_light_yellow_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/icons/virtual_func_obj.png has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/os/win32/x86/appdep.exe has changed
Binary file srcanaapps/depexplorer/com.nokia.s60tools.appdep/os/win32/x86/cfilt.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/plugin.xml	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   
+    <extension
+      point="org.eclipse.core.runtime.products"
+      id="product">      
+      <product name="Dependency Explorer" application="org.eclipse.ui.ide.workbench" > 
+          <property name="appName" value="Carbide.c++ Extensions - Dependency Explorer"/> 
+     </product> 
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            description="Dependency Explorer Tool&apos;s Actions"
+            id="com.nokia.s60tools.appdep.ui.actionSet"
+            label="Dependency Explorer Tool"
+            visible="true">
+         <action
+               class="com.nokia.s60tools.appdep.ui.actions.ToolbarShortcutAction"
+               icon="icons/appdep.png"
+               id="com.nokia.s60tools.appdep.ui.actions.ToolbarShortcutAction"
+               label="&amp;Dependency Explorer"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               tooltip="Dependency Explorer">
+         </action>
+         <menu
+       			id="com.nokia.carbide.cpp.ui.CarbideMenu"
+       			label="&amp;Carbide"
+       			path="additions">
+       			<groupMarker name="additions"/>
+     		</menu>
+      </actionSet>
+   </extension>
+      
+   <extension
+         point="org.eclipse.ui.views">
+      <category
+            id="com.nokia.s60tools"
+            name="Carbide Extensions"/>
+      <view
+            category="com.nokia.s60tools"
+            class="com.nokia.s60tools.appdep.ui.views.main.MainView"
+            icon="icons/appdep.png"
+            id="com.nokia.s60tools.appdep.ui.views.main.MainView"
+            name="Dependency Explorer"/>
+      <view
+            class="com.nokia.s60tools.appdep.ui.views.listview.ListView"
+            id="com.nokia.s60tools.appdep.ui.views.listview.ListView"
+            name="Component List"/>
+   </extension>
+   
+       <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            name="Dependecy Explorer Preferences"
+            class="com.nokia.s60tools.appdep.ui.preferences.DEPreferencePage"
+            category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage"
+            id="com.nokia.s60tools.appdep.ui.preferences.DEPreferencePage">
+      </page>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/resources/IsUsedByReport.xsl	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:lxslt="http://xml.apache.org/xslt">
+
+	<!-- 
+	*******************************************************************************
+	* 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 the License "Symbian Foundation License v1.0"
+	* which accompanies this distribution, and is available
+	* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+	*
+	* Initial Contributors:
+	* Nokia Corporation - initial contribution.
+	*
+	* Contributors:
+	*
+	* Description:
+	*******************************************************************************
+	-->  
+
+<xsl:template match="/">
+  <html>
+  <head>
+  
+	  <title>  
+	    <xsl:value-of select="report/isUsedByData/component/@name"/> is used by;
+		SDK Name: <xsl:value-of select="report/info/sdk/@name"/>
+		Target:  <xsl:value-of select="report/info/sdk/@target"/>
+		Build: <xsl:value-of select="report/info/sdk/@build"/>		
+	  </title>
+  
+
+	<!-- 
+	*******************************************************************************
+	*
+	* Styles
+	*	
+	*******************************************************************************
+	-->  
+  
+  	<style type="text/css">
+
+	body {
+		background-color: white;
+		font-family: Verdana;
+		font-size: 10px;
+	}
+	p {
+		font-family="Verdana";
+		font-size: 10px;
+	}
+	p.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+	td {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: left;
+	}
+	td.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+
+	th {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}
+	th.properties {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;
+		width: 90px;		
+	}
+	
+	th.isUsedBy {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}	
+	th.isUsedBySorted {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;	
+		background-color: silver;	
+	}	
+	
+	caption {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal;
+		font-style: italic;
+		text-align: left;
+		
+	}	
+	dt {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal
+		text-align: left;
+	}	
+	
+	h1 {
+		font-family="Verdana";
+		font-size: 18px;
+	}		
+	h2 {
+		font-family="Verdana";
+		font-size: 16px;
+	}		
+	h3 {
+		font-family="Verdana";
+		font-size: 14px;
+	}		
+	h4 {
+		font-family="Verdana";
+		font-size: 12px;
+	}	
+ 	h5 {
+		font-family="Verdana";
+		font-size: 11px;
+	}
+
+
+
+	</style>
+
+  	
+  </head>
+  <body>
+  			
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Report information "Header"
+	*	
+	*******************************************************************************
+	-->
+  
+  <a name="top"></a>
+  
+  <h2>Report information</h2>  
+  	
+    <table border="0" cellspacing="1" cellpadding="3">
+	    <tr><th>SDK Name </th><td> <xsl:value-of select="report/info/sdk/@name"/></td></tr>
+	    <tr><th>Target </th><td> <xsl:value-of select="report/info/sdk/@target"/></td></tr>
+	    <tr><th>Build </th><td> <xsl:value-of select="report/info/sdk/@build"/></td></tr>
+	    <tr><th>Component </th><td> <xsl:value-of select="report/isUsedByData/component/@name"/></td></tr>
+	</table>
+         
+
+  
+  <hr></hr>
+    
+  <h2><xsl:value-of select="report/isUsedByData/component/@name"/> is used by</h2>
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Report information "Header"
+	*	
+	*******************************************************************************
+	-->  
+  
+	<xsl:variable name="sortCriteria">
+		<xsl:value-of select="report/isUsedByData/component/@sortCriteria"/> 
+	</xsl:variable> 
+	
+	
+  <table border="1" cellspacing="0" cellpadding="0" width="100%">	
+  	<tr>
+  	
+		<!--
+			public static final int CRITERIA_NAME = 1;
+			public static final int CRITERIA_BIN_FORMAT = 2;
+			public static final int CRITERIA_UID1 = 3;
+			public static final int CRITERIA_UID2 = 4;
+			public static final int CRITERIA_UID3 = 5;
+			public static final int CRITERIA_SECURE_ID = 6;
+			public static final int CRITERIA_VENDOR_ID = 7;
+			public static final int CRITERIA_MIN_HEAP = 8;
+			public static final int CRITERIA_MAX_HEAP = 9;
+			public static final int CRITERIA_STACK_SIZE = 10;
+		-->
+  	  	
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='1'">	    	
+				<th class="isUsedBySorted">Filename</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+				<th class="isUsedBy">Filename</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='2'">	    	
+				<th class="isUsedBySorted">Binary format</th>
+			</xsl:when>
+			<xsl:otherwise>	    	
+				<th class="isUsedBy">Binary format</th>	    											
+			</xsl:otherwise>
+		</xsl:choose>    	
+		    	    	
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='3'">	    	
+				<th class="isUsedBySorted">UID1</th>
+			</xsl:when>
+			<xsl:otherwise>	  
+				<th class="isUsedBy">UID1</th>  		    											
+			</xsl:otherwise>
+		</xsl:choose>    	
+    	    	
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='4'">	    	
+				<th class="isUsedBySorted">UID2</th>
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+				<th class="isUsedBy">UID2</th>
+			</xsl:otherwise>
+		</xsl:choose>    	    	    	
+    	
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='5'">	    	
+			<th class="isUsedBySorted">UID3</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">UID3</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+    	    	
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='6'">	    	
+			<th class="isUsedBySorted">Secure ID</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">Secure ID</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='7'">	    	
+			<th class="isUsedBySorted">Vendor ID</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">Vendor ID</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='8'">	    	
+			<th class="isUsedBySorted">Min Heap Size</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">Min Heap Size</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='9'">	    	
+			<th class="isUsedBySorted">Max Heap Size</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">Max Heap Size</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+		<xsl:choose>
+			<xsl:when test="$sortCriteria='10'">	    	
+			<th class="isUsedBySorted">Stack Size</th>	
+			</xsl:when>
+			<xsl:otherwise>	    		    								
+			<th class="isUsedBy">Stack Size</th>
+			</xsl:otherwise>
+		</xsl:choose>    	
+
+    </tr>
+    			
+    <xsl:for-each select="report/isUsedByData/component/isUsedBy">
+		<tr>
+			<td><xsl:value-of select="./Filename"/></td>
+		    <td><xsl:value-of select="./Binary_format"/></td>
+		    <td><xsl:value-of select="./UID1"/></td>
+		    <td><xsl:value-of select="./UID2"/></td>	    		
+		    <td><xsl:value-of select="./UID3"/></td>
+		    <td><xsl:value-of select="./Secure_ID"/></td>
+		    <td><xsl:value-of select="./Vendor_ID"/></td>
+		    <td><xsl:value-of select="./Min_Heap_Size"/></td>
+		    <td><xsl:value-of select="./Max_Heap_Size"/></td>
+		    <td><xsl:value-of select="./Stack_Size"/></td>
+		</tr>
+	</xsl:for-each>    
+
+	    			    		
+  </table>   
+
+  </body>
+  </html>
+
+</xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/resources/PrintReport.xsl	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:lxslt="http://xml.apache.org/xslt">
+
+	<!-- 
+	*******************************************************************************
+	* 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 the License "Symbian Foundation License v1.0"
+	* which accompanies this distribution, and is available
+	* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+	*
+	* Initial Contributors:
+	* Nokia Corporation - initial contribution.
+	*
+	* Contributors:
+	*
+	* Description:
+	*******************************************************************************
+	-->
+
+<xsl:template match="/">
+  <html>
+  <head>
+  
+	  <title>  
+		SDK Name: <xsl:value-of select="report/info/sdk/@name"/>
+		Target:  <xsl:value-of select="report/info/sdk/@target"/>
+		Build: <xsl:value-of select="report/info/sdk/@build"/>
+		Root component: <xsl:value-of select="report/components/rootComponent/@name"/>  
+	  </title>
+  
+
+	<!-- 
+	*******************************************************************************
+	*
+	* Styles
+	*	
+	*******************************************************************************
+	-->  
+  
+  	<style type="text/css">
+
+	body {
+		background-color: white;
+		font-family: Verdana;
+		font-size: 10px;
+	}
+	p {
+		font-family="Verdana";
+		font-size: 10px;
+	}
+	p.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+	td {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: left;
+	}
+	td.right {
+		font-family="Verdana";
+		font-size: 10px;
+		text-align: right;
+	}
+
+	th {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}
+	th.properties {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;
+		width: 90px;		
+	}
+	
+	th.isUsedBy {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;		
+	}	
+	th.isUsedBySorted {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: bold;
+		text-align: left;	
+		background-color: silver;	
+	}	
+	
+	caption {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal;
+		font-style: italic;
+		text-align: left;
+		
+	}	
+	dt {
+		font-family="Verdana";
+		font-size: 10px;
+		font-weight: normal
+		text-align: left;
+	}	
+	
+	h1 {
+		font-family="Verdana";
+		font-size: 18px;
+	}		
+	h2 {
+		font-family="Verdana";
+		font-size: 16px;
+	}		
+	h3 {
+		font-family="Verdana";
+		font-size: 14px;
+	}		
+	h4 {
+		font-family="Verdana";
+		font-size: 12px;
+	}	
+ 	h5 {
+		font-family="Verdana";
+		font-size: 11px;
+	}
+
+
+	</style>
+
+  
+	
+	
+  </head>
+  <body>
+  			
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Report information "Header"
+	*	
+	*******************************************************************************
+	-->
+  
+  <a name="top"></a>
+  
+  <h2>Report information</h2>  
+  	
+    <table border="0" cellspacing="1" cellpadding="3">
+	    <tr><th>SDK Name </th><td> <xsl:value-of select="report/info/sdk/@name"/></td></tr>
+	    <tr><th>Target </th><td> <xsl:value-of select="report/info/sdk/@target"/></td></tr>
+	    <tr><th>Build </th><td> <xsl:value-of select="report/info/sdk/@build"/></td></tr>
+	    <tr><th>Root component </th><td> <xsl:value-of select="report/components/rootComponent/@name"/></td></tr>
+	</table>
+         
+  <hr></hr>
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Table of contents
+	*	
+	*******************************************************************************
+	-->
+    <h2>Table of contents</h2>
+    <dl>
+	<dd><b><a href="#components">Components</a></b></dd>
+	<dl>
+	    <xsl:for-each select="report/components/rootComponent">
+	      
+	    	<!-- 
+	    		Calling templates for recursively tructure (nested looping)
+	    		@see </xsl:template> <xsl:template match="component"> part at end of file
+	    	 -->
+	    	<xsl:apply-templates mode="TOC"/>         	    
+	  
+	  	</xsl:for-each>  		
+
+	</dl>
+	<dd><b><a href="#properties">Properties</a></b></dd>
+	<dd><b><a href="#exportedFunctions">Exported functions</a></b></dd>
+	
+	</dl>
+
+	
+  
+  <hr></hr>
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Components
+	*	
+	*******************************************************************************
+	-->
+  	<a name="components"></a>
+  	<h2>Components</h2>
+    <xsl:for-each select="report/components/rootComponent">
+         	
+    	<!-- 
+    		Calling templates for recursively tructure (nested looping)
+    		@see </xsl:template> <xsl:template match="component"> part at end of file
+    	 -->
+    	
+    	<xsl:apply-templates mode="COMPONENTS"/>   
+  
+  	</xsl:for-each>  
+  
+  	<hr></hr>
+  
+ 
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Part for properties
+	*	
+	*******************************************************************************
+	-->
+  
+  <hr></hr>
+  
+  <a name="properties"></a>  
+  <h2>Properties</h2>
+  
+  <xsl:for-each select="report/properties/component">
+  
+	<xsl:variable name="propertyName">
+		<xsl:value-of select="@name"/>
+	</xsl:variable> 
+	
+	  
+  	<dl>
+
+  		<dt>
+  			<table border="0" cellspacing="0" cellpadding="0" width="100%">
+  				<tr>
+  					<td>
+  						<!-- if component founds as parent in this report showing link to it -->
+				    	<xsl:choose>
+							<xsl:when test="@foundAsParent='true'">	    	
+								<a href="#{$propertyName}"><xsl:value-of select="$propertyName"/> </a>
+			          		</xsl:when>
+			          		<!-- Otherwise showing only its name -->
+			          		<xsl:otherwise>	    		    								
+								<xsl:value-of select="$propertyName"/>
+				          </xsl:otherwise>
+			    	    </xsl:choose>  					
+  					
+  						
+  						<a name="property_{$propertyName}"></a>  						
+			    	    <!-- Links to exported functions -->
+			    	    &#160;&#160;
+			    	    <i><a href="#exportedFunction_{$propertyName}">&#60;Exported functions&#62;</a></i>
+  						
+  					</td>
+  				<td class="right"><a href="#top">Top</a></td></tr>
+  			</table>
+  		</dt>
+  		<dd>
+    		<table border="1" cellspacing="0" cellpadding="0" width="400px">	
+	    		<tr><th class="properties">Directory</th><td><xsl:value-of select="./directory"/></td></tr>
+	    		<tr><th class="properties">Filename</th><td><xsl:value-of select="./filename"/></td></tr>
+	    		<tr><th class="properties">BinaryFormat</th><td><xsl:value-of select="./binaryFormat"/></td></tr>
+	    		<tr><th class="properties">UID1</th><td><xsl:value-of select="./UID1"/></td></tr>
+	    		<tr><th class="properties">UID2</th><td><xsl:value-of select="./UID2"/></td></tr>	    		
+	    		<tr><th class="properties">UID3</th><td><xsl:value-of select="./UID3"/></td></tr>
+	    		<tr><th class="properties">Secure ID</th><td><xsl:value-of select="./secureID"/></td></tr>
+	    		<tr><th class="properties">Vendor ID</th><td><xsl:value-of select="./vendorID"/></td></tr>
+	    		<tr><th class="properties">Capabilities</th><td><xsl:value-of select="./capabilities"/></td></tr>
+	    		<tr><th class="properties">Min Heap Size</th><td><xsl:value-of select="./minHeapSize"/></td></tr>
+	    		<tr><th class="properties">Max Heap Size</th><td><xsl:value-of select="./maxHeapSize"/></td></tr>
+	    		<tr><th class="properties">Stack Size</th><td><xsl:value-of select="./stackSize"/></td></tr>
+	    		<tr><th class="properties">Dll Ref Table Count</th><td><xsl:value-of select="./dllRefTableCount"/></td></tr>	    			    		
+	      	</table>   
+		</dd>
+  	</dl>		
+    
+  </xsl:for-each>     <!-- report/properties/component -->   
+
+  
+	<!-- 
+	*******************************************************************************
+	*
+	* Part for exported functions
+	*	
+	*******************************************************************************
+	-->
+  
+  <hr></hr>
+  <hr></hr>
+  
+  <a name="exportedFunctions"></a>  
+  <h2>Exported Functions</h2>
+  
+  <xsl:for-each select="report/exportedFunctions/component">
+  
+	<xsl:variable name="exporteFunctionName">
+		<xsl:value-of select="@name"/>
+	</xsl:variable> 
+  
+  	<dl>
+  		<!-- Header and anchor to this property -->
+  		<dt>
+  			<table border="0" cellspacing="0" cellpadding="0" width="100%">
+  				<tr>
+  					<td>
+  						<!-- if component founds as parent in this report showing link to it -->
+				    	<xsl:choose>
+							<xsl:when test="@foundAsParent='true'">	    	
+								<a href="#{$exporteFunctionName}"><xsl:value-of select="$exporteFunctionName"/> </a>
+			          		</xsl:when>
+			          		<!-- Otherwise showing only its name -->
+			          		<xsl:otherwise>	    		    								
+								<xsl:value-of select="$exporteFunctionName"/>
+				          </xsl:otherwise>
+			    	    </xsl:choose>    					  						
+  						
+  						<a name="exportedFunction_{$exporteFunctionName}"></a>
+			    	    <!-- Links to properties -->
+			    	    &#160;&#160;
+			    	    <i><a href="#property_{$exporteFunctionName}">&#60;Properties&#62;</a></i>
+  						
+  						</td>
+  					<td class="right"><a href="#top">Top</a></td>
+  				</tr>
+  			</table>
+  		</dt>
+  		<dd>
+    		<table border="1" cellspacing="0" cellpadding="0" width="400px">	
+    			<tr><th>Ordinal</th><th>Name</th></tr>
+    			<xsl:for-each select="function">
+	    			<tr>
+	    				<td width="45px"><xsl:value-of select="@ordinal"/></td>
+	    				<td><xsl:value-of select="@name"/></td>
+	    			</tr>
+	    		</xsl:for-each>     <!-- function -->     
+	      	</table>   
+		</dd>
+  	</dl>		
+    
+  </xsl:for-each>     <!-- report/properties/component -->     
+  
+    
+  </body>
+  </html>
+  
+  
+  
+</xsl:template>
+
+
+	<!-- 
+	*******************************************************************************
+	*
+	* Template to create components
+	*	
+	*******************************************************************************
+	-->
+
+      <xsl:template match="component" mode="COMPONENTS">
+      
+    	<dl>
+    		
+    		<!-- Creating component name -->    	
+	    	<dt>
+			<xsl:variable name="baseComponentName">
+		  		<xsl:value-of select="@name"/>
+			</xsl:variable>    	    	
+	    	<!-- if type is base, an ancor will be created for reference types to point it -->
+	    	<xsl:choose>
+				<xsl:when test="@type='base'">	    	
+	    			<a name="{$baseComponentName}"> 
+	    			
+	    			</a>
+	    			<b><xsl:value-of select="@name"/></b> 
+          		</xsl:when>
+          		<xsl:otherwise>	    		    
+					<!-- else if type is reference, an link will be created to point base -->    	  	
+	    			<a href="#{$baseComponentName}">	    			
+	    			<i> <b><xsl:value-of select="@name"/></b> </i>
+	    			</a>
+	          </xsl:otherwise>
+    	    </xsl:choose>
+    	    
+    	    <!-- Unique anchor for TOC -->
+			<xsl:variable name="fullName">
+		  		<xsl:value-of select="@fullName"/>
+			</xsl:variable>      	    
+			<a name="{$fullName}"></a>
+    	    
+    	    <!-- Links to properties and exported functions -->
+    	    &#160;&#160;
+    	    <i><a href="#property_{$baseComponentName}">&#60;Properties&#62;</a></i>
+    	    &#160;&#160;
+    	    <i><a href="#exportedFunction_{$baseComponentName}">&#60;Exported functions&#62;</a></i>
+			
+    	    </dt>
+    	  	<!-- Creating component name ends --> 
+			    	  	
+
+    	  	<dd>  	    	
+    	  		
+    			<table border="1" cellspacing="0" cellpadding="0">
+    			<caption>Imported functions</caption>	
+	    			<tr>
+	    			<th>Ordinal</th><th>Name</th><th>Offset</th>
+	    			</tr>
+	    	  
+		        	<xsl:for-each select="importedFunctions/function">
+		    			<tr>
+		    			
+				    	<xsl:choose>
+							<xsl:when test="@virtual='0'">
+								<!-- if offset is not set function is not virtual -->
+				        		<td><xsl:value-of select="@ordinal"/></td>
+					      		<td><xsl:value-of select="@name"/></td>
+					      		<td><xsl:value-of select="@offset"/>&#160; </td>			
+			          		</xsl:when>
+			          		<xsl:otherwise>	    		    
+								<!-- else function is virtual -->    	  	
+				        		<td><i><xsl:value-of select="@ordinal"/></i></td>
+					      		<td><i><xsl:value-of select="@name"/></i></td>
+					      		<td><i><xsl:value-of select="@offset"/>&#160; </i></td>
+								
+				          </xsl:otherwise>		    			
+						</xsl:choose>		    			
+						
+			      		</tr>
+		    		</xsl:for-each>      <!-- importedFunctions/function -->  
+	      		</table>    
+	      		<br></br>	    
+			</dd>
+			
+
+			<!-- Link to top align to right -->
+			<p class="right"><a href="#top">Top</a></p>
+			
+			<!-- 
+				Recursivily call same function until "<component>" -element found
+				Every <component> under <component> will be tabulated
+			-->	    	
+			
+	    	<dl>
+	    		<xsl:apply-templates mode="COMPONENTS"/>
+	    	</dl>
+	    	
+	    		    	        
+    	</dl>    	
+    	  		
+  		
+  	</xsl:template>
+
+	<!-- 
+	*******************************************************************************
+	*
+	* Template to create Table Of Contens for components, looping like 	
+	* components part, but not printing imported functions
+	*	
+	*******************************************************************************
+	-->  	
+  	
+      <xsl:template match="component" mode="TOC">
+      
+    	<dl>
+    			
+	    	<dt>
+			<xsl:variable name="baseComponentName">
+		  		<xsl:value-of select="@name"/>
+			</xsl:variable>    	 
+    	    <!-- Unique anchor for TOC -->
+			<xsl:variable name="fullName">
+		  		<xsl:value-of select="@fullName"/>
+			</xsl:variable>      	    
+						   	
+	    	<!-- if type is base, an link will be regular font -->  
+	    	<xsl:choose>
+				<xsl:when test="@type='base'">	    	
+	    			<a href="#{$fullName}">	    			
+	    			 <xsl:value-of select="@name"/>
+	    			</a>
+	    			
+          		</xsl:when>
+          		<xsl:otherwise>	    		    
+					<!-- else if type is reference, an link will be italic -->    	  	
+	    			<a href="#{$fullName}">	    			
+	    			<i> <xsl:value-of select="@name"/> </i>
+	    			</a>
+	          </xsl:otherwise>
+    	    </xsl:choose>
+    	    
+    	    </dt>
+
+			<!-- 
+				Recursivily call same function until "<component>" -element found
+				Every <component> under <component> will be tabulated
+			-->	    	
+	    	<dl>
+	    		<xsl:apply-templates mode="TOC"/>
+	    	</dl>
+	    	
+	    		    	        
+    	</dl>    	
+  		
+  		
+  	</xsl:template>
+  	
+  	
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/AppDepHelpContextIDs.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,90 @@
+/*
+* 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.appdep;
+
+/**
+ * IDs for context sensitive help.
+ * @see contexts.xml -file IDs links to <code> <context id="<ID>"> </code>
+ */
+public class AppDepHelpContextIDs {
+	/**
+     * Help plug-in ID the context sensitive help is applied to.
+     */	 
+    private static final String APPDEP_HELP_PROJECT_PLUGIN_ID = 
+                                        "com.nokia.s60tools.appdep.help"; //$NON-NLS-1$
+	
+    //
+    // Context-sensitive help IDs
+    //
+    
+    public static final String APPDEP_MAIN_VIEW = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID +".APPDEP_MAIN_VIEW"; //$NON-NLS-1$
+
+    public static final String APPDEP_COMPONENT_LIST_VIEW = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_COMPONENT_LIST_VIEW"; //$NON-NLS-1$
+  
+    public static final String APPDEP_IMPORTED_FUNCTIONS = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_IMPORTED_FUNCTIONS"; //$NON-NLS-1$
+
+    public static final String APPDEP_EXPORTED_FUNCTIONS = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_EXPORTED_FUNCTIONS"; //$NON-NLS-1$
+
+    public static final String APPDEP_PROPERTIES = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_PROPERTIES"; //$NON-NLS-1$
+  
+    public static final String APPDEP_DIALOG_ADD_SIS_FILES = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_DIALOG_ADD_SIS_FILES"; //$NON-NLS-1$
+
+    public static final String APPDEP_WIZARD_PAGE_SDK_SELECT = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_WIZARD_PAGE_SDK_SELECT"; //$NON-NLS-1$
+
+    public static final String APPDEP_WIZARD_PAGE_BUILD_TARGET_SELECT = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_WIZARD_PAGE_BUILD_TARGET_SELECT"; //$NON-NLS-1$
+
+    public static final String APPDEP_WIZARD_PAGE_CACHE_GEN_OPT = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_WIZARD_PAGE_CACHE_GEN_OPT"; //$NON-NLS-1$
+
+    public static final String APPDEP_WIZARD_PAGE_COMP_SELECT = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_WIZARD_PAGE_COMP_SELECT"; //$NON-NLS-1$
+
+    public static final String APPDEP_FIND_DIALOG = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_FIND_DIALOG"; //$NON-NLS-1$
+  
+    public static final String APPDEP_LOCATE_COMPONENT_DIALOG = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_LOCATE_COMPONENT_DIALOG"; //$NON-NLS-1$
+
+    public static final String APPDEP_SEARCH_DIALOG = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_SEARCH_DIALOG"; //$NON-NLS-1$
+  
+    public static final String APPDEP_PREF_PAGE = 
+		  APPDEP_HELP_PROJECT_PLUGIN_ID 
+		  +".APPDEP_PREF_PAGE"; //$NON-NLS-1$  
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/Product.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,39 @@
+/*
+* 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.appdep.common;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Product {
+	private static final String BUNDLE_NAME = "com.nokia.s60tools.appdep.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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/Product.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -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 the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+ProductInfoRegistry.Product_Name=Dependency Explorer
+ProductInfoRegistry.Console_Window_Name=Console
+ProductInfoRegistry.Cache_File_Name=appdep-cache_dependencies.txt
+ProductInfoRegistry.Cache_Temp_File_Name=appdep-temp.txt
+ProductInfoRegistry.Cache_Symbols_File_Name=appdep-cache_symbol_tables.txt
+ProductInfoRegistry.Images_Directory=icons
+ProductInfoRegistry.Binaries_Relative_Path=os\\win32\\x86
+ProductInfoRegistry.CFilt_Win32OS_Binary_Name=cfilt.exe
+ProductInfoRegistry.Core_Win32OS_Binary_Name=appdep
+ProductInfoRegistry.Resources_Directory=resources
+ProductInfoRegistry.Export_Report_Xsl_File_Name=PrintReport.xsl
+ProductInfoRegistry.Export_Report_IsUsedBy_Xsl_File_Name=IsUsedByReport.xsl
+ProductInfoRegistry.S60_RnD_Tools_Dir=s60rndtools
+ProductInfoRegistry.AppDepCacheDir=appdep\\cache
+ProductInfoRegistry.dumbsis.exe_File_Name=dumpsis.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/common/ProductInfoRegistry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,185 @@
+/*
+* 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.appdep.common;
+
+/**
+ * This class stores product information such as product name, 
+ * version, console view name etc.  
+ * The idea is to have the product information defined
+ * in one place and used via single access point.
+ */
+public class ProductInfoRegistry {
+
+	//
+	// Product info fields get their data from properties file.
+	//
+	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");	 //$NON-NLS-1$ //$NON-NLS-2$
+	private static final String CACHE_FILE_NAME = Product.getString("ProductInfoRegistry.Cache_File_Name"); //$NON-NLS-1$
+	private static final String CACHE_TEMP_FILE_NAME = Product.getString("ProductInfoRegistry.Cache_Temp_File_Name"); //$NON-NLS-1$
+	private static final String CACHE_SYMBOLS_FILE_NAME = Product.getString("ProductInfoRegistry.Cache_Symbols_File_Name"); //$NON-NLS-1$
+	private static final String IMAGES_DIRECTORY = Product.getString("ProductInfoRegistry.Images_Directory");	 //$NON-NLS-1$
+	private static final String BINARIES_RELATIVE_PATH = Product.getString("ProductInfoRegistry.Binaries_Relative_Path");	 //$NON-NLS-1$
+	private static final String CFILT_WIN32OS_BINARY_NAME = Product.getString("ProductInfoRegistry.CFilt_Win32OS_Binary_Name"); //$NON-NLS-1$
+	private static final String APPDEP_WIN32OS_BINARY_NAME=Product.getString("ProductInfoRegistry.Core_Win32OS_Binary_Name"); //$NON-NLS-1$
+	private static final String APPDEP_RESOURCES_DIRECTORY = Product.getString("ProductInfoRegistry.Resources_Directory"); //$NON-NLS-1$
+	private static final String APPDEP_EXPORT_XSL_FILE_NAME = Product.getString("ProductInfoRegistry.Export_Report_Xsl_File_Name"); //$NON-NLS-1$
+	private static final String APPDEP_IS_USED_BY_XSL_FILE_NAME = Product.getString("ProductInfoRegistry.Export_Report_IsUsedBy_Xsl_File_Name"); //$NON-NLS-1$
+	private static final String STR_S60_RND_TOOLS_DIR = Product.getString("ProductInfoRegistry.S60_RnD_Tools_Dir"); //$NON-NLS-1$
+	private static final String STR_APPDEP_CACHE_DIR = Product.getString("ProductInfoRegistry.AppDepCacheDir"); //$NON-NLS-1$	
+	private static final String DUMPSIS_EXE_FILE_NAME = Product.getString("ProductInfoRegistry.dumbsis.exe_File_Name");//$NON-NLS-1$ 
+	
+	/**
+	 * Currently used and supported cache version info.
+	 */
+	private static final String STR_SUPPORTED_CACHE_VERSION_INFO = "101";  //$NON-NLS-1$
+	
+	/**
+	 * Start of the first line of cache symbol tables file
+	 */
+	private static final String STR_CACHE_SYMBOL_TABLES_FILE_CONTENT_PREFIX = "appdep symbol tables cache version:"; //$NON-NLS-1$
+	
+	/**
+	 * Returns name used for the console window
+	 * @return Returns the CONSOLE_WINDOW_NAME.
+	 */
+	public static String getConsoleWindowName() {
+		return CONSOLE_WINDOW_NAME;
+	}
+	/**
+	 * Returns product name.
+	 * @return Returns the PRODUCT_NAME.
+	 */
+	public static String getProductName() {
+		return PRODUCT_NAME;
+	}
+	/**
+	 * Returns cache file name.
+	 * @return Returns the CACHE_FILE_NAME.
+	 */
+	public static String getCacheFileName() {
+		return CACHE_FILE_NAME;
+	}
+	
+	/**
+	 * Returns image for storing images.
+	 * @return Returns the IMAGES_DIRECTORY.
+	 */
+	public static String getImagesDirectoryName() {
+		return IMAGES_DIRECTORY;
+	}
+	/**
+	 * Returns temporary file name used for cache creation.
+	 * @return Returns the CACHE_TEMP_FILE_NAME.
+	 */
+	public static String getCacheTempFileName() {
+		return CACHE_TEMP_FILE_NAME;
+	}
+	/**
+	 * Returns relative path to directory used to store os-specific binaries.
+	 * @return Returns the BINARIES_RELATIVE_PATH.
+	 */
+	public static String getWin32BinariesRelativePath() {
+		return BINARIES_RELATIVE_PATH;
+	}
+	/**
+	 * Returns name of the cfilt binary.
+	 * @return Returns the CFILT_WIN32OS_BINARY_NAME.
+	 */
+	public static String getCfiltBinaryName() {
+		return CFILT_WIN32OS_BINARY_NAME;
+	}
+	/**
+	 * Returns name of the appdep core binary.
+	 * @return Returns the APPDEP_WIN32OS_BINARY_NAME.
+	 */
+	public static String getAppDepBinaryName() {
+		return APPDEP_WIN32OS_BINARY_NAME;
+	}
+	/**
+	 * @return Returns the CACHE_SYMBOLS_FILE_NAME.
+	 */
+	public static String getCacheSymbolsFileName() {
+		return CACHE_SYMBOLS_FILE_NAME;
+	}
+	/**
+	 * Returns name of the directory used to store resources.
+	 * @return Returns the APPDEP_RESOURCES_DIRECTORY.
+	 */
+	public static String getAppDepResourcesDirectory() {
+		return APPDEP_RESOURCES_DIRECTORY;
+	}
+	/**
+	 * Returns file used for XSL transformation in export report functionality 
+	 * when applied to component tree,
+	 * @return Returns the APPDEP_EXPORT_XSL_FILE_NAME.
+	 */
+	public static String getAppDepExportXSLFileName() {
+		return APPDEP_EXPORT_XSL_FILE_NAME;
+	}
+	
+	/**
+	 * Returns file used for XSL transformation in export report functionality 
+	 * when applied to component list view.
+	 * @return Returns the APPDEP_IS_USED_BY_XSL_FILE_NAME
+	 */
+	public static String getAppDepIsUsedByXSLFileName() {
+		return APPDEP_IS_USED_BY_XSL_FILE_NAME;
+	}	
+	
+	/**
+	 * Returns relative path to the cache directory.
+	 * @return Returns STR_APPDEP_CACHE_DIR
+	 */
+	public static String getAppDepCacheDir() {
+		return STR_APPDEP_CACHE_DIR;
+	}
+
+	/**
+	 * Returns name of the S60 RnD tools directory under which cache data is stored.
+	 * @return Returns STR_S60_RND_TOOLS_DIR
+	 */
+	public static String getS60RndToolsDir() {
+		return STR_S60_RND_TOOLS_DIR;
+	}
+	/**
+	 * Return cache file version we currently support.
+	 * @return Cache file version we currently support.
+	 */
+	public static String getSupportedCacheFileVersionInfoString() {
+		return STR_SUPPORTED_CACHE_VERSION_INFO;
+	}	
+
+	/**
+	 * Get dumpsis.exe file name
+	 * @return "dumbsis.exe"
+	 */
+	public static String getDumpsisExeFileName() {
+		return DUMPSIS_EXE_FILE_NAME;
+	}		
+
+	/**
+	 * Get prefix contents for file appdep-cache_symbol_tables.txt
+	 * @return prefix contents for appdep-cache_symbol_tables.txt file
+	 */
+	public static String getCacheSymbolTablesFileContentPrefix() {
+		return STR_CACHE_SYMBOL_TABLES_FILE_CONTENT_PREFIX;
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepCacheIndexManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,99 @@
+/*
+* 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.appdep.core;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.ListenerList;
+
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+
+/**
+ * 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 management of cache index
+ * creation process that happens at background. All cache index
+ * background builds register themselves to to this class.
+ * The other users can register to listen to the cache index
+ * creation completion events if they wish to do so.
+ */
+public class AppDepCacheIndexManager {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private AppDepCacheIndexManager instance = null;
+
+	/**
+	 * List of ongoing cache index operations.
+	 */
+	private ArrayList<CacheIndex> ongoingCacheIndexBuildOperations = null;
+	
+	/**
+	 * Listeners interested in cache creation operations.
+	 */
+	private ListenerList listeners = null;
+	
+	/**
+	 * Public Singleton instance accessor.
+	 * @return Returns instance of this singleton class-
+	 */
+	public static AppDepCacheIndexManager getInstance(){
+		if( instance == null ){
+			instance = new AppDepCacheIndexManager();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private AppDepCacheIndexManager() {
+		ongoingCacheIndexBuildOperations = new ArrayList<CacheIndex>();
+		listeners = new ListenerList();
+	}
+	
+	public void addListener(ICacheIndexListener obj){
+		listeners.add(obj);
+	}
+	
+	public void removeListener(ICacheIndexListener obj){
+		listeners.remove(obj);
+	}
+
+	public void registerCacheIndexCreationProcess(CacheIndex indx){
+		ongoingCacheIndexBuildOperations.add(indx);
+	}
+
+	public void unregisterCacheIndexCreationProcess(CacheIndex indx){
+		ongoingCacheIndexBuildOperations.remove(indx);
+		Object[] listenerArray = listeners.getListeners();
+		for (int i = 0; i < listenerArray.length; i++) {
+			ICacheIndexListener listenerObj 
+								= (ICacheIndexListener) listenerArray[i];
+			listenerObj.cacheIndexCreationCompleted(indx);
+		}
+	}
+	
+	public void shutdown(){
+		// It is possible also here to prepare for plugin shutdown
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepCoreFacade.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,467 @@
+/*
+* 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.appdep.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.data.CacheDataConstants;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+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.ICustomLineReader;
+import com.nokia.s60tools.util.cmdline.UnsupportedOSException;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.resource.FileUtils;
+
+
+/**
+ * The purpose of this class is offer as a facade for
+ * the appdep core services (command line tool).
+ */
+public class AppDepCoreFacade implements ICmdLineCommandExecutorObserver {
+
+	private String options = null;
+	private String commands = null;
+	
+    private ICmdLineCommandExecutor cmdLineExecutor = null;
+    private AppDepSettings settings = null;
+    private ICmdLineCommandExecutorObserver observer = null;
+    private Job currentJobContext = null;
+    
+    /**
+     * Separator character used between targets platforms when generating
+     * cache for multiple targets in single command.
+     */
+    private static final String TARGET_SEPARATOR = "+"; //$NON-NLS-1$
+    
+    /**
+     * folder where SIS cache files is located under cache base dir 
+     */
+	private static final String SIS_PATH = "sis";//$NON-NLS-1$
+    
+    /**
+     * Stroring list of targets that is currentlu selected 
+     */
+    private ITargetPlatform[] currentlySelectedTargets = null;
+
+    /**
+     * This flag is <code>true</code> when the settings should to be
+	 * checked from cache generation options instead from default settings.
+     */
+    private boolean checkFromCacheGenerOpts = false;
+            
+	public AppDepCoreFacade(AppDepSettings settings,
+							ICmdLineCommandExecutorObserver observer
+							) throws UnsupportedOSException{		
+        
+		// Storing the client observer
+		this.observer = observer;
+		// And passing ourselves as real observers
+		cmdLineExecutor = CmdLineCommandExecutorFactory.CreateOsDependentCommandLineExecutor(this, AppDepConsole.getInstance());
+        this.settings = settings;
+
+        options = new String(""); //$NON-NLS-1$
+        commands = new String(""); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Constructs command line tool parameters based on the current settings and given arguments. 
+	 * @param targetPlatformIdentifiers Id of the used target platform(s) separated 
+	 *                                  with TARGET_SEPARATOR character.
+	 * @return Parameters for the commoand.
+	 * @throws InvalidCmdLineToolSettingException
+	 */
+	private String prepareParameters(String targetPlatformIdentifiers) throws InvalidCmdLineToolSettingException{
+
+		CacheGenerationOptions cacheGenerOpts = settings.getCacheGenerOptions();
+		String toolchainNameStr = null;	
+		String parameters = new String(""); //$NON-NLS-1$
+
+		if(checkFromCacheGenerOpts && cacheGenerOptionsAreSet()){
+			toolchainNameStr = cacheGenerOpts.getUsedToolchain().getToolchainName();
+		}
+		else{
+			toolchainNameStr = settings.getCurrentlyUsedToolChain().getToolchainName();			
+		}
+		
+		if( toolchainNameStr.compareToIgnoreCase( "RVCT" ) == 0 ){ //$NON-NLS-1$
+			
+			// An example RVCT command line
+	        //  set CMD_LINE=appdep RVCT -cfilt %CFILT_DIR%\cfilt.exe 
+	        //  -tools %RVCT_TOOLS% -cache %CACHE_DIR% -release %SDK_ROOT% 
+	        //  -targets ARMV5 %OPT% %COMMAND% %COMPONENT%
+			
+	        parameters = "-tools " + "\"" + settings.getRvctToolsDir() + "\""  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						 + " -cfilt " + "\"" + settings.getCfiltProgramPathName() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						 + " -cache " + "\"" + settings.getCacheBaseDirForCurrentlyUsedSdk() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						 + " -release " + "\"" + settings.getSdkRootDir() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -targets " + targetPlatformIdentifiers;			 //$NON-NLS-1$
+		}
+		else if( toolchainNameStr.compareToIgnoreCase( "GCCE" ) == 0 ){ //$NON-NLS-1$
+
+			// An example GCCE command line
+			// appdep GCCE -tools %GCCE_TOOLS% -cache %CACHE_DIR% -release %SDK_ROOT% 
+			// -targets GCCE %OPT% %COMMAND% %COMPONENT%
+			
+	        parameters = "-tools " + "\"" + settings.getGcceToolsDir() + "\""  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -cache " + "\"" + settings.getCacheBaseDirForCurrentlyUsedSdk() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -release " + "\"" + settings.getSdkRootDir() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -targets " + targetPlatformIdentifiers;			 //$NON-NLS-1$
+		}
+		else if( toolchainNameStr.compareToIgnoreCase( "GCC" ) == 0 ){ //$NON-NLS-1$
+
+			// An example GCC command line
+			// appdep GCC -tools %GCC_TOOLS% -cache %CACHE_DIR% -release %SDK_ROOT% 
+			// -targets THUMB %OPT% %COMMAND% %COMPONENT%
+			
+	        parameters = "-tools " + "\"" + settings.getGccToolsDir() + "\""  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -cache " + "\"" + settings.getCacheBaseDirForCurrentlyUsedSdk() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -release " + "\"" + settings.getSdkRootDir() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	        			 + " -targets " + targetPlatformIdentifiers;			 //$NON-NLS-1$
+		}
+		else{
+			// This is an internal error if we ever get into here
+			throw new InvalidCmdLineToolSettingException( 
+					Messages.getString("AppDepCoreFacade.UnexpectedException_In_prepareParameters_Method")  //$NON-NLS-1$
+					+ ". "  //$NON-NLS-1$
+					+ Messages.getString("AppDepCoreFacade.Toolchain_Str")  //$NON-NLS-1$
+					+ "'"  //$NON-NLS-1$
+					+ toolchainNameStr  
+					+ "' "  //$NON-NLS-1$
+					+ Messages.getString("AppDepCoreFacade.Is_Not_Supported_Msg_End")  //$NON-NLS-1$
+					+ "!" );			 //$NON-NLS-1$
+		}
+		
+		if(settings.getBuildType() instanceof BuildTypeDebug){
+			parameters += " --useudeb "; //$NON-NLS-1$
+		}
+		
+		if(checkFromCacheGenerOpts && cacheGenerOptionsAreSet()){
+			if(cacheGenerOpts.getUsedLibraryType() == CacheGenerationOptions.USE_LIB_FILES
+					&&
+			    // This option is unnecessary for GCC toolchain
+			   ! toolchainNameStr.equalsIgnoreCase(AppDepSettings.STR_GCC)){
+				parameters += " --uselibs ";				 //$NON-NLS-1$
+			}
+		}
+
+		return parameters;
+	}
+	
+	/**
+	 * Guard for accessing cache generation options.
+	 * @return <code>true</code> if options can be accessed safely, otherwise <code>false</code>.
+	 */
+	private boolean cacheGenerOptionsAreSet() {
+		return (settings.getCacheGenerOptions() != null);
+	}
+
+	public void generateCache(Job jobContext) throws InvalidCmdLineToolSettingException{
+		
+		// Enabling the check from cache generation options
+        checkFromCacheGenerOpts = true;
+
+        ICustomLineReader stdErrReader = null;
+        
+        ITargetPlatform[] toStripTargetList = settings.getCurrentlyUsedTargetPlatforms();
+		// Stripping away SIS target
+		ArrayList<ITargetPlatform> strippedTargetList = new ArrayList<ITargetPlatform>();
+        for (int i = 0; i < toStripTargetList.length; i++) {
+			ITargetPlatform platform = toStripTargetList[i];
+			if(! platform.getId().equalsIgnoreCase(AppDepSettings.TARGET_TYPE_ID_SIS)){
+		        checkCacheDirectoryExistenceAndCreateIfNeeded(platform.getId());
+		        strippedTargetList.add(platform);
+			}
+		}
+        
+		currentlySelectedTargets = strippedTargetList.toArray(new TargetPlatform[0]);
+        
+        // Setting up fields that are used to build the command 
+        options = "--refresh";	// Forcing cache refres	 //$NON-NLS-1$
+        
+        stdErrReader = new CacheCreationProgressLineReader();
+        if(settings.isInSISFileAnalysisMode()){
+        	String sisOptions = getSISGenerationOptions();
+        	commands = sisOptions;
+        }else{        
+        	commands = ""; // No command is needed, generating only cache //$NON-NLS-1$
+        }
+        
+        executeCommand(null, stdErrReader, jobContext);
+        
+		// Disabling the check from cache generation options
+        checkFromCacheGenerOpts = false;
+	}
+
+	/**
+	 * Get -sisfiles "<files user has been selected>" -options for SIS cache generation.
+	 * @return -sisfiles "<files user has been selected>". User selected files are semi
+	 * comma separated.
+	 */
+	private String getSISGenerationOptions(){
+		
+		String[] sisFiles = settings.getSISFilesForAnalysis();
+		
+		StringBuffer sisCommand = new StringBuffer();
+		sisCommand.append("-sisfiles \""); //$NON-NLS-1$
+		
+		for (int i = 0; i < sisFiles.length; i++) {
+			sisCommand.append(sisFiles[i]);
+			if(i != sisFiles.length -1){
+				sisCommand.append(";"); //$NON-NLS-1$
+			}
+		}
+		
+		sisCommand.append("\""); //$NON-NLS-1$
+		
+		return sisCommand.toString();
+	}
+	
+	public void getComponentsThatUsesComponent(String componentName, 
+			                                   ArrayList<String> resultLinesArrayList,
+			                                   Job jobContext) throws InvalidCmdLineToolSettingException{
+		
+        ICustomLineReader stdOutReader = null;
+        
+		currentlySelectedTargets = settings.getCurrentlyUsedTargetPlatforms();		
+		
+        options = "";	// No special options are needed //$NON-NLS-1$
+        stdOutReader = new LinesToStringArrayListCustomLineReader(resultLinesArrayList);
+        commands = "-dependson " + componentName; //$NON-NLS-1$
+        
+        executeCommand(stdOutReader, null, jobContext);
+	}
+
+	public void getComponentsThatUsesFunction(String componentName, 
+											  String functionOrdinal,
+									          ArrayList<String> resultLinesArrayList,
+									          Job jobContext) throws InvalidCmdLineToolSettingException{
+
+		ICustomLineReader stdOutReader = null;
+		
+		currentlySelectedTargets = settings.getCurrentlyUsedTargetPlatforms();		
+
+		options = "";	// No special options are needed //$NON-NLS-1$
+		stdOutReader = new LinesToStringArrayListCustomLineReader(resultLinesArrayList);
+		commands = "-usesfunction " + componentName + "@" + functionOrdinal; //$NON-NLS-1$ //$NON-NLS-2$
+		
+		executeCommand(stdOutReader, null, jobContext);
+	}
+	
+	
+	/**
+	 * Check the existence of cache directory, and creates 
+	 * a new directory (whole path) if needed.
+	 * @param targetPlatformId Target plaform to check cache existence from.
+	 */
+	private void checkCacheDirectoryExistenceAndCreateIfNeeded(String targetPlatformId) {
+		String cacheDirCreateFailedMsg = Messages.getString("AppDepCoreFacade.Cache_Dir_Create_Failed_Msg"); //$NON-NLS-1$
+        File cacheDir = new File(settings.getCacheDirForTarget(targetPlatformId));
+        if(cacheDir.exists()&& cacheDir.isFile()){
+        	// If there already exists a file with same name => deleting it
+        	deleteFile(cacheDir, false);
+        }
+        
+        if(!cacheDir.exists()){
+        	// If cache directory does not exist, creating it
+        	if(!cacheDir.mkdirs()){
+        		AppDepConsole.getInstance().println(cacheDirCreateFailedMsg, IConsolePrintUtility.MSG_ERROR);
+        		throw new RuntimeException(cacheDirCreateFailedMsg);
+        	}
+        }
+	}
+
+	/**
+	 * Deletes the file given as argument.
+	 * @param fileToBeDeleted File to be deleted.
+	 * @param ignoreDeleteFailure If this is set to <code>false</code> an exception is raised 
+	 * when delete attempt has failed, if set to <code>true</code> raises and exception if
+	 * delete has failed.
+	 */
+	private void deleteFile(File fileToBeDeleted, boolean ignoreDeleteFailure) {
+    	if(!fileToBeDeleted.delete()){
+    		if(!ignoreDeleteFailure){
+        		String fileDeleteFailedMsg = Messages.getString("AppDepCoreFacade.File_Delete_Failed_Msg") + ": " + fileToBeDeleted.getAbsolutePath(); //$NON-NLS-1$ //$NON-NLS-2$
+        		AppDepConsole.getInstance().println(fileDeleteFailedMsg, IConsolePrintUtility.MSG_ERROR);
+        		throw new RuntimeException(fileDeleteFailedMsg);    			
+    		}
+    	}
+	}
+	
+	private String[] buildCommandLine() throws InvalidCmdLineToolSettingException{
+		
+		Vector<String> cmdLineVector = new Vector<String>();
+		
+		try {
+			// Executable
+			cmdLineVector.add(settings.getAppDepProgramPathName());
+			// Toolchain
+			if(checkFromCacheGenerOpts  && cacheGenerOptionsAreSet()){
+				CacheGenerationOptions opt = settings.getCacheGenerOptions();
+				IToolchain toolchain = opt.getUsedToolchain();
+				cmdLineVector.add(toolchain.getToolchainName());											
+			}
+			else{
+				//Using current settings
+				cmdLineVector.add(settings.getCurrentlyUsedToolChain().getToolchainName());			
+			}
+			// Parameters		
+			String targetPlatformIds = currentlySelectedTargets[0].getId();
+			// Combining targets ids with separateor character TARGET_SEPARATOR
+			for (int i = 1; i < currentlySelectedTargets.length; i++) {
+				targetPlatformIds = targetPlatformIds 
+									+ TARGET_SEPARATOR 
+									+ currentlySelectedTargets[i].getId();
+			}
+			cmdLineVector.add(prepareParameters(targetPlatformIds));
+			
+			// Options
+			cmdLineVector.add(options);
+			// Commands
+			cmdLineVector.add(commands);								
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		return cmdLineVector.toArray(new String[0]);
+	}
+	
+	 /**
+	 * Builds the command line and runs the given command.
+	 * The current version support only one command to be executed
+	 * at a time. Therefore we are using flag that prevents
+	 * the execution of two commands at the same time.
+	 * @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.
+	 * @throws InvalidCmdLineToolSettingException 
+	 */
+	private void executeCommand(ICustomLineReader stdOutReader,
+	 		  					ICustomLineReader stdErrReader) throws InvalidCmdLineToolSettingException{
+		String[] cmdLineArr = buildCommandLine();
+		
+		//If we are in SIS Analysis mode, an empty symbolics cache file must be generated
+        if(settings.isInSISFileAnalysisMode()){
+        	try {        		
+				generateEmptyCacheSymbolFile();
+			} catch (Exception e) {
+				//If an error occurs throwing runtime message and cache generation will not be started
+				e.printStackTrace();
+				AppDepConsole.getInstance().println(Messages.getString("AppDepCoreFacade.EmptySymbolCahceFileCreation_ErrMsg")  //$NON-NLS-1$
+						+e.getMessage(), AppDepConsole.MSG_ERROR);
+				throw new RuntimeException(e.getMessage());
+			}
+        }
+        
+		cmdLineExecutor.runCommand(cmdLineArr, stdOutReader, stdErrReader, currentJobContext);
+		
+	}
+
+	/**
+	 * Create an empty code>appdep-cache_symbol_tables.txt</code> -file
+	 * because <code>appdep.exe</code> in SIS mode does not create one 
+	 * and other cache handling logic requires one. 
+	 * 
+	 * @throws IOException if on error occurs
+	 */
+	 private void generateEmptyCacheSymbolFile() throws Exception {
+		String filePath = settings.getCacheBaseDirForCurrentlyUsedSdk() +
+			File.separatorChar + SIS_PATH + 
+			File.separatorChar + ProductInfoRegistry.getCacheSymbolsFileName();
+		
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,"Generating empty symbol cache file to: " +filePath);//$NON-NLS-1$
+		
+		StringBuffer b = new StringBuffer();
+		b.append(ProductInfoRegistry.getCacheSymbolTablesFileContentPrefix());
+		b.append(" ");//$NON-NLS-1$
+		b.append(ProductInfoRegistry.getSupportedCacheFileVersionInfoString());
+		b.append("\n");//$NON-NLS-1$
+		b.append(CacheDataConstants.CACHE_FILE_END_MARK);
+		
+		FileUtils.writeToFile(filePath, b.toString());
+	}
+
+	/**
+	 * Wrapper to to the referenced executeComman. Just stores
+	 * job context that enables to add created worker thread 
+	 * to the job context.
+	 * @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.
+	 * @param jobContext   Job object under which the command will be executed.
+	 * @throws InvalidCmdLineToolSettingException 
+	 */
+	private void executeCommand(ICustomLineReader stdOutReader,
+	 		  					ICustomLineReader stdErrReader, 
+	 		  					Job jobContext) throws InvalidCmdLineToolSettingException{
+		currentJobContext = jobContext;
+		executeCommand(stdOutReader,
+					   stdErrReader);
+	}
+	
+	
+	/**
+	 * Just delegating the call further to the real observer.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#progress(int)
+	 */
+	public void progress(int percentage) {
+		observer.progress(percentage);		
+	}
+
+	/**
+	 * Setting down execution flag and delegating 
+	 * the call further to the real observer. 
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed(int)
+	 */
+	public void interrupted(String reasonMsg) {
+		observer.interrupted(reasonMsg);
+	}
+
+	/**
+	 * Just delegating the call further to the real observer.
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#progress(int)
+	 */
+	public void processCreated(Process proc) {
+		observer.processCreated(proc);
+	}
+	
+	/**
+	 * Setting down execution flag and delegating 
+	 * the call further to the real observer. 
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed(int)
+	 */
+	public void completed(int exitValue) {
+		observer.completed(exitValue);
+	}
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/AppDepSettings.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1980 @@
+/*
+* 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.appdep.core;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.Vector;
+import java.util.regex.Pattern;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.core.job.AppDepJobManager;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.sdk.SdkManager;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This class stores the AppDep tool related settings that are currently
+ * in effect and offers services that are related to those settings. 
+ * The class is implemented as singleton in order to make sure  
+ * that there are no possibility to have conflicting intances
+ * of this class created by many parties.
+ */
+public class AppDepSettings {
+	
+	//
+	// Public available constants
+	//
+	/**
+	 * Name of the executable that is used for RVCT tool chain to resolve
+	 * dependency information.
+	 */
+	public static final String RVCT_FROM_ELF_EXECUTABLE = "fromelf.exe"; //$NON-NLS-1$
+		
+	/**
+	 * Abbreviated name for GNU Compiler Collection.
+	 * Used as command line parameter, therefore DO NOT CHANGE
+	 * unless the command line interface is changed.
+	 */
+	public static final String STR_GCC = "GCC"; //$NON-NLS-1$
+	/**
+	 * Abbreviated name for Arm Toolchain.
+	 * Used as command line parameter, therefore DO NOT CHANGE
+	 * unless the command line interface is changed.
+	 */
+	public static final String STR_GCCE = "GCCE"; //$NON-NLS-1$
+	/**
+	 * Abbreviated name for RealView Compilation Tools.
+	 * Used as command line parameter, therefore DO NOT CHANGE
+	 * unless the command line interface is changed.
+	 */
+	public static final String STR_RVCT = "RVCT"; //$NON-NLS-1$
+
+	/**
+	 * Epoc32 directory name constant.
+	 */
+	public static final String STR_EPOC32_DIR = "epoc32";	 //$NON-NLS-1$
+	
+ 	//
+	// Private constants
+	//
+	private static final String STR_RELEASE_DIR = "release";	 //$NON-NLS-1$
+	
+	//
+	// Constants for unsupported targets
+	//
+	
+	// Not supporting targets that start with the following strings
+	private static final String STR_WILDCHARD_WIN = "WIN"; //$NON-NLS-1$
+	private static final String STR_WILDCHARD_TOOLS = "TOOLS"; //$NON-NLS-1$
+	
+	// Not supporting targets with following exact matches
+	// => There are not currenly any exact math targets defined
+	
+	// Constants for GCC toolchain targets
+	private static final String STR_ARMI = "ARMI"; //$NON-NLS-1$
+	private static final String STR_ARM4 = "ARM4"; //$NON-NLS-1$
+	private static final String STR_THUMB = "THUMB"; //$NON-NLS-1$
+	// Wildchards for GCC toolchain targets
+	private static final String STR_WILDCHARD_GCC_M = "M"; //$NON-NLS-1$
+	
+	/**
+	 * Location relative to epoc32 directory for elftran.exe executable 
+	 * that is needed for creating cache files.
+	 */
+	private static final String STR_ELFTRAN_EXE = "elftran.exe"; //$NON-NLS-1$
+
+	/**
+	 * Location relative to epoc32 directory for elftran.exe executable 
+	 * that is needed for creating cache files.
+	 */
+	private static final String STR_PETRAN_EXE = "petran.exe"; //$NON-NLS-1$
+
+	/**
+	 * Directory where GCC toolchain tools exist.
+	 * Directory is relative to SDK's root directory.
+	 * @see #getGccToolsDir
+	 */
+	private static final String GCC_TOOL_REL_DIR = STR_EPOC32_DIR + "\\gcc\\bin"; //$NON-NLS-1$
+	
+	/**
+	 * When SIS file(s) is selected for analysis, Target platform type is "sis".
+	 */
+	public static final String TARGET_TYPE_ID_SIS = "sis"; //$NON-NLS-1$
+	
+	private static Vector<AppDepSettings> settingInstancesVector = null;
+	
+	// Supported toolchain objects...
+	private Toolchain toolchainGCC;
+	private Toolchain toolchainGCCE;
+	private Toolchain toolchainRVCT;
+
+	//.. are stored in vector in order to make checking easier
+	private Vector<Toolchain> supportedToolchainsVector = null;
+	
+	/**
+	 * Storing also those target types that are not supported by the tool.
+	 */
+	private Vector<String> notSupportedTargetsVector = null;	
+
+	/**
+	 * And making also wildchard check for the targets starting
+	 * with some specified string.
+	 */
+	private Vector<String> notSupportedTargetWildchardsVector = null;	
+
+	/**
+	 * Information for currently selected 
+	 * SDK or Platform.
+	 */
+	private SdkInformation currentlyUsedSdk = null;
+
+	/**
+	 * Directory where GCCE toolchain tools exist.
+	 * For example, "C:\Program Files\CSL Arm Toolchain\bin"
+	 */
+	private String gcceToolsDir = null;
+	
+	/**
+	 * Directory where RVCT toolchain tools exist.
+	 * For example, "C:\Program Files\ARM\RVCT\Programs\2.2\503\win_32-pentium"
+	 */
+	private String rvctToolsDir = null;
+	
+	
+	/**
+	 * Directory where cfilt.exe is located.
+	 */
+	String externalProgramsPathName = null;
+
+	/**
+	 * Current user preference for the used toolchain.
+	 * This updated automatically when the currently
+	 * used target platform is set. The default value
+	 * is based on the preferred toolchain choice, 
+	 * and on the fact that which toolchains are
+	 * available in the workstation's environment. 
+	 */
+	private IToolchain currentlyUsedToolChain = null;	
+	
+	/**
+	 * Preferences to be used for cache generation.
+	 */
+	private CacheGenerationOptions cacheGenerOptions = null;
+
+	/**
+	 * Current user preference for the selected targets.
+	 */
+	private ArrayList<ITargetPlatform> currentlyUsedTargetPlatforms= null;
+	
+	/**
+	 * The name of the currently analyzed component. 
+	 */
+	private String currentlyAnalyzedComponentName = null;
+	
+	/**
+	 * Currently supported build types are
+	 * - BuildTypeDebug, and
+	 * - BuildTypeRelease
+	 */
+	private IBuildType buildType = null;
+	
+	/**
+	 * This is used to cache the amount of components
+	 * for the recently queried platform. The component
+	 * query may take a considerable long time, and therefore
+	 * caching improves performance.
+	 */
+	private int mostRecentlyQueriedComponentCount;	
+	
+	/**
+	 * Path where print report is recently exported. 
+	 * Used to set as default path when export functionality is used
+	 * again during same session.
+	 */
+	private String exportPrintReportPath = null;
+	
+	/**
+	 * If XML report (file) is generated aswell when Exporting html report.
+	 */
+	private boolean exportXMLreport = false;
+
+	/**
+	 * Path to resources. XSL file is located in there.
+	 */
+	private String resourcesPath = null;
+	
+	/**
+	 * XSL file name, default value "PrintReport.xsl"
+	 */
+	private String XSLFileName = null;
+
+	/**
+	 * XSL file name, default value "IsUsedByReport.xsl"
+	 */
+	private String isUsedByXSLFileName = null;	
+	
+	/**
+	 * Listeners who want to know about the changes in the current settings.
+	 */
+	private Vector<IAppDepSettingsChangedListener> settingListenersVector;
+	
+	/**
+	 * SIS files for analysis
+	 */
+	private String[] sisFilesForAnalysis = null;
+	
+	/**
+	 * If SDK Selection Wizard is running in SIS analysis mode 
+	 */
+	private boolean isInSISFileAnalysisMode = false;
+
+	/**
+	 * Cache data loading flag.
+	 */
+	private boolean isCacheDataLoadingOngoing = false;
+
+	/**
+	 * Cache update flag is set to <code>true</code> when target platform is not changed 
+	 * but target cache has been updated and needs reloading.
+	 */
+	private boolean cacheUpdated;
+
+	/**
+	 * Target platform for the currently analyzed component.
+	 */
+	private ITargetPlatform currentlyAnalyzedComponentTargetPlatform = null;
+	
+	/**
+	 * Accessor for currently active settings.
+	 * @return Returns currently active instance.
+	 */
+	public static AppDepSettings getActiveSettings(){
+		
+		AppDepSettings instance = null;
+		
+		if( settingInstancesVector == null ){
+			settingInstancesVector = new Vector<AppDepSettings>();
+			instance = new AppDepSettings();
+			settingInstancesVector.add(instance);			
+		}
+		else{
+			instance = (AppDepSettings) settingInstancesVector.lastElement();
+		}
+		return instance;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#clone()
+	 */	
+	@SuppressWarnings("unchecked") //$NON-NLS-1$
+	public Object clone(){
+		AppDepSettings clone = new AppDepSettings();
+		
+		// Doing actual cloning
+		clone.toolchainGCC = toolchainGCC;
+		clone.toolchainGCCE = toolchainGCCE;
+		clone.toolchainRVCT = toolchainRVCT;
+		clone.supportedToolchainsVector = (Vector<Toolchain>) supportedToolchainsVector.clone();
+		clone.notSupportedTargetsVector  = (Vector<String>) notSupportedTargetsVector .clone();
+		clone.notSupportedTargetWildchardsVector  = (Vector<String>) notSupportedTargetWildchardsVector .clone();
+		
+		clone.currentlyUsedSdk = currentlyUsedSdk;
+		clone.gcceToolsDir = gcceToolsDir;
+		clone.rvctToolsDir = rvctToolsDir;
+		clone.externalProgramsPathName = externalProgramsPathName;
+		clone.currentlyUsedToolChain = currentlyUsedToolChain;
+		clone.cacheGenerOptions = cacheGenerOptions;
+		ITargetPlatform[] targetPlatformArr = getCurrentlyUsedTargetPlatforms();
+		for (int i = 0; i < targetPlatformArr.length; i++) {
+			ITargetPlatform targetPlatformId = targetPlatformArr[i];
+			clone.currentlyUsedTargetPlatforms.add(targetPlatformId);
+			
+		}
+		clone.buildType = buildType;
+		clone.currentlyAnalyzedComponentName = currentlyAnalyzedComponentName;
+		clone.currentlyAnalyzedComponentTargetPlatform = currentlyAnalyzedComponentTargetPlatform;
+		clone.exportPrintReportPath = exportPrintReportPath;
+		clone.resourcesPath = resourcesPath;
+		clone.XSLFileName = XSLFileName;
+		clone.isUsedByXSLFileName = isUsedByXSLFileName;		
+		clone.settingListenersVector = (Vector<IAppDepSettingsChangedListener>) settingListenersVector.clone();
+		
+		if(sisFilesForAnalysis != null){
+			clone.sisFilesForAnalysis = new String[sisFilesForAnalysis.length];
+			for(int i = 0; i<sisFilesForAnalysis.length; i++){
+				clone.sisFilesForAnalysis[i] = new String( sisFilesForAnalysis[i] );
+			}
+		}else{
+			clone.sisFilesForAnalysis = null;
+		}
+		clone.isInSISFileAnalysisMode = isInSISFileAnalysisMode;
+		clone.cacheUpdated = cacheUpdated;
+		
+		return clone;
+	}
+	
+	/**
+	 * Clones the currently active instance and sets
+	 * clone as new active instance.
+	 * @return Returns cloned instance.
+	 */
+	public static AppDepSettings cloneAndAddAsNewActiveInstance(){
+		AppDepSettings existing = null;
+		AppDepSettings cloned = null;
+		// We trust here that there is at least a single active instance
+		existing = (AppDepSettings) settingInstancesVector.lastElement();
+		cloned = (AppDepSettings) existing.clone();
+		settingInstancesVector.add(cloned);				
+		return cloned;
+	}
+	
+	/**
+	 * Sets given settings instance as currently active settings.
+	 * @param newActiveSettings New settings to be set as current
+	 *                          active settings.
+	 * @return Returns the settings that were just set as currently
+	 *         active settings.
+	 */
+	public static AppDepSettings setAsNewActiveInstance(AppDepSettings newActiveSettings){
+		settingInstancesVector.add(newActiveSettings);	
+		return newActiveSettings;
+	}	
+
+	/**
+	 * Creates a new uninitialized instance and sets it
+	 * as active instance. 
+	 * @return Returns a new instance.
+	 */
+	public static AppDepSettings newActiveInstance(){
+		AppDepSettings instance = null;		
+		if( settingInstancesVector == null ){
+			settingInstancesVector = new Vector<AppDepSettings>();
+		}		
+		instance = new AppDepSettings();
+		settingInstancesVector.add(instance);				
+		return instance;
+	}
+
+	/**
+	 * Check for the existence of previous active instances.
+	 * @return Returns <code>true</code> if there is an earlier instance, 
+	 *         otherwise <code>false</code>.
+	 */
+	public static boolean hasPreviousActiveInstance(){
+		if( settingInstancesVector != null ){
+			return (settingInstancesVector.size() > 1);
+		}		
+		return false;
+	}
+
+	public static void removePreviousInstances(){
+		if( settingInstancesVector != null ){
+			if(settingInstancesVector.size() > 0){
+				Vector<AppDepSettings> preserveThese = new Vector<AppDepSettings>();
+				preserveThese.add(settingInstancesVector.lastElement());
+				// Deleting all the other elements than the last one
+				settingInstancesVector.retainAll(preserveThese);				
+			}
+		}		
+	}
+	
+	/**
+	 * Returns the previously active instance and removes the
+	 * currently active instance.
+	 * @return Returns the previously active instance.
+	 */
+	public static AppDepSettings restorePreviousActiveInstance(){
+		
+		if(! hasPreviousActiveInstance()){
+			throw new RuntimeException(Messages.getString("AppDepSettings.Restore_NonExisting_Instance")); //$NON-NLS-1$
+		}
+		
+		AppDepSettings instance = null;
+		Object currentlyActive = settingInstancesVector.lastElement();
+		settingInstancesVector.remove(currentlyActive);			
+		instance = (AppDepSettings) settingInstancesVector.lastElement();
+		return instance;
+	}
+	
+	/**
+	 * Default constructor 
+	 */
+	private AppDepSettings(){		
+		gcceToolsDir = new String(""); //$NON-NLS-1$
+		rvctToolsDir = new String(""); //$NON-NLS-1$
+		externalProgramsPathName = new String(""); //$NON-NLS-1$
+		currentlyUsedTargetPlatforms = new ArrayList<ITargetPlatform>();
+		settingListenersVector = new Vector<IAppDepSettingsChangedListener>();
+		buildType = new BuildTypeRelease();
+		initializeSupportedToolchains();
+		initializeNotSupportedTargets();
+	}
+
+	private void initializeSupportedToolchains(){
+		supportedToolchainsVector = new Vector<Toolchain>();
+		
+		// Creating toolchain instances
+		toolchainGCC = new Toolchain(STR_GCC, Messages.getString("AppDepSettings.GNU_Comp_Coll"), false, true); //$NON-NLS-1$
+		// GCCE is used as preferred default toolchain when it can be used
+		toolchainGCCE = new Toolchain(STR_GCCE, Messages.getString("AppDepSettings.CSL_Arm_Toolchain"), true); //$NON-NLS-1$
+		toolchainRVCT = new Toolchain(STR_RVCT, Messages.getString("AppDepSettings.RVCT_Comp_Tools"), false); //$NON-NLS-1$
+		
+		supportedToolchainsVector.add(toolchainGCC);
+		supportedToolchainsVector.add(toolchainGCCE);
+		supportedToolchainsVector.add(toolchainRVCT);
+	}
+
+	/**
+	 * Building here a list of not supported targets.
+	 */
+	private void initializeNotSupportedTargets(){
+		
+		// Initializing exact match targets
+		notSupportedTargetsVector = new Vector<String>();
+		// => There are not currenly any exact math targets defined
+		
+		// Initializing startsWith match targets
+		notSupportedTargetWildchardsVector = new Vector<String>();
+		notSupportedTargetWildchardsVector.add(STR_WILDCHARD_WIN);
+		notSupportedTargetWildchardsVector.add(STR_WILDCHARD_TOOLS);
+	}
+
+	/**
+	 * Returns tools directory for the currently used SDK/Platform. 
+	 * @return Tools directory for the currently used SDK/Platform.
+	 */
+	private String getToolsDirForCurrentlyUsedSdk() {		
+		return removeEndingBackslash (getCurrentlyUsedSdk().getEpoc32ToolsDir());
+	}
+
+    /**
+     * Returns path to cache directory relative to tools directory.
+	 * The directory name MUST not contain ending backslash!!!
+     * @return Path to cache directory relative to tools directory.
+     */
+    private String getCachePathRelativeToToolsDir(){
+    	return ProductInfoRegistry.getS60RndToolsDir()
+				+ File.separatorChar 
+				+ ProductInfoRegistry.getAppDepCacheDir();
+    }
+		
+	/**
+	 * Returns cache base directory for the currently used SDK/Platform.
+	 * The directory name MUST not contain ending backslash!!!
+	 * @return Cache base directory for the currently used SDK/Platform.
+	 */
+	public String getCacheBaseDirForCurrentlyUsedSdk() {		
+		return getToolsDirForCurrentlyUsedSdk() 
+				+ File.separatorChar
+				+ getCachePathRelativeToToolsDir();
+	}
+	
+	/**
+	 * Returns the cache directories pointed by current settings. 
+	 * @return Returns the cacheBaseDir.
+	 */
+	public String[] getCacheDirs() {
+		ITargetPlatform[] targets = getCurrentlyUsedTargetPlatforms();
+		int targetCount = targets.length;
+		String[] resultArr = new String[targetCount];
+		for (int i = 0; i < targets.length; i++) {
+			String targetPlatformId = targets[i].getId();
+			resultArr[i] = getCacheDirForTarget (targetPlatformId);
+		}
+		return resultArr;	
+	}	
+	
+	/**
+	 * Returns the cache directory for given target. 
+	 * @param targetPlatformId Id for target platform to be used in directory name.
+	 * @return Returns the cache directory for given target.
+	 */
+	public String getCacheDirForTarget(String targetPlatformId) {
+		if(targetPlatformId.equalsIgnoreCase(AppDepSettings.TARGET_TYPE_ID_SIS)){
+			return getCacheBaseDirForCurrentlyUsedSdk()
+				+ File.separatorChar
+				+ removeEndingBackslash (targetPlatformId);
+		}
+		else{
+			return getCacheBaseDirForCurrentlyUsedSdk()
+				+ File.separatorChar
+				+ removeEndingBackslash (targetPlatformId)
+				+ File.separatorChar
+				+ removeEndingBackslash (getBuildType().getBuildTypeName());	
+		}
+	}	
+
+	/**
+	 * Returns the cache directory for given arguments. 
+	 * @return Returns the cache directory for given arguments.
+	 */	
+	private String getCacheDir(SdkInformation sdkInfo, String targetPlatformName, IBuildType buildType) {
+		String cacheDir = removeEndingBackslash (sdkInfo.getEpoc32ToolsDir()) 
+					+ File.separatorChar
+					+ getCachePathRelativeToToolsDir()
+					+ File.separatorChar					
+					+ removeEndingBackslash (targetPlatformName )
+					+ File.separatorChar
+					+ removeEndingBackslash (buildType.getBuildTypeName());
+		return cacheDir;	
+	}	
+
+	/**
+	 * Returns absolute pathname to the currently 
+	 * used cache file for given target.
+	 * @param targetPlatformId Id for target platform to be used in directory name.
+	 * @return Returns currently used cache file's path name.
+	 */
+	public String getCacheFileAbsolutePathName(String targetPlatformId) {
+		return getCacheDirForTarget(targetPlatformId)
+			+ File.separatorChar 
+			+ ProductInfoRegistry.getCacheFileName();
+	}
+
+	/**
+	 * Returns absolute pathname to the symbols table file of the 
+	 * currently used cache directory  for given target.
+	 * @param targetPlatformId Id for target platform to be used in directory name.
+	 * @return Returns currently used symbols table file's path name.
+	 */
+	public String getCacheSymbolsTableFileAbsolutePathName(String targetPlatformId) {
+		return getCacheDirForTarget(targetPlatformId)
+			+ File.separatorChar 
+			+ ProductInfoRegistry.getCacheSymbolsFileName();
+	}
+	
+	/**
+	 * Returns absolute pathname to the cache file from the
+	 * SDK ID and Target Platform name given as parameters.
+	 * @param sdkInfo SDK information object. 
+	 * @param targetPlatformId Target Platform Name string
+	 * @param buildType Build type.
+	 * @return Absolute pathname to the cache file.
+	 */
+	public String getCacheFileAbsolutePathNameForSdkAndPlatform(SdkInformation sdkInfo, 
+																String targetPlatformId,
+																IBuildType buildType) {
+		return 
+		getCacheDir(sdkInfo,targetPlatformId,buildType) 
+				+ File.separatorChar 
+				+ ProductInfoRegistry.getCacheFileName();
+	}
+	
+	/**
+	 * Checks is the given Target Platform is cached.
+	 * 
+	 * @param sdkId
+	 *            SDK ID string.
+	 * @param targetPlatformName
+	 *            Target Platform Name string
+	 * @param buildType
+	 *            Build type.
+	 * @return Returns <code>true</code> if the target platform is cached,
+	 *         otherwise <code>false</code>.
+	 */	
+	public boolean isTargetPlatformCached(String sdkId,
+			String targetPlatformName, IBuildType buildType) {
+		SdkInformation[] infos;
+		
+		try {
+			infos = SdkManager.getSdkInformation();
+			for (int i = 0; i < infos.length; i++) {
+				SdkInformation info = infos[i];
+				if (sdkId.equals(info.getSdkId())) {
+					return isTargetPlatformCached(info, targetPlatformName,
+							buildType);
+				}
+			}
+
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+	
+	/**
+	 * Checks is the given Target Platform is cached.
+	 * 
+	 * @param sdkInfo
+	 *             SDK information object.
+	 * @param targetPlatformName
+	 *            Target Platform Name string
+	 * @param buildType
+	 *            Build type.
+	 * @return Returns <code>true</code> if the target platform is cached,
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isTargetPlatformCached(SdkInformation sdkInfo,
+			String targetPlatformName, IBuildType buildType) {
+
+		String cacheFilePath = getCacheFileAbsolutePathNameForSdkAndPlatform(
+				sdkInfo, targetPlatformName, buildType);
+		File cacheFile = new File(cacheFilePath);
+		if (cacheFile.exists()) {
+			// There is no temporary file and cache file exists
+			return true;
+		}
+
+		// Cache file does not exist
+		return false;
+	}
+	
+
+	/**
+	 * Returns the absolute path pointing to cfilt program.
+	 * @return Returns pathname to cfilt program
+	 */
+	public String getCfiltProgramPathName() {
+		return getExternalProgramsPathName()
+				+ File.separatorChar 
+				+ ProductInfoRegistry.getCfiltBinaryName();
+	}
+
+	/**
+	 * Returns the absolute path pointing to AppDep
+	 * command line executable.
+	 * @return Returns pathname to appdep program
+	 */
+	public String getAppDepProgramPathName() {
+		return getExternalProgramsPathName()
+				+ File.separatorChar 
+				+ ProductInfoRegistry.getAppDepBinaryName();
+	}
+
+	/**
+	 * @return Returns the externalProgramsPathName.
+	 */
+	public String getExternalProgramsPathName() {
+		return externalProgramsPathName;
+	}
+	
+	/**
+	 * @param externalProgramsPathName The externalProgramsPathName to set.
+	 */
+	public void setExternalProgramsPathName(String externalProgramsPathName) {
+		this.externalProgramsPathName = removeEndingBackslash(externalProgramsPathName);
+	}
+
+	/**
+	 * Returns the currently used target platforms.
+	 * @return Array of currently used target platforms.
+	 */
+	public ITargetPlatform[]  getCurrentlyUsedTargetPlatforms() {
+		return currentlyUsedTargetPlatforms.toArray(new TargetPlatform[0]);
+	}
+
+	/**
+	 * Checks if the given target platform is supported.
+	 * @param targetPlatform Target platform to be checked.
+	 * @return Returns <code>true</code> if the given target platform 
+	 * is supported, otherwise <code>false</code>.
+	 */
+	public boolean isSupportedTargetPlatform(String targetPlatform){
+		// Target is not supported if it is listed in predefined list
+		for (Iterator<String> iter = notSupportedTargetsVector.iterator(); iter.hasNext();) {
+			String str = iter.next();
+			if( str.compareToIgnoreCase( targetPlatform ) == 0 ){
+				return false;
+			}
+		}
+		
+		// Target is also not supported if it is listed in predefined list of startsWith matches
+		for (Iterator<String> iter = notSupportedTargetWildchardsVector.iterator(); iter.hasNext();) {
+			String str = iter.next().toLowerCase();
+			if( targetPlatform.toLowerCase().startsWith(str) ){
+				return false;
+			}
+		}
+		
+		// Not defined as unsupported, therefore supported
+		return true;
+	}
+	
+	/**
+	 * Sets new targets as currently used ones.
+	 * Updates also currently used toolchain accordingly.
+	 * This method must be called with targets that maps
+	 * to the same toolchain, and all given targets
+	 * must be supported.
+	 * @param targetPlatformNameArr The new target set to be set as currently ised targets..
+	 */
+	public void setCurrentlyUsedTargetPlatforms(String[] targetPlatformNameArr)
+										throws InvalidCmdLineToolSettingException {
+
+		// Supported one ...clearing old settings
+		clearCurrentlyUsedTargetPlatforms();
+		// Temporary variable to find out correct toolchain settings
+		IToolchain toolchainSetting = null;
+		
+		// Checking that no empty array was passed
+		if(targetPlatformNameArr.length > 0){
+			toolchainSetting = getDefaultToolchainForTarget(targetPlatformNameArr[0]);
+		}
+		else{
+			throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Target_Array_Is_Empty") );  //$NON-NLS-1$
+		}
+		// Checking validity of the settings and storing the given targets
+		for (int i = 0; i < targetPlatformNameArr.length; i++) {
+			String targetPlatformId = targetPlatformNameArr[i];
+			if(! isSupportedTargetPlatform(targetPlatformId)){
+				// Not found, regarded as unsupported
+				throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Target")  //$NON-NLS-1$
+						+ targetPlatformNameArr  
+						+ Messages.getString("AppDepSettings.NotSupported") ); //$NON-NLS-1$
+			}			
+			// Check was OK => storing the target information
+			currentlyUsedTargetPlatforms.add(new TargetPlatform(targetPlatformId));
+			// All items must map to the same toolchain
+			IToolchain toolchainSettingTmp = getDefaultToolchainForTarget(targetPlatformId);
+			if(! toolchainSettingTmp.equals(toolchainSetting)){
+				throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Targets_Does_Not_Map_To_Same_Toolchain") );  //$NON-NLS-1$				
+			}
+		}
+		// Finally setting the used toolchain accordingly
+		setCurrentlyUsedToolChain(toolchainSetting);							
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * Returns the used toolchain.
+	 * @return Returns the currentlyUsedToolChain.
+	 */
+	public IToolchain getCurrentlyUsedToolChain() {
+		return currentlyUsedToolChain;
+	}
+
+	/**
+	 * Returns the used toolchain's name.
+	 * @return Returns the currently used toolchains name.
+	 */
+	public String getCurrentlyUsedToolChainName() {
+		return currentlyUsedToolChain.getToolchainName();
+	}
+	
+	/**
+	 * Sets new toolchain as currently used one.
+	 * @param newToolChainSetting The currentlyUsedToolChain to set.
+	 */
+	private void setCurrentlyUsedToolChain(IToolchain newToolChainSetting) 
+										throws InvalidCmdLineToolSettingException {
+		// Can we found the toolchain among the supported ones
+		for (Iterator<Toolchain> iter = supportedToolchainsVector.iterator(); iter.hasNext();) {
+			Toolchain tch = iter.next();
+			String str = tch.getToolchainName();
+			if( str.compareToIgnoreCase( newToolChainSetting.getToolchainName() ) == 0 ){
+				this.currentlyUsedToolChain = newToolChainSetting;
+				return;
+			}
+		}
+		// Not found, regarded as unsupported
+		throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Toolchain")  //$NON-NLS-1$
+				+ newToolChainSetting  
+				+ Messages.getString("AppDepSettings.NotSupported") ); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Returns the used directory for GCCE tools.
+	 * @return Returns the gcceToolsDir.
+	 */
+	public String getGcceToolsDir() {
+		return gcceToolsDir;
+	}
+
+	/**
+	 * @param gcceToolsDir The gcceToolsDir to set.
+	 */
+	public void setGcceToolsDir(String gcceToolsDir) {
+		this.gcceToolsDir = removeEndingBackslash(gcceToolsDir);
+	}
+
+	/**
+	 * Gets GCCE toolchain installation status.
+	 * @return Returns <code>true</code> if toolchain is installed,
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isGcceToolsInstalled() {
+		return toolchainGCCE.isInstalled();
+	}
+
+	/**
+	 * Sets GCCE toolchain installation status.
+	 * @param isGcceToolsInstalled The installation status to set.
+	 */
+	public void setGcceToolsInstalled(boolean isGcceToolsInstalled) {
+		toolchainGCCE.setIsInstalled(isGcceToolsInstalled);
+	}
+
+	/**
+	 * Gets RVCT toolchain installation status.
+	 * @return Returns <code>true</code> if toolchain is installed,
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isRvctToolsInstalled() {
+		return toolchainRVCT.isInstalled();
+	}
+
+	/**
+	 * Sets RVCT toolchain installation status.
+	 * @param isRvctToolsInstalled The installation status to set.
+	 */
+	public void setRvctToolsInstalled(boolean isRvctToolsInstalled) {
+		toolchainRVCT.setIsInstalled(isRvctToolsInstalled);
+	}
+
+	/**
+	 * Returns the used root directory of SDK.
+	 * @return Returns the sdkRootDir.
+	 */
+	public String getSdkRootDir() {
+		if(currentlyUsedSdk != null){
+			return removeEndingBackslash(currentlyUsedSdk.getEpocRootDir());
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the used directory for RVCT tools.
+	 * @return Returns the rvctToolsDir.
+	 */
+	public String getRvctToolsDir() {
+		return rvctToolsDir;
+	}
+
+	/**
+	 * Sets the used directory for RVCT tools.
+	 * @param rvctToolsDir The rvctToolsDir to set.
+	 */
+	public void setRvctToolsDir(String rvctToolsDir) {
+		this.rvctToolsDir = removeEndingBackslash(rvctToolsDir);
+	}
+
+	/**
+	 * @return Returns the buildType.
+	 */
+	public IBuildType getBuildType() {
+		return buildType;
+	}
+	
+	/**
+	 * Checks that given parameter referes to supported build
+	 * type, and sets the new type if it is supported.
+	 * @param buildTypeString The name of build type to set.
+	 * @throws InvalidCmdLineToolSettingException If the given build type is not supported.
+	 */		
+	public void setBuildType(String buildTypeString) throws InvalidCmdLineToolSettingException {
+		if( buildTypeString.equalsIgnoreCase(BuildTypeRelease.NAME)){
+			this.buildType = new BuildTypeRelease();			
+		}
+		else if( buildTypeString.equalsIgnoreCase(BuildTypeDebug.NAME)){
+			this.buildType = new BuildTypeDebug();			
+		}
+		else{
+			// Not found, regarded as unsupported
+			throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Build_Type")  //$NON-NLS-1$
+					+ buildTypeString  
+					+ Messages.getString("AppDepSettings.NotSupported") );			 //$NON-NLS-1$
+		}
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * Checks that given parameter referes to supported build
+	 * type, and sets the new type if it is supported.
+	 * @param buildType The build type object to set.
+	 * @throws InvalidCmdLineToolSettingException If the given build type is not supported.
+	 */	
+	public void setBuildType(IBuildType buildType) throws InvalidCmdLineToolSettingException {
+		if( (buildType instanceof BuildTypeDebug)
+			||
+			(buildType instanceof BuildTypeRelease) 	
+			){
+			this.buildType = buildType;			
+		}
+		else{
+			// Not found, regarded as unsupported
+			throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Build_Type")  //$NON-NLS-1$
+					+ buildType.getBuildTypeName()  
+					+ Messages.getString("AppDepSettings.NotSupported") );			 //$NON-NLS-1$
+		}
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}	
+	
+	/**
+	 * Maps the given build type string into corresponding
+	 * build object type if the given type is supported..
+	 * @param buildTypeString The name of build type to set.
+	 * @throws InvalidCmdLineToolSettingException If the given build type is not supported.
+	 */		
+	public IBuildType getBuildTypeFromString(String buildTypeString) throws InvalidCmdLineToolSettingException {
+		if( buildTypeString.equalsIgnoreCase(BuildTypeRelease.NAME)){
+			return new BuildTypeRelease();			
+		}
+		else if( buildTypeString.equalsIgnoreCase(BuildTypeDebug.NAME)){
+			return new BuildTypeDebug();			
+		}
+		
+		// Not found, regarded as unsupported
+		throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Build_Type")  //$NON-NLS-1$
+				+ buildTypeString  
+				+ Messages.getString("AppDepSettings.NotSupported") );			 //$NON-NLS-1$
+	}
+
+	/**
+	 * Builds release dir based on the already known directory
+	 * components.
+	 * @return Returns the release directory.
+	 */
+	public String getReleaseDir() {
+		return 	getSdkRootDir()
+					+ File.separator
+					+ STR_EPOC32_DIR
+					+ File.separator
+					+ STR_RELEASE_DIR;
+	}
+
+	/**
+	 * Builds the build based on the already known directory
+	 * components.
+	 * @param targetPlatformId Target platform to get build directory for.
+	 * @return Returns the build directory.
+	 */
+	public String getBuildDir(String targetPlatformId) {
+		return 	getReleaseDir()
+					+ File.separator
+					+ targetPlatformId
+					+ File.separator
+					+ getBuildType().getBuildTypeName();
+	}
+
+	/**
+	 * Builds the build based on the already known 
+	 * directory components.
+	 * @return Returns the build directories 
+	 *          as set for currently selected target.
+	 */
+	public Set<String> getBuildDirsAsSet() {
+		Set<String> buildDirSet = new HashSet<String>();
+		ITargetPlatform[] targets = getCurrentlyUsedTargetPlatforms();
+		for (int i = 0; i < targets.length; i++) {
+			ITargetPlatform platform = targets[i];
+			String buildDir = getReleaseDir()
+									+ File.separator
+									+ platform.getId()
+									+ File.separator
+									+ getBuildType().getBuildTypeName();
+			buildDirSet.add(buildDir);
+		}
+		return buildDirSet;	
+	}
+	
+	/**
+	 * @return Returns the currentlyUsedSdk.
+	 */
+	public SdkInformation getCurrentlyUsedSdk() {
+		return currentlyUsedSdk;
+	}
+
+	/**
+	 * @param currentlyUsedSdk The currentlyUsedSdk to set.
+	 */
+	public void setCurrentlyUsedSdk(SdkInformation currentlyUsedSdk) {
+		this.currentlyUsedSdk = currentlyUsedSdk;
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * Returns build directory for the given Sdk information node
+	 * and target platform name.
+	 * @param sdkInfo Sdk information object.
+	 * @param targetPlatformName Target platform name.
+	 * @param buildType Build type.
+	 * @return Build directory string.
+	 */
+	public String getBuildDirectoryForSdkAndPlatform(SdkInformation sdkInfo, 
+													 String targetPlatformName,
+													 IBuildType buildType) {
+		return 	sdkInfo.getReleaseRootDir()
+				+ File.separator
+				+ targetPlatformName
+				+ File.separator
+				+ buildType.getBuildTypeName();
+	}
+
+	public void updateCurrentlyUsedSDKAndTargetPlatforms(SdkInformation currentlyUsedSdk,
+												   String[] currentlyUsedTargetPlatforms,
+												   IBuildType currentlyUsedBuildType
+												   ) throws InvalidCmdLineToolSettingException{
+		setCurrentlyUsedSdk(currentlyUsedSdk);
+		setCurrentlyUsedTargetPlatforms(currentlyUsedTargetPlatforms);
+		setBuildType(currentlyUsedBuildType);
+	}
+
+	/**
+	 * The method adds given target to the list of currently used ones.
+	 * The method checks if the toolChain of given platform maps with the
+	 * default toolchain (of all other platforms). If not, the method throws an exception.
+	 * @param targetPlatformId The new target to be added to currently used targets.
+	 */
+	public void addTargetPlatform(String targetPlatformId) throws InvalidCmdLineToolSettingException
+	{
+		if(! isSupportedTargetPlatform(targetPlatformId)){
+			// Given target is not found in the list of supported targets. So, regarded as unsupported
+			throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Target")  //$NON-NLS-1$
+					+ targetPlatformId  
+					+ Messages.getString("AppDepSettings.NotSupported") ); //$NON-NLS-1$
+		}
+		
+		// Check was OK => adding the target information
+		currentlyUsedTargetPlatforms.add(new TargetPlatform(targetPlatformId));
+		// The toolchain of given platform must match with the toolchain of all existing platforms.
+		IToolchain toolchainSettingTmp = getDefaultToolchainForTarget(targetPlatformId);
+		if(toolchainSettingTmp == null || !toolchainSettingTmp.getToolchainName().equalsIgnoreCase(getCurrentlyUsedToolChainName())){
+			throw new InvalidCmdLineToolSettingException( Messages.getString("AppDepSettings.Targets_Does_Not_Map_To_Same_Toolchain") );  //$NON-NLS-1$				
+		}
+		
+		notifySettingsListeners(false);
+	}
+	/**
+	 * @return Returns the currentlyAnalyzedComponentName.
+	 */
+	public String getCurrentlyAnalyzedComponentName() {
+		return currentlyAnalyzedComponentName;
+	}
+
+	/**
+	 * Sets currently analyzed component name and resets
+	 * target platform setting. Target platform can be set after this call 
+	 * by calling method <code>setCurrentlyAnalyzedComponentTargetPlatform</code>.
+	 * @param currentlyAnalyzedComponentName The currentlyAnalyzedComponentName to set.
+	 */
+	public void setCurrentlyAnalyzedComponentName(
+			                                String currentlyAnalyzedComponentName) {		
+		this.currentlyAnalyzedComponentName = currentlyAnalyzedComponentName;
+		this.currentlyAnalyzedComponentTargetPlatform = null; // not set by default
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * Sets the target platform for the currently analyzed component.
+	 * Should be called after <code>setCurrentlyAnalyzedComponentName</code> is called if needed.
+	 * @param currentlyAnalyzedComponentTargetPlatform The target platform for the currently analyzed component.
+	 */
+	public void setCurrentlyAnalyzedComponentTargetPlatform(
+			                                ITargetPlatform currentlyAnalyzedComponentTargetPlatform) {		
+		this.currentlyAnalyzedComponentTargetPlatform = currentlyAnalyzedComponentTargetPlatform;
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * Gets target platform for the currently analyzed component.
+	 * @return target platform for the currently analyzed component, or <code>null</code> if not set.
+	 */
+	public ITargetPlatform getCurrentlyAnalyzedComponentTargetPlatform() {
+		return currentlyAnalyzedComponentTargetPlatform;
+	}
+
+	/**
+	 * Checks if cache data loading is ongoing.
+	 * @return <code>true</code> if cache data loading is ongoing, otherwise <code>false</code>.
+	 */
+	public boolean isCacheDataLoadingOngoing(){
+		return isCacheDataLoadingOngoing;
+	}
+	
+	/**
+	 * Checks if caching is ongoing for the given target.
+	 * @param sdkInfo SDK information object 
+	 * @param targetPlatformName Target Platform Name string
+	 * @param buildType Build type.
+	 * @return Returns <code>true</code> if caching is ongoing, 
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isCacheGenerationOngoingForTarget(SdkInformation sdkInfo, 
+										 String targetPlatformName,
+										 IBuildType buildType) {	
+		return AppDepJobManager.getInstance().hasCacheGenerationJobForTarget(sdkInfo.getSdkId(),
+																			targetPlatformName,
+																			buildType);
+	}
+	
+	/**
+	 * Checks if caching is ongoing for the given SDK.
+	 * @param sdkInfo SDK information object 
+	 * @return Returns <code>true</code> if caching is ongoing, 
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isCacheGenerationOngoingForSdk(SdkInformation sdkInfo) {	
+		return AppDepJobManager.getInstance().hasCacheGenerationJobForSdk(sdkInfo.getSdkId());
+	}
+	
+	/**
+	 * Returns component file objects for the SDK and Target Platform 
+	 * given as parameters.
+	 * @param sdkInfo SDK information object. 
+	 * @param targetPlatformName Target Platform Name string
+	 * @param buildType Build type.
+	 * @return File object array of given components.
+	 */
+	private File[] getComponentsForSdkAndPlatform(SdkInformation sdkInfo, 
+												  String targetPlatformName,
+												  IBuildType buildType) {
+		
+		String releaseDirPath = 
+							sdkInfo.getReleaseRootDir() 
+							+ File.separatorChar 
+							+ targetPlatformName
+							+ File.separatorChar 
+							+ buildType.getBuildTypeName();
+		File releaseDir = new File(releaseDirPath);
+		if(releaseDir.exists())
+			return releaseDir.listFiles(new ComponentFileFilter());
+		else{
+			return null;
+		}
+	}
+
+	/**
+	 * Returns component count for the SDK and Target Platform 
+	 * given as parameters.
+	 * @param sdkInfo SDK information object. 
+	 * @param targetPlatformName Target Platform Name string
+	 * @param buildType Build type.
+	 * @return Component count
+	 */
+	public int getComponentCountForSdkAndPlatform(SdkInformation sdkInfo, 
+												  String targetPlatformName,
+												  IBuildType buildType) {
+		
+		mostRecentlyQueriedComponentCount = 0;
+		
+		String releaseDirPath = 
+							sdkInfo.getReleaseRootDir() 
+							+ File.separatorChar 
+							+ targetPlatformName
+							+ File.separatorChar 
+							+ buildType.getBuildTypeName();
+		File releaseDir = new File(releaseDirPath);
+		if(releaseDir.exists()){
+			String[] fileArr = releaseDir.list(new ComponentFileFilter());
+			mostRecentlyQueriedComponentCount = fileArr.length;
+			return mostRecentlyQueriedComponentCount;			
+		}
+		// Directory was not found => no components.
+		return mostRecentlyQueriedComponentCount;
+	}
+	
+	/**
+	 * Check if cache needs to be updated i.e. there is newer
+	 * files existing in build directory. Note that this method returns
+	 * <code>true</code> whenever it meets the first target requiring update.
+	 * @param sdkInfo SDK information object. 
+	 * @param targets Target to check cache update need for
+	 * @param buildType Build type.
+	 * @return <code>true</code> if cache needs update, otherwise <code>false</code>.
+	 */
+	public boolean cacheNeedsUpdate(SdkInformation sdkInfo, 
+									ITargetPlatform[] targets, IBuildType buildType){
+
+		// Checking through all the targets
+		for (int i = 0; i < targets.length; i++) {
+			ITargetPlatform platform = targets[i];
+			String targetPlatformName = platform.getId();
+			
+			if(targetPlatformName.equals(TARGET_TYPE_ID_SIS)){
+				continue;
+			}
+			
+			String cacheFilePath = getCacheFileAbsolutePathNameForSdkAndPlatform(
+																				sdkInfo, 
+																				targetPlatformName,
+																				buildType);
+			File cacheFile = new File(cacheFilePath);
+			if(!cacheFile.exists()){
+				// We should not encounter this situation, but if there is no
+				// cache file, then it surely needs update.
+				return true;
+			}
+			
+			String buildDir = getBuildDirectoryForSdkAndPlatform(sdkInfo, 
+																 targetPlatformName,
+																 buildType);
+			
+			CacheIndex cacheIndx = null;
+		    try {
+				cacheIndx = CacheIndex.getCacheIndexInstance(cacheFile,
+						                                                buildDir);
+			} catch (IOException e) {
+				e.printStackTrace();
+				// We should no encounter in this situation, but then
+				// it is better to enable the regeneration of the cache.
+				return true;
+			}
+
+			// Checking that cache is not corrupted. 
+			if(! cacheIndx.isCacheNonCorrupted()){
+				// If corrupted, then needs update
+				return true;
+			}
+			
+			// Checking that cache is of correct version
+			if(! cacheIndx.getVersionInfo().equals(ProductInfoRegistry.getSupportedCacheFileVersionInfoString())){
+				// If non-supported version, then needs update
+				return true;
+			}			
+			File[] fileArr = null;
+			
+		    fileArr = getComponentsForSdkAndPlatform(sdkInfo, 
+					  									   targetPlatformName,
+					  									   buildType);
+		    // Comparing found components against cache information
+			if(fileArr != null && isComponentFileArrayChangedWhenComparingWithCache(cacheIndx, fileArr)){
+				return true;
+			}
+			
+		}//for
+		
+	    return false;
+	}
+
+	/**
+	 * Checks if given component file array has been changed in respect to cache file.
+	 * @param cacheIndx Cache index used to check for timestamps stored in cache.
+	 * @param componentFileArr File array to be checked against cache information.
+	 * @return <code>true</code> if cache needs update, otherwsise <code>false</code>.
+	 */
+	private boolean isComponentFileArrayChangedWhenComparingWithCache(CacheIndex cacheIndx, File[] componentFileArr) {
+		
+		File f = null;
+		for (int j = 0; j < componentFileArr.length; j++) {
+			f = componentFileArr[j];
+			String basename = f.getName();
+			try {
+				long fileModifiedAsMillisecAccuracy = f.lastModified();
+				// Flooring timestamp into second level accuracy. The unit is still milliseconds.
+				long fileModifiedAsSecAccuracy = floorTimestampIntoSecondLevelAccuracy(fileModifiedAsMillisecAccuracy);
+				// Unit for cache timestamp got from cache index is also milliseconds 
+				long cacheTimestamp = cacheIndx.getLastModifiedTimeForComponent(basename);
+				
+				if (fileModifiedAsSecAccuracy != cacheTimestamp) {	
+					
+					// Absolute value of the difference in milliseconds
+					long diff = Math.abs((fileModifiedAsSecAccuracy - cacheTimestamp));
+					
+					//
+					// lastModified() method of File-class does not
+					// always produce correct results in Windows environment.
+					// Sometimes it gives time stamps that are exactly 
+					// one hour wrong due to daylight savings:
+					//
+					// For details, see 
+					// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4860999
+					//
+					// Therefore ignoring exact 1 hour differences in timestamps.
+					//					
+					final int DL_SAVINGS_BUG_CHECK_INTERVAL = (1000 * 60 * 60);
+					
+					// Allowing a  range N seconds when identifying if the cache information of
+					// a component is up-to-date. This is because if the cache file has been
+					// generated with different operating system, the time stamps may not be exactly
+					// same. This line declares the currently used N.
+					final int DIFF_TOLERANCE = (1000 * 2); // 1000 * N
+					
+					// Checking the timestamp, first via bug filter
+					// Ignoring timestamps possibly caused due to the bug when adjusted with tolerance
+					if(
+						diff < (DL_SAVINGS_BUG_CHECK_INTERVAL - DIFF_TOLERANCE)
+						||
+						diff > (DL_SAVINGS_BUG_CHECK_INTERVAL + DIFF_TOLERANCE)						
+							){
+						// If the bug filter was passed we can continue checking...						
+						
+						if(diff > DIFF_TOLERANCE){
+							// Found component that is newer that cache
+							DbgUtility.println(DbgUtility.PRIORITY_LOOP, 
+									"Time stamps differ for component '" //$NON-NLS-1$
+									+ basename + "' " //$NON-NLS-1$
+									+ fileModifiedAsSecAccuracy 
+									+ " != " + cacheTimestamp); //$NON-NLS-1$
+							DbgUtility.println(DbgUtility.PRIORITY_LOOP, 
+									"Time stamps differ for component '" //$NON-NLS-1$
+									+ basename + "' " //$NON-NLS-1$
+									+ new Date(fileModifiedAsSecAccuracy).toString() 
+									+ " != " + new Date(cacheTimestamp).toString() ); //$NON-NLS-1$
+							return true;													
+						}
+					}
+				} 
+			} catch (NoSuchElementException e) {
+				// A new component has been added, and therefore
+				// cache file needs update.
+				DbgUtility.println(DbgUtility.PRIORITY_LOOP, 
+						           "Component not found from cache index: " + basename); //$NON-NLS-1$
+					return true;
+				}			
+		}//for
+		
+		return false;
+	}
+	
+	/**
+	 * Floors milliseconds timestamp into nearest second.
+	 * @param millisecTimestamp Timestamp with millisecond accuracy.
+	 * @return Timestamp with second accuracy.
+	 */
+	private long floorTimestampIntoSecondLevelAccuracy(long millisecTimestamp){
+		long seconds = millisecTimestamp/1000;
+		return (1000 * seconds);
+	}
+	
+	/**
+	 * Filter filenames that are regarded as valid components
+	 * for static dependency analysis.
+	 */
+	private class ComponentFileFilter implements FilenameFilter{
+
+		public boolean accept(File dir, String name) {
+			
+			// Filtering is made based on file extension.
+			// Accepting the following extensions.
+			String[] allowedExtensions = { "dll", //$NON-NLS-1$
+						                    "exe", //$NON-NLS-1$
+						                    "tsy", //$NON-NLS-1$
+						                    "csy", //$NON-NLS-1$
+						                    "fsy", //$NON-NLS-1$
+						                    "dsy", //$NON-NLS-1$
+						                    "prt", //$NON-NLS-1$
+						                    "app", //$NON-NLS-1$
+						                    "psy", //$NON-NLS-1$
+						                    "fep", //$NON-NLS-1$
+						                    "agt", //$NON-NLS-1$
+						                    "fxt" //$NON-NLS-1$
+			                             };
+			
+			String regExp = Pattern.quote("."); //$NON-NLS-1$
+			String[] splitArr = name.split(regExp);
+			int itemCount = splitArr.length;
+			if(itemCount > 1){
+				String extension = splitArr[itemCount-1];
+				for (int i = 0; i < allowedExtensions.length; i++) {
+					String allowedExt = allowedExtensions[i];
+					if(extension.equalsIgnoreCase(allowedExt)){
+						return true;
+					}					
+				}				
+			}
+			
+			return false;
+		}
+	}
+
+	/**
+	 * Removes ending backslash from directory if such exists.
+	 * @param directoryStr Directory path name to be checked for removal.
+	 * @return Returns directory path name without ending backslash.
+	 */
+	private String removeEndingBackslash(String directoryStr) {
+		if(directoryStr.endsWith(File.separator)){
+			return directoryStr.substring(0, (directoryStr.length()-1));
+		}
+		// No backslash => returning string as it was
+		return directoryStr;
+	}
+		
+	/**
+	 * Goes through the directory given in <code>File</code> object and deletes
+	 * all the only partially created cache files.
+	 * @param directoryToBeChecked
+	 * @param parentDirectoryPath
+	 */
+	private void deletePartiallyCreatedCacheFiles(File directoryToBeChecked, String parentDirectoryPath) {
+		File[] fileArr = directoryToBeChecked.listFiles();
+		for (int i = 0; i < fileArr.length; i++) {
+			File f = fileArr[i];
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, parentDirectoryPath + f.getName());	
+			if(f.isDirectory()){
+				// Traversing also sub directories
+				deletePartiallyCreatedCacheFiles(f, parentDirectoryPath + f.getName() + File.separatorChar);
+			}
+			else{
+				
+				File cacheFile = new File(f.getParent() 
+		                  + File.separatorChar
+		                  + ProductInfoRegistry.getCacheFileName());
+				File symbolsTableFile = new File(f.getParent() 
+		                  + File.separatorChar
+		                  + ProductInfoRegistry.getCacheSymbolsFileName());
+
+				//
+				// Cache files are considered as partially created, if
+				// - either of the cache info files is of zero size
+				//	
+				boolean cacheFileIsZeroSized = cacheFile.exists() && (cacheFile.length() == 0);
+				boolean symbolsTableFileIsZeroSized = symbolsTableFile.exists() && (symbolsTableFile.length() == 0);
+				
+				if(cacheFileIsZeroSized || symbolsTableFileIsZeroSized){					
+
+					// Partially created cache ...
+
+					// Deleting cache file first
+					if(cacheFile.exists()){
+						DbgUtility.println(DbgUtility.PRIORITY_LOOP, "\tDeleting cache file!!!"); //$NON-NLS-1$
+						if(!cacheFile.delete()){
+							AppDepConsole.getInstance().println(Messages.getString("AppDepSettings.Failed_to_Delete_Cache_File")  //$NON-NLS-1$
+										       + cacheFile.getAbsolutePath(), IConsolePrintUtility.MSG_ERROR);							
+						}
+					}
+					// Then deleting the symbol tables file, if it exists
+					if(symbolsTableFile.exists()){
+						DbgUtility.println(DbgUtility.PRIORITY_LOOP, "\tDeleting symbol tables cache file!!!"); //$NON-NLS-1$
+						if(!symbolsTableFile.delete()){
+							AppDepConsole.getInstance().println(Messages.getString("AppDepSettings.Failed_to_Delete_Symbols_File") //$NON-NLS-1$
+									           + f.getAbsolutePath(), IConsolePrintUtility.MSG_ERROR);
+						}						
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Clean-up cache files that are only partially created.
+	 */
+	public void cleanupPartiallyCreatedCacheFiles(){
+		
+		SdkInformation[] infos;
+		File cacheDir;
+		String strCacheDir;
+		//Found all installed SDK:s, search through all of them and clean 
+		try {
+			infos = SdkManager.getSdkInformation();			
+			for (int i = 0; i < infos.length; i++) {
+				SdkInformation info = infos[i];
+				strCacheDir = 
+					removeEndingBackslash (info.getEpoc32ToolsDir()) 
+					+ File.separatorChar
+					+ getCachePathRelativeToToolsDir();
+				cacheDir = new File(strCacheDir);
+				if(cacheDir.exists()){
+					DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "cleanupPartiallyCreatedCacheFiles for '" + cacheDir.getAbsolutePath() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+					deletePartiallyCreatedCacheFiles(cacheDir, cacheDir.getName() + File.separatorChar);
+				}
+			}
+
+		} catch (SdkEnvInfomationResolveFailureException e) {
+			e.printStackTrace();
+		}		
+		
+		
+	}
+
+	/**
+	 * @return Returns the mostRecentlyQueriedComponentCount.
+	 */
+	public int getMostRecentlyQueriedComponentCount() {
+		return mostRecentlyQueriedComponentCount;
+	}
+	
+	/**
+	 * @return Returns the gccToolsDir.
+	 */
+	public String getGccToolsDir() {
+		return getCurrentlyUsedSdk().getEpocRootDir()
+				+ GCC_TOOL_REL_DIR;
+	}
+	
+	/**
+	 * Gets array of all supported toolchains.
+	 * @return Array of all supported toolchains.
+	 */
+	public IToolchain[] getAllSupportedToolchains(){
+		return (IToolchain[]) supportedToolchainsVector.toArray(new IToolchain[0]);
+	}
+	
+	/**
+	 * Gets array of supported toolchains for currently selected target.
+	 * @return Array of supported toolchains for currently selected target..
+	 * @throws InvalidCmdLineToolSettingException
+	 */
+	public IToolchain[] getSupportedToolchainsForCurrentlyUsedTargets() throws InvalidCmdLineToolSettingException{
+		// In setCurrentlyUsedTargetPlatforms it is made sure that all targets
+		// platforms will map to the same toolchains => therefore we can
+		// safely use just the first target platform instance.
+		String targetPlatformId = getCurrentlyUsedTargetPlatforms()[0].getId();		
+		return getSupportedToolchainsForGivenTargetPlatformId(targetPlatformId);
+	}
+
+	
+	/**
+	 * Gets array of supported toolchains for given target platform id.
+	 * @param targetPlatformId Target platform id.
+	 * @return Array of supported toolchains for given target platform id.
+	 * @throws InvalidCmdLineToolSettingException
+	 */
+	public IToolchain[] getSupportedToolchainsForGivenTargetPlatformId(String targetPlatformId) throws InvalidCmdLineToolSettingException{
+		
+		ArrayList<Toolchain> toolchainsForTargetArrayList = new ArrayList<Toolchain>();
+		
+		// Checking GCC targets
+		if(targetPlatformId.equalsIgnoreCase(STR_ARMI)
+				||
+				targetPlatformId.equalsIgnoreCase(STR_ARM4)
+				||
+				targetPlatformId.equalsIgnoreCase(STR_THUMB)
+				||
+				targetPlatformId.toLowerCase().startsWith(STR_WILDCHARD_GCC_M.toLowerCase())
+				){
+			toolchainsForTargetArrayList.add(toolchainGCC);		
+		}
+		// Using these for all others
+		else{
+			toolchainsForTargetArrayList.add(toolchainGCCE);		
+			toolchainsForTargetArrayList.add(toolchainRVCT);		
+		}
+		
+		return (IToolchain[]) toolchainsForTargetArrayList.toArray(new IToolchain[0]);
+	}
+
+	/**
+	 * Gets default toolchain for currently the given target.
+	 * @param targetId Target to check for default toolchain.
+	 * @return Default toolchain for currently the given target.
+	 * @throws InvalidCmdLineToolSettingException
+	 */
+	public IToolchain getDefaultToolchainForTarget(String targetId) throws InvalidCmdLineToolSettingException{
+		
+		IToolchain defaultToolchain = null;
+					
+		// Checking for supported GCC toolchain targets
+		if(targetId.equalsIgnoreCase(STR_ARMI)
+				||
+				targetId.equalsIgnoreCase(STR_ARM4)
+				||
+				targetId.equalsIgnoreCase(STR_THUMB)
+				||
+				targetId.toLowerCase().startsWith(STR_WILDCHARD_GCC_M.toLowerCase())
+				){
+			defaultToolchain = toolchainGCC;		
+		}
+		else{
+			if(isGcceToolsInstalled()){
+				// This is preferred toolchain
+				defaultToolchain = toolchainGCCE;		
+			}
+			else{
+				// This is alternate toolchain for same purpose
+				defaultToolchain = toolchainRVCT;		
+			}
+		}
+
+		return defaultToolchain;
+	}
+	
+	/**
+	 * @return Returns the cacheGenerOptions.
+	 */
+	public CacheGenerationOptions getCacheGenerOptions() {
+		return cacheGenerOptions;
+	}
+
+	/**
+	 * @param cacheGenerOptions The cacheGenerOptions to set.
+	 */
+	public void setCacheGenerOptions(CacheGenerationOptions cacheGenerOptions) {
+		this.cacheGenerOptions = cacheGenerOptions;
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+	
+	/**
+	 * If SDK selection wizard is launched with SIS page option.
+	 * @return <code>true</code> if Add SIS files page is launched and Wizard is in SIS Analysis mode.
+	 */
+	public boolean isInSISFileAnalysisMode() {
+		return isInSISFileAnalysisMode;
+	}
+	/**
+	 * Set if SDK selection wizard is launched with SIS page option.
+	 * @param set Wizard to SIS analysis mode.
+	 */
+	public void setIsInSISFileAnalysisMode(boolean isInSISFileAnalysisMode) {
+		this.isInSISFileAnalysisMode = isInSISFileAnalysisMode;
+		if(!isInSISFileAnalysisMode){
+			sisFilesForAnalysis = null;
+		}
+	}	
+	
+	/**
+	 * Get SIS files selected in SIS selection page.
+	 * @return SIS files selected in SIS selection page if this wizard is SIS wizard
+	 * (this.isInSISFileAnalysisMode() returns <code>true</code>, otherwise null. 
+	 * Returned files names is absolutely file names with path.
+	 */
+	public String[] getSISFilesForAnalysis() {
+		if(isInSISFileAnalysisMode()){
+			return sisFilesForAnalysis;
+		}
+		else{
+			return null;
+		}
+	}		
+	/**
+	 * Set selected SIS files for analysis
+	 * @param valid Symbian 9.x sisFiles (absolutely file names with path)
+	 */
+	public void setSISFilesForAnalysis(String[] sisFiles) {
+		this.sisFilesForAnalysis = sisFiles;
+	}		
+
+	/**
+	 * @return Returns the exportPrintReportPath.
+	 */
+	public String getExportPrintReportPath() {
+		return exportPrintReportPath;
+	}
+
+	/**
+	 * @param exportPrintReportPath The exportPrintReportPath to set.
+	 */
+	public void setExportPrintReportPath(String exportPrintReportPath) {
+		this.exportPrintReportPath = exportPrintReportPath;
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * @return Returns the exportXMLreport.
+	 */
+	public boolean isExportXMLreport() {
+		return exportXMLreport;
+	}
+
+	/**
+	 * @param exportXMLreport The exportXMLreport to set.
+	 */
+	public void setExportXMLreport(boolean exportXMLreport) {
+		this.exportXMLreport = exportXMLreport;
+		// Notifying possible listeners
+		notifySettingsListeners(false);
+	}
+
+	/**
+	 * @return Returns the resourcesPath.
+	 */
+	public String getResourcesPath() {
+		return resourcesPath;
+	}
+
+	/**
+	 * @param resourcesPath The resourcesPath to set.
+	 */
+	public void setResourcesPath(String resourcesPath) {
+		this.resourcesPath = resourcesPath;
+	}
+
+	/**
+	 * @return Returns the XSLFileName.
+	 */
+	public String getXSLFileName() {
+		return XSLFileName;
+	}
+
+	/**
+	 * @param fileName The XSLFileName to set.
+	 */
+	public void setXSLFileName(String fileName) {
+		this.XSLFileName = fileName;
+	}
+
+	/**
+	 * @param cacheUpdated The cacheUpdated to set.
+	 */
+	public void cacheWasUpdated() {
+		cacheUpdated = true;
+	}
+
+	/**
+	 * @return Returns the isUsedByXSLFileName.
+	 */
+	public String getIsUsedByXSLFileName() {
+		return isUsedByXSLFileName;
+	}
+
+	/**
+	 * @param isUsedByXSLFileName The isUsedByXSLFileName to set.
+	 */
+	public void setIsUsedByXSLFileName(String isUsedByXSLFileName) {
+		this.isUsedByXSLFileName = isUsedByXSLFileName;
+	}
+
+	/**
+	 * Returns currently used targets as string representation.
+	 * @return
+	 */
+	public String getCurrentlyUsedTargetPlatformsAsString() {
+		ITargetPlatform[] targets = getCurrentlyUsedTargetPlatforms();
+		String targetPlatformStrList = ""; //$NON-NLS-1$
+		if(targets.length > 0){
+			targetPlatformStrList = targets[0].getId();
+			for (int i = 1; i < targets.length; i++) {
+				String targetPlatformId = targets[i].getId();
+				targetPlatformStrList = targetPlatformStrList + "+" + targetPlatformId;  //$NON-NLS-1$
+			}			
+		}
+		return targetPlatformStrList;
+	}
+
+	/**
+	 * Checks if Elftran is available for given SDK or platform.
+	 * @param sdkInfo  SDK information object. 
+	 * @return <code>true</code> if elftran is available, otherwise <code>false</code>.
+	 */
+	public boolean isElftranAvailable(SdkInformation sdkInfo){
+		String absolutePath = 	sdkInfo.getEpoc32ToolsDir() + File.separatorChar + STR_ELFTRAN_EXE;
+		File elftranFile = new File(absolutePath);
+		if(elftranFile.exists()){
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * Checks if Petran is available for given SDK or platform.
+	 * @param sdkInfo  SDK information object. 
+	 * @return <code>true</code> if petran is available, otherwise <code>false</code>.
+	 */
+	public boolean isPetranAvailable(SdkInformation sdkInfo){
+		String absolutePath = 	sdkInfo.getEpoc32ToolsDir() + File.separatorChar + STR_PETRAN_EXE;
+		File petranFile = new File(absolutePath);
+		if(petranFile.exists()){
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Checks if Dumpsis.exe is available for given SDK or platform.
+	 * @param sdkInfo  SDK information object. 
+	 * @return <code>true</code> if Dumpsis.exe is available, otherwise <code>false</code>.
+	 */
+	public boolean isDumpsisAvailable(SdkInformation sdkInfo){
+		String absolutePath = 	sdkInfo.getEpoc32ToolsDir() + File.separatorChar + ProductInfoRegistry.getDumpsisExeFileName();
+		File dumpsisFile = new File(absolutePath);
+		if(dumpsisFile.exists()){
+			return true;
+		}
+		return false;		
+	}
+	
+	/**
+	 * Adds a new settings change listener object.
+	 * @param listener Listener to be added.
+	 */
+	public void addSettingsListener(IAppDepSettingsChangedListener listener){
+		settingListenersVector.add(listener);
+	}
+	
+	/**
+	 * Removes a new settings change listener object.
+	 * @param listener Listener to be removed.
+	 */
+	public void removeSettingsListener(IAppDepSettingsChangedListener listener){
+		settingListenersVector.remove(listener);
+	}
+	
+	/**
+	 * Notifies listeners that settings has been changed.
+	 * @param isTargetBuildChanged Should set to <code>true</code> by the caller if, the currently
+	 * 							   used target build settings has been changed, otherwise set to 
+	 * 							   <code>false</code> by the caller (for example, if only currently
+	 *                             analyzed component has been changed). 
+	 */
+	private void notifySettingsListeners(boolean isTargetBuildChanged){
+		for (IAppDepSettingsChangedListener listener : settingListenersVector) {
+			listener.settingsChanged(isTargetBuildChanged);
+		}		
+	}
+	
+	/**
+	 * Checks if currently selected caches require update.
+	 * @return <code>true</code> if some of the currently selected caches
+	 *         needs update, otherwise <code>false</code>.
+	 */
+	public boolean currentlySelectedCachesNeedsUpdate(){
+		return cacheNeedsUpdate(getCurrentlyUsedSdk(), 
+								getCurrentlyUsedTargetPlatforms(), 
+					            getBuildType());
+	}
+
+	/**
+	 * Checks if two setting instances had equal target platform selection.
+	 * @param settingsToCompareThisTo Settings object to compare this instance against.
+	 * @return <code>true</code> if two setting instances had equal target platform selection, otherwise <code>false</code>.
+	 */
+	public boolean hasEqualTargetPlatformSelections(AppDepSettings settingsToCompareThisTo) {
+		
+		//
+		// Doing actual comparison 
+		//
+		if(settingsToCompareThisTo.currentlyUsedSdk.getSdkId() != currentlyUsedSdk.getSdkId()) return false;
+		
+		ITargetPlatform[] targetPlatformArrThis = getCurrentlyUsedTargetPlatforms();
+		ITargetPlatform[] targetPlatformArrThisCompareTo = settingsToCompareThisTo.getCurrentlyUsedTargetPlatforms();
+		
+		if(targetPlatformArrThisCompareTo.length != targetPlatformArrThis.length) return false;
+		
+		for (int i = 0; i < targetPlatformArrThisCompareTo.length; i++) {
+			ITargetPlatform targetPlatformIdThisCompareTo = targetPlatformArrThisCompareTo[i];
+			ITargetPlatform targetPlatformIdThis = targetPlatformArrThis[i];
+			// If any of the selected targets differ => no match
+			if(targetPlatformIdThisCompareTo.getId() != targetPlatformIdThis.getId()) return false;
+		}
+		// Also build type must match
+		if(settingsToCompareThisTo.buildType.getBuildTypeName() != buildType.getBuildTypeName()) return false;
+		
+		return true;
+	}
+
+	/**
+	 * @param isCacheDataLoadingOngoing the isCacheDataLoadingOngoing to set
+	 */
+	public void setCacheDataLoadingOngoing(boolean isCacheDataLoadingOngoing) {
+		this.isCacheDataLoadingOngoing = isCacheDataLoadingOngoing;
+	}
+
+	/**
+	 * @return the cacheUpdated
+	 */
+	public boolean isCacheUpdated() {
+		return cacheUpdated;
+	}
+
+	/**
+	 * Resets cache update flag back to <code>false</code>.
+	 */
+	public void resetCacheUpdateFlag() {
+		this.cacheUpdated = false;
+	}
+
+	/**
+	 * Returns string representation of currently selected SDK and target platforms.
+	 * @return String representation of currently selected SDK and target platforms.
+	 */
+	public String getCurrentlyUsedTargetsAsString() {
+		return "'"  //$NON-NLS-1$
+				+ getCurrentlyUsedSdk().getSdkId()
+				+ " - " //$NON-NLS-1$
+				+ getCurrentlyUsedTargetPlatformsAsString()
+				+ " " //$NON-NLS-1$
+				+ getBuildType().getBuildTypeDescription()
+				+ "'"; //$NON-NLS-1$;
+	}
+
+	/**
+	 * Clear currently used target platforms from settings.
+	 */
+	public void clearCurrentlyUsedTargetPlatforms() {
+		currentlyUsedTargetPlatforms.clear();
+	}
+
+	/**
+	 * Check if root component has been already selected under analysis.
+	 * @return <code>true</code> if root component has been selected, 
+	 */
+	public static boolean isRootComponentSelectedForAnalysis() {
+		String currentRootComponent = null;
+		AppDepSettings activeSettings = getActiveSettings();
+		if(activeSettings != null){
+			currentRootComponent =  activeSettings.getCurrentlyAnalyzedComponentName();					
+			if(currentRootComponent != null){
+				// Root component selected
+				return true;
+			}			
+		}
+		// Root component not selected
+		return false;
+	}
+
+	/**
+	 * Sets version of the RVCT toolchain.
+	 * @param version string representation of toolchain version.
+	 */
+	public void setRvctToolsVersion(String version) {
+		toolchainRVCT.setVersion(version);
+	}
+
+	/**
+	 * Gets currently set RVCT tools version.
+	 * @return string representation of toolchain version, or <code>null</code> if version info is not available. 
+	 */
+	public String getRvctToolsVersion() {
+		return toolchainRVCT.getVersion();
+	}
+
+	/**
+	 * Checks that command-line tools needed by AppDep Core are available in order
+	 * to run cache generation. Currently required tools include petran.exe for GCC toolchain
+	 * and elftran.exe for other toolchains.
+	 * @param sdkInfo SDK information object.
+	 * @param targetPlatformID Target platform id used to get matching toolchain setting.
+	 * @return <code>true</code> if all required tools are available, otherwise <code>false</code>.
+	 * @throws InvalidCmdLineToolSettingException 
+	 */
+	public boolean areToolsRequiredByCoreAvailable(SdkInformation sdkInfo, String targetPlatformID) throws InvalidCmdLineToolSettingException {
+		IToolchain[] supportedToolchainsForGivenTargetPlatformId = getSupportedToolchainsForGivenTargetPlatformId(targetPlatformID);		
+		if(supportedToolchainsForGivenTargetPlatformId[0].getToolchainName().equals(STR_GCC)){
+			return isPetranAvailable(sdkInfo);
+		}
+		return isElftranAvailable(sdkInfo);
+	}
+	
+	/**
+	 * Gets currently used binary dump tool name based on the currently
+	 * used toolchain setting.
+	 * @param targetPlatformID Target platform id used to get matching toolchain setting.
+	 * @return STR_PETRAN_EXE if GCC toolchain is selected, otherwise STR_ELFTRAN_EXE.
+	 * @throws InvalidCmdLineToolSettingException 
+	 */
+	public String getCurrentlyUsedCoreDumpToolName(String targetPlatformID) throws InvalidCmdLineToolSettingException{
+		IToolchain[] supportedToolchainsForGivenTargetPlatformId = getSupportedToolchainsForGivenTargetPlatformId(targetPlatformID);
+		if(supportedToolchainsForGivenTargetPlatformId[0].getToolchainName().equals(STR_GCC)){
+			return STR_PETRAN_EXE;
+		}
+		return STR_ELFTRAN_EXE;		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/BuildTypeDebug.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+public class BuildTypeDebug implements IBuildType {
+
+	public static final String NAME = "udeb"; //$NON-NLS-1$
+	private static final String DESCRIPTION = Messages.getString("BuildTypeDebug.BuildType_Description"); //$NON-NLS-1$
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#getBuildTypeName()
+	 */
+	public String getBuildTypeName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#getBuildTypeDescription()
+	 */
+	public String getBuildTypeDescription() {
+		return DESCRIPTION;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#equals(com.nokia.s60tools.appdep.core.IBuildType)
+	 */
+	public boolean equals(IBuildType buildType){
+		return NAME.equals(buildType.getBuildTypeName());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/BuildTypeRelease.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+public class BuildTypeRelease implements IBuildType {
+
+	public static final String NAME = "urel"; //$NON-NLS-1$
+	private static final String DESCRIPTION = Messages.getString("BuildTypeRelease.BuildType_Description"); //$NON-NLS-1$
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#getBuildTypeName()
+	 */
+	public String getBuildTypeName() {
+		return NAME;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#getBuildTypeDescription()
+	 */
+	public String getBuildTypeDescription() {
+		return DESCRIPTION;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IBuildType#equals(com.nokia.s60tools.appdep.core.IBuildType)
+	 */
+	public boolean equals(IBuildType buildType){
+		return NAME.equals(buildType.getBuildTypeName());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheCreationProgressLineReader.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,82 @@
+/*
+* 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.appdep.core;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+import com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver;
+import com.nokia.s60tools.util.cmdline.ICustomLineReader;
+
+public class CacheCreationProgressLineReader implements ICustomLineReader {
+
+	public CacheCreationProgressLineReader() {
+	}
+
+    private void filterProgressStatus(String line, 
+			   						  ICmdLineCommandExecutorObserver observer){
+    	String[] splitArr = line.split("%"); //$NON-NLS-1$
+    	if(splitArr.length == 2){
+	    	String token1 = splitArr[0];
+	    	String progressPercentageStr = token1.substring(token1.length()-3);
+	    	int progressPercentageInt = Integer.parseInt(progressPercentageStr.trim());
+	    	observer.progress(progressPercentageInt);
+    	}
+    }
+
+	public String readLine(BufferedReader br, 
+						   ICmdLineCommandExecutorObserver observer) throws IOException {
+		
+    	StringBuffer line = new StringBuffer(""); //$NON-NLS-1$
+    	// Marking is used to go back one character in the stresm after all the
+    	// backspaces are skipped. So we allow reading of one character and
+    	// the mark is still preserved.
+    	final int readAheadLimit = 1;
+    	int charAsInteger;
+    	char ch;
+    	while((charAsInteger = br.read()) != -1){
+    		ch = (char) charAsInteger;
+    		if(ch == '\n' || ch == '\r'){
+    			 filterProgressStatus(line.toString(), observer);
+	    		 return line.toString();
+    		}
+    		else if(ch == '\b'){
+    			// Consuming all the backspaces
+    			while(ch == '\b'){
+    				// Marking the place before read
+    				br.mark(readAheadLimit);
+    				charAsInteger = br.read();
+    				if(charAsInteger == -1){
+    					break;
+    				}
+    	    		ch = (char) charAsInteger;
+    			}
+    			// Going back into marked place (one character back)
+    			br.reset();
+    			 filterProgressStatus(line.toString(), observer);
+	    		return line.toString();
+    		}
+    		else{
+    			line.append(ch);	    			
+    		}
+    	}
+    	return null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheDataLoadProcessManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,185 @@
+/*
+* 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.appdep.core;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+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 com.nokia.s60tools.appdep.core.data.CacheDataManager;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.core.model.ICacheLoadProgressNotification;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.util.LogUtils;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This Singleton class takes care that cache data loading happens
+ * in synchronized manner that end-used experiences fluent
+ * notification about cache load process and population 
+ * of component tree.
+ */
+public class CacheDataLoadProcessManager {
+
+	/**
+	 * Private Singleton instance of this class.
+	 */
+	private static CacheDataLoadProcessManager instance;
+	
+	/**
+	 * IRunnableWithProgress object that performs cache load process.
+	 */
+	private class CacheLoadJobRunnable implements IRunnableWithProgress, ICacheLoadProgressNotification {
+
+		/**
+		 * Expected component count to be loaded (=amount of steps).
+		 */
+		private final int expectedComponentCount;
+
+		/**
+		 * Component count of currently loaded components.
+		 */
+		private int loadedComponentCount;
+
+		/**
+		 * Progress monitor used to report job progress.
+		 */
+		private IProgressMonitor progressMonitor;
+
+		/**
+		 * Settings to be used for cache loading.
+		 */
+		private final AppDepSettings activeSettings;
+
+		/**
+		 * Title message of progress dialog to show user.
+		 */
+		private final String title;
+
+		/**
+		 * Constructor.
+		 * @param activeSettings Active settings used for cache load.
+		 * @param expectedComponentCount Expected component count to be loaded (=amount of steps).
+		 */
+		public CacheLoadJobRunnable(String title, AppDepSettings activeSettings, int expectedComponentCount) {
+			this.title = title;
+			this.activeSettings = activeSettings;
+			this.expectedComponentCount = expectedComponentCount;
+		}
+		
+		public void run(IProgressMonitor monitor) {
+			progressMonitor = monitor;
+						
+			try {
+				progressMonitor.beginTask(title, expectedComponentCount);
+				// Loading cache data
+				CacheDataManager.loadCache(activeSettings, this);
+			} catch (CacheFileDoesNotExistException e) {
+				throw new RuntimeException(e.getMessage() + " (" + e.getClass().getSimpleName()  +")."); //$NON-NLS-1$ //$NON-NLS-2$	
+			} catch (IOException e) {
+				throw new RuntimeException(e.getMessage() + " (" + e.getClass().getSimpleName()  +")."); //$NON-NLS-1$ //$NON-NLS-2$	
+			} catch (Exception e) {
+				throw new RuntimeException(e.getMessage() + " (" + e.getClass().getSimpleName()  +")."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.appdep.core.model.ICacheLoadProgressNotification#componentLoaded(java.lang.String)
+		 */
+		public void componentLoaded(String componentName) {
+			loadedComponentCount++;
+			if(loadedComponentCount < expectedComponentCount){
+				progressMonitor.worked(1);						
+			}
+			else{
+				// Cache load about to finish => can inform user already
+				progressMonitor.setTaskName(Messages.getString("CacheDataLoadProcessManager.CacheDataLoaded_InfoMsg")); //$NON-NLS-1$
+			}
+		}
+		
+	};
+
+	/**
+	 * Private constructor. Instance of this class is generated via <code>runCacheLoadProcess</code> method.
+	 */
+	private CacheDataLoadProcessManager(){
+	}
+	
+	/**
+	 * Cache load process triggering publicly available access method.
+	 * @param activeSettings Settings used for cache data load process.
+	 * @param isCacheUpdated Set to <code>true</code> when we are actually re-loading currently analyzed cache.
+	 */
+	public static void runCacheLoadProcess(AppDepSettings activeSettings, boolean isCacheUpdated) {
+		if(instance == null){
+			instance = new CacheDataLoadProcessManager();			
+		}
+		instance.runCacheLoadProcessImpl(activeSettings, isCacheUpdated);
+	}
+
+	/**
+	 * Cache load process triggering private implementation.
+	 * @param activeSettings Settings used for cache data load process.
+	 * @param isCacheUpdated Set to <code>true</code> when we are actually re-loading currently analyzed cache.
+	 */
+	public void runCacheLoadProcessImpl(AppDepSettings activeSettings, boolean isCacheUpdated){ 		
+		try {
+			// Resettings possibly set cache update flag
+			activeSettings.resetCacheUpdateFlag();
+			// Starting load process
+			loadCacheDataShowProgressAndWaitForCompletion(activeSettings, isCacheUpdated);
+		} catch (Exception e) {			
+			String errMessageShort = Messages.getString("CacheDataLoadProcessManager.CacheDataLoadFailed_ErrMsg"); //$NON-NLS-1$
+			String errMessageExtended = errMessageShort + ": (" + e.getClass().getSimpleName() //$NON-NLS-1$ 
+										+ "): " + e.getMessage(); //$NON-NLS-1$
+			LogUtils.logStackTrace(errMessageExtended, e);
+			throw new RuntimeException(errMessageShort + ".");//$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Loads cache data and synchronously waits for load completion while notifies user
+	 * @param activeSettings Settings used for cache data load process.
+	 * @param isCacheUpdated Set to <code>true</code> when we are actually re-loading currently analyzed cache.
+	 * @throws IOException 
+	 * @throws CacheFileDoesNotExistException 
+	 * @throws InterruptedException 
+	 * @throws InvocationTargetException 
+	 */
+	private void loadCacheDataShowProgressAndWaitForCompletion(AppDepSettings activeSettings, boolean isCacheUpdated) throws CacheFileDoesNotExistException, IOException, InvocationTargetException, InterruptedException {
+		List<String> duplicateItemsList = new ArrayList<String>();
+		List<ComponentListNode> componentIteratorForGivenSettings = CacheIndex.getComponentIteratorForGivenSettings(activeSettings, duplicateItemsList);
+		int componentCountToBeLoaded = componentIteratorForGivenSettings.size();
+		String title = null;
+		title = Messages.getString("CacheDataLoadProcessManager.LoadingCache_ProgressMsg");			 //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, title); //$NON-NLS-1$
+		CacheLoadJobRunnable waitForCacheLoadJob = new CacheLoadJobRunnable(title, activeSettings, componentCountToBeLoaded);
+		ProgressMonitorDialog loadJobDld = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
+		loadJobDld.run(true, false, waitForCacheLoadJob);
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "CACHE LOAD DONE!"); //$NON-NLS-1$
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/CacheGenerationOptions.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,62 @@
+/*
+* 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.appdep.core;
+
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Class storing cache generation options.
+ */
+public class CacheGenerationOptions {
+
+	public static final int USE_DSO_FILES = 0;
+	public static final int USE_LIB_FILES = 1;
+	
+	private final IToolchain usedToolchain;
+	private int usedLibraryType;
+	
+	public CacheGenerationOptions(IToolchain usedToolchain, int usedLibraryType) throws InvalidCmdLineToolSettingException{
+		this.usedToolchain = usedToolchain;
+		if(usedLibraryType == USE_DSO_FILES || usedLibraryType == USE_LIB_FILES){
+			this.usedLibraryType = usedLibraryType;			
+		}
+		else{
+			String msg = Messages.getString("CacheGenerationOptions.Invalid_LibraryType_Msg")  //$NON-NLS-1$
+				         + ": " //$NON-NLS-1$
+						 + usedLibraryType;
+			throw new InvalidCmdLineToolSettingException(msg);
+		}
+	}
+
+	/**
+	 * @return Returns the usedLibraryType.
+	 */
+	public int getUsedLibraryType() {
+		return usedLibraryType;
+	}
+
+	/**
+	 * @return Returns the usedToolchain.
+	 */
+	public IToolchain getUsedToolchain() {
+		return usedToolchain;
+	}
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IAppDepSettingsChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* 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.appdep.core;
+
+/**
+ * Listener interface for listening the change of currently
+ * active settings.
+ */
+public interface IAppDepSettingsChangedListener {
+
+	/**
+	 * Informs listeners that active settings has been changed.
+	 * @param isTargetBuildChanged Should set to <code>true</code> by the caller if, the currently
+	 * 							   used target build settings has been changed, otherwise set to 
+	 * 							   <code>false</code> by the caller (for example, if only currently
+	 *                             analyzed component has been changed). 
+	 */
+	public void settingsChanged(boolean isTargetBuildChanged);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IBuildType.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,45 @@
+/*
+* 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.appdep.core;
+
+/**
+ * Common interface for all the supported 
+ * build types.
+ */
+public interface IBuildType {
+	
+	/**
+	 * Returns the build type name that matches with
+	 * the build directory name.
+	 * @return Build type name.
+	 */
+	public String getBuildTypeName();
+	
+	/**
+	 * Returns a short description of the build type.
+	 * @return Build type description.
+	 */
+	public String getBuildTypeDescription();
+	
+	/**
+	 * @return <code>true</code> if build types equals, otherwise <code>false</code>.
+	 */
+	public boolean equals(IBuildType buildType);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/ICacheIndexListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* 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.appdep.core;
+
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+
+/**
+ * Listener interface for object requiring information
+ * about successful cache creation.
+ */
+public interface ICacheIndexListener {
+	
+	/**
+	 * Informs the listener about successful cache index creation.
+	 * @param cacheIndexObj Cache index that was just created.
+	 */
+	public void cacheIndexCreationCompleted(CacheIndex cacheIndexObj);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/ITargetPlatform.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* 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.appdep.core;
+
+/**
+ * Target platform interface.
+ */
+public interface ITargetPlatform {
+	
+	/**
+	 * Gets identifier for the target platform 
+	 */
+	String getId();
+	
+	/**
+	 * @return <code>true</code> if target platform IDs equals, otherwise <code>false</code>.
+	 */
+	public boolean idEquals(String targetPlatformId);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/IToolchain.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,67 @@
+/*
+* 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.appdep.core;
+
+/**
+ * Common interface for all the supported 
+ * toolchain types.
+ */
+public interface IToolchain {
+	
+	/**
+	 * Returns the build type name that matches with
+	 * the toolchain name used when invoking command
+	 * line tool.
+	 * @return Toolchain type name.
+	 */
+	public String getToolchainName();
+	
+	/**
+	 * Returns a short description of the toolchain.
+	 * @return Toolchain description.
+	 */
+	public String getToolchainDescription();
+	
+	/**
+	 * Returns the installation status.
+	 * @return Returns <code>true</code> if toolchain is
+	 * installed, otherwise <code>false</code>.
+	 */
+	public boolean isInstalled();
+	
+	/**
+	 * Updates the installation status for the toolchain.
+	 */
+	public void setIsInstalled(boolean isInstalled);
+	
+	/**
+	 * Check it this toolchain is a default one.
+	 * @return Returns <code>true</code> if toolchain is
+	 * default one, otherwise <code>false</code>.
+	 */
+	public boolean isDefault();
+	
+	/**
+	 * Gets toolchain version if available.
+	 * @return toolchain version, or <code>null</code> if not available.
+	 */
+	public String getVersion();
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/LinesToStringArrayListCustomLineReader.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,45 @@
+/*
+* 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.appdep.core;
+
+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;
+
+class LinesToStringArrayListCustomLineReader implements ICustomLineReader {
+
+	private final ArrayList<String> resultLinesArrayList;
+
+	public LinesToStringArrayListCustomLineReader(ArrayList<String> resultLinesArrayList) {
+		this.resultLinesArrayList = resultLinesArrayList;
+	}
+
+	public String readLine(BufferedReader br, 
+			   ICmdLineCommandExecutorObserver observer) throws IOException {		
+		String line = br.readLine();
+		if(line != null){
+			resultLinesArrayList.add(line);			
+		}
+		return line;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/TargetPlatform.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,51 @@
+/*
+* 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.appdep.core;
+
+/**
+ * Class representing target platform selection.
+ */
+public class TargetPlatform implements ITargetPlatform {
+
+	private final String id;
+
+	/**
+	 * Constructor.
+	 * @param id Unique string identfier for target platform type
+	 */
+	public TargetPlatform(String id){
+		this.id = id;
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.ITargetPlatform#getId()
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.ITargetPlatform#idEquals(java.lang.String)
+	 */
+	public boolean idEquals(String targetPlatformId){
+		return id.equals(targetPlatformId);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/Toolchain.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core;
+
+/**
+ * Represents toolchain abstraction in 
+ * the level needed for the application. 
+ */
+public class Toolchain implements IToolchain {
+
+	private final String name;
+	private final String description;
+	private boolean isInstalled;
+	private final boolean isDefault;
+	private String toolchainVersion;
+
+	/**
+	 * Constructor.
+	 * @param name Toolchain name
+	 * @param description Toolchain description
+	 * @param isDefault set to <code>true</code> if this is default toolchain to be used, otherwise set to <code>false</code>
+	 * @param isInstalled set to <code>true</code> if this toolchain is installed on user's workstation, otherwise set to <code>false</code>
+	 */
+	public Toolchain(String name, String description, boolean isDefault, boolean isInstalled){
+		this.name = name;
+		this.description = description;
+		this.isDefault = isDefault;
+		this.isInstalled = isInstalled;		
+	}
+	
+	/**
+	 * Constructor for setting toolchain initially as non-installed.
+	 * @param name Toolchain name
+	 * @param description Toolchain description
+	 * @param isDefault set to <code>true</code> if this is default toolchain to be used, otherwise set to <code>false</code>
+	 */
+	public Toolchain(String name, String description, boolean isDefault){
+		this.name = name;
+		this.description = description;
+		this.isDefault = isDefault;
+		this.isInstalled = false;		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IToolchain#getToolchainName()
+	 */
+	public String getToolchainName() {
+		return name;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IToolchain#getToolchainDescription()
+	 */
+	public String getToolchainDescription() {
+		return description;
+	}
+
+	public boolean isInstalled() {
+		return isInstalled;
+	}
+
+	public void setIsInstalled(boolean isInstalled) {
+		this.isInstalled = isInstalled;
+	}
+
+	public boolean isDefault() {
+		return isDefault;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IToolchain#getVersion()
+	 */
+	public String getVersion() {
+		return toolchainVersion;
+	}
+
+	/**
+	 * Sets toolchain version.
+	 * @param version toolchain version
+	 */
+	public void setVersion(String version) {
+		toolchainVersion = version;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheCompPropertyField.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.data;
+
+/**
+ * Constants for indexing component property line
+ * in cache file.
+ */
+public class CacheCompPropertyField {	
+	public static final int DIRECTORY_ARR_INDX = 0; 
+	public static final int FILENAME_ARR_INDX = 1;
+	public static final int BINARY_FORMAT_ARR_INDX = 2;
+	public static final int UID1_ARR_INDX = 3;
+	public static final int UID2_ARR_INDX = 4;
+	public static final int UID3_ARR_INDX = 5;
+	public static final int SECURE_ID_ARR_INDX = 6;
+	public static final int VENDOR_ID_ARR_INDX = 7;
+	public static final int CAPABILITIES_ARR_INDX = 8;
+	public static final int MIN_HEAP_SIZE_ARR_INDX = 9;
+	public static final int MAX_HEAP_SIZE_ARR_INDX = 10;
+	public static final int STACK_SIZE_ARR_INDX = 11;
+	public static final int CACHE_TIMESTAMP_ARR_INDX = 12;	
+	public static final int DLL_REF_TABLE_COUNT_ARR_INDX = 13;
+	
+	/**
+	 * Gets the component property line field count.
+	 * 
+	 * This method should be up-to-date with corresponding field
+	 * indices defined above of this method.
+	 * @return The amount of fields in component property line in cache file.
+	 */
+	public static int getCompPropertyFieldCount(){
+		return 14;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheDataConstants.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.data;
+
+/**
+ * Declares and defines all cache data format related constants
+ * that are needed by multiple classes. 
+ */
+public class CacheDataConstants {
+
+	/**
+	 * Separator which is used to divide different data fields
+	 * in a single line of cache data.
+	 */
+	public static final String CACHE_FIELD_SEPARATOR = "|"; //$NON-NLS-1$
+	/**
+	 * Each non-corrupted cache file should end with the following string.
+	 */
+	public static final String CACHE_FILE_END_MARK = "#end"; //$NON-NLS-1$
+	/**
+	 * Header containing version info is separated with this character.
+	 * The header line is of format:
+	 * 
+	 *  appdep dependencies cache version: 101
+	 */
+	public static final String CACHE_VERSION_INFO_SEPARATOR = ":"; //$NON-NLS-1$
+	/**
+	 * Virtual flag for imported function is set to 'true' when the values is the following. 
+	 */
+	public static final String VIRTUAL_INDEX_FIELD_IS_TRUE_VALUE = "1"; //$NON-NLS-1$
+	/**
+	 * Indices to import function properties.
+	 */
+	public static final int FUNC_ORDINAL_INDEX = 0;
+	public static final int FUNC_NAME_INDEX = 1;
+	public static final int FUNC_IS_VIRTUAL_INDEX = 2;
+	public static final int FUNC_OFFSET_INDEX = 3;
+	/**
+	 * If function name has not been resolved, it is shown with the following string instance.
+	 */
+	public static final String FUNC_NAME_NOT_RESOLVED = "Import library not found!"; //$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheDataManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,645 @@
+/*
+* 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.appdep.core.data;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.core.model.AbstractFunctionData;
+import com.nokia.s60tools.appdep.core.model.CacheFactory;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ICacheLoadProgressNotification;
+import com.nokia.s60tools.appdep.core.model.ITargetCache;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.core.model.UsedComponentData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.search.MatchType;
+import com.nokia.s60tools.appdep.search.MatchType.MatchTypes;
+import com.nokia.s60tools.appdep.search.SearchConstants.SearchType;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Singleton facade class for accessing services of <code>ITargetCache</code> interface 
+ * that can handle only single cache file related searches. This manager class
+ * makes possible to handle searches from settings containing multiple targets.
+ */
+public class CacheDataManager implements ICacheDataManager {
+
+	//
+	// Class variables
+	//
+	
+	/**
+	 * Settings object this manager instance gets its settings data from.
+	 */
+	private static AppDepSettings settings = null;
+
+	/**
+	 * Storing each target cache interface reference for getting component data.
+	 */
+	private static List<ITargetCache> targetCacheList = null;
+
+	/**
+	 * Access to Singleton instance.
+	 */
+	private static CacheDataManager instance = null;
+
+	/**
+	 * Constructor (private).
+	 * Method <code>loadCache</code> is used to initialize the Singleton instance 
+	 * with proper data and <code>getInstance</code> later to access the initialized instance. 
+	 */
+	private CacheDataManager(){
+	}
+	
+	/**
+	 * Creating cache data manager that uses given settings.
+	 * @param settings Settings object to get user's selections from.
+	 * @throws CacheFileDoesNotExistException
+	 * @throws IOException
+	 */
+	public static ICacheDataManager getInstance() throws CacheFileDoesNotExistException, IOException{
+		
+		checkInstanceAccessPreconditions();
+		
+		if(instance == null){
+			instance = new CacheDataManager();
+		}
+		return instance;
+	}
+
+	/**
+	 * Checks that Singleton instance has been properly configured
+	 */
+	private static void checkInstanceAccessPreconditions() {
+		if(
+			settings == null
+			||
+			targetCacheList.size() < 1
+			){
+			// This failure happens in case cache data loading has failed due to some error logged elsewhere in code.
+			String errMsg = Messages.getString("CacheDataManager.TriedToAccessUninitializedSingletonInstance_ErrMsg") //$NON-NLS-1$
+										+ "'"  //$NON-NLS-1$
+										+ CacheDataManager.class.getSimpleName()
+										+ "' " //$NON-NLS-1$
+										+ Messages.getString("CacheDataManager.TargetCacheListSizeNegative_ErrMsg") //$NON-NLS-1$
+										+ "(" //$NON-NLS-1$
+										+ Messages.getString("CacheDataManager.Size_Str")   //$NON-NLS-1$
+										+ "=" //$NON-NLS-1$
+										+ targetCacheList.size() 
+										+ ")."; //$NON-NLS-1$
+			AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+			throw new RuntimeException(errMsg);			
+		}		
+	}
+
+	/**
+	 * Creates cache data manager that uses given settings.
+	 * @param settings Settings object to get user's selections from.
+	 * @param notifierRequestor If not <code>null</code> the client is requesting notifications about component loading process.
+	 * @throws CacheFileDoesNotExistException
+	 * @throws IOException
+	 */
+	public static void loadCache(AppDepSettings loadSettings, ICacheLoadProgressNotification notifierRequestor) throws CacheFileDoesNotExistException, IOException{
+		settings = loadSettings; // New settings override the old settings
+		targetCacheList = new ArrayList<ITargetCache>();
+		ITargetPlatform[] targets = settings.getCurrentlyUsedTargetPlatforms();
+		for (int i = 0; i < targets.length; i++) {
+			ITargetPlatform targetPlatform = targets[i];
+			String targetPlatformId = targetPlatform.getId();
+			String cacheDirForTarget = settings.getCacheDirForTarget(targetPlatformId);			
+			ITargetCache loadedTargetCache = CacheFactory.getInstance().loadCache(cacheDirForTarget, targetPlatformId, notifierRequestor);			
+			targetCacheList.add(loadedTargetCache);
+			}		
+	}
+
+	/**
+	 * This can be used to reset current settings.
+	 * This is mainly needed by JUnit tests for testing condition 
+	 * of accessing uninitialized manager instance.
+	 */
+	public static void reset(){
+		settings = null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getComponentPropertyArrayForComponent(java.lang.String)
+	 */
+	public ComponentPropertiesData getComponentPropertyArrayForComponent(String cmpName, ITargetPlatform targetPlatformRestriction) throws CacheIndexNotReadyException, IOException {
+		
+		ComponentPropertiesData results = null;
+		// Combining information from caches of all selected targets 
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			try {
+				// Checking if target platform must match
+				if(targetPlatformRestriction != null && !targetPlatformRestriction.idEquals(targetCache.getId())){
+					continue; // target platform match is required, and not matching => skipping this target cache
+				}				
+				// Search keys for accessing model data should be lower-case to overcome possible name mismatches
+				results = targetCache.getComponentPropertiesForComponent(cmpName.toLowerCase());
+				return results;
+			} catch (NoSuchElementException e) {
+				// If this was the last cache reader on the list informing the client via exception 
+				// that the component was not found, otherwise continuing for the next reader instance.
+				if(i == (targetCacheList.size()-1)){
+					throw e;					
+				}
+			}			
+		}
+		return results;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getDirectlyDependentComponentsFor(java.lang.String)
+	 */
+	public List<UsedComponentData> getDirectlyDependentComponentsFor(String compToSearchFor) throws IOException{
+
+		List<UsedComponentData> results = null;		
+		
+		// Combining information from caches of all selected targets 
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			try {
+				// Search keys for accessing model data should be lower-case to overcome possible name mismatches
+				results = targetCache.getDirectlyDependentComponentsFor(compToSearchFor.toLowerCase());
+				return results;
+			} catch (NoSuchElementException e) {
+				// If this was the last cache reader on the list informing the client via exception 
+				// that the component was not found, otherwise continuing for the next reader instance.
+				if(i == (targetCacheList.size()-1)){
+					throw e;					
+				}
+			}			
+		}
+		return results;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getExportedFunctionsForComponent(java.lang.String)
+	 */
+	public Collection<ExportFunctionData> getExportedFunctionsForComponent(String componentNameWithExtension) throws CacheIndexNotReadyException, IOException {
+		Collection<ExportFunctionData> results = null;		
+		
+		// Combining information from caches of all selected targets 
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			try {
+				// Search keys for accessing model data should be lower-case to overcome possible name mismatches
+				results = targetCache.getExportedFunctionsForComponent(componentNameWithExtension.toLowerCase());;
+				return results;
+			} catch (NoSuchElementException e) {
+				// If this was the last cache reader on the list informing the client via exception 
+				// that the component was not found, otherwise continuing for the next reader instance.
+				if(i == (targetCacheList.size()-1)){
+					throw e;					
+				}
+			}			
+		}
+		return results;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getParentImportedFunctionsForComponent(java.lang.String, java.lang.String)
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctionsForComponent(String parentCmpName, String importedCmpName) throws CacheIndexNotReadyException, IOException {
+		Collection<ImportFunctionData> results = null;		
+		
+		// Combining information from caches of all selected targets 
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			try {
+				// Search keys for accessing model data should be lower-case to overcome possible name mismatches.
+				results = targetCache.getParentImportedFunctionsForComponent(parentCmpName.toLowerCase(), importedCmpName.toLowerCase());
+				return results;
+			} catch (NoSuchElementException e) {
+				// If this was the last cache reader on the list informing the client via exception 
+				// that the component was not found, otherwise continuing for the next reader instance.
+				if(i == (targetCacheList.size()-1)){
+					throw e;					
+				}
+			}			
+		}
+		return results;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getUsingComponents(com.nokia.s60tools.appdep.core.job.IJobProgressStatus, java.util.ArrayList, java.lang.String, java.lang.String)
+	 */
+	public void getUsingComponents(IJobProgressStatus progressCallback, ArrayList<ComponentPropertiesData> resultComponentsArrayList, String componentName, String functionOrdinal) throws JobCancelledByUserException, IOException {
+		
+		int totalComponentCount = 0;
+		// Calculating the total component count for all caches
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			totalComponentCount += targetCache.getComponents().size();
+		}
+		// Getting using components for each cache and adding them to results array list
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+			targetCache.getUsingComponents(progressCallback, resultComponentsArrayList, componentName, functionOrdinal, totalComponentCount);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#searchComponentWithPrefix(java.util.List, java.lang.String)
+	 */
+	public String searchComponentWithPrefix(List<String> prefixList,
+			String componentName) {
+				
+		if( prefixList == null || prefixList.isEmpty() ){
+			return null;
+		}
+		
+		String[] prefixes = new String[prefixList.size()];
+		int j = 0;
+		
+		//Make map where is prefixes as lower case and in order they appear in users defined list
+		for (String pref : prefixList) {
+			prefixes[j] = pref;
+			j++;
+		}
+		
+		
+		// Combining information from caches of all selected targets 
+		Map<String, ComponentPropertiesData> compsWithWantedName = new HashMap<String, ComponentPropertiesData>();
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+
+			Collection<ComponentPropertiesData> components = targetCache
+					.getComponents();
+			
+			for (ComponentPropertiesData data : components) {
+				
+				// if this component name ends with component name wanted:
+				String compName = data.getFilename().toLowerCase();
+				if (compName.endsWith(componentName.toLowerCase())) {
+					// If first component in prefix list is found, we can just
+					// return it, otherwise keep on seeking
+					// because if we found 3rd or 4th on prefix list, we cannot
+					// know it there is a 1st or 2nd on the list.
+					if (compName.startsWith(prefixes[0])) {
+						return data.getFilename();
+					} else {
+						// If found component is one of the wanted components
+						// storing it to matching components
+						for (int k = 0; k < prefixes.length; k++) {
+							if (compName.startsWith(prefixes[k])) {
+								compsWithWantedName.put(prefixes[k], data);
+								break;
+							}
+						}
+					}
+				}
+				
+			}
+			
+		}
+		
+		//If we did not found first in the prefix list, just returning first on the list
+		for(int k = 0; k<prefixes.length; k++){
+			if(compsWithWantedName.containsKey(prefixes[k])){
+				return compsWithWantedName.get(prefixes[k]).getFilename();
+			}
+			
+		}
+		return null;
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#searchConcreteComponentsByGenericComponent(java.lang.String)
+	 */
+	public String[] searchConcreteComponentsByGenericComponent(
+			String genericComponentName) {
+		
+		// Combining information from caches of all selected targets 
+		ArrayList<String> concreteComponents = new ArrayList<String>();
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+
+			Collection<ComponentPropertiesData> components = targetCache
+					.getComponents();
+			
+			for (ComponentPropertiesData data : components) {
+				
+				// if this component name ends with component name wanted:
+				String compName = data.getFilename();
+				if (compName.toLowerCase().endsWith(genericComponentName.toLowerCase())) {
+
+					//Adding name of the component, which ends with generic component name to list
+					concreteComponents.add(compName);
+				}			
+			}		
+		}		
+		
+		return (String[]) concreteComponents.toArray(new String[0]);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#searchCache(java.lang.String, com.nokia.s60tools.appdep.search.SearchService.SearchType, com.nokia.s60tools.appdep.search.SearchService.MatchType)
+	 */
+	public Map<String, List<AbstractFunctionData>> searchCache(String searchString, SearchType searchType,
+			MatchType matchType) {
+		
+
+		Map<String, List<AbstractFunctionData>> matchingComponents = new HashMap<String, List<AbstractFunctionData>>();
+		
+		// Combining information from caches of all selected targets 
+		for (int i = 0; i < targetCacheList.size(); i++) {
+			ITargetCache targetCache = targetCacheList.get(i);
+
+			Collection<ComponentPropertiesData> components = targetCache
+					.getComponents();
+
+			int errors = 0;
+			for (ComponentPropertiesData data : components) {
+				
+				try {
+					handleSearchByType(searchString, searchType, matchType,
+							matchingComponents, data, targetCache);
+				} catch (NoSuchElementException e) {
+					//No action for NoSuchElementException
+					errors++;//Counting errors
+				} 
+			}
+			if(errors > 0){
+				String dbgMessage = "There were totally: '" + errors //$NON-NLS-1$
+									+ "' error(s) when searchtype was '" //$NON-NLS-1$ 
+									+ searchType  + "'."; //$NON-NLS-1$
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, dbgMessage);				
+			}
+		}		
+		
+		return matchingComponents;
+	}
+
+	/**
+	 * Makes search to cache based based on given search type. Delegates search query further with correct parameters.
+	 * @param searchString String to search for.
+	 * @param searchType what kind of information wanted to search.
+	 * @param matchType how searchString must be occur in results.
+	 * @param matchingComponents Output parameter. Map of matching results or empty list if none found. Map contains component names as keys
+	 *                           and function data list as values. Values are <code>null</code>s when search type is {@link SearchType.SEARCH_COMPONENTS}
+	 *                           and instances of {@link ExportFunctionData} when search type is {@link SearchType.SEARCH_EXPORTED_FUNCTION}
+	 *                           and instances of {@link ImportFunctionData} when search type is {@link SearchType.SEARCH_IMPORTED_FUNCTIONS}
+	 * @param data  Component properties data to be examined for possible match.
+	 * @param targetCache Target cache containing component properties currently under search.
+	 */
+	private void handleSearchByType(String searchString, SearchType searchType, MatchType matchType,
+			Map<String, List<AbstractFunctionData>> matchingComponents, ComponentPropertiesData data, ITargetCache targetCache) {
+
+		switch (searchType) {
+		case SEARCH_COMPONENTS:
+			searchForComponents(searchString, data, matchType, matchingComponents);		
+			break;
+		case SEARCH_EXPORTED_FUNCTION:
+			searchForExportedFunctions(searchString, data, matchType, matchingComponents, targetCache);
+			break;
+		case SEARCH_IMPORTED_FUNCTIONS:
+			searchForImportedFunctions(searchString, data, matchType, matchingComponents, targetCache);
+			break;
+
+		}		
+
+	}
+
+	/**
+	 * Makes component search based on the given search string and match type.
+	 * @param searchString String to search for.
+	 * @param data  Component properties data to be examined for possible match.
+	 * @param matchType how searchString must be occur in results.
+	 * @param matchingComponents Output parameter. Map of matching results or empty list if none found. Map contains component names as keys
+	 *                           and function data list as values. Values are <code>null</code>s when search type is {@link SearchType.SEARCH_COMPONENTS}
+	 *                           and instances of {@link ExportFunctionData} when search type is {@link SearchType.SEARCH_EXPORTED_FUNCTION}
+	 *                           and instances of {@link ImportFunctionData} when search type is {@link SearchType.SEARCH_IMPORTED_FUNCTIONS}
+	 */
+	private void searchForComponents(String searchString, ComponentPropertiesData data, 
+			MatchType matchType, Map<String, List<AbstractFunctionData>> matchingComponents) {
+		
+		boolean isCaseSensitive = matchType.isCaseSensitiveSearch();
+				
+		String compName = data.getFilename();
+		boolean matches = checkMatchByMatchType(searchString, compName, matchType,
+				isCaseSensitive);
+				
+		//Adding component to results if it marches to search string
+		if (matches) {
+
+			//Adding name of the component, which ends with generic component name to list
+			matchingComponents.put(compName, null);
+		}			
+	}
+	
+	/**
+	 * Makes exported function search based on the given search string and match type.
+	 * @param searchString String to search for.
+	 * @param data  Component properties data to be examined for possible match.
+	 * @param matchType how searchString must be occur in results.
+	 * @param matchingComponents Output parameter. Map of matching results or empty list if none found. Map contains component names as keys
+	 *                           and function data list as values. Values are <code>null</code>s when search type is {@link SearchType.SEARCH_COMPONENTS}
+	 *                           and instances of {@link ExportFunctionData} when search type is {@link SearchType.SEARCH_EXPORTED_FUNCTION}
+	 *                           and instances of {@link ImportFunctionData} when search type is {@link SearchType.SEARCH_IMPORTED_FUNCTIONS}
+	 * @param targetCache Target cache containing component properties currently under search.
+	 */
+	private void searchForExportedFunctions(
+			String searchString, ComponentPropertiesData data, MatchType matchType, 
+			Map<String, List<AbstractFunctionData>> matchingComponents, ITargetCache targetCache) {
+		
+		boolean isCaseSensitive = matchType.isCaseSensitiveSearch();
+				
+		String compName = data.getFilename();
+		Collection<ExportFunctionData> exportedFunctions = targetCache.getExportedFunctionsForComponent(compName);
+
+		//Seeking through all exported functions, and if found one function matching criteria,
+		//adding that function and component name to list. There can be more than one
+		boolean matches = false; 		
+		for (ExportFunctionData exportFunctionData : exportedFunctions) {
+			String exportFunctionName = exportFunctionData.getFunctionName(); // By default using long name
+			// For StartsWith, EndsWith, and ExactMatch searches we are using function's base name instead
+			if(matchType.getMatchType() == MatchTypes.STARTS_WITH 
+					|| matchType.getMatchType() == MatchTypes.ENDS_WITH
+					|| matchType.getMatchType() == MatchTypes.EXACT_MATCH){
+				exportFunctionName = exportFunctionData.getFunctionBaseName();
+			}
+			matches = checkMatchByMatchType(searchString, exportFunctionName, matchType,
+					isCaseSensitive);
+					
+			//Adding component to results if it marches to search string
+			if (matches) {
+
+				if(matchingComponents.containsKey(compName)){
+					List<AbstractFunctionData> functions = matchingComponents.get(compName);
+					functions.add(exportFunctionData);
+				}else{
+					List<AbstractFunctionData> functions = new ArrayList<AbstractFunctionData>();
+					functions.add(exportFunctionData);										
+					//Adding name of the component, which ends with generic component name to list
+					matchingComponents.put(compName, functions);					
+				}				
+			}			
+		}
+	}	
+	
+	/**
+	 * Makes imported function search based on the given search string and match type.
+	 * @param searchString String to search for.
+	 * @param data  Component properties data to be examined for possible match.
+	 * @param matchType how searchString must be occur in results.
+	 * @param matchingComponents Output parameter. Map of matching results or empty list if none found. Map contains component names as keys
+	 *                           and function data list as values. Values are <code>null</code>s when search type is {@link SearchType.SEARCH_COMPONENTS}
+	 *                           and instances of {@link ExportFunctionData} when search type is {@link SearchType.SEARCH_EXPORTED_FUNCTION}
+	 *                           and instances of {@link ImportFunctionData} when search type is {@link SearchType.SEARCH_IMPORTED_FUNCTIONS}
+	 * @param targetCache Target cache containing component properties currently under search.
+	 */
+	private void searchForImportedFunctions(
+			String searchString, ComponentPropertiesData data, MatchType matchType, 
+			Map<String, List<AbstractFunctionData>> matchingComponents, ITargetCache targetCache) {
+		
+		boolean isCaseSensitive = matchType.isCaseSensitiveSearch();
+				
+		
+		String compName = data.getFilename();
+		//We already have this component in list
+		if(matchingComponents.containsKey(compName)){
+			return;
+		}
+		//Gets the list of components that are used directly by this component.
+		Collection<UsedComponentData> usedComponentList = data.getUsedComponentList();
+		//Looping through all components that are using selected component
+		boolean matches = false; 
+		for (UsedComponentData usedComponentData : usedComponentList) {
+			//Gets functions imported from the component by the using parent component.
+			Collection<ImportFunctionData> imp = usedComponentData.getParentImportedFunctions();
+			//Looping through all imported function data 
+			for (ImportFunctionData importFunctionData : imp) {
+				//Check if import function name matches with search criteria
+				String importFunctionName = importFunctionData.getFunctionName(); // By default using long name
+				// For StartsWith, EndsWith, and ExactMatch searches we are using function's base name instead
+				if(matchType.getMatchType() == MatchTypes.STARTS_WITH 
+						|| matchType.getMatchType() == MatchTypes.ENDS_WITH
+						|| matchType.getMatchType() == MatchTypes.EXACT_MATCH){
+					importFunctionName = importFunctionData.getFunctionBaseName();
+				}
+				matches = checkMatchByMatchType(searchString, importFunctionName, matchType,
+						isCaseSensitive);
+				
+				//Adding component to results if it marches to search string
+				if (matches) {
+
+					//If there already is that function found
+					if(matchingComponents.containsKey(compName)){ 
+						List<AbstractFunctionData> functions = matchingComponents.get(compName);
+						functions.add(importFunctionData);
+					}
+					//else that function occurs very first time, and will be added to matchingComponents
+					else{
+						List<AbstractFunctionData> functions = new ArrayList<AbstractFunctionData>();
+						functions.add(importFunctionData);										
+						//Adding name of the component, which ends with generic component name to list
+						matchingComponents.put(compName, functions);					
+					}
+					
+				}									
+			}
+		}
+	}		
+
+	/**
+	 * Checks if search string match to another string by the given match type.
+	 * @param searchString search string.
+	 * @param stringToCompareWith string to compare search string against.
+	 * @param matchType match type
+	 * @param isCaseSensitive set to <code>true</code> if check should be case sensitive, otherwise <code>false</code>.
+	 * @return <code>true</code> if matches, <code>false</code> otherwise.
+	 */
+	private boolean checkMatchByMatchType(String searchString,
+			String stringToCompareWith, MatchType matchType,
+			boolean isCaseSensitive) {
+		
+		stringToCompareWith = stringToCompareWith.trim();
+		boolean matches;
+		switch (matchType.getMatchType()) {
+		case STARTS_WITH:
+			if(isCaseSensitive){
+				matches = stringToCompareWith.startsWith(searchString);				
+			}else{
+				matches = stringToCompareWith.toLowerCase().startsWith(searchString.toLowerCase());				
+			}
+			break;
+
+		case ENDS_WITH:
+			if(isCaseSensitive){
+				matches = stringToCompareWith.endsWith(searchString);				
+			}else{
+				matches = stringToCompareWith.toLowerCase().endsWith(searchString.toLowerCase());				
+			}			
+			break;
+		case CONTAINS:
+			if(isCaseSensitive){
+				matches = stringToCompareWith.contains(searchString);				
+			}else{
+				matches = stringToCompareWith.toLowerCase().contains(searchString.toLowerCase());				
+			}			
+			break;
+		case EXACT_MATCH:
+			if(isCaseSensitive){
+				matches = stringToCompareWith.equals(searchString);				
+			}else{
+				matches = stringToCompareWith.equalsIgnoreCase(searchString);				
+			}			
+			break;
+		case REGULAR_EXPRESSION:
+			if(isCaseSensitive){
+				 Pattern p = Pattern.compile(searchString);
+				 Matcher m = p.matcher(stringToCompareWith);
+				 matches = m.matches();		
+			}else{
+				 Pattern p = Pattern.compile(searchString, Pattern.CASE_INSENSITIVE);
+				 Matcher m = p.matcher(stringToCompareWith);
+				 matches = m.matches();
+				 }				
+			
+			break;			
+		default:
+			matches = false;
+			break;
+		}
+		return matches;
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndex.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,797 @@
+/*
+* 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.appdep.core.data;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This cache index class stores timestamp for each component 
+ * that is defined in the cache. The storing of the timestamp
+ * info enables possibility to check if cache file needs to
+ * be updated when compared with timestamp of real components
+ * residing in underneath release directory.
+ * 
+ * Because the idea is to generate cache index per cache file, the class
+ * stores indexInstances of already created indexes and return the already
+ * created index object when matching cache file is passed into static
+ * <code>getInstance</code> method.
+ */
+public class CacheIndex {
+
+	/**
+	 * Conversion factor from seconds to milliseconds.
+	 */
+	private static final long TO_MILLISEC = 1000;
+
+	/**
+	 * Default and initial value used for cache file version strings.
+	 * Just making sure that version number is always a legal version string value.
+	 */
+	private static final String DEFAULT_VERSION_VALUE_STRING = "000"; //$NON-NLS-1$
+
+	/**
+	 * Reference to the known indexInstances of this class. 
+	 */
+	private static Map<String, CacheIndex> indexInstances = Collections.synchronizedMap(new HashMap<String, CacheIndex>());
+
+	/**
+	 * This map stores the following information
+	 * gained from main cache file:
+	 * - key: component name with extension (equals to component name in lowercase letters)
+	 * - IndexData class instance: byte offset from the start of the file, and
+	 *                             last component modification timestamp.
+	 */
+	private Map<String, IndexData> componentCacheIndexDataMap = null;
+	
+	/**
+	 * Reference to cache file to be indexed.
+	 */
+	private File cacheFile = null;	
+		
+	/**
+	 * Cache build status is originally <code>false</code>, and set to <code>false</code>
+	 * after the background thread that has built the index is terminated successfully.
+	 */
+	private boolean isCacheIndexBuilt = false;
+	
+	/**
+	 * Build directory for this cache file instance.
+	 */
+	private String buildDirectory = null;
+	
+	/**
+	 * This flag is set to <code>false</code> when 
+	 * some one uses first time getInstance() method for
+	 * for getting instance that is already existing.
+	 * This flag is used to prevent unnecessary update
+	 * attempts.
+	 */
+	private boolean justCreated = true;		
+	
+	/**
+	 * Storing version information for the cache
+	 */
+	private String versionInfo = null;
+		
+	/**
+	 * Flag if the dependencies cache is non-corrupted or not.
+	 */
+	private boolean isDependenciesFileNonCorrupted = false;
+	
+	/**
+	 * Flag if the dependencies cache is non-corrupted or not.
+	 */
+	private boolean isSymbolsFileNonCorrupted = false;
+	
+	/**
+	 * Data that is indexed for each component.
+	 */
+	private class IndexData{
+		
+		/**
+		 * Component modification timestamp.
+		 */
+		private final long timestamp;
+
+		/**
+		 * Constructor.
+		 * @param timestamp Component modification timestamp.
+		 */
+		public IndexData(long timestamp){
+			this.timestamp = timestamp;			
+		}
+
+		/**
+		 * Gets component modification timestamp.
+		 * @return component modification timestamp.
+		 */
+		public long getTimestamp() {
+			return timestamp;
+		}
+	}	
+	
+	/**
+	 * Returns cache index for the given cache file. Creates a new
+	 * cache index object, if no index was previously created.
+	 * @param cacheFile Valid cache File object to get/create cache index from.
+	 * @param buildDirectory Build directory string to be used as seek string to cache file.
+	 * @return Returns cache index class instance.
+	 * @throws IOException
+	 */
+	public static CacheIndex getCacheIndexInstance(File cacheFile, String buildDirectory) throws IOException{
+		
+		CacheIndex instance = null;
+		
+		synchronized(indexInstances){
+			
+			// Do we already have index for this cache file
+			instance = (CacheIndex) indexInstances.get(cacheFile.getAbsolutePath());
+			
+			if( instance == null ){
+				// No => Creating a new cache index instance.
+				instance = new CacheIndex(cacheFile, buildDirectory);
+				indexInstances.put(cacheFile.getAbsolutePath(), instance);
+			}
+			else{
+				instance.setJustCreated(false);
+			}
+			
+		} // synchronized
+		
+		// Returning corresponding instance object
+		return (CacheIndex) instance;
+	}
+	
+	/**
+	 * Private constructor that creates and instance and starts to build
+	 * index at background.
+	 * @param cacheFile Valid cache File object to create cache index from.
+	 * @param buildDirectory Build directory string to be used as seek string to cache file.
+	 * @throws IOException
+	 */
+	private CacheIndex(File cacheFile, String buildDirectory) throws IOException{
+		this.cacheFile = cacheFile;
+		this.buildDirectory = buildDirectory;
+		componentCacheIndexDataMap = Collections.synchronizedMap(new HashMap<String, IndexData>());
+		versionInfo = new String(DEFAULT_VERSION_VALUE_STRING);  //$NON-NLS-1$ 
+		startCacheIndexBuildThread();
+	}
+
+	/**
+	 * Triggers the thread that creates the index at background.
+	 * Set the cache index build status flag after the cache index
+	 * has been created successfully.
+	 * @throws IOException
+	 */
+	private void startCacheIndexBuildThread() throws IOException{
+		
+		final CacheIndex indexObject = this;
+		
+		Thread worker = new Thread(){
+			public void run() {
+				long runMethodStartTime = System.currentTimeMillis();
+				long cacheFileSizeInBytes = cacheFile.length();
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() + " IndexBuildThread started: "  //$NON-NLS-1$
+						+ new Date(runMethodStartTime).toString()
+						+ " for cache file: " + cacheFile.getAbsolutePath() //$NON-NLS-1$
+						+ " of size '" + cacheFileSizeInBytes + "' bytes."); //$NON-NLS-1$ //$NON-NLS-2$
+				
+				AppDepCacheIndexManager indexMgr = AppDepCacheIndexManager.getInstance();
+
+				// We can promote building of bigger cache indices by increasing priority
+				boolean increasePriority = false;
+				// and slow down building of very small cache indices by increasing priority
+				boolean decreasePriority = false;
+				
+				// Heuristical limit of for enabling higher priority.
+				int priorityIncrLimitInMegabytes = 15; // MB
+				// Easier to compare in bytes vs. MB because it would need zero integer division check for small cache files
+				long priorityIncrLimitInBytes = (1024*1024) * priorityIncrLimitInMegabytes; // bytes
+				if(cacheFileSizeInBytes > priorityIncrLimitInBytes){
+					increasePriority = true;
+				}
+								
+				// Heuristical limit of for enabling smaller priority.
+				int priorityDescrLimitInKilobytes = 100; // KB
+				long priorityDecrLimitInBytes = 1024 * priorityDescrLimitInKilobytes; // bytes
+				if(cacheFileSizeInBytes < priorityDecrLimitInBytes){
+					decreasePriority = true;
+				}
+				// Building index
+				try {
+					indexMgr.registerCacheIndexCreationProcess(indexObject);
+					//
+					// Adjusting thread priorities if needed - check API docs if interested in what
+					// are the possible values for thread priorities:
+					//  http://java.sun.com/j2se/1.5.0/docs/api/constant-values.html#java.lang.Thread.MIN_PRIORITY
+					//  http://java.sun.com/j2se/1.5.0/docs/api/constant-values.html#java.lang.Thread.NORM_PRIORITY
+					//  http://java.sun.com/j2se/1.5.0/docs/api/constant-values.html#java.lang.Thread.MAX_PRIORITY
+					//
+					if(increasePriority){
+						this.setPriority(this.getPriority() + 3);
+					}
+					if(decreasePriority){
+						this.setPriority(this.getPriority() - 3);
+					}
+					buildCacheIndex();
+				} catch (Exception e) {
+					e.printStackTrace();
+					String errMsg = Messages.getString("CacheIndex.CacheIndex_Generate_Failed_Msg")  //$NON-NLS-1$
+						            + ": " + e.getMessage(); //$NON-NLS-1$
+					AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+					indexMgr.unregisterCacheIndexCreationProcess(indexObject);
+					throw new RuntimeException(errMsg);
+				}
+				
+				isCacheIndexBuilt = true;
+				indexMgr.unregisterCacheIndexCreationProcess(indexObject);
+				
+				// Tracing of consumed time
+				long endTime = System.currentTimeMillis();
+				File parentDirectory = cacheFile.getParentFile();
+				String buildTypeNameString = parentDirectory.getName();
+				String targetNameString = parentDirectory.getParentFile().getName();
+				String platformNameString = parentDirectory.getParentFile().getParentFile().getName();
+				String combinedDbgInfoStr = platformNameString + "/" + targetNameString + "/" + buildTypeNameString; //$NON-NLS-1$ //$NON-NLS-2$
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() 
+									+ " IndexBuildThread ended: " + new Date(endTime).toString() //$NON-NLS-1$
+									+ " for cache file: " + cacheFile.getAbsolutePath()); //$NON-NLS-1$
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() + "TOTAL: " + (endTime-runMethodStartTime)/1000 + " seconds (" + combinedDbgInfoStr + ")!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() + "COMPONENT INDEX SIZE: " + componentCacheIndexDataMap.size() + " (" + combinedDbgInfoStr + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$				
+			}					
+		};
+		// Kicking-off the thread
+		worker.start();		
+	}
+	
+	/**
+	 * Builds the cache index and checks the integrity of cache files.
+	 * @throws IOException
+	 */
+	private void buildCacheIndex() throws IOException{		
+		buildCacheIndexDataFromMainCacheFile();
+		checkSymbolsFileIntegrity();
+	}
+
+	/**
+	 * Gets cache data from main cache file i.e. getting byte offsets for component property line 
+	 * locations and cached modification timestamps for the components.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private void buildCacheIndexDataFromMainCacheFile() throws FileNotFoundException, IOException {
+		
+		// Creating reader for main cache file
+		BufferedReader bufRdr = setupBufferedReader(cacheFile);
+		
+		// Reading the 1st header line from the cache file
+		String line = bufRdr.readLine();
+		versionInfo = parseVersionInfoFromHeaderLine(line); // Getting version information only from main cache file
+			
+		// Reading the first actual property information line
+		line = bufRdr.readLine();		
+
+		// This is just a debugging aid - starting 
+		// to read from line 2 forwards
+		int lineno = 2;
+		
+		boolean isEndMarkFound = false;
+		boolean isEndOfFile = false;
+		
+		// After this reading of all line goes similarly
+		// Reading file until EOF (i.e. when null is returned)
+		for (; line != null; lineno++) {
+			
+			isEndOfFile = false;
+			
+			// Successful comparison requires that compared strings have equal case
+			if(isComponentDefinitionLineInMainCacheFile(line)){
+				// A component was found, adding it to the index
+				parseComponentPropertyLineAndAddToIndex(line);
+			}
+			else{
+				if(line.equals(CacheDataConstants.CACHE_FILE_END_MARK)){
+					isEndMarkFound = true;
+					isEndOfFile = true;
+				}
+			}
+			
+			// Reading next line	
+			line = bufRdr.readLine();
+		}
+		
+		if(isEndMarkFound && isEndOfFile){
+			isDependenciesFileNonCorrupted = true;
+		}
+	}
+
+	/**
+	 * Reads version information from the header line
+	 * @param headerLine Header line to be checked version info fromt.
+	 * @return Version info string, or default version value if could not parse.
+	 */
+	private String parseVersionInfoFromHeaderLine(String headerLine) {
+		String[] splitArr = headerLine.split(CacheDataConstants.CACHE_VERSION_INFO_SEPARATOR);
+		if(splitArr.length == 2){
+			return splitArr[1].trim();
+		}
+		return DEFAULT_VERSION_VALUE_STRING;
+	}
+
+	/**
+	 * Checks if the current line is a component definition line.
+	 * Line is component property line if the field count is the
+	 * one that is expected for this kind of line.
+	 * @param line Line to be checked.
+	 * @return <code>true</code> if component definition line, otherwise <code>false</code>.
+	 */
+	static boolean isComponentDefinitionLineInMainCacheFile(String line) {	
+		int splitCount = splitPopertyLineIntoStringArray(line).length;
+		if(splitCount == CacheCompPropertyField.getCompPropertyFieldCount()){
+			return true;
+		}
+		
+		return false;
+	}
+		
+	/**
+	 * Parses the property line that constains information about the single component 
+	 * and stores the byte offset to the index map with component name.
+	 * @param line	Property line to parse component's name from.
+	 */
+	private void parseComponentPropertyLineAndAddToIndex(String line){
+		
+		String compPropertiesLine = line;
+		
+		String [] compPropertiesArr = splitPopertyLineIntoStringArray(compPropertiesLine);
+		
+		// Using the build directory path from the currently 
+		// used file system instead of one in the cache file which may not exist
+		// in case cache file was created on some another computer/substed drive.
+		String cmpName = compPropertiesArr[CacheCompPropertyField.FILENAME_ARR_INDX];
+		
+		// Storing the modification time of the cached component
+		String compModifiedTimestampString = compPropertiesArr[CacheCompPropertyField.CACHE_TIMESTAMP_ARR_INDX];		
+		long compModifiedTimestamp = TO_MILLISEC * Long.parseLong(compModifiedTimestampString);		
+		
+		synchronized(componentCacheIndexDataMap){
+									
+			// There should not be an already existing component
+			if(componentCacheIndexDataMap.get(cmpName.toLowerCase()) != null){
+				// In case of duplicate components, only the first one is added.
+				// Duplicate instances are ignored, and an error message printed to concole.
+				String errMsg = Messages.getString("CacheIndex.DuplicateComponents_Encountered_ErrMsg"); //$NON-NLS-1$
+				AppDepConsole.getInstance().println(errMsg + " (" + cmpName.toLowerCase() + ")", AppDepConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			else{
+				componentCacheIndexDataMap.put(cmpName.toLowerCase(), new IndexData(compModifiedTimestamp));				
+			}
+			
+		} // synchronized
+	}
+
+	/**
+	 * Creates file object that points to the symbols information file.
+	 * @return File object that refers to the symbols information file.
+	 */
+	private File createSymbolsFileObject(){
+		String cacheDirectoryPath = cacheFile.getParentFile().getAbsolutePath();
+		String symbolsFilePathName = cacheDirectoryPath
+		                             + File.separatorChar
+		                             + ProductInfoRegistry.getCacheSymbolsFileName();
+		return new File(symbolsFilePathName); 		
+	}
+	
+	/**
+	 * Checks that symbols file has header with version number that matches with one
+	 * for main cache file, and also checks up that there is correct end mark.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private void checkSymbolsFileIntegrity() throws FileNotFoundException, IOException {
+		
+		// There is some room for improvement in this method because it is shortened
+		// from earlier version that also analyzed component data. But keeping this
+		// for now on because do not want to break working stuff. Now the extra		
+		// unused code portions are cleaned up anyway.
+		File symbolsFile = createSymbolsFileObject(); 
+		
+		if(! symbolsFile.exists()){
+			// Symbols file does not exist, and therefore there are 
+			// no export functions related information available.
+			return;
+		}
+		
+		// Creating reader for symbols cache file
+		BufferedReader localBufRdrVar = setupBufferedReader(symbolsFile);
+				
+		// Reading the 1st header line from the cache file
+		String line = null;
+		try {
+			line = localBufRdrVar.readLine(); 
+			
+		} catch (IOException e) {
+			// File existed but there was no data, or
+			// something else failed.			
+			return;
+		}		
+		
+		if(line == null){
+			// File existed but there was no data
+			// (i.e. end of file was reached)
+			return;
+		}
+			
+		// Storing  version number from the header line
+		String symbolsFileVersion = parseVersionInfoFromHeaderLine(line);
+		
+		// Reading the first actual property information line
+		line = localBufRdrVar.readLine();		
+
+		// This is just a debugging aid - starting 
+		// to read from line 2 forwards
+		int lineno = 2;
+		
+		boolean isEndMarkFound = false;
+		boolean isEndOfFile = false;
+		
+		// After this reading of all line goes similarly
+		// Reading file until EOF (i.e. when null is returned)
+		for (; line != null; lineno++) {
+			
+			isEndOfFile = false;
+			
+			if(line.equals(CacheDataConstants.CACHE_FILE_END_MARK)){
+				isEndMarkFound = true;
+				isEndOfFile = true;
+			}
+			
+			// Reading next line	
+			line = localBufRdrVar.readLine();
+		}
+
+		// Symbols file is non corrupted if...
+		// - end of file is reached, and expected end mark is found
+		// - symbols file is created with same appdep core version than main cache file
+		if((isEndMarkFound && isEndOfFile) && (symbolsFileVersion.equals(versionInfo))){
+			isSymbolsFileNonCorrupted = true;
+		}
+	}
+				
+	/**
+	 * Splits the property line into a string array containing property line fields.
+	 * @param compPropertiesLine Property line to be splitted.
+	 * @return A string array containing property line fields.
+	 */
+	static String[] splitPopertyLineIntoStringArray(String compPropertiesLine){
+		String fieldSepRegExp = Pattern.quote(CacheDataConstants.CACHE_FIELD_SEPARATOR);
+		
+		String[] splitArr = compPropertiesLine.split(fieldSepRegExp);
+		return splitArr;		
+	}
+	
+	/**
+	 * Returns modification timestamp stored in cache for the given component.
+	 * @param cmpName The name of the component.
+	 * @return Last modification timestamp for the component as milliseconds.
+	 */
+	public long getLastModifiedTimeForComponent(String cmpName){		
+		Object obj = componentCacheIndexDataMap.get(cmpName.toLowerCase());
+		if( obj == null){
+			throw new NoSuchElementException();			
+		}
+		IndexData idt = (IndexData) obj;
+		long timestamp = idt.getTimestamp();
+		return timestamp;
+	}
+	
+	/**
+	 * Gets the amount of components in cache index.
+	 * @return The amount of components in cache index.
+	 */
+	public int getCachedComponentCount(){		
+		return componentCacheIndexDataMap.size();
+	}
+		
+	/**
+	 * Returns the cache build status.
+	 * @return Returns the isCacheIndexBuilt.
+	 */
+	private boolean isCacheIndexBuiltImpl() {
+		return isCacheIndexBuilt;
+	}
+	
+	/**
+	 * Gets the component set of all component names that
+	 * exist in cache.
+	 */
+	public Set<String> getComponentNameSet(){
+		return componentCacheIndexDataMap.keySet();
+	}
+	
+	/**
+	 * Checks from given function info array if the function 
+	 * is virtual. 
+	 * @param functionInfoArr Function info array
+	 * @return <code>true</code> if the function is virtual, 
+	 *         otherwise <code>false</code>.
+	 */
+	public static boolean isVirtualFunctionFlagSet(String[] functionInfoArr){		
+		String fVirtualFlag = functionInfoArr[CacheDataConstants.FUNC_IS_VIRTUAL_INDEX];
+		if(fVirtualFlag.trim().equals(CacheDataConstants.VIRTUAL_INDEX_FIELD_IS_TRUE_VALUE)){ //$NON-NLS-1$
+			return true;
+		}
+		else{
+			return false;
+		}
+	}
+
+	/**
+	 * Updates cache index with latest available information.
+	 * @throws IOException
+	 */
+	public void update() throws IOException {		
+		// If we are acquiring cache index instance
+		// that has been already built previously
+		// we need to reset and rebuild it.
+		// If cache index was just created the
+		// building process is still going on.
+		if(! isJustCreated()){
+			// Clearing the old data
+			componentCacheIndexDataMap.clear();
+			// Doing re-build
+			startCacheIndexBuildThread();						
+		}
+	}
+
+	/**
+	 * Checks if cache index for this object has been created.
+	 * @return <code>true</code> if created, otherwise <code>false</code>.
+	 */
+	private boolean isJustCreated() {
+		return justCreated;
+	}
+
+	/**
+	 * Sets cache index creation status.
+	 * @param justCreated set to <code>true</code> if created, otherwise set to <code>false</code>.
+	 */
+	private void setJustCreated(boolean justCreated) {
+		this.justCreated = justCreated;
+	}
+	
+	/**
+	 * Checks if there already exists cache index for given cache file. 
+	 * @param cacheFileAbsolutePathName  Cache file path name for cache file/ to be checked.
+	 * @return <code>true</code> if exists, otherwise <code>false</code>.
+	 */
+	public static boolean cacheIndexExistsFor(String cacheFileAbsolutePathName){
+		
+		boolean cacheIndexExists = false;
+		
+		synchronized(indexInstances){			
+			if( indexInstances.get(cacheFileAbsolutePathName) != null){
+				cacheIndexExists = true;
+			}
+		} // synchronized
+		
+		return cacheIndexExists;
+	}
+
+	/**
+	 * Returns creation status of cache index that is under creation.
+	 * @param cacheFileAbsolutePathName  Cache file path name for cache file/ to be checked.
+	 * @return <code>true</code> if created, otherwise <code>false</code>.
+	 */
+	public static boolean cacheIndexCreatedFor(String cacheFileAbsolutePathName){
+		
+		boolean cacheIndexCreated = false;
+		
+		synchronized(indexInstances){
+			CacheIndex indxInstance = (CacheIndex) indexInstances.get(cacheFileAbsolutePathName);
+			if(indxInstance != null){
+				return indxInstance.isCacheIndexBuiltImpl();
+			}
+		} // synchronized
+		
+		return cacheIndexCreated;
+	}
+	
+	/**
+	 * Sets up the currently used buffered reader. 
+	 * @param file File object to user directly or user RAM-disk image for.
+	 * @throws FileNotFoundException
+	 */
+	private BufferedReader setupBufferedReader(File file) throws FileNotFoundException{		
+		FileReader fileRdr = new FileReader(file);
+		return new BufferedReader(fileRdr);					
+	}
+	
+	/**
+	 * Returns regular expression used to split fields in cache data. 
+	 * @return regular expression used to split fields in cache data.
+	 */
+	public static String getCacheFieldSeparatorRegExp(){
+		return Pattern.quote(CacheDataConstants.CACHE_FIELD_SEPARATOR);
+	}
+
+	/**
+	 * Returns version information string found from dependencies file's header.
+	 * @return Three-letter string containing version info.
+	 */
+	public String getVersionInfo() {
+		return versionInfo;
+	}
+
+	/**
+	 * Method for checking if cache is non-corrupted.
+	 * @return <code>true</code> if cache is non-corrupted, otherwise <code>false</code>.
+	 */
+	public boolean isCacheNonCorrupted(){
+		return (isDependenciesFileNonCorrupted && isSymbolsFileNonCorrupted);
+	}
+
+	/**
+	 * Gets build directory bound to the cache index.
+	 * @return the buildDirectory
+	 */
+	public String getBuildDirectory() {
+		return buildDirectory;
+	}
+
+	/**
+	 * Returns component list for the targets pointed by given settings object.
+	 * @param settings[in] Settings to get currently selected targets from.
+	 * @param duplicateItemsList[out] Out parameter that contains the list of duplicate
+	 *                           components found from the selected targets.
+	 * @return Component iterator for the currently selected targets.
+	 * @throws CacheFileDoesNotExistException 
+	 * @throws IOException 
+	 */
+	public static List<ComponentListNode> getComponentIteratorForGivenSettings(AppDepSettings settings, List<String> duplicateItemsList) throws CacheFileDoesNotExistException, IOException {
+
+		ArrayList<CacheIndex> cacheIndexList = new ArrayList<CacheIndex>();
+		
+		// Getting all the cache indices referred by the settings
+		ITargetPlatform[] currentlyUsedTargetPlatforms = settings.getCurrentlyUsedTargetPlatforms();
+		for (int i = 0; i < currentlyUsedTargetPlatforms.length; i++) {
+			ITargetPlatform targetPlatform = currentlyUsedTargetPlatforms[i];
+			String targetPlatformId = targetPlatform.getId();
+			String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathName(targetPlatformId);
+			File cacheFile = new File(cacheFileAbsolutePathName);
+			if(!cacheFile.exists()){
+				throw new CacheFileDoesNotExistException(cacheFileAbsolutePathName);
+			}
+			String buildDirectory = settings.getBuildDir(targetPlatformId);
+			// Getting existing, or creating a new cache index 
+			// for enabling faster access for cache data
+			CacheIndex cacheIndx = CacheIndex.getCacheIndexInstance(cacheFile, buildDirectory);
+			cacheIndexList.add(cacheIndx);
+		}
+		
+		// Storing all component names here for duplicate component check
+		Set<String> allComponentNames = new HashSet<String>();
+		
+		// Making sure that there are no previously queried results in the passes list
+		duplicateItemsList.clear();
+		
+		// Storing component list nodes into here
+		List<ComponentListNode> componentList = new ArrayList<ComponentListNode>();
+		
+		// Combining component lists from all selected targets
+		for (int i = 0; i < cacheIndexList.size(); i++) {
+			CacheIndex cacheIndx = cacheIndexList.get(i);
+			Set<String> tmpSet = cacheIndx.getComponentNameSet();
+			Iterator<String> tmpIter = tmpSet.iterator();
+			// Iterating through the whole set
+			while (tmpIter.hasNext()) {
+				String cmpName = tmpIter.next();
+				long lastModificationTimeForComponent = cacheIndx.getLastModifiedTimeForComponent(cmpName);
+				componentList.add(new ComponentListNode(cmpName, currentlyUsedTargetPlatforms[i], lastModificationTimeForComponent));
+				// Checking for possible duplicate component names
+				// and adding found duplicates to the duplicate list
+				checkForPossibleComponentDuplicate(duplicateItemsList, allComponentNames, cmpName);
+			}						
+		}
+		return componentList;
+	}	
+
+	/**
+	 * Checks if the given component has duplicates and adds to the duplicate
+	 * list if found.
+	 * @param duplicateItemsList Out parameter that is duplicate item list to be updated.
+	 * @param allComponentNames	 All component names found so far from the targets.
+	 * @param cmpName			 Component name to check for possible duplicate instances.
+	 */
+	private static void checkForPossibleComponentDuplicate(List<String> duplicateItemsList, Set<String> allComponentNames, String cmpName) {
+		if(allComponentNames.contains(cmpName)){
+			if(!duplicateItemsList.contains(cmpName)){
+				duplicateItemsList.add(cmpName);
+			}
+		}
+		else{
+			allComponentNames.add(cmpName);
+		}
+	}
+	
+	/**
+	 * Updates the cache index for the given cache file.
+	 * @param cacheFileAbsolutePathName Absolute path name pointing to the 
+	 * 									location of cache data file to be examined.
+	 * @param buildDirectory Build directory string to be used as seek string to cache file.
+	 * @throws IOException
+	 * @throws CacheFileDoesNotExistException 
+	 */
+	public static void updateCacheIndexFor(String cacheFileAbsolutePathName, String buildDirectory) throws IOException, CacheFileDoesNotExistException{
+		File localVarCacheFile = new File(cacheFileAbsolutePathName);
+		if(!localVarCacheFile.exists()){
+			throw new CacheFileDoesNotExistException(cacheFileAbsolutePathName);
+		}
+		// Getting existing, or creating a new cache index 
+		// for enabling faster access for cache data
+		CacheIndex localCacheIndxRef = CacheIndex.getCacheIndexInstance(localVarCacheFile, buildDirectory);
+		localCacheIndxRef.update();
+	}
+
+	/**
+	 * Checks if the cache index has been build for the queried cache file and build directory.
+	 * @param cacheFileAbsolutePathName Absolute path name pointing to the 
+	 * 									location of cache data file to be examined.
+	 * @param buildDirectory Build directory string to be used as seek string to cache file.
+	 * @return <code>true</code> if cache index has been build for the queried cache file, otherwise <code>false</code>.
+	 * @throws IOException
+	 * @throws CacheFileDoesNotExistException
+	 */
+	public static boolean isCacheIndexBuilt(String cacheFileAbsolutePathName, String buildDirectory) throws IOException, CacheFileDoesNotExistException{
+		File cacheFile = new File(cacheFileAbsolutePathName);
+		if(!cacheFile.exists()){
+			throw new CacheFileDoesNotExistException(cacheFileAbsolutePathName);
+		}
+		// Getting existing, or creating a new cache index 
+		// for enabling faster access for cache data
+		CacheIndex cacheIndx = CacheIndex.getCacheIndexInstance(cacheFile, buildDirectory);
+		return cacheIndx.isCacheIndexBuiltImpl();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndexCreationRequest.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.data;
+
+/**
+ * Storage class used to store cache index creation
+ * request related data.
+ */
+public class CacheIndexCreationRequest{
+
+	/**
+	 * Absolute path name to cache file.
+	 */
+	private final String cacheFile;
+	/**
+	 * Absolute path name to build directory..
+	 */
+	private final String buildDir;
+
+	/**
+	 * Constructor.
+	 * @param cacheFile Absolute path name to cache file.
+	 * @param buildDir Absolute path name to build directory..
+	 */
+	public CacheIndexCreationRequest(String cacheFile, String buildDir){
+		this.cacheFile = cacheFile;
+		this.buildDir = buildDir;			
+	}
+
+	/**
+	 * Gets build directory name.
+	 * @return build directory name.
+	 */
+	public String getBuildDir() {
+		return buildDir;
+	}
+
+	/**
+	 * Gets cache file name.
+	 * @return cache file name.
+	 */
+	public String getCacheFile() {
+		return cacheFile;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheIndexCreator.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,253 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.appdep.core.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager;
+import com.nokia.s60tools.appdep.core.ICacheIndexListener;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.wizards.ICacheIndexCreatorObserver;
+
+/**
+ * Registers the valid cache index creation requests
+ * and perform creation of registered cache indices 
+ * when asked to do so.
+ */
+public class CacheIndexCreator implements Runnable, IRunnableWithProgress, ICacheIndexListener{
+
+	/**
+	 * Observer needing to get informed when cache index creation is ready.
+	 */
+	private final ICacheIndexCreatorObserver indexCreatorObserver;
+
+	/**
+	 * Count of cache indices to be created.
+	 * Accessed only via increment and decrement methods
+	 */
+	private int cacheIndicesToBeCreatedCount = 0;
+	
+	/**
+	 * Stores cache index creation requests.
+	 */
+	private ArrayList<CacheIndexCreationRequest> cacheIndexCreationReqArr = null;
+	
+	/**
+	 * Reference to cache index manager.
+	 */
+	AppDepCacheIndexManager indexMgr = null;
+	
+	/**
+	 * Reference to progress monitor of the job launching cache index creation.
+	 */
+	private IProgressMonitor monitorStored = null;
+	
+	/**
+	 * Constructor to be launched from JUnit tests.
+	 * @param indexCreatorObserver Observer needing to get informed when cache index creation is ready.
+	 */
+	public CacheIndexCreator(){
+		this.indexCreatorObserver = null;
+		this.allocateMembers();
+	}
+	
+	/**
+	 * Constructor to be launched from UI
+	 * @param indexCreatorObserver Observer needing to get informed when cache index creation is ready.
+	 */
+	public CacheIndexCreator(ICacheIndexCreatorObserver indexCreatorObserver){
+		this.indexCreatorObserver = indexCreatorObserver;
+		allocateMembers();
+	}
+	
+	/**
+	 * Allocates member variables not initialized via constructor parameters.
+	 */
+	public void allocateMembers(){
+		cacheIndexCreationReqArr = new ArrayList<CacheIndexCreationRequest>();				
+	}
+	
+	/**
+	 * Increments cache index creation count.
+	 * @return incremented count.
+	 */
+	synchronized private int incrementIndicesToBeCreatedCount(){
+		return (++cacheIndicesToBeCreatedCount);
+	}
+	
+	/**
+	 * Decrements cache index creation count.
+	 * @return decremented count.
+	 */
+	synchronized private int decrementIndicesToBeCreatedCount(){
+		return (--cacheIndicesToBeCreatedCount);			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+
+		if(monitorStored == null){			
+			monitorStored = monitor;
+			int steps = cacheIndexCreationReqArr.size();
+			if(monitorStored != null){ // There is no monitor initialized in JUnit tests
+				monitorStored.beginTask(Messages.getString("CacheIndexCreator.Creating_Cache_Indices"), steps); //$NON-NLS-1$			
+			}
+			handleIndexCreationRequests();			
+		}//if			
+		
+	} //run
+
+	/**
+	 * Handles registered cache index creation request.
+	 */
+	private void handleIndexCreationRequests() {
+		for (Iterator<CacheIndexCreationRequest> iter = cacheIndexCreationReqArr.iterator(); iter.hasNext();) {
+			CacheIndexCreationRequest req = iter.next();
+			try {
+				// Requesting
+				File cacheFile = new File(req.getCacheFile());
+				if(!cacheFile.exists()){
+					throw new CacheFileDoesNotExistException(cacheFile.getAbsolutePath());
+				}
+				CacheIndex.getCacheIndexInstance(cacheFile, req.getBuildDir());
+			} catch (CacheFileDoesNotExistException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			
+		} //for
+		
+		// Resetting array after all request have been handled
+		cacheIndexCreationReqArr.clear();
+	}
+
+	/**
+	 * Registers cache index creation request for a target identified 
+	 * in parameters, if does not registered already.
+	 * @param cacheFileAbsolutePathName Cache file path name for target to be registerd.
+	 * @param buildDirAbsolutePathName Build directory file path name for target to be registerd.
+	 */
+	public void registerCacheIndexCreation(String cacheFileAbsolutePathName, 
+			   String buildDirAbsolutePathName) {
+								
+		//Checking if we already have the cache index
+		if(CacheIndex.cacheIndexExistsFor(cacheFileAbsolutePathName)){
+			// Already exists, no need to re-create
+			return;
+		}
+		
+		// Checking that we do not already have the same request?...
+		for (Iterator<CacheIndexCreationRequest> iter = cacheIndexCreationReqArr.iterator(); iter.hasNext();) {
+			CacheIndexCreationRequest req = iter.next();
+			if(req.getCacheFile().equalsIgnoreCase(cacheFileAbsolutePathName)){
+				// Request already registered!
+				return;
+			}
+		}
+		
+		// Not registered yet, registering...
+		if(indexMgr == null){
+			indexMgr = AppDepCacheIndexManager.getInstance();			
+			indexMgr.addListener(this);								
+		}
+		
+		incrementIndicesToBeCreatedCount();
+		cacheIndexCreationReqArr.add(new CacheIndexCreationRequest(cacheFileAbsolutePathName, 
+												   buildDirAbsolutePathName));
+		
+	}
+	
+	/**
+	 * Checks if there are any cache creation requests.
+	 * @return <code>true</code> if requests, otherwise <code>false</code>.
+	 */
+	public boolean hasIndexCreationRequests(){
+		return (cacheIndexCreationReqArr.size() > 0);
+	}
+		
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.ICacheIndexListener#cacheIndexCreationCompleted(com.nokia.s60tools.appdep.core.data.CacheIndex)
+	 */
+	public void cacheIndexCreationCompleted(CacheIndex cacheIndexObj) {
+					
+		final ICacheIndexListener listenerObj = this;
+		final CacheIndex cacheIndexObjFinal = cacheIndexObj;
+		
+		Runnable monitorStatusUpdateRunnable = new Runnable(){
+			public void run(){
+				try {
+					// One cache index creation step completed
+					if(monitorStored != null){ // There is no monitor initialized in JUnit tests
+						monitorStored.worked(1);						
+					}
+					
+					try {
+						// Refreshing tree view
+						if(indexCreatorObserver != null){
+							indexCreatorObserver.cacheIndexCreated(cacheIndexObjFinal);
+						}						
+					} catch (Exception e) {
+						// User might have been Canceled the wizard
+						// and widget is disposed and this call fails
+						// Just then ignoring and making sure that
+						// done() is called for monitor. 
+					}
+					
+					// Updating count of work that is still pending
+					// and testing if all the work has been done
+					if(decrementIndicesToBeCreatedCount() == 0){
+						if(monitorStored != null){ // There is no monitor initialized in JUnit tests
+							monitorStored.done();
+						}
+						indexMgr.removeListener(listenerObj);
+						// Forcing the manager creation next time
+						// if new registrations happen during 
+						// the lifetime of this object
+						indexMgr = null;
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		};
+		
+		// Update request done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(monitorStatusUpdateRunnable);
+	
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Runnable#run()
+	 */
+	public void run() {
+		handleIndexCreationRequests();			
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/CacheLibPropertyField.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,30 @@
+/*
+* 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.appdep.core.data;
+
+/**
+ * Constants for indexing library property line
+ * in symbol information cache file.
+ */
+public class CacheLibPropertyField {
+	public static final int DIRECTORY_ARR_INDX = 0; 
+	public static final int FILENAME_ARR_INDX = 1;
+	public static final int CACHE_TIMESTAMP_ARR_INDX = 2;	
+	public static final int EXPORT_FUNC_COUNT_ARR_INDX = 13;	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentLinkLeafNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,86 @@
+/*
+* 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.appdep.core.data;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+
+
+/**
+ * Represents leaf node that cannot have any children 
+ * in component tree hierarchy. This leaf node is a link
+ * to actual component node that already exists in the 
+ * component tree. Link leaf node is used to break cyclic
+ * dependency hierarchies thus making possible to represent
+ * data in tree view. 
+ */
+public class ComponentLinkLeafNode extends ComponentNode {
+	
+	/**
+	 * Component node the link node refers to.
+	 */
+	private ComponentParentNode referredComponent;
+	
+	/**
+	 * Constructor.
+	 * @param referredComponent Component node the link node refers to.
+	 */
+	public ComponentLinkLeafNode(ComponentParentNode referredComponent) {
+		super();
+		this.referredComponent = referredComponent;
+	}
+
+	/**
+	 * Get referred component node.
+	 * @return Returns the referredComponent.
+	 */
+	public ComponentParentNode getReferredComponent() {
+		return referredComponent;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#toString()
+	 */
+	public String toString() {
+		return referredComponent.getName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#getName()
+	 */
+	public String getName() {
+		return referredComponent.getName();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitable#accept(com.nokia.s60tools.appdep.ui.views.data.IVisitor)
+	 */
+	public void accept(IVisitor visitor) {
+		visitor.visit(this);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#getTargetPlatform()
+	 */
+	@Override
+	public ITargetPlatform getTargetPlatform() {
+		return getReferredComponent().getTargetPlatform();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,108 @@
+/*
+* 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.appdep.core.data;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitable;
+
+
+/**
+ * This is an abstract class that defines the parent relationship
+ * and defines an interface i.e. abstract methods that force that
+ * the derived node classes must be able to tell their name.
+ */
+public abstract class ComponentNode implements IVisitable {
+	
+	/**
+	 * Separator character used in fully qualified component node name.
+	 */
+	protected static final String SEPARATOR = "/"; //$NON-NLS-1$
+	
+	/**
+	 * Parent node reference.
+	 */
+	private ComponentParentNode parent;
+
+	/**
+	 * Constructor.
+	 */
+	public ComponentNode() {
+	}
+	
+	/**
+	 * Sets parent for the node.
+	 * @param parent parent node
+	 */
+	public void setParent(ComponentParentNode parent) {
+		this.parent = parent;
+	}
+	
+	/**
+	 * Gets parent for the node.
+	 * @return parent for the node.
+	 */
+	public ComponentParentNode getParent() {
+		return parent;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public abstract String toString();
+	
+	/**
+	 * Gets node name.
+	 * @return node name.
+	 */
+	public abstract String getName();
+
+	/**
+	 * Gets node's fully qualified name.
+	 * @return fully qualified name.
+	 */
+	public String getFullName(){
+
+		// Checking root component case
+		if(this instanceof ComponentParentNode){			
+			if(((ComponentParentNode)this).isRootComponent()){
+				return SEPARATOR + getName(); 
+			}
+		}
+		
+		// Otherwise proceeding normally towards root node
+		StringBuffer fullName = new StringBuffer(getName());
+		ComponentParentNode parent = getParent();
+		while(!parent.isRootComponent()){
+			fullName.insert(0, parent.getName() + SEPARATOR);
+			parent = parent.getParent();
+		}
+		// Adding finally the root component
+		fullName.insert(0, SEPARATOR + parent.getName() + SEPARATOR);
+				
+		return fullName.toString();
+	}
+
+	/**
+	 * Gets target platform for the component node, or <code>null</code> if not set.
+	 * Abstract method to be implemented by subclasses.
+	 * @return target platform for the component node, or <code>null</code> if not set.
+	 */
+	public abstract ITargetPlatform getTargetPlatform();
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ComponentParentNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,316 @@
+/*
+* 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.appdep.core.data;
+
+import java.util.ArrayList;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+
+/**
+ * Class representing component parent node in component tree.
+ */
+public class ComponentParentNode extends ComponentNode {
+	
+	/**
+	 * Binding type enumerator.
+	 */
+	public static enum CompBindType{NONE, AUTO_BIND, USER_BIND};
+	
+	/**
+	 * Node name.
+	 */
+	private String name = null;
+	
+	/**
+	 * Node's children 
+	 */
+	private ArrayList<ComponentNode> children = null;
+	
+	/**
+	 * Node listener. 
+	 */
+	private IComponentParentNodeListener listener = null;
+	
+	/**
+	 * This information is used to select the correct icon
+	 * by the label provider for the root component node.
+	 */
+	private boolean isRootComponent = false;
+
+	/**
+	 * This flag is set to true if information for
+	 * this component cannot be found from cache.
+	 */
+	private boolean isMissing = false;	
+	
+	/**
+	 * This boolean flag is set to <code>true</code> after
+	 * all direct children of this component are resolved.
+	 */
+	private boolean isDirectChildrensResolved = false;
+	
+	/**
+	 * Original name of node, if concrete name was set
+	 */
+	private String originalName = null;
+	
+	/**
+	 * Bind type of node, used when concrete name was set 
+	 */
+	private CompBindType compBindType = CompBindType.NONE;
+	
+	/**
+	 * Target platform for the component node, or <code>null</code> if not set.
+	 */
+	private ITargetPlatform targetPlatform = null;	
+
+	/**
+	 * Constructor.
+	 * @param name Node name.
+	 */
+	public ComponentParentNode(String name) {
+		super();
+		this.name = name;
+		children = new ArrayList<ComponentNode>();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#toString()
+	 */
+	public String toString() {
+		return getName();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#getName()
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Adds new child node.
+	 * @param child child node to add
+	 */
+	public void addChild(ComponentNode child) {
+		addChild(child, children.size());
+	}
+	
+	/**
+	 * Removes given child node.
+	 * @param child child node to remove 
+	 */
+	public void removeChild(ComponentNode child) {
+		children.remove(child);
+		child.setParent(null);
+		if(listener != null){
+			listener.childRemoved(child);
+		}
+	}
+	
+	/**
+	 * Replaces a child node.
+	 * @param childToBeRemoved child node to replace to
+	 * @param childToBeAdded child node to replace with
+	 */
+	public void replaceChild(ComponentNode childToBeRemoved, ComponentNode childToBeAdded){
+		int index = children.indexOf(childToBeRemoved);
+		removeChild(childToBeRemoved);
+		addChild(childToBeAdded, index);
+	}
+
+	/**
+	 * Adds child to the specified index.
+	 * @param childToBeAdded child node to be added.
+	 * @param index index for addition.
+	 */
+	private void addChild(ComponentNode childToBeAdded, int index) {
+		children.add(index, childToBeAdded);
+		childToBeAdded.setParent(this);
+		if(listener != null){
+			listener.childAdded(childToBeAdded);
+		}
+	}
+
+	/**
+	 * Gets node's children.
+	 * @return node's children.
+	 */
+	public ComponentNode [] getChildren() {
+		return (ComponentNode [])children.toArray(new ComponentNode[children.size()]);
+	}
+	
+	/**
+	 * Checks if node has any children.
+	 * @return <code>true</code> in case has children, otherwise <code>false</code>.
+	 */
+	public boolean hasChildren() {
+		return children.size()>0;
+	}
+
+	/**
+	 * Checks if node is root component.
+	 * @return <code>true</code> if node is root component, otherwise <code>false</code>.
+	 */
+	public boolean isRootComponent() {
+		return isRootComponent;
+	}
+
+	/**
+	 * Sets root component property.
+	 * @param isRootComponent <code>true</code> if node is set to root component, otherwise <code>false</code>.
+	 */
+	public void setRootComponent(boolean isRootComponent) {
+		this.isRootComponent = isRootComponent;
+	}
+
+	/**
+	 * Checks missing status.
+	 * @return Returns the isMissing.
+	 */
+	public boolean isMissing() {
+		return isMissing;
+	}
+
+	/**
+	 * Sets missing status.
+	 * @param isMissing The isMissing to set.
+	 */
+	public void setMissing(boolean isMissing) {
+		this.isMissing = isMissing;
+	}
+
+	/**
+	 * Checks if direct dependencies for the node has been resolved.
+	 * @return Returns the isDirectChildrensResolved.
+	 */
+	public boolean isDirectChildrensResolved() {
+		return isDirectChildrensResolved;
+	}
+
+	/**
+	 * Sets status of direct dependencies resolvance.
+	 * @param isDirectChildrensResolved The isDirectChildrensResolved to set.
+	 */
+	public void setDirectChildrensResolved(boolean isDirectChildrensResolved) {
+		this.isDirectChildrensResolved = isDirectChildrensResolved;
+	}
+	
+	/**
+	 * Removes all children nodes.
+	 */
+	public void removeAllChildren(){
+		children.clear();
+		if(listener != null){
+			listener.allChildrensRemoved();
+		}
+	}
+	
+	/**
+	 * Sets node listener.
+	 * @param listener Listener to set.
+	 */
+	public void setNodeListener(IComponentParentNodeListener listener){
+		this.listener = listener;
+	}
+	
+	/**
+	 * Gets root node.
+	 * @return root node.
+	 */
+	public ComponentParentNode getRootNode(){
+		if(this.isRootComponent){
+			return this;
+		}
+		else{
+			return getParent().getRootNode();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitable#accept(com.nokia.s60tools.appdep.ui.views.data.IVisitor)
+	 */
+	public void accept(IVisitor visitor) {
+		visitor.visit(this);
+		
+	}
+
+	/**
+	 * Sets generic component name to concrete component name. 
+	 * Use only when found component that is generic a component, e.g. <code>hal.dll</code>
+	 * and there is user selected or automatically selected concrete name for component.
+	 * When component is missing {@link ComponentParentNode.isMissing()} 
+	 * component can be generic component.
+	 * @param concreteComponentName Concrete component name.
+	 * @param bindType of component, if it was user selected, then set {@link CompBindType.USER_BIND}
+	 * if it was set automatically by preferences, then set {@link CompBindType.AUTO_BIND}
+	 */
+	public void setConcreteName(String concreteComponentName, CompBindType bindType) {
+		this.originalName  = this.name;
+		this.name = concreteComponentName;
+		this.compBindType = bindType;
+	}
+
+	/**
+	 * Return the original name of the component, if concrete name was set.
+	 * @return the original name of component or <code>null</code> if component does not have a concrete name.
+	 */
+	public String getOriginalName() {
+		return originalName;
+	}
+	
+	/**
+	 * Check if component was a generic component originally and a concrete component
+	 * was found to replacing it. To get original component name use @see ComponentParentNode.getOriginalName().
+	 * @return <code>true</code> if component was a generic component and 
+	 *         a concrete component was set to replace it, <code>false</code> otherwise.
+	 */
+	public boolean wasGenericComponent(){
+		return  getOriginalName() == null ? false : true;
+	}
+
+	/**
+	 * Get bind type of component. 
+	 * @return <code>CompBindType.NONE</code> if this component is a concrete component by its own 
+	 *         or it has not been set to concrete component, 
+	 * <code>CompBindType.AUTO_BIND</code> if component was set to concrete automatically by preference list,
+	 * <code>CompBindType.USER_BIND</code> if component was set to concrete by user action with dialog.
+	 */
+	public CompBindType getGenericComponentBindType() {
+		return compBindType ;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.ComponentNode#getTargetPlatform()
+	 */
+	@Override
+	public ITargetPlatform getTargetPlatform() {
+		return targetPlatform;
+	}
+	
+	/**
+	 * Sets target platform for the component node, or <code>null</code> if not set.
+	 * @param targetPlatform target platform for the component node
+	 */
+	public void setTargetPlatform(ITargetPlatform targetPlatform) {
+		this.targetPlatform = targetPlatform;
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/ICacheDataManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,162 @@
+/*
+* 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.appdep.core.data;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.core.model.AbstractFunctionData;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.core.model.UsedComponentData;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.search.MatchType;
+import com.nokia.s60tools.appdep.search.SearchConstants.SearchType;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Interface for accessing cache data manager object itself.
+ */
+public interface ICacheDataManager {
+	
+	/**
+	 * Searches from cache with wanted parameters.
+	 * 
+	 * @param searchString String to search for.
+	 * @param searchType what kind of information wanted to search.
+	 * @param matchType how searchString must be occur in results.
+	 * @return Map of matching results or empty list if none found. Map contains component names as keys
+	 * and function data list as values. Values are <code>null</code>s when search type is {@link SearchType.SEARCH_COMPONENTS}
+	 * and instances of {@link ExportFunctionData} when search type is {@link SearchType.SEARCH_EXPORTED_FUNCTION}
+	 * and instances of {@link ImportFunctionData} when search type is {@link SearchType.SEARCH_IMPORTED_FUNCTIONS}
+	 * 
+	 */
+	public Map<String, List<AbstractFunctionData>> searchCache(String searchString, SearchType searchType, MatchType matchType);
+	
+	/**
+	 * Searches concrete component implementations for generic component name. 
+	 * Results will be a list of component that has given component names
+	 * as suffix.
+	 * 
+	 * E.g. if given generic component name is <code>hal.dll</code> returned list can be:
+	 * <code>
+	 *   _h2_hal.dll
+	 *   _h4hrp_hal.dll
+	 *   _integrator_cm1136_hal.dll
+	 *   _template_hal.dll
+	 * </code>
+	 * 
+	 * @param genericComponentName Name of the generic component
+	 * @return a String array of concrete component names found in used SDK, or empty array if none found. 
+	 */
+	public String [] searchConcreteComponentsByGenericComponent(String genericComponentName);
+	
+	/**
+	 * Gets the name of the concrete implementation by generic component name and prefix list.
+	 * 
+	 * E.g. if prefix list is: 
+	 * <code>
+	 *   _h2_
+	 *   _h4hrp_
+	 *   _integrator_cm1136_
+	 *   _template_
+	 * </code>
+	 * And wanted component name name is <code>hal.dll</code>. When in used <code>sdk</code>
+	 * there is components with prefixes given and component name as suffix:
+	 * <code>
+	 *   _h2_hal.dll
+	 *   _h4hrp_hal.dll
+	 *   _integrator_cm1136_hal.dll
+	 *   _template_hal.dll
+	 * </code>
+	 * Result will be <code>_h2_hal.dll</code> because <code>_h2_</code> prefix was first in prefix list.  
+	 * 
+	 * @param prefixList Prefix list.
+	 * @param componentName Component name.
+	 * @return First component matching prefix list by in order they appear or <code>null</code> if can't found any.
+	 */
+	public String searchComponentWithPrefix(List<String> prefixList, String componentName);
+
+	/**
+	 * Gets the component properties for the given component name.
+	 * Delegates call further to corresponding method in <code>ITargetCacher</code> interface.
+	 * @param cmpName The name of the component.
+	 * @param targetPlatformRestriction Component must belong to the given target platform (armv5, armv9e etc.).
+	 *                                  If set to <code>null</code>, match is made only based on component name.
+	 * @return component properties data for the component, or <code>null</code> if component was not found.
+	 * @throws CacheIndexNotReadyException 
+	 * @throws IOException 
+	 */
+	public ComponentPropertiesData getComponentPropertyArrayForComponent(String cmpName, ITargetPlatform targetPlatformRestriction) throws CacheIndexNotReadyException, IOException;
+	
+	/**
+	 * Gets the components that the given component directly depends upon.
+	 * Delegates call further to corresponding method in <code>ITargetCacher</code> interface.
+	 * @param componentName The name of the component.
+	 * @return The string array of component name that are directly depended upon.
+	 * @throws IOException 
+	 */
+	public List<UsedComponentData> getDirectlyDependentComponentsFor(String compToSearchFor) throws IOException;
+	
+	/**
+	 * Gets the functions that are exported from the given library for the use
+	 * of other components. Methods can be found from symbols table cache 
+	 * file in the ordinal order 1->N.
+	 * Delegates call further to corresponding method in <code>ITargetCacher</code> interface.
+	 * @param exportedCmpName Name of the component the functions are exported from.
+	 * @return String array of exported function info lines without any parsing.
+	 * @throws CacheIndexNotReadyException 
+	 * @throws IOException 
+	 */
+	public Collection<ExportFunctionData> getExportedFunctionsForComponent(String componentNameWithExtension) throws CacheIndexNotReadyException, IOException;
+	
+	/**
+	 * Gets the functions that are imported from imported component for the use
+	 * of parent component.
+	 * Delegates call further to corresponding method in <code>ITargetCacher</code> interface.
+	 * @param parentCmpName Name of the parent component that imports the functions.
+	 * @param importedCmpName Name of the component that the functions are imported from.
+	 * @return String array of imported function info lines without any parsing.
+	 * @throws CacheIndexNotReadyException 
+	 * @throws IOException 
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctionsForComponent(String parentCmpName, String importedCmpName) throws CacheIndexNotReadyException, IOException;
+	
+	/**
+	 * Gets the string array of component properties for the components
+	 * that are using the given component. 
+	 * Delegates call further to corresponding method in <code>ITargetCacher</code> interface.
+	 * @param progressCallback Job progress callback interface.
+	 * @param resultComponentsArrayList Array list objects to return resulting components into. 
+	 * @param componentName Name of the component to search using components for. 
+	 * @param functionOrdinal Ordinal of the function to search using components for. 
+	 *                        This parameter can be set to <code>null</code> if we are
+	 *                        only interested in components that are using the given component.
+	 * @throws JobCancelledByUserException 
+	 * @throws IOException 
+	 * @throws CacheIndexNotReadyException 
+	 */
+	public void getUsingComponents(IJobProgressStatus progressCallback, ArrayList<ComponentPropertiesData> resultComponentsArrayList, String componentName, String functionOrdinal) throws JobCancelledByUserException, IOException;
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/IComponentParentNodeListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.data;
+
+/**
+ * This class declares a listener interface
+ * that can be used if there is need to listen
+ * for component node events.
+ */
+public interface IComponentParentNodeListener {
+	
+	/**
+	 * Called when a new child node is added.
+	 * @param child Added child node.
+	 */
+	public void childAdded(ComponentNode child);
+	
+	/**
+	 * Called when a child node is removed.
+	 * @param child Removed child node.
+	 */
+	public void childRemoved(ComponentNode child);
+	
+	/**
+	 * Called when all child nodes are removed.
+	 */
+	public void allChildrensRemoved();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/data/IComponentSearchProgressListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,49 @@
+/*
+* 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.appdep.core.data;
+
+/**
+ * Notification interface that enables to follow-up component search progress.
+ */
+public interface IComponentSearchProgressListener {
+	
+	/**
+	 * Search start notification callback.
+	 */
+	public void searchStarted();
+	
+	/**
+	 * Notifies about addition of single component.
+	 * @param node Component node that has been added.
+	 * @param componentTotalCount Total count of components found so far.
+	 */
+	public void componentAdded(ComponentNode node, int componentTotalCount);
+	
+	/**
+	 * Search aborted notification callback.
+	 * @param componentTotalCount Total count of components found so far.
+	 */
+	public void searchAborted(int componentTotalCount);
+
+	/**
+	 * Search end notification callback.
+	 * @param componentTotalCount Total count of components found.
+	 */
+	public void searchFinished(int componentTotalCount);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/AppDepJobManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,180 @@
+/*
+* 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.appdep.core.job;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.ListenerList;
+
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+
+/**
+ * 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 deregister when completed.
+ */
+public class AppDepJobManager {
+
+	/**
+	 * Singleton instance.
+	 */
+	static private AppDepJobManager 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 AppDepJobManager getInstance(){
+		if( instance == null ){
+			instance = new AppDepJobManager();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Private default constructor.
+	 */
+	private AppDepJobManager() {
+		registeredJobs = new ArrayList<IManageableJob>();
+		listeners = new ListenerList();
+	}
+	
+	void registerJob(IManageableJob job){
+		registeredJobs.add(job);
+	}
+
+	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);
+		}
+	}
+	
+	/**
+	 * Performs forced shutdown for all the 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();
+		}
+	}
+	
+	/**
+	 * Adds job completion listener.
+	 * @param obj job completion listener.
+	 */
+	public void addListener(IJobCompletionListener obj){
+		listeners.add(obj);
+	}
+	
+	/**
+	 * Removes job completion listener.
+	 * @param obj  job completion listener.
+	 */
+	public void removeListener(IJobCompletionListener obj){
+		listeners.remove(obj);
+	}
+	
+	/**
+	 * Checks if there are any cache generation processed ongoing
+	 * for the given target.
+	 * @param sdkId SDK ID for the SDK to check against. 
+	 * @param targetPlatformName Target Platform Name string
+	 * @param buildType Build type.
+	 * @return <code>true</code> if there is cache generation job ongoing for 
+	 *         the given SDK, otherwise <code>false</code>.
+	 */
+	public boolean hasCacheGenerationJobForTarget(String sdkId, 
+												 String targetPlatformName,
+												 IBuildType buildType) {	
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = iter.next();
+			if(job instanceof ICacheGenerationJob){
+				SdkInformation targetSdkForJob = ((ICacheGenerationJob)job).getTargetSdkForJob();
+				ITargetPlatform[] targetsForJob = ((ICacheGenerationJob)job).getTargetPlatformForJob();
+				boolean targetPlatformMatchFound = false;
+				for (int i = 0; i < targetsForJob.length; i++) {
+					ITargetPlatform targetPlatformForJob = targetsForJob[i];
+					if(targetPlatformForJob.idEquals(targetPlatformName)){
+						targetPlatformMatchFound = true;
+					}
+				}
+				IBuildType buildTypeForJob = ((ICacheGenerationJob)job).getBuildTypeForJob();				
+				if(targetSdkForJob.getSdkId().equals(sdkId)
+					&&
+					targetPlatformMatchFound
+					&&
+					buildTypeForJob.equals(buildType)
+					){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * Checks if there are any cache generation processed ongoing
+	 * for the given SDK.
+	 * @param sdkId SDK ID for the SDK to check against. 
+	 * @return <code>true</code> if there is cache generation job ongoing for 
+	 *         the given SDK, otherwise <code>false</code>.
+	 */
+	public boolean hasCacheGenerationJobForSdk(String sdkId) {	
+		for (Iterator<IManageableJob> iter = registeredJobs.iterator(); iter.hasNext();) {
+			IManageableJob job = iter.next();
+			if(job instanceof ICacheGenerationJob){
+				SdkInformation targetSdkForJob = ((ICacheGenerationJob)job).getTargetSdkForJob();
+				if(targetSdkForJob.getSdkId().equals(sdkId)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/GenerateCacheJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,476 @@
+/*
+* 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.appdep.core.job;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+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.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager;
+import com.nokia.s60tools.appdep.core.AppDepCoreFacade;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.CacheDataLoadProcessManager;
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.ICacheIndexListener;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.ui.wizards.WizardUtils;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+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.debug.DbgUtility;
+
+/**
+ * Generates cache as a background job.
+ */
+public class GenerateCacheJob extends Job 
+							 implements ICmdLineCommandExecutorObserver,
+							            ICacheGenerationJob,
+							            ICacheIndexListener{
+
+	/**
+	 * Core facade to delegate execution of cache generation.
+	 */
+	private AppDepCoreFacade invoker = null;
+	
+	/**
+	 * Current tool settings used for generation.
+	 */
+	private AppDepSettings settings = null;
+	
+	/**
+	 * Job progress monitor.
+	 */
+	private IProgressMonitor monitor = null;
+	
+	/**
+	 * External appdep core tool process handle.
+	 */
+	private Process proc = null;
+	
+	/**
+	 * Maximum number of steps for job (100%) 
+	 */
+	private final int steps = 100;
+	
+	/**
+	 * Storing previous percentage amount got from job progress notifications. 
+	 */
+	private int previousPercentage = 0;
+	
+	/**
+	 * Job's cancel status.
+	 */
+	private boolean isCanceled = false;
+	
+	/**
+	 * Target platforms the cache is generated for.
+	 */
+	private ITargetPlatform[] targets = null;
+	
+	/**
+	 * This list is used to find out when all cache indices are updated
+	 * after the cache generation job is finished.
+	 */
+	private List<String> dirtyCachesBuilDirArrList = null;
+	
+	/**
+	 * Exit value from cache generation command done by appdep core.
+	 */
+	private int exitValue;
+	 
+	
+	/**
+	 * Constructor.
+	 * @param name Name of the job to be presented to user in Job title.
+	 * @param settings Settings object used for the cache generation.
+	 */
+	public GenerateCacheJob(String name, AppDepSettings settings) {
+		super(name);
+		setUser(true);
+		this.settings = settings;
+		targets = settings.getCurrentlyUsedTargetPlatforms();
+		dirtyCachesBuilDirArrList = new ArrayList<String>();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor progressMonitor) {
+		
+		this.monitor = progressMonitor;
+		try {
+			AppDepJobManager.getInstance().registerJob(this);
+			AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.StartingCacheGener_Msg"));    			 //$NON-NLS-1$
+			invoker = new AppDepCoreFacade(settings, this);
+			// Storing caches that really need update, must be called before calling generateCache
+			storeDirtyCachesBuildDirList();
+			invoker.generateCache(this);
+		} catch (InvalidCmdLineToolSettingException e1) {
+			e1.printStackTrace();
+			return completedWithStartupError(Messages.getString("GenerateCacheJob.CacheGenerFailed_Msg_InvalidSettings") //$NON-NLS-1$
+											+ e1.getMessage());    				
+		} catch (UnsupportedOSException e2) {
+			e2.printStackTrace();
+			String msg = Messages.getString("GenerateCacheJob.CacheGenerFailed_Msg_OS_NotSupported"); //$NON-NLS-1$
+			return completedWithStartupError(msg + ": " //$NON-NLS-1$
+											+ e2.getMessage());
+		}
+		
+       return Job.ASYNC_FINISH;
+       
+	  }
+
+	/**
+	 * Stores the list of caches that needs update.
+	 */
+	private void storeDirtyCachesBuildDirList() {
+		dirtyCachesBuilDirArrList.clear();
+		SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();
+		IBuildType buildType = settings.getBuildType();
+		for (int i = 0; i < targets.length; i++) {
+			ITargetPlatform targetPlatform = targets[i];
+			String targetPlatformId = targetPlatform.getId();
+			String buildDir = settings.getBuildDir(targetPlatformId);
+			if(settings.cacheNeedsUpdate(sdkInfo, new ITargetPlatform[]{targetPlatform}, buildType)){
+				DbgUtility.println(DbgUtility.PRIORITY_LOOP, "DIRTY CACHE build dir: " + buildDir); //$NON-NLS-1$
+				// Storing build directory in lower case letters for later getting correct match
+				dirtyCachesBuilDirArrList.add(buildDir.toLowerCase());					
+			}
+		}
+		// Finally checking if we are in SIS mode we need to also include it into the list
+		if(settings.isInSISFileAnalysisMode()){
+			String buildDir = settings.getBuildDir(AppDepSettings.TARGET_TYPE_ID_SIS);
+			dirtyCachesBuilDirArrList.add(buildDir.toLowerCase());
+		}
+	}
+
+	/**
+	 * Shows error message to user when job could not be started due to fault
+	 * in input parameters.
+	 * @param consoleMsg Message printed to console.
+	 * @return <code>IStatus</code> object.
+	 */
+	private IStatus completedWithStartupError(String consoleMsg){
+		AppDepConsole.getInstance().println(consoleMsg, IConsolePrintUtility.MSG_ERROR);
+		AppDepJobManager.getInstance().unregisterJob(this);
+		monitor.done();
+		return Status.OK_STATUS;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#progress(int)
+	 */
+	public void progress(int percentage) {
+		
+		isCanceled = monitor.isCanceled();
+        if (isCanceled){
+    		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Canceled_By_User_Msg"));    				 //$NON-NLS-1$
+        	proc.destroy();
+			monitor.done();
+		    done(Status.CANCEL_STATUS);
+		    return;
+        }
+        monitor.subTask(percentage + Messages.getString("GenerateCacheJob.Percent_Complete"));			 //$NON-NLS-1$
+        monitor.worked(percentage - previousPercentage);
+        previousPercentage = percentage;
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#processCreated(java.lang.Process)
+	 */
+	public void processCreated(Process proc) {
+		
+		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Started_Msg"));    				 //$NON-NLS-1$
+		
+		// Storing reference to the process
+		this.proc = proc;
+		
+		String sdkStr = settings.getCurrentlyUsedSdk().getSdkId();
+	
+		String buildTypeStr = settings.getBuildType().getBuildTypeName();
+		String cacheGenerateMsg = Messages.getString("GenerateCacheJob.CacheGener_For_Msg") //$NON-NLS-1$
+									+ sdkStr + "/" + settings.getCurrentlyUsedTargetPlatformsAsString() //$NON-NLS-1$
+									+ " (" + buildTypeStr + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+		monitor.beginTask(cacheGenerateMsg, steps);
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#interrupted(java.lang.String)
+	 */
+	public void interrupted(String reasonMsg) {
+		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Interrupted_Msg"));   //$NON-NLS-1$
+		AppDepJobManager.getInstance().unregisterJob(this);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.util.cmdline.ICmdLineCommandExecutorObserver#completed(int)
+	 */
+	public void completed(int exitValue) {
+
+		// Storing exitValue for future reference
+        this.exitValue = exitValue;
+        
+		if (!isCanceled){
+        	if(exitValue == 0){
+        		//
+        		// Cache generation was completed successfully
+        		//
+        		
+        		// Doing cache index update it it is needed
+        		if(dirtyCachesBuilDirArrList.size() > 0){
+            		// Starting cache index update
+            		AppDepCacheIndexManager.getInstance().addListener(this);
+                    
+            		monitor.subTask(Messages.getString("GenerateCacheJob.CacheIndex_Updating_Msg")); //$NON-NLS-1$
+            		for (int i = 0; i < targets.length; i++) {
+    					String targetPlatformId = targets[i].getId();
+    	                try {
+    	    				AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheIndex_Update_Starting_Msg"));    				 //$NON-NLS-1$
+    	    				String buildDir = settings.getBuildDir(targetPlatformId);
+    	    				// Converting build directory to lower case for correct match
+    	    				if(dirtyCachesBuilDirArrList.contains(buildDir.toLowerCase())){
+    							String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathName(targetPlatformId);
+    	    					DbgUtility.println(DbgUtility.PRIORITY_LOOP, "Updating cache index for: " + cacheFileAbsolutePathName); //$NON-NLS-1$
+								CacheIndex.updateCacheIndexFor(cacheFileAbsolutePathName,
+    																buildDir);	    					
+    	    				}
+    	    				AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheIndex_Update_Started_Msg"));    				 //$NON-NLS-1$
+    	    			} catch (IOException e1) {
+    	    				e1.printStackTrace();
+    	    				AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheIndex_Update_Failed_IOExecption_Msg") //$NON-NLS-1$
+    	    												+ e1.getMessage(), IConsolePrintUtility.MSG_ERROR);    				
+    	    			} catch (CacheFileDoesNotExistException e2) {
+    	    				e2.printStackTrace();
+    	    				AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheIndex_Update_Failed_FileNotExist_Msg") //$NON-NLS-1$
+    	    												+ e2.getMessage(), IConsolePrintUtility.MSG_ERROR);    				
+    	    			}					
+    				}
+            		
+            		// Job is still active until cache indices has been updated...            		        			
+        		}
+        		else{
+        			// No need to update any cache indices...we are done
+    	        	monitor.done();
+    			    done(Status.OK_STATUS);
+    			    // Showing completion status message to user now.
+    	        	runCacheCompletionMsgBoxInUIThread();        				    
+        		}
+        		
+        	}
+        	else{
+        		//
+        		// Something failed in cache generation
+        		//        		
+        		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Failed_WithCode_Msg") + exitValue);    				 //$NON-NLS-1$
+        		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Removing_Corrupted_Files_Msg"));    				 //$NON-NLS-1$
+	            // If was not canceled by user
+	        	// => Job itself was terminated normally even though there was some error in cache generation.
+	        	monitor.done();
+			    done(Status.OK_STATUS);
+			    // Showing completion status message to user now.
+	        	runCacheCompletionMsgBoxInUIThread();        				    
+        	}		    
+		    
+        }
+        else{
+        	// User canceled the operation.
+    		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Removing_Partially_Generated_Files_Msg"));    				 //$NON-NLS-1$
+        }
+        
+		AppDepConsole.getInstance().println(Messages.getString("GenerateCacheJob.CacheGener_Ended_WithExitVal_Msg") + exitValue);    				 //$NON-NLS-1$
+		AppDepJobManager.getInstance().unregisterJob(this);
+	}
+
+	/**
+	 * Informs user about cache generation results. Gives an error message in case
+	 * of an error has happened or in case of success queries if user wants to 
+	 * select a component from just generated cache.
+	 */
+	private void informUserAboutCacheCreationCompletion() {
+		
+		try {
+			
+			String targetPlatformStr = settings.getCurrentlyUsedTargetsAsString();
+			String msg = null;
+			AppDepMessageBox msgBox = null;
+
+			if(exitValue != 0){				
+				// Something failed				
+				msg = Messages.getString("GenerateCacheJob.CacheGener_Failed_For_Msg") + targetPlatformStr  //$NON-NLS-1$
+					  + " (" + Messages.getString("GenerateCacheJob.Exit_Code") + "=" + exitValue + "). " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+					  + Messages.getString("GenerateCacheJob.See_Console_Log_Msg"); //$NON-NLS-1$
+				
+				msgBox = new AppDepMessageBox(msg, SWT.ICON_ERROR | SWT.OK);
+				msgBox.open();			
+			}
+			else{				
+				// Generation completed successfully
+				
+				// Setting cache update flag 
+				settings.cacheWasUpdated();
+				
+				msg = Messages.getString("GenerateCacheJob.CacheGener_Completed_For_Msg") + targetPlatformStr + ". "  //$NON-NLS-1$ //$NON-NLS-2$
+				     +  Messages.getString("GenerateCacheJob.CacheGener_Do_You_Want_To_Select_Component_Question"); //$NON-NLS-1$
+				
+				msgBox = new AppDepMessageBox(msg, SWT.ICON_QUESTION | SWT.YES | SWT.NO);
+				int userResponse = msgBox.open();			
+				if(userResponse == SWT.YES){
+					// Invoking component selection dialog
+					if(WizardUtils.invokeSDKAndTargetPlatformSelectionWizard(msgBox.getParent(), 
+																			 false,
+																			 settings,
+																			 true)){
+						MainView.update();
+					}				
+				}
+				else{
+				     // Otherwise just reloading cache and refreshing existing view with new information
+					try {
+						CacheDataLoadProcessManager.runCacheLoadProcess(settings, true);
+					} catch (Exception e) {
+						e.printStackTrace();
+						// Cache reload failed				
+						msg = Messages.getString("GeneralMessages.CacheDataReload_Failed_For_Msg") //$NON-NLS-1$
+						        + " '" + targetPlatformStr  + "'. " //$NON-NLS-1$ //$NON-NLS-2$
+							  + Messages.getString("GenerateCacheJob.See_Console_Log_Msg"); //$NON-NLS-1$
+						
+						msgBox = new AppDepMessageBox(msg, SWT.ICON_ERROR | SWT.OK);
+						msgBox.open();			
+					}
+					MainView.update();					
+				}
+			}			
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		if(proc != null){
+			proc.destroy();
+			try {
+				proc.waitFor();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}					
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.ICacheGenerationJob#getTargetSdkForJob()
+	 */
+	public SdkInformation getTargetSdkForJob() {
+		return settings.getCurrentlyUsedSdk();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.ICacheGenerationJob#getBuildTypeForJob()
+	 */
+	public IBuildType getBuildTypeForJob() {
+		return settings.getBuildType();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.ICacheGenerationJob#getTargetPlatformForJob()
+	 */
+	public ITargetPlatform[] getTargetPlatformForJob() {
+		return settings.getCurrentlyUsedTargetPlatforms();
+	}
+	
+	/**
+	 * Convenience method for creating cache generation job
+	 * for the currently active settings.
+	 */
+	public static void triggerCacheGenerationForCurrentlyActiveSettings(){
+		// Cache generation uses the settings set by the user.			
+		// Getting a local copy of currently active settings...
+		AppDepSettings localSettings 
+				= (AppDepSettings) AppDepSettings.getActiveSettings().clone();
+		//... and passing it to cache generate job object
+		Job jb = new GenerateCacheJob(Messages.getString("GeneralMessages.CacheGeneration_Job_Title_Text"), localSettings); //$NON-NLS-1$
+		
+		// We do not want cache generation to block other 
+		// jobs and therefore using the lowest priority
+		jb.setPriority(Job.DECORATE);
+		jb.schedule();		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.ICacheIndexListener#cacheIndexCreationCompleted(com.nokia.s60tools.appdep.core.data.CacheIndex)
+	 */
+	public void cacheIndexCreationCompleted(CacheIndex cacheIndexObj) {
+ 
+		String buildDirectory = cacheIndexObj.getBuildDirectory();
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP, "DIRTY CACHE UPDATED for build dir: " + buildDirectory); //$NON-NLS-1$
+
+		// Converting build directory in lower case letters for getting correct match
+		dirtyCachesBuilDirArrList.remove(buildDirectory.toLowerCase());
+		// Have all the scheduled cache indices updated
+		if(dirtyCachesBuilDirArrList.size() == 0){
+			// No more need for listening completions
+			AppDepCacheIndexManager.getInstance().removeListener(this);
+			
+            // Job has completed successfully
+        	monitor.done();
+		    done(Status.OK_STATUS);
+		    // Showing completion status message to user
+        	runCacheCompletionMsgBoxInUIThread();        				    
+		}
+	}
+
+	/**
+	 * Schedules completion message box showing to the UI Thread.
+	 * Showing dialog in UI thread causes <code>IllegalThreadAccess</code> exception.
+	 */
+	private void runCacheCompletionMsgBoxInUIThread() {
+		// Informing used about the result of cache generation
+		Runnable cacheCreationCompletedRunnable = new Runnable(){
+			public void run(){
+				informUserAboutCacheCreationCompletion();
+			}
+		};
+		
+		// Showing a visible message in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(cacheCreationCompletedRunnable);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/ICacheGenerationJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.job;
+
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * Extends manageable job for providing possibility to 
+ * query for target SDK for the cache generation job. 
+ */
+public interface ICacheGenerationJob extends IManageableJob{
+	
+	/**
+	 * Gets SDK for the generation job.
+	 * @return SDK for the generation job.
+	 */
+	public SdkInformation getTargetSdkForJob();
+	
+	/**
+	 * Gets target platform for the generation job.
+	 * @return Target platform for the generation job.
+	 */
+	public ITargetPlatform[] getTargetPlatformForJob();
+	
+	/**
+	 * Gets build type for the generation job.
+	 * @return Build type for the generation job.
+	 */
+	public IBuildType getBuildTypeForJob();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IJobCompletionListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* 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.appdep.core.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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IJobProgressStatus.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.job;
+
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Notification interface for informing jobs progress status.
+ */
+public interface IJobProgressStatus {
+	/**
+	 * 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.
+	 * @param processedItem Item that is currently under processing.
+	 * @throws JobCancelledByUserException 
+	 */
+	public void progress(int percentage, String processedItem) throws JobCancelledByUserException;
+
+	/**
+	 * Checks if job has been cancelld by the user.
+	 * @return Returns <code>true</code> if jobs has been cancelled by user, 
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isCanceled();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/IManageableJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,33 @@
+/*
+* 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.appdep.core.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 whenever job needs to be shut down forcibly.
+	 */
+	public void forcedShutdown();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/job/UsedByOtherComponentsJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,327 @@
+/*
+* 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.appdep.core.job;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.CacheDataConstants;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.listview.ListView;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewDataPopulator;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Generates a background job that searches for
+ * is used by dependencies.
+ */
+public class UsedByOtherComponentsJob extends Job 
+							 implements IJobProgressStatus,
+							            IManageableJob {
+
+	//
+	// Private members and constants
+	// 
+	
+	private AppDepSettings settings = null;
+	private IProgressMonitor monitor = null;
+	private Process proc = null;
+	private final ArrayList<ComponentPropertiesData> resultComponentsArrayList;
+	private final String componentName;
+	private final IWorkbenchPage activeWbPage;
+	private final int steps;
+	private final String functionOrdinal;
+	private String functionName;
+	private String listViewTitleString;
+	private int previousPercentage = 0;	
+	private static final int VIEW_ACTIVATION_STEPS = 20;
+	
+	/**
+	 * Constructor.
+	 * @param name Name of the job to be presented to user in Job title.
+	 * @param settings Settings object used for the cache generation.
+	 * @param componentName Name of the component selected by user. Either the component 
+	 *                      for which we are searching dependencies, or the component that 
+	 *                      implements the function we are searching dependencies for.
+	 * @param functionName Can be set to <code>null</code> if we searching only dependencies
+	 *                     between the component and other components. Otherwise we are searching
+	 *                     components that are using this function. If this parameter is set, then
+	 *                     also function ordinal has to be set.
+	 * @param functionOrdinal Can be set to <code>null</code> if we searching only dependencies
+	 *                     between the component and other components. Otherwise we are searching
+	 *                     components that are using this function.
+	 * @param resultComponentsArrayList Result components array. 
+	 * @param activeWbPage	Currently active workbench page. This must be passes as parameter, because
+	 *                      non-UI thread cannot otherwise launch the component list view.
+	 * @param maximumComponentCount The amount of components available for the SDK/Platform currentlu
+	 *                              under analysis. This information is needed in order to be able to
+	 *                              show reasonable progress information bar.
+	 */
+	public UsedByOtherComponentsJob(String name, AppDepSettings settings,
+									String componentName,
+									String functionName,
+									String functionOrdinal,
+			                        ArrayList<ComponentPropertiesData> resultComponentsArrayList,
+			                        IWorkbenchPage activeWbPage) {
+		super(name);
+		setUser(true);
+		this.settings = settings;
+		this.componentName = componentName;
+		this.functionName = functionName;
+		this.functionOrdinal = functionOrdinal;
+		this.resultComponentsArrayList = resultComponentsArrayList;
+		this.activeWbPage = activeWbPage;
+        // Showing progress as percentages & reserving steps for view activation
+		steps = 100 + VIEW_ACTIVATION_STEPS; 
+		// Checking that all passes parameters are correct ones
+		checkParameterPreconditions();
+	}
+
+	/**
+	 * Checks that provided parameters for constructor are valid ones.
+	 * @throws IllegalArgumentException
+	 */
+	private void checkParameterPreconditions(){
+		// Both function related arguments has to be defined, or 
+		// none of the function related arguments should be set-
+		boolean bothFuncParamsNotNull = (functionName != null) && (functionOrdinal != null);
+		boolean bothFuncParamsNull  = (functionName == null) && (functionOrdinal == null);
+		if(! (bothFuncParamsNotNull || bothFuncParamsNull)){
+			String msg = Messages.getString("UsedByOtherComponentsJob.InvalidParams_ConsoleMsg"); //$NON-NLS-1$
+			AppDepConsole.getInstance().println(msg, IConsolePrintUtility.MSG_ERROR);    				
+			throw new IllegalArgumentException(msg );
+		}
+		// If functiona name cannot be resolved...
+		if(functionName != null && functionName.equals(CacheDataConstants.FUNC_NAME_NOT_RESOLVED)){
+			//...using component name with ordinal instead
+			functionName = componentName + "@" + functionOrdinal; //$NON-NLS-1$
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor progressMonitor) {
+		
+		IStatus stat = Status.OK_STATUS;
+		
+		this.monitor = progressMonitor;
+		
+		try {
+			AppDepJobManager.getInstance().registerJob(this);
+			AppDepConsole.getInstance().println(Messages.getString("UsedByOtherComponentsJob.Seeking_dependencies_ConsoleMsg"));    						 //$NON-NLS-1$
+			String msg = null;
+				
+			if(functionOrdinal != null){
+				msg = Messages.getString("UsedByOtherComponentsJob.Seeking_Components_Using_ConsoleMsg") //$NON-NLS-1$
+					+ "'" + functionName //$NON-NLS-1$
+					+ "'";		 //$NON-NLS-1$
+			}
+			else{
+				msg = Messages.getString("UsedByOtherComponentsJob.Seeking_Components_Using_ConsoleMsg") //$NON-NLS-1$
+					+ "'" + componentName //$NON-NLS-1$
+					+ "'";				 //$NON-NLS-1$
+			}
+			
+			// Starting task
+			monitor.beginTask(msg, steps);
+			// Getting using components into resultComponentsArrayList
+			MainViewDataPopulator.getUsingComponents(settings, this, resultComponentsArrayList, 
+			                                         componentName, functionOrdinal);	
+			// Handling the results
+			handleResultsAndInformUser();
+			
+		} catch (CacheFileDoesNotExistException e1) {
+			stat = handleException(Messages.getString("UsedByOtherComponentsJob.Failed_To_Seek_No_Cache_File"), e1); //$NON-NLS-1$
+			this.cancel();
+		} catch (IOException e2) {
+			stat = handleException(Messages.getString("UsedByOtherComponentsJob.Failed_To_Seek_IO_Exception") //$NON-NLS-1$
+					                         + e2.getMessage() + ").", e2); //$NON-NLS-1$
+			this.cancel();
+		} catch (JobCancelledByUserException e) {
+			// Job was cancelled by the user
+			stat = Status.CANCEL_STATUS;
+		}finally{
+			AppDepJobManager.getInstance().unregisterJob(this);
+			monitor.done();
+			
+		}
+		
+        if ((stat == Status.OK_STATUS) && isCanceled()){        		
+            return Status.CANCEL_STATUS;
+        }
+        
+        return stat;
+	  }
+
+	/**
+	 * Handles exception and wraps it into <code>IStatus</code> object.
+	 * @param consoleMsg message to be shown in console.
+	 * @param exception exception encountered.
+	 * @return <code>IStatus</code> object.
+	 */
+	private IStatus handleException(String consoleMsg, Throwable exception){
+		AppDepConsole.getInstance().println(consoleMsg, IConsolePrintUtility.MSG_ERROR);
+		return new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR, consoleMsg, exception);
+	}
+	
+	/**
+	 * Checks job results and in case of successful ending launches
+	 * component list view.
+	 */
+	public void handleResultsAndInformUser() {
+		
+        if (isCanceled()){        		
+            return;
+        }
+
+        if (isCanceled()){        		
+            return;
+        }
+        monitor.subTask(Messages.getString("UsedByOtherComponentsJob.Activatinb_View"));	 //$NON-NLS-1$
+        final int stepsLeft = (steps - previousPercentage);
+        monitor.worked(stepsLeft);
+        
+		// Launching the component list view
+		Runnable launchViewRunnable = new Runnable(){
+			public void run(){
+				launchListView();
+			}
+		};
+		
+		// Update request done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(launchViewRunnable);        		    		
+	}
+
+	/**
+	 * Launches list view and shows data for the user.
+	 */
+	private void launchListView() {
+		
+	   try {
+			IWorkbenchPage page = activeWbPage;
+
+			// Checking if view is already open
+			IViewReference[] viewRefs = activeWbPage.getViewReferences();
+			
+			for (int i = 0; i < viewRefs.length; i++) {
+				IViewReference reference = viewRefs[i];
+				String id = reference.getId();
+				if(id.equalsIgnoreCase(ListView.ID)){
+					// Found, restoring the view
+					IViewPart viewPart = reference.getView(true);
+					ListView listView = (ListView) viewPart;
+					updateListView(listView);
+					page.activate(viewPart);
+					return;
+				}
+			}
+			IViewPart viewPart = page.showView(ListView.ID);
+			ListView listView = (ListView) viewPart;
+			updateListView(listView);
+			
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(Messages.getString("UsedByOtherComponentsJob.Failed_To_Invoke_ListView_ConsoleMsg")  //$NON-NLS-1$
+											+ e.getMessage() 
+											+ ").", //$NON-NLS-1$
+											IConsolePrintUtility.MSG_ERROR);    				
+		}
+		
+	}
+
+	/**
+	 * Updates information to the list view.
+	 * @param listView List view to be updated.
+	 */
+	private void updateListView(ListView listView) {
+		listView.setInput(resultComponentsArrayList);
+		if(functionName != null){
+			listViewTitleString = Messages.getString("UsedByOtherComponentsJob.Found") + resultComponentsArrayList.size()  //$NON-NLS-1$
+			    +Messages.getString("UsedByOtherComponentsJob.Components_Using_Function") //$NON-NLS-1$
+				+ "'" + functionName //$NON-NLS-1$
+				+ "'";						 //$NON-NLS-1$
+		}
+		else{
+			listViewTitleString = Messages.getString("UsedByOtherComponentsJob.Found") + resultComponentsArrayList.size()  //$NON-NLS-1$
+			    +Messages.getString("UsedByOtherComponentsJob.Components_Using_Component") //$NON-NLS-1$
+				+ "'" + componentName //$NON-NLS-1$
+				+ "'";				 //$NON-NLS-1$
+		}
+		listView.updateDescription(listViewTitleString);
+		listView.setComponentName(componentName);
+		// Storing function name => set automatically to null if only queried for a component
+		listView.setFunctionName(functionName);		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IManageableJob#forcedShutdown()
+	 */
+	public void forcedShutdown() {
+		if(proc != null){
+			proc.destroy();
+			try {
+				proc.waitFor();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}					
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.IJobProgressStatus#progress(int, java.lang.String)
+	 */
+	public void progress(int percentage, String prosessing) throws JobCancelledByUserException {
+        if (isCanceled()){
+        	String msg = Messages.getString("UsedByOtherComponentsJob.Canceled_By_User_ConsoleMsg"); //$NON-NLS-1$
+    		AppDepConsole.getInstance().println(msg);
+    		throw new JobCancelledByUserException(msg);
+        }
+        monitor.subTask(percentage + Messages.getString("UsedByOtherComponentsJob.Percentage_Completed")); //$NON-NLS-1$
+        monitor.worked(percentage - previousPercentage);
+        previousPercentage = percentage;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.IJobProgressStatus#isCanceled()
+	 */
+	public boolean isCanceled() {
+		return monitor.isCanceled();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/AbstractFunctionData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,138 @@
+/*
+* 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.appdep.core.model;
+
+import java.util.regex.Pattern;
+
+import com.nokia.s60tools.appdep.exceptions.ZeroFunctionOrdinalException;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+
+/**
+ * Abstract base class for import and export function data.
+ */
+public abstract class AbstractFunctionData {
+	
+	/**
+	 * The following character is used to separate class/namespace name from function name in raw cache data.
+	 */
+	private final static String FUNC_NAME_SEPARATOR = "::"; //$NON-NLS-1$
+	
+	/**
+	 * The following character is used to start parameter list in function name.
+	 */
+	private final static String FUNC_PARAM_LIST_START_CHAR = "("; //$NON-NLS-1$
+	
+	/**
+	 * Function ordinal (1..n when converted into integer).
+	 */
+	private final String functionOrdinal;
+	/**
+	 * Function name.
+	 */
+	protected String functionName;
+
+	/**
+	 * Constructor.
+	 * @param functionOrdinal Function ordinal (1..n when converted into integer).
+	 * @param functionName Function name.
+	 * @throws IllegalArgumentException 
+	 * @throws ZeroFunctionOrdinalException 
+	 */
+	public AbstractFunctionData(String functionOrdinal, String functionName) throws IllegalArgumentException, ZeroFunctionOrdinalException{
+		this.functionOrdinal = functionOrdinal;
+		this.functionName = functionName;
+		validateOrdinal();		
+	}
+
+	/**
+	 * Checks that ordinal can be converted into integer.
+	 * @throws ZeroFunctionOrdinalException 
+	 */
+	private void validateOrdinal() throws IllegalArgumentException, ZeroFunctionOrdinalException{
+		String validateErrMsg = Messages.getString("AbstractFunctionData.NotValidOrdinal_ErrMsg") + functionOrdinal; //$NON-NLS-1$
+		try {
+			int ordinal = getFunctionOrdinalAsInt();
+			// Ordinal should be positive value from 1..N
+			if(!(ordinal > 0)){
+				if(ordinal == 0){
+					// Zero ordinal functions are special cases handled by caller
+					throw new ZeroFunctionOrdinalException(functionName);
+				}
+				throw new IllegalArgumentException(validateErrMsg);				
+			}
+		} catch (NumberFormatException e) {
+			throw new IllegalArgumentException(validateErrMsg);
+		}		
+	}
+
+	/**
+	 * Returns function ordinal as int.
+	 * @return function ordinal as int.
+	 */
+	public int getFunctionOrdinalAsInt(){
+		return Integer.parseInt(functionOrdinal);
+	}
+
+	/**
+	 * Returns function ordinal as Integer.
+	 * @return function ordinal as Integer.
+	 */
+	public Integer getFunctionOrdinalAsInteger(){
+		return new Integer(getFunctionOrdinalAsInt());
+	}
+	
+	/**
+	 * Gets function ordinal. 
+	 * @return the functionOrdinal
+	 */
+	public String getFunctionOrdinal() {
+		return functionOrdinal;
+	}
+
+	/**
+	 * Gets function name.
+	 * @return the functionName
+	 */
+	public String getFunctionName() {
+		return functionName;
+	}
+	
+	/**
+	 * Extracts function's base name from the full name.
+	 * @return Function's base name without class or namespace name prefix and parameter list.
+	 */
+	public String getFunctionBaseName() {
+		// Separating component name prefix from function name and parameters
+		String[] splittedFuncName = functionName.split(Pattern.quote(FUNC_NAME_SEPARATOR));
+		// If there was component name prefix...
+		if(splittedFuncName.length == 2){
+			//  returning function base name without class/namespace name and without parameter list
+			// e.g RFs::PrivatePath(TDes16&) => PrivatePath			[efsrv.dll:27]
+			// q.g. std::terminate() => terminate					[drtrvct2_2.dll:1]
+			return splittedFuncName[1].split(Pattern.quote(FUNC_PARAM_LIST_START_CHAR))[0];
+		}
+		else{
+			// Otherwise returning just function name without parameter list
+			// e.g FileNamesIdentical(TDesC16 const&, TDesC16 const&) => FileNamesIdentical		[efsrv.dll:1]
+			// e.g operator delete(void*) => operator delete									[scppnwdl.dll:3]
+			// e.g __btod_div_common => __btod_div_common										[drtrvct2_2.dll:11]
+			return functionName.split(Pattern.quote(FUNC_PARAM_LIST_START_CHAR))[0];
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/CacheFactory.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,456 @@
+/*
+* 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.appdep.core.model;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.data.CacheCompPropertyField;
+import com.nokia.s60tools.appdep.core.data.CacheDataConstants;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.exceptions.InvalidModelDataException;
+import com.nokia.s60tools.appdep.exceptions.ZeroFunctionOrdinalException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.LogUtils;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+/**
+ * Singleton class that parses cache files and creates TargetCache object based 
+ * on the parsed cache data.
+ */
+public class CacheFactory {
+	
+	// Indices for using imported component definition line in dependencies cache that
+	// is of the following format: 
+	//
+	// component_name.dll|61
+	//
+	public static final int USED_COMPONENT_NAME_FIELD_INDEX = 0;
+	public static final int IMPORTED_FUNCTION_CNT_FIELD_INDEX = 1;
+	
+	// Indices for using library file definition line in symbols cache that
+	// is of the following format: 
+	//
+	// W:\epoc32\release\armv5\lib\|component_name.dso|1188902018|2229
+	//
+	public static final int LIB_NAME_FIELD_INDEX = 1;
+	public static final int LIB_TIMESTAMP_FIELD_INDEX = 2;
+	public static final int EXPORT_FUNC_COUNT_FIELD_INDEX = 3;
+	private static final int LIB_DEF_LINE_FIELD_COUNT = 4;;
+		
+	/**
+	 * This regular expression is used to split cache data lines.
+	 */
+	private static final String CACHE_FIELD_SEPARATOR_REGEXP = getCacheFieldSeparatorRegExp();
+
+	/**
+	 * Private exception used to notify about ending of cache file while doing reading.
+	 */
+	private class EOFException extends Exception{
+
+		private static final long serialVersionUID = -7745437229230851377L;
+
+		public EOFException(){
+			super();
+		}
+	}
+	
+	/**
+	 * Private helper class used for reading cache files.
+	 */
+	private class CacheFileReader{
+		
+		private BufferedReader br;
+		private FileReader fileRdr;
+
+		/**
+		 * Constructor. 
+		 * @param filePathName Absolute path name for the cache file to read from.
+		 * @throws FileNotFoundException 
+		 */
+		public CacheFileReader(String filePathName) throws FileNotFoundException{
+			File f = new File(filePathName);
+			fileRdr = new FileReader(f);
+			br = new BufferedReader(fileRdr);
+		}		
+
+		/**
+		 * Reads the contents of a file line by line. 
+		 * @throws EOFException 
+		 * @throws IOException 
+		 */
+		public String nextLine() throws EOFException, IOException{
+			String line = br.readLine();
+			if(line == null){
+				// End-of-file reached
+				br.close();
+				fileRdr.close();
+				throw new EOFException();
+			}
+			return line;
+		}		
+	}
+	
+	/**
+	 * Singleton instance of the factory class.
+	 */
+	private static CacheFactory instance;
+
+	/**
+	 * Private constructor.
+	 */
+	private CacheFactory(){	
+	}
+	
+	/**
+	 * Singleton class accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	public static CacheFactory getInstance(){
+		if(instance == null){
+			instance = new CacheFactory();
+		}
+		return instance;		
+	}
+	
+	/**
+	 * Load a single cache data from dependencies and symbols cache file into internal data structure.
+	 * @param cacheDirectoryAbsolutePath Absolute path name to the directory cache files for 
+	 *                                   the target reside. 
+	 * @param targetPlatformId Id for the target platform to be loaded.
+	 * @return Reference to data target data model service method interface.
+	 * @param notifierRequestor If not <code>null</code> the client is requesting notifications about component loading process.
+	 * @throws IOException 
+	 */
+	public ITargetCache loadCache(String cacheDirectoryAbsolutePath, String targetPlatformId, ICacheLoadProgressNotification notifierRequestor) throws IOException{
+		TargetCache targetCache = new TargetCache(targetPlatformId);
+		String dependenciesCacheVersion = parseAndPopulateDependencies(targetCache, cacheDirectoryAbsolutePath + File.separator + ProductInfoRegistry.getCacheFileName(), notifierRequestor);
+		String symbolsCacheVersion = parseAndPopulateSymbols(targetCache, cacheDirectoryAbsolutePath + File.separator + ProductInfoRegistry.getCacheSymbolsFileName());
+		// Cache file versions must match
+		if(! dependenciesCacheVersion.equals(symbolsCacheVersion)){
+			String errMsg = Messages.getString("CacheFactory.CacheDataIntegriryFailure_ErrMsg")  //$NON-NLS-1$
+										+ " " + Messages.getString("CacheFactory.CacheDataIntegriryFailure_Version1_ErrMsg") //$NON-NLS-1$ //$NON-NLS-2$ 
+										+ dependenciesCacheVersion + Messages.getString("CacheFactory.CacheDataIntegriryFailure_Version2_ErrMsg")  //$NON-NLS-1$
+										+ symbolsCacheVersion + Messages.getString("CacheFactory.CacheDataIntegriryFailure_NoMatch_ErrMsg");//$NON-NLS-1$
+			LogUtils.logStackTrace(errMsg, null);
+			throw new RuntimeException(errMsg); 
+		}
+		targetCache.setVersion(dependenciesCacheVersion); // Storing cache version, if all versions are matching
+		return targetCache;
+	}
+	
+	/**
+	 * Parses and populates dependencies cache data.
+	 * @param targetCache Target cache to set dependencies cache data.
+	 * @param dependenciesCacheAbsoluteFilePathName Absolute path name to cache data file.
+	 * @param notifierRequestor If not <code>null</code> the client is requesting notifications about component loading process.
+	 * @return Version number of the cache file.
+	 * @throws IOException 
+	 */
+	private String parseAndPopulateDependencies(TargetCache targetCache,
+			String dependenciesCacheAbsoluteFilePathName, ICacheLoadProgressNotification notifierRequestor) throws IOException {
+		
+		DependenciesCache dependenciesCache = new DependenciesCache();
+		
+		String cacheVersion = null;  
+		String line = null;
+		String prevLine = null;
+		ComponentPropertiesData currentCmpPropData = null;
+
+		try {
+			CacheFileReader cacheRdr = new CacheFileReader(dependenciesCacheAbsoluteFilePathName);
+			line = cacheRdr.nextLine();
+			cacheVersion = getVersionInfoFromHeader(line, dependenciesCacheAbsoluteFilePathName);
+			
+			while(true){ // Reading lines until EOFException or other exception encountered
+				prevLine = line;
+				line = cacheRdr.nextLine();
+				String[] stringArrayCandidate = splitPopertyLineIntoStringArray(line);
+				if(isComponentDefinitionLineInMainCacheFile(stringArrayCandidate)){
+					currentCmpPropData =  new ComponentPropertiesData(stringArrayCandidate);
+					handleComponentReferences(cacheRdr, currentCmpPropData);					
+					dependenciesCache.addComponentPropertiesData(currentCmpPropData,targetCache.getId());
+					if(notifierRequestor != null){
+						notifierRequestor.componentLoaded(currentCmpPropData.getFilename());						
+					}
+				}
+				
+			}
+		} catch (EOFException e) {
+			// Cache file must end with CacheIndex.CACHE_FILE_END_MARK in order being fully generated and valid one
+			if(!prevLine.equals(CacheDataConstants.CACHE_FILE_END_MARK)){
+				String errMsg = Messages.getString("CacheFactory.CacheDataIntegriryFailure_ErrMsg")  //$NON-NLS-1$ 
+											+ " " + Messages.getString("CacheFactory.CacheDataIntegriryFailure_version_NoEOF_Mark_ErrMsg") //$NON-NLS-1$ //$NON-NLS-2$ 
+											+ dependenciesCacheAbsoluteFilePathName + ").";//$NON-NLS-1$
+				LogUtils.logStackTrace(errMsg, e);
+				throw new RuntimeException(errMsg); 
+			}
+		} catch (Exception e) {
+			String errMsg = Messages.getString("CacheFactory.CacheDataLoadFailure_ErrMsg")  //$NON-NLS-1$
+										+ dependenciesCacheAbsoluteFilePathName + Messages.getString("CacheFactory.CacheDataLoadFailure_Unexpected_ErrMsg")  //$NON-NLS-1$
+										+ e.getClass().getSimpleName() 
+										+ "): " //$NON-NLS-1$
+										+ e.getMessage();
+			LogUtils.logStackTrace(errMsg, e);
+			throw new RuntimeException(errMsg);
+		}
+		
+		// Setting dependencies cache data
+		targetCache.setDependenciesCache(dependenciesCache);
+		
+		return cacheVersion;
+	}
+
+	/**
+	 * Parses and populates symbols cache data.
+	 * @param targetCache Target cache to set dependencies cache data.
+	 * @param symbolsCacheAbsoluteFilePathName Absolute path name to cache data file.
+	 * @return Version number of the cache file.
+	 * @throws IOException 
+	 */
+	private String parseAndPopulateSymbols(TargetCache targetCache,
+			String symbolsCacheAbsoluteFilePathName) throws IOException {
+		
+		SymbolsCache symbolsCache = new SymbolsCache();
+		
+		String cacheVersion = null;  
+		String prevLine = null;
+		ComponentPropertiesData currentCmpPropData = null;
+		
+		try {
+			CacheFileReader cacheRdr = new CacheFileReader(symbolsCacheAbsoluteFilePathName);
+			String line = cacheRdr.nextLine();
+			cacheVersion = getVersionInfoFromHeader(line, symbolsCacheAbsoluteFilePathName);
+			
+			while(true){ // Reading lines until EOFException or other exception encountered
+				prevLine = line;
+				line = cacheRdr.nextLine();
+				String[] stringArrayCandidate = splitPopertyLineIntoStringArray(line);
+				// Checking if we have library definition line
+				if(isComponentDefinitionLineSymbolsCacheFile(stringArrayCandidate)){
+					// Getting field from the library definition line 
+					String libBaseName = SymbolsCache.removeFileExtension(stringArrayCandidate[LIB_NAME_FIELD_INDEX]);
+					long libCachedTimestamp = Long.parseLong(stringArrayCandidate[LIB_TIMESTAMP_FIELD_INDEX]);
+					int exportedFuncCount = Integer.parseInt(stringArrayCandidate[EXPORT_FUNC_COUNT_FIELD_INDEX]);
+					// Creating library data object
+					LibPropertiesData libPropData = new LibPropertiesData(libBaseName, libCachedTimestamp);
+					// Adding exported function into library data object
+					handleExportedFunctions(cacheRdr, libPropData, exportedFuncCount);
+					// Adding to symbols cache
+					symbolsCache.addLibPropertiesData(libPropData);
+				}
+			}
+		} catch (EOFException e) {
+			// Cache file must end with CacheIndex.CACHE_FILE_END_MARK in order being fully generated and valid one
+			if(!prevLine.equals(CacheDataConstants.CACHE_FILE_END_MARK)){
+				String errMsg = Messages.getString("CacheFactory.CacheDataIntegriryFailure_ErrMsg")  //$NON-NLS-1$ 
+											+ " " + Messages.getString("CacheFactory.CacheDataIntegriryFailure_NoEOF_Mark_ErrMsg") //$NON-NLS-1$ //$NON-NLS-2$ 
+											+ symbolsCacheAbsoluteFilePathName + ").";//$NON-NLS-1$
+				LogUtils.logStackTrace(errMsg, e);
+				throw new RuntimeException(errMsg); 
+			}
+		} catch (InvalidModelDataException e) {
+			String errMsg = Messages.getString("CacheFactory.CacheDataIntegriryFailure_ErrMsg")  //$NON-NLS-1$ 
+										+ " " + Messages.getString("CacheFactory.CacheDataIntegriryFailure_InvalidComponent_ErrMsg") //$NON-NLS-1$ //$NON-NLS-2$ 
+										+ symbolsCacheAbsoluteFilePathName + Messages.getString("CacheFactory.CacheDataIntegriryFailure_Detailed_ErrMsg") //$NON-NLS-1$
+										+ currentCmpPropData;
+			LogUtils.logStackTrace(errMsg, e);
+			throw new RuntimeException(errMsg);
+		}
+		
+		// Setting symbols cache data
+		targetCache.setSymbolsCache(symbolsCache);
+		
+		return cacheVersion;
+	}
+
+	/**
+	 * Reads exported functions and stores into model
+	 * @param cacheRdr Cache data reader object
+	 * @param libPropData Library properties data object to add exported functions.
+	 * @param exportedFuncCount Exported function count read from the reader object.
+	 * @throws IOException 
+	 * @throws EOFException 
+	 */
+	private void handleExportedFunctions(CacheFileReader cacheRdr, LibPropertiesData libPropData, int exportedFuncCount) throws EOFException, IOException {
+		for (int exportFuncOrdinal = 1; exportFuncOrdinal <= exportedFuncCount; exportFuncOrdinal++) {
+			String exportFuncName = cacheRdr.nextLine();
+			Integer exportFuncOrdinalAsInteger = new Integer(exportFuncOrdinal);
+			ExportFunctionData exportFunctionData;
+			try {
+				exportFunctionData = new ExportFunctionData(exportFuncOrdinalAsInteger.toString(), exportFuncName);
+				libPropData.addExportedFunction(exportFunctionData);			
+			} catch (ZeroFunctionOrdinalException e) {
+				// Zero ordinal functions are just ignored and not added to properties data.
+				DbgUtility.println(DbgUtility.PRIORITY_LOOP, "Encountered zero ordinal exported function: " + e.getFunctionName()); //$NON-NLS-1$ 									
+			}
+		}
+	}
+
+	/**
+	 * This method is created purely for enabling JUnit testing of ITargetCache interface
+	 * with a given set of test data without requiring parsing of 
+	 * @param version Cache file data format version.
+	 * @param id Id of the target platform this target cache represents 
+	 * @param dependenciesCache Dependencies cache data.
+	 * @param symbolsCache Library cache data.
+	 * @return Reference to data target data model service method interface.
+	 */
+	public ITargetCache createCacheForUnitTests(String version, String id, DependenciesCache dependenciesCache, SymbolsCache symbolsCache){
+		TargetCache cache = new TargetCache(id);
+		cache.setDependenciesCache(dependenciesCache);
+		cache.setSymbolsCache(symbolsCache);
+		cache.setVersion(version);
+		return cache;		
+	}
+	
+	/**
+	 * Reads version information from the header line
+	 * @param headerLine Header line to be checked version info from.
+	 * @param cacheFileAbsolutePathName
+	 * @return Version string.
+	 */
+	private String getVersionInfoFromHeader(String headerLine, String cacheFileAbsolutePathName) {
+		String[] splitArr = headerLine.split(CacheDataConstants.CACHE_VERSION_INFO_SEPARATOR);
+		if(splitArr.length == 2){
+			return splitArr[1].trim();
+		}
+		String errMsg = Messages.getString("CacheFactory.CacheDataIntegriryFailure_ErrMsg")  //$NON-NLS-1$ 
+									+ " " + Messages.getString("CacheFactory.CacheDataIntegriryFailure_NoVersionNumber_ErrMsg") //$NON-NLS-1$ //$NON-NLS-2$ 
+									+ cacheFileAbsolutePathName + ")."; //$NON-NLS-1$
+		LogUtils.logStackTrace(errMsg, null);
+		throw new RuntimeException(errMsg); 
+	}
+	
+	
+	/**
+	 * Checks if the current line is a component definition line array.
+	 * Line is component property line if the field count is the
+	 * one that is expected for this kind of line.
+	 * @param stringArrayCandidate String array candidate.
+	 * @return <code>true</code> if component definition line, otherwise <code>false</code>.
+	 */
+	boolean isComponentDefinitionLineInMainCacheFile(String[] stringArrayCandidate) {	
+		if(stringArrayCandidate.length == CacheCompPropertyField.getCompPropertyFieldCount()){
+			return true;
+		}		
+		return false;
+	}
+
+	/**
+	 * Splits the property line into a string array containing property line fields.
+	 * @param compPropertiesLine Property line to be split.
+	 * @return A string array containing property line fields.
+	 */
+	String[] splitPopertyLineIntoStringArray(String compPropertiesLine){
+		return compPropertiesLine.split(CACHE_FIELD_SEPARATOR_REGEXP);
+	}
+	
+	/**
+	 * Stores all the components from which this component property data object imports functions. 
+	 * @param cacheRdr Cache data reader.
+	 * @param currentCmpPropData Component properties object into which add imported functions and their components.
+	 * @throws IOException 
+	 * @throws EOFException 
+	 */
+	private void handleComponentReferences(CacheFileReader cacheRdr,
+			ComponentPropertiesData currentCmpPropData) throws EOFException, IOException {
+
+		// Getting amount of referred components
+		int referredCompCount = currentCmpPropData.getDllRefTableCountAsInt();
+		// Storing information from the all referred components.
+		for (int handledCmpCount = 0; handledCmpCount < referredCompCount; handledCmpCount++) {
+			// Getting component name and count of imported functions
+			String referredCompLine = cacheRdr.nextLine();		
+			String [] referredCompArr = splitPopertyLineIntoStringArray(referredCompLine);		
+			String referredCmpName = referredCompArr[USED_COMPONENT_NAME_FIELD_INDEX];
+			String importedFuncCountAsString = referredCompArr[IMPORTED_FUNCTION_CNT_FIELD_INDEX];
+			int importedFuncCount = Integer.parseInt(importedFuncCountAsString);
+
+			// Adding data model object for storing functions imported from the component
+			UsedComponentData usedCmpData = new UsedComponentData(referredCmpName);
+			
+			// Temporary variables used for access textual cache data
+			String importedFuncLine;
+			String[] importedFuncLineArr;
+			boolean isVirtual;
+			
+			// Browsing through all the imported functions for the component
+			for (int i = 0; i < importedFuncCount; i++) {
+				importedFuncLine = cacheRdr.nextLine();
+				importedFuncLineArr = splitPopertyLineIntoStringArray(importedFuncLine);
+				isVirtual = isVirtualFunctionFlagSet(importedFuncLineArr);				
+				ImportFunctionData importFuncData;
+				try {
+					importFuncData = new ImportFunctionData(
+															importedFuncLineArr[ImportFunctionData.ORDINAL_FIELD_INDEX], 
+															importedFuncLineArr[ImportFunctionData.NAME_FIELD_INDEX], 
+															isVirtual, 
+															importedFuncLineArr[ImportFunctionData.OFFSET_FIELD_INDEX] 								
+															);
+					usedCmpData.addImportedFunction(importFuncData);
+				} catch (ZeroFunctionOrdinalException e) {
+					// Zero ordinal functions are just ignored and not added to properties data.
+					DbgUtility.println(DbgUtility.PRIORITY_LOOP, "Encountered zero ordinal imported function: " //$NON-NLS-1$ 
+																 + e.getFunctionName());
+				}
+			} // for
+			// After imported function are added, adding imported component to the using component object
+			currentCmpPropData.addUsedComponentData(usedCmpData);
+		} // for
+		
+	}
+
+	/**
+	 * Checks from given imported function info array if the function 
+	 * is virtual. 
+	 * The call is further delegated to CacheIndex class
+	 * @param importedFuncLineArr Function info array
+	 * @return <code>true</code> if the function is virtual, 
+	 *         otherwise <code>false</code>.
+	 */
+	public static boolean isVirtualFunctionFlagSet(String[] importedFuncLineArr) {
+		return CacheIndex.isVirtualFunctionFlagSet(importedFuncLineArr);
+	}
+
+	/**
+	 * Returns regular expression used to split fields in cache data. 
+	 * The call is further delegated to CacheIndex class
+	 * @return regular expression used to split fields in cache data.
+	 */
+	private static String getCacheFieldSeparatorRegExp() {
+		return CacheIndex.getCacheFieldSeparatorRegExp();
+	}
+
+	/**
+	 * Checks if the current line is a library definition line.
+	 * @param stringArrayCandidate Line to be checked.
+	 * @return <code>true</code> if component definition line, otherwise <code>false</code>.
+	 */
+	private boolean isComponentDefinitionLineSymbolsCacheFile(String[] stringArrayCandidate) {		
+		if(stringArrayCandidate.length == LIB_DEF_LINE_FIELD_COUNT){
+			return true;
+		}		
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ComponentPropertiesData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,448 @@
+/*
+* 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.appdep.core.model;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.TargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheCompPropertyField;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.PropertyData;
+
+
+/**
+ * Stores the properties and all the used components listed 
+ * for a certain component in dependencies cache file.
+ */
+public class ComponentPropertiesData {
+
+	
+	//
+	// NOTE: Column indices must start from zero (0) and
+	// the columns must be added in ascending numeric
+	// order.
+	//
+	
+	// These are column indices for a simple property view 
+	public static final int PROPERTY_COLUMN_INDEX = 0;
+	public static final int VALUE_COLUMN_INDEX = 1;
+	
+	// These are column indices for a full list view of properties 
+	public static final int NAME_COLUMN_INDEX = 0;
+	public static final int BIN_FORMAT_COLUMN_INDEX = 1;
+	public static final int UID1_COLUMN_INDEX = 2;
+	public static final int UID2_COLUMN_INDEX = 3;
+	public static final int UID3_COLUMN_INDEX = 4;
+	public static final int SECURE_ID_COLUMN_INDEX = 5;
+	public static final int VENDOR_ID_COLUMN_INDEX = 6;
+	public static final int MIN_HEAP_COLUMN_INDEX = 7;
+	public static final int MAX_HEAP_COLUMN_INDEX = 8;
+	public static final int STACK_SIZE_COLUMN_INDEX = 9;	
+	
+	/**
+	 * Descriptions used for the different property fields
+	 */
+	public static final String[] DESCRIPT_ARR = {   Messages.getString("ComponentPropertiesData.PropFieldDesc_Directory"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_Filename"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_BinaryFormat"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_UID1"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_UID2"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_UID3"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_SecureID"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_VendorID"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_Capabilities"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_MinHeapSize"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_MaxHeapSize"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_StackSize"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_CacheTimestamp"), //$NON-NLS-1$
+													Messages.getString("ComponentPropertiesData.PropFieldDesc_DllRefTableCount") //$NON-NLS-1$
+												};
+	
+	//
+	// Component properties fields
+	//
+	private String directory;
+	private String filename;
+	private String binaryFormat;
+	private String uid1;
+	private String uid2;
+	private String uid3;
+	private String secureId;
+	private String vendorId;
+	private String[] capabilities;
+	private String minHeapSize;
+	private String maxHeapSize;
+	private String stackSize;
+	private String cacheTimestamp;
+	private String dllRefTableCount;
+	
+	/**
+	 * List of components that are used directly by this component.
+	 * The list of components are in the order they have been added into the list.
+	 * All map keys should be stored in lower case.
+	 */
+	private Map<String, UsedComponentData> usedComponents;
+	
+	/**
+	 * Constructs the object based on the given array 
+	 * of properties.
+	 * @param propertyValueArray Value array containing property information.
+	 */
+	public ComponentPropertiesData(String[] propertyValueArray){
+		// We want to preserve the order the used components are inserted into the map.
+		usedComponents = new LinkedHashMap<String, UsedComponentData>();
+		setPropertyData(propertyValueArray);
+	}
+
+	/**
+	 * Sets objects data based on the given array 
+	 * of properties.
+	 * @param propertyValueArray Value array containing property information.
+	 */
+	private void setPropertyData(String[] propertyValueArray){
+		directory = propertyValueArray[CacheCompPropertyField.DIRECTORY_ARR_INDX];
+		filename = propertyValueArray[CacheCompPropertyField.FILENAME_ARR_INDX];
+		binaryFormat = propertyValueArray[CacheCompPropertyField.BINARY_FORMAT_ARR_INDX];
+		uid1 = propertyValueArray[CacheCompPropertyField.UID1_ARR_INDX];
+		uid2 = propertyValueArray[CacheCompPropertyField.UID2_ARR_INDX];
+		uid3 = propertyValueArray[CacheCompPropertyField.UID3_ARR_INDX];
+		secureId = propertyValueArray[CacheCompPropertyField.SECURE_ID_ARR_INDX];
+		vendorId = propertyValueArray[CacheCompPropertyField.VENDOR_ID_ARR_INDX];
+		parseCapabilities(propertyValueArray[CacheCompPropertyField.CAPABILITIES_ARR_INDX]);
+		minHeapSize = propertyValueArray[CacheCompPropertyField.MIN_HEAP_SIZE_ARR_INDX];
+		maxHeapSize = propertyValueArray[CacheCompPropertyField.MAX_HEAP_SIZE_ARR_INDX];
+		stackSize = propertyValueArray[CacheCompPropertyField.STACK_SIZE_ARR_INDX];
+		cacheTimestamp = propertyValueArray[CacheCompPropertyField.CACHE_TIMESTAMP_ARR_INDX];
+		dllRefTableCount = propertyValueArray[CacheCompPropertyField.DLL_REF_TABLE_COUNT_ARR_INDX];		
+	}
+	
+	/**
+	 * Parses and transforms capabilities from numeric format into string array.
+	 * @param capabilitiesInNumericFormatString capabilities in numeric format
+	 */
+	private void parseCapabilities(String capabilitiesInNumericFormatString) {
+		
+		int allDefinedCapabilitiesAsInt = Integer.parseInt(capabilitiesInNumericFormatString);
+
+		// All the capabilities that was found for this executable
+        ArrayList<String> foundCapabilities = new ArrayList<String>();
+		
+		// Capabilities to compare against
+        ArrayList<String> symbianCaps = new ArrayList<String>();
+        symbianCaps.add("TCB"); //$NON-NLS-1$
+        symbianCaps.add("CommDD"); //$NON-NLS-1$
+        symbianCaps.add("PowerMgmt"); //$NON-NLS-1$
+        symbianCaps.add("MultimediaDD"); //$NON-NLS-1$
+        symbianCaps.add("ReadDeviceData"); //$NON-NLS-1$
+        symbianCaps.add("WriteDeviceData"); //$NON-NLS-1$
+        symbianCaps.add("DRM"); //$NON-NLS-1$
+        symbianCaps.add("TrustedUI"); //$NON-NLS-1$
+        symbianCaps.add("ProtServ"); //$NON-NLS-1$
+        symbianCaps.add("DiskAdmin"); //$NON-NLS-1$
+        symbianCaps.add("NetworkControl"); //$NON-NLS-1$
+        symbianCaps.add("AllFiles"); //$NON-NLS-1$
+        symbianCaps.add("SwEvent"); //$NON-NLS-1$
+        symbianCaps.add("NetworkServices"); //$NON-NLS-1$
+        symbianCaps.add("LocalServices"); //$NON-NLS-1$
+        symbianCaps.add("ReadUserData"); //$NON-NLS-1$
+        symbianCaps.add("WriteUserData"); //$NON-NLS-1$
+        symbianCaps.add("Location"); //$NON-NLS-1$
+        symbianCaps.add("SurroundingsDD"); //$NON-NLS-1$
+        symbianCaps.add("UserEnvironment"); //$NON-NLS-1$
+        
+        for (int shift=0; shift<symbianCaps.size(); shift++){
+            if ((allDefinedCapabilitiesAsInt & (1<<(shift&31))) > 0){
+            	foundCapabilities.add(symbianCaps.get(shift));            	
+            }
+        }
+        capabilities = (String[]) foundCapabilities.toArray(new String[0]);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		strBuf.append(DESCRIPT_ARR[CacheCompPropertyField.DIRECTORY_ARR_INDX] + ": "); //$NON-NLS-1$
+		strBuf.append(directory);			
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.FILENAME_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(filename);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.BINARY_FORMAT_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(binaryFormat);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.UID1_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(uid1);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.UID2_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(uid2);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.UID3_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(uid3);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.SECURE_ID_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(secureId);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.VENDOR_ID_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(vendorId);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.CAPABILITIES_ARR_INDX] + ": \n"); //$NON-NLS-1$ //$NON-NLS-2$
+		for (int i = 0; i < capabilities.length; i++) {
+			strBuf.append("\t" + capabilities[i] + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		strBuf.append(DESCRIPT_ARR[CacheCompPropertyField.MIN_HEAP_SIZE_ARR_INDX] + ": "); //$NON-NLS-1$
+		strBuf.append(minHeapSize);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.MAX_HEAP_SIZE_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(maxHeapSize);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.STACK_SIZE_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(stackSize);
+		strBuf.append("\n" + DESCRIPT_ARR[CacheCompPropertyField.DLL_REF_TABLE_COUNT_ARR_INDX] + ": "); //$NON-NLS-1$ //$NON-NLS-2$
+		strBuf.append(dllRefTableCount);	
+		
+		// Returning resulting buffer
+		return strBuf.toString();
+	}
+
+	/**
+	 * Gets binary format for the component.
+	 * @return Returns the binaryFormat.
+	 */
+	public String getBinaryFormat() {
+		return binaryFormat;
+	}
+
+	/**
+	 * Gets capabilities as string array.
+	 * @return Returns the capabilities string array.
+	 */
+	public String[] getCapabilities() {
+		return capabilities;
+	}
+
+	/**
+	 * Gets amount of references in dll reference table
+	 * (i.e. amount of direct dependencies for the component).
+	 * @return Returns the dllRefTableCount.
+	 */
+	public String getDllRefTableCount() {
+		return dllRefTableCount;
+	}
+
+	/**
+	 * Gets directory.
+	 * @return Returns the directory.
+	 */
+	public String getDirectory() {
+		return directory;
+	}
+
+	/**
+	 * Gets file name.
+	 * @return Returns the filename.
+	 */
+	public String getFilename() {
+		return filename;
+	}
+
+	/**
+	 * Gets maximum heap size.
+	 * @return Returns the maxHeapSize.
+	 */
+	public String getMaxHeapSize() {
+		return maxHeapSize;
+	}
+
+	/**
+	 * Gets minimum heap size.
+	 * @return Returns the minHeapSize.
+	 */
+	public String getMinHeapSize() {
+		return minHeapSize;
+	}
+
+	/**
+	 * Gets secure id.
+	 * @return Returns the secureId.
+	 */
+	public String getSecureId() {
+		return secureId;
+	}
+
+	/**
+	 * Gets stack size.
+	 * @return Returns the stackSize.
+	 */
+	public String getStackSize() {
+		return stackSize;
+	}
+
+	/**
+	 * Gets UID1
+	 * @return Returns the uid1.
+	 */
+	public String getUid1() {
+		return uid1;
+	}
+
+	/**
+	 * Gets UID2
+	 * @return Returns the uid2.
+	 */
+	public String getUid2() {
+		return uid2;
+	}
+
+	/**
+	 * Gets UID3
+	 * @return Returns the uid3.
+	 */
+	public String getUid3() {
+		return uid3;
+	}
+
+	/**
+	 * Gets vendor id. 
+	 * @return Returns the vendorId.
+	 */
+	public String getVendorId() {
+		return vendorId;
+	}
+
+	/**
+	 * Converts a selected set of properties into property
+	 * data array.
+	 * @return Property data array.
+	 */
+	public PropertyData[] toPropertyDataArray() {
+		ArrayList<PropertyData> propDataArrayList = new ArrayList<PropertyData>();
+		
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.DIRECTORY_ARR_INDX], directory));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.FILENAME_ARR_INDX], filename));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.BINARY_FORMAT_ARR_INDX], binaryFormat));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.UID1_ARR_INDX], uid1));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.UID2_ARR_INDX], uid2));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.UID3_ARR_INDX], uid3));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.SECURE_ID_ARR_INDX], secureId));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.VENDOR_ID_ARR_INDX], vendorId));
+
+		StringBuffer strBuf = new StringBuffer();	
+		for (int i = 0; i < capabilities.length-1; i++) {
+			strBuf.append(capabilities[i] + " "); //$NON-NLS-1$
+		}
+		if(capabilities.length > 0){
+			strBuf.append(capabilities[capabilities.length-1]);			
+		}
+		
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.CAPABILITIES_ARR_INDX], strBuf.toString()));
+		
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.MIN_HEAP_SIZE_ARR_INDX], minHeapSize));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.MAX_HEAP_SIZE_ARR_INDX], maxHeapSize));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.STACK_SIZE_ARR_INDX], stackSize));
+		propDataArrayList.add(new PropertyData(DESCRIPT_ARR[CacheCompPropertyField.DLL_REF_TABLE_COUNT_ARR_INDX], dllRefTableCount));
+		
+		// Returning resulting array
+		return (PropertyData[]) propDataArrayList.toArray(new PropertyData[0]);
+	}
+
+	/**
+	 * Gets cache timestamp.
+	 * @return Returns the cacheTimestamp.
+	 */
+	public String getCacheTimestamp() {
+		return cacheTimestamp;
+	}
+
+	/**
+	 * Adds a new used component data item instance for the component.
+	 * @param usedCmpData Used component data item instance to be added.
+	 */
+	public void addUsedComponentData(UsedComponentData usedCmpData){
+		// All map keys are stored in lower case
+		String componentName = usedCmpData.getComponentName().toLowerCase();
+		UsedComponentData usedComponentData = usedComponents.get(componentName);
+		if(usedComponentData != null){
+			throw new IllegalArgumentException(Messages.getString("ComponentPropertiesData.ComponentAlreadyAdded_ErrMsg_Part1") //$NON-NLS-1$
+											   + Messages.getString("ComponentPropertiesData.ComponentAlreadyAdded_ErrMsg_Part2")  //$NON-NLS-1$
+											   + componentName + "."); //$NON-NLS-1$
+		}
+		usedComponents.put(componentName, usedCmpData);
+	}
+	
+	/**
+	 * Gets the list of components that are used directly by this component.
+	 * The list of components are in the order they have been added into the list.
+	 * @return the list of components that are used directly by this component.
+	 * @see ComponentPropertiesData#addUsedComponentData
+	 */
+	public List<UsedComponentData> getUsedComponentList() {
+		return new ArrayList<UsedComponentData>(usedComponents.values());
+	}
+
+	/**
+	 * Checks if this component used the component given as parameter.
+	 * @param componentName Name of the component to be checked for usage.
+	 * @return <code>true</code> if this component uses the given component, otherwise <code>false</code>.
+	 */
+	public boolean usesComponent(String componentName) {
+		return usedComponents.containsKey(componentName);
+	}
+
+	/**
+	 * Gets used component data for the given component.
+	 * @param componentName Component to get data for.
+	 * @return used component data for the given component.
+	 */
+	public UsedComponentData getUsedComponent(String componentName) {
+		if(!usesComponent(componentName)){
+			throw new IllegalArgumentException(Messages.getString("ComponentPropertiesData.ComponentIsNotUsed_ErrMsg_Part1")  //$NON-NLS-1$
+					+ componentName +Messages.getString("ComponentPropertiesData.ComponentIsNotUsed_ErrMsg_Part2")  //$NON-NLS-1$
+					+ getFilename() +").");			 //$NON-NLS-1$
+		}
+		return usedComponents.get(componentName);
+	}
+
+	/**
+	 * Returns dllRefTableCount as integer.
+	 * @return dllRefTableCount as integer.
+	 */
+	public int getDllRefTableCountAsInt() {
+		return Integer.parseInt(getDllRefTableCount());
+	}
+
+	/**
+	 * Parsed target platform Id from directory property.
+	 * @return target platform, or <code>null</code> if target platform
+	 *         cannot be identified for the component.
+	 */
+	public ITargetPlatform getTargetPlatform(){
+		TargetPlatform targetPlatform = null;
+		try {
+			File f = new File(directory);
+			String id = f.getParentFile().getName();
+			targetPlatform = new TargetPlatform(id);
+		} catch (Exception e) {
+			// We might end up here in case filename is not defined
+			// e.g. for component that are added from SIS file 
+			// in case can be ignored. 
+			e.printStackTrace();			
+		}
+		
+		return targetPlatform;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/DependenciesCache.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,190 @@
+/*
+* 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.appdep.core.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.exceptions.InvalidModelDataException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Model class instance representing data that is available via dependencies cache data file.
+ */
+public class DependenciesCache {
+
+	/**
+	 * Map that can be used to get cached component by using
+	 * component name (=Filename) as key.
+	 * All map keys should be stored in lower case.
+	 */
+	private Map<String, ComponentPropertiesData> componentPropertiesMap;
+
+	/**
+	 * Constructor.
+	 */
+	public DependenciesCache(){
+		componentPropertiesMap = new HashMap<String, ComponentPropertiesData>();
+	}
+	
+	/**
+	 * Adds given component properties data into model.
+	 * @param cPropData Component properties data to be added.
+	 */
+	public void addComponentPropertiesData(ComponentPropertiesData cPropData,String targetPlatformId) {
+		String compName = cPropData.getFilename().toLowerCase(); // Map keys are always stored in lower case
+		if(componentPropertiesMap.get(compName) == null){
+			// Only accepting the 1st instance of a component with the same name
+			componentPropertiesMap.put(compName, cPropData);
+		}
+		else{
+			// Debug reporting duplicate
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Duplicate component detected: "+ cPropData.getFilename()//$NON-NLS-1$
+																							+" ["+targetPlatformId+"]");//$NON-NLS-1$ //$NON-NLS-2$
+		}
+		
+	}
+	
+	/**
+	 * Returns all component properties of the cache file.
+	 * The collection is not ordered.
+	 * @return All component properties of the cache file.
+	 */
+	public Collection<ComponentPropertiesData> getAllComponentProperties() {
+		return componentPropertiesMap.values();
+	}
+
+	/**
+	 * Gets component properties data object for given component.
+	 * @param compName Name of the component to get properties data object for.
+	 * @return Component properties data object for given component, or throws <code>NoSuchElementException</code> 
+	 *                   if component is not in cache. 
+	 * @throws NoSuchElementException
+	 */
+	public ComponentPropertiesData getComponentPropertiesData(String compName){
+		// Map keys are always stored in lower case
+		ComponentPropertiesData cmpPropData = componentPropertiesMap.get(compName.toLowerCase());
+		if(cmpPropData == null){
+			throw new NoSuchElementException(Messages.getString("DependenciesCache.ComponentNotFoundFromCache_ErrMsg") + ": '" + compName + "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		return cmpPropData;
+	}
+
+	/**
+	 * Gets the components that the given component directly depends upon.
+	 * @param componentName The name of the component.
+	 * @return Component properties data list.
+	 */
+	public List<UsedComponentData> getDirectlyDependentComponentsFor(String compToSearchFor) {
+		ComponentPropertiesData cmpPropData = getComponentPropertiesData(compToSearchFor);
+		return cmpPropData.getUsedComponentList();
+	}
+
+	/**
+	 * Gets the functions that are imported from imported component for the use
+	 * of parent component.
+	 * @param parentCmpName Name of the parent component that imports the functions.
+	 * @param importedCmpName Name of the component that the functions are imported from.
+	 * @return Imported function data list.
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctionsForComponent(String parentCmpName, String importedCmpName) {
+		ComponentPropertiesData cmpPropData = getComponentPropertiesData(parentCmpName);
+		Collection<UsedComponentData> usedComponentList = cmpPropData.getUsedComponentList();
+		for (UsedComponentData usedComponentData : usedComponentList) {
+			String componentName = usedComponentData.getComponentName();
+			if(componentName.equalsIgnoreCase(importedCmpName)){
+				return usedComponentData.getParentImportedFunctions();
+			}
+		}
+		throw new NoSuchElementException(Messages.getString("DependenciesCache.ImportedComponentNotFoundFromCache_ErrMsgStart") + importedCmpName  //$NON-NLS-1$
+											+ Messages.getString("DependenciesCache.ImportedComponentNotFoundFromCache_ErrMsgEnd")  //$NON-NLS-1$
+											+ parentCmpName + "'."); //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets the string array of component properties for the components
+	 * that are using the given component. 
+	 * @param progressCallback Job progress callback object that can be used to report progress. 
+	 *                         Can be set to <code>null</code> when no progress information is needed.
+	 * @param resultComponentsArrayList Array list object to return resulting components into. 
+	 * @param componentName Name of the component to search using components for. 
+	 * @param functionOrdinal Ordinal of the function to search using components for. 
+	 *                        This parameter can be set to <code>null</code> if we are
+	 *                        only interested in components that are using the given component.
+	 * @param totalComponentCount Total component count forming possibly from several caches.
+	 * @throws JobCancelledByUserException 
+	 */
+	public void getUsingComponents(IJobProgressStatus progressCallback,
+			ArrayList<ComponentPropertiesData> resultComponentsArrayList,
+			String componentName, String functionOrdinal,
+			int totalComponentCount) throws JobCancelledByUserException {
+		
+		boolean reportProgress = (progressCallback != null) && (totalComponentCount > 0);
+		
+		// Variables used to inform about the progress
+		final int hundred = 100;
+		// Calculating 10 percentage of components from all the components in cache
+		int hundredComponentsAsPercentage = reportProgress ? (hundred * hundred) / totalComponentCount: 0;
+		int totalPercentage = 0;
+		int componentCount = 0;
+		
+		boolean isFunctionUsageCheck = (functionOrdinal != null);
+		Collection<ComponentPropertiesData> componentsColl = componentPropertiesMap.values();
+		for (ComponentPropertiesData cmpPropData : componentsColl) {
+			// Reporting progress if queried about the seeking of using components
+			if(reportProgress){
+				// Updating component count
+				componentCount++;
+				// Informing about the progress
+				if((componentCount % hundred) == 0){
+					totalPercentage = totalPercentage + hundredComponentsAsPercentage;
+					progressCallback.progress(totalPercentage, null);				
+				}
+			}			
+			boolean isMatch = cmpPropData.usesComponent(componentName); 			
+			if(isMatch){
+				// This component is using the queried component
+				if(isFunctionUsageCheck){
+					UsedComponentData usedCmpData = cmpPropData.getUsedComponent(componentName);
+					Collection<ImportFunctionData> parentImportedFunctions = usedCmpData.getParentImportedFunctions();
+					for (ImportFunctionData importFunctionData : parentImportedFunctions) {
+						String functionOrdinalToCompare = importFunctionData.getFunctionOrdinal();
+						if(functionOrdinalToCompare.equals(functionOrdinal)){
+							// This component is using the queried function
+							resultComponentsArrayList.add(cmpPropData);
+							break; // We can break this inner for loop and continue outermost one
+						}
+					}
+				}
+				else{
+					// This component is using the queried component
+					resultComponentsArrayList.add(cmpPropData);
+				}				
+			}
+		}
+	}
+	
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ExportFunctionData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+/*
+* 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.appdep.core.model;
+
+import com.nokia.s60tools.appdep.exceptions.ZeroFunctionOrdinalException;
+
+/**
+ * Stores the data for a single exported
+ * function.
+ */
+public class ExportFunctionData extends AbstractFunctionData{
+	
+	//
+	// NOTE: Column indeces must start from zero (0) and
+	// the columns must be added in ascending numeric
+	// order.
+	//
+	public static final int ORDINAL_COLUMN_INDEX = 0; // This is used in UI
+	public static final int NAME_COLUMN_INDEX = 1; // This is used in UI
+
+	/**
+	 * Constructor.
+	 * @param functionOrdinal Function ordinal (1..n when converted into integer).
+	 * @param functionName Function name.
+	 * @throws IllegalArgumentException 
+	 * @throws ZeroFunctionOrdinalException 
+	 */
+	public ExportFunctionData(String functionOrdinal, String functionName) throws IllegalArgumentException, ZeroFunctionOrdinalException{
+		super(functionOrdinal, functionName);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ICacheLoadProgressNotification.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,30 @@
+/*
+* 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.appdep.core.model;
+
+/**
+ * Cache load progress notification interface.
+ */
+public interface ICacheLoadProgressNotification {
+
+	/**
+	 * Notifies about the loaded component.
+	 * @param componentName Name of the component loaded.
+	 */
+	public void componentLoaded(String componentName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ITargetCache.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Interface for accessing information of a single cache object.
+ */
+public interface ITargetCache {
+	
+	/**
+	 * Gets cache version string.
+	 * @return cache version string.
+	 */
+	public String getVersion();
+
+	/**
+	 * Returns components for the target.
+	 * @return Component properties data collection having all components of the cache.
+	 */
+	public Collection<ComponentPropertiesData> getComponents();
+
+	/**
+	 * Gets the component property data for given component.
+	 * @param cmpName The name of the component.
+	 * @return component properties data for the component.
+	 */
+	public ComponentPropertiesData getComponentPropertiesForComponent(String cmpName);
+	
+	/**
+	 * Gets the components that the given component directly depends upon.
+	 * @param componentName The name of the component.
+	 * @return Component properties data list.
+	 */
+	public List<UsedComponentData> getDirectlyDependentComponentsFor(String compToSearchFor);
+	
+	/**
+	 * Gets the functions that are exported from the given library for the use
+	 * of other components. Methods can be found from symbols table cache 
+	 * file in the ordinal order 1->N.
+	 * @param exportedCmpName Name of the component the functions are exported from.
+	 * @return Export function data list.
+	 */
+	public Collection<ExportFunctionData> getExportedFunctionsForComponent(String componentNameWithExtension);
+	
+	/**
+	 * Gets the functions that are imported from imported component for the use
+	 * of parent component.
+	 * @param parentCmpName Name of the parent component that imports the functions.
+	 * @param importedCmpName Name of the component that the functions are imported from.
+	 * @return Imported function data list.
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctionsForComponent(String parentCmpName, String importedCmpName);
+	
+	/**
+	 * Gets the string array of component properties for the components
+	 * that are using the given component. 
+	 * @param progressCallback Job progress callback object that can be used to report progress. 
+	 *                         Can be set to <code>null</code> when no progress information is needed.
+	 * @param resultComponentsArrayList Array list object to return resulting components into. 
+	 * @param componentName Name of the component to search using components for. 
+	 * @param functionOrdinal Ordinal of the function to search using components for. 
+	 *                        This parameter can be set to <code>null</code> if we are
+	 *                        only interested in components that are using the given component.
+	 * @param totalComponentCount Total component count forming possibly from several caches.
+	 * 							  This parameter can be set to any value if <code>progressCallback</code> is set to <code>null</code>.
+	 * @throws JobCancelledByUserException
+	 */
+	public void getUsingComponents(IJobProgressStatus progressCallback, ArrayList<ComponentPropertiesData> resultComponentsArrayList, 
+			                       String componentName, String functionOrdinal, int totalComponentCount) throws JobCancelledByUserException;
+
+	/**
+	 * Returns collection of libraries stored into the cache.
+	 * @return collection of libraries stored into the cache.
+	 */
+	public Collection<LibPropertiesData> getLibraries();
+
+	/**
+	 * Gets target platform id this target cache represents.
+	 * @return target platform id this target cache represents.
+	 */
+	public String getId();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/ImportFunctionData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,107 @@
+/*
+* 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.appdep.core.model;
+
+import com.nokia.s60tools.appdep.exceptions.ZeroFunctionOrdinalException;
+
+/**
+ * Data placeholder for import function data.
+ */
+public class ImportFunctionData extends AbstractFunctionData{
+
+	//
+	// These indexes are used to access cache data
+	//
+	public static final int ORDINAL_FIELD_INDEX = 0; // This field count is to access cache data file
+	public static final int NAME_FIELD_INDEX = 1; // This field count is to access cache data file
+	public static final int ISVIRTUAL_FIELD_INDEX = 2; // This field count is to access cache data file
+	public static final int OFFSET_FIELD_INDEX = 3; // This field count is to access cache data file
+
+	//
+	// NOTE: Column indeces must start from zero (0) and
+	// the columns must be added in ascending numeric
+	// order.
+	//
+	public static final int ORDINAL_COLUMN_INDEX = 0; // This field count is for UI
+	public static final int NAME_COLUMN_INDEX = 1; // This field count is for UI
+	public static final int OFFSET_COLUMN_INDEX = 2; // This field count is for UI
+
+	/**
+	 * <code>true</code> if function is virtual, otherwise <code>false</code>.
+	 */
+	private final boolean isVirtual;
+	/**
+	 * Function offset.
+	 */
+	private final String functionOffset;
+
+	/**
+	 * Constructor.
+	 * @param functionOrdinal Function ordinal (1..n when converted into integer).
+	 * @param functionName Function name.
+	 * @param isVirtual <code>true</code> if function is virtual, otherwise <code>false</code>.
+	 * @param functionOffset Function offset.
+	 * @throws IllegalArgumentException
+	 * @throws ZeroFunctionOrdinalException 
+	 */
+	public ImportFunctionData(String functionOrdinal, String functionName, boolean isVirtual, String functionOffset) throws IllegalArgumentException, ZeroFunctionOrdinalException{
+		super(functionOrdinal, functionName);
+		this.isVirtual = isVirtual;
+		this.functionOffset = functionOffset;
+	}
+	
+	/**
+	 * Checks if function is virtual of not.
+	 * @return <code>true</code> in case is virtual, otherwise <code>false</code>.
+	 */
+	public boolean isVirtual() {
+		return isVirtual;
+	}
+
+	/**
+	 * Gets function offset 
+	 * @return the functionOffset
+	 */
+	public int getFunctionOffset() {
+		return Integer.parseInt(functionOffset);
+	}
+
+	/**
+	 * Getting string representation for function offset. Only valid for virtual functions.
+	 * @return the functionOffset
+	 */
+	public String getFunctionOffsetAsString() {
+		// Returning empty string for non-virtual function that do not really have offset.
+		if(!isVirtual()){
+			return ""; //$NON-NLS-1$
+		}
+		return functionOffset;
+	}
+
+	/**
+	 * Sets function name for the given imported function data.
+	 * This is needed in order to set function name in case it is resolved
+	 * later on by help of the user interaction that provides additional
+	 * information.
+	 * @param functionName Function name to be set.
+	 */
+	public void setFunctionName(String functionName) {
+		this.functionName = functionName;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/LibPropertiesData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.core.model;
+
+import java.util.Collection;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Stores exported functions and other library specific data.
+ */
+public class LibPropertiesData {
+
+	/**
+	 * Base name of the library without extension (*.dso or *.lib).
+	 */
+	private final String libraryBaseName;
+	/**
+	 * Timestamp of the library stored into symbols cache file.
+	 */
+	private final long libraryCacheTimestamp;
+	
+	/**
+	 * Functions exported by library.
+	 */
+	private SortedMap<Integer, ExportFunctionData> exportedFunctions;
+
+	/**
+	 * Constructor.
+	 * @param libraryBaseName Base name of the library without extension (*.dso or *.lib).
+	 * @param libraryCacheTimestamp Timestamp of the library stored into symbols cache file.
+	 */
+	public LibPropertiesData(String libraryBaseName, long libraryCacheTimestamp) {
+		this.libraryBaseName = libraryBaseName;
+		this.libraryCacheTimestamp = libraryCacheTimestamp;	
+		exportedFunctions = new TreeMap<Integer, ExportFunctionData>();
+	}
+	
+	/**
+	 * Adds a new export function to the library.
+	 * @param exportFuncData Export function to be added.
+	 */
+	public void addExportedFunction(ExportFunctionData exportFuncData) throws IllegalArgumentException {
+		Integer functionOrdinalAsInteger = exportFuncData.getFunctionOrdinalAsInteger();
+		if(exportedFunctions.get(functionOrdinalAsInteger) != null){
+			throw new IllegalArgumentException(Messages.getString("LibPropertiesData.FunctionOrdinalMustBeUnique_ErrMsg")); //$NON-NLS-1$
+		}
+		exportedFunctions.put(functionOrdinalAsInteger, exportFuncData);	
+	}
+
+	/**
+	 * Gets base name of the library without extension  (*.dso or *.lib).
+	 * @return Base name of the library without extension.
+	 */
+	public String getLibraryBaseName() {
+		return libraryBaseName;
+	}
+
+	/**
+	 * Gets library cache timestamp.
+	 * @return the libraryCacheTimestamp
+	 */
+	public long getLibraryCacheTimestamp() {
+		return libraryCacheTimestamp;
+	}
+	
+	/**
+	 * Gets functions exported by the library.
+	 * @return Exported function collection in the ordinal order.
+	 */
+	public Collection<ExportFunctionData> getExportedFunctions(){
+		return exportedFunctions.values();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/SymbolsCache.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,107 @@
+/*
+* 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.appdep.core.model;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import com.nokia.s60tools.appdep.exceptions.InvalidModelDataException;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Model class instance representing data that is available via symbols cache data file.
+ */
+public class SymbolsCache {
+
+	/**
+	 * Map that can be used to get cached library by using
+	 * library base name as key.
+	 */
+	private Map<String, LibPropertiesData> libraryPropertiesMap;
+
+	/**
+	 * Constructor.
+	 */
+	public SymbolsCache(){
+		libraryPropertiesMap = new HashMap<String, LibPropertiesData>();
+	}
+	
+	/**
+	 * Adds given library properties data into model.
+	 * @param libPropData Library properties data to be added.
+	 * @throws InvalidModelDataException 
+	 */
+	public void addLibPropertiesData(LibPropertiesData libPropData) throws InvalidModelDataException{
+		String libBaseName = libPropData.getLibraryBaseName().toLowerCase();
+		if(libraryPropertiesMap.get(libBaseName) != null){
+			throw new InvalidModelDataException(Messages.getString("SymbolsCache.SymbolHasDublicateDefinition_Err_Msg")); //$NON-NLS-1$
+		}
+		libraryPropertiesMap.put(libBaseName, libPropData);
+	}
+	
+	/**
+	 * Returns all library properties of the cache file.
+	 * The collection is not ordered.
+	 * @return All library properties of the cache file.
+	 */
+	public Collection<LibPropertiesData> getAllLibraryProperties() {
+		return libraryPropertiesMap.values();
+	}
+
+	/**
+	 * Gets component properties data object for given component.
+	 * @param libBaseName Base name of the library to get properties data object for.
+	 * @return Component properties data object for given component or <code>null</code> if component is not in cache. 
+	 */
+	public LibPropertiesData getLibPropertiesData(String libBaseName){
+		return libraryPropertiesMap.get(libBaseName);
+	}
+
+	/**
+	 * Returns file name without file extension.
+	 * @param fileNameStr File name to be remove extension from.
+	 * @return Return file name without an extension, or file
+	 *         name itself, if file did not have any extension.
+	 */
+	public static String removeFileExtension(String fileNameStr){
+		int extIndex = fileNameStr.lastIndexOf("."); //$NON-NLS-1$
+		if(extIndex != -1){
+			return fileNameStr.substring(0, extIndex);
+		}
+		else{
+			return fileNameStr;
+		}		
+	}
+	
+	/**
+	 * Gets exported functions for the given component name.
+	 * @param componentNameWithExtension Component name with an extension.
+	 * @return Exported functions for the given component name.
+	 */
+	public Collection<ExportFunctionData> getExportedFunctionsForComponent(String componentNameWithExtension) {
+		String libraryBaseName = removeFileExtension(componentNameWithExtension);
+		LibPropertiesData libPropData = libraryPropertiesMap.get(libraryBaseName);
+		if(libPropData == null){
+			throw new NoSuchElementException(Messages.getString("SymbolsCache.ComponentNotFoundFromCache_ErrMsg") + ": '" + libraryBaseName + "'."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		return libPropData.getExportedFunctions();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/TargetCache.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,172 @@
+/*
+* 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.appdep.core.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Object used for storing accessing information of a single cache 
+ * file via an object model.
+ */
+public class TargetCache implements ITargetCache {
+	
+	/**
+	 * Version of the cache.
+	 */
+	private String version;
+	
+	/**
+	 * Dependencies cache data storage
+	 */
+	DependenciesCache dependenciesCache = null;
+
+	/**
+	 * Library cache data storage
+	 */
+	SymbolsCache symbolsCache = null;
+
+	/**
+	 * Id of the target platform this target cache represents 
+	 * The id is got based on the cache directory structure
+	 * and set after construction of cache object.
+	 */
+	private String id;
+
+	/**
+	 * Constructor (created only by CacheFactory).
+	 * @param id target platform id this target cache represents.
+	 */
+	TargetCache(String id){
+		this.id = id;
+	}	
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getVersion()
+	 */
+	public String getVersion() {
+		return version;		
+	}
+
+	/**
+	 * Checks that user has set up necessary data members for enabling cache data access.
+	 */
+	private void checkPreconditions() {
+		if(dependenciesCache == null || symbolsCache == null){
+			throw new RuntimeException(Messages.getString("TargetCache.CacheNotSetUpProperly_ErrMsg"));			 //$NON-NLS-1$
+		}		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getComponents()
+	 */
+	public Collection<ComponentPropertiesData> getComponents() {
+		checkPreconditions();
+		return dependenciesCache.getAllComponentProperties();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getComponentPropertiesForComponent(java.lang.String)
+	 */
+	public ComponentPropertiesData getComponentPropertiesForComponent(
+			String cmpName) {
+		checkPreconditions();
+		return dependenciesCache.getComponentPropertiesData(cmpName);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getDirectlyDependentComponentsFor(java.lang.String)
+	 */
+	public List<UsedComponentData> getDirectlyDependentComponentsFor(
+			String compToSearchFor) {
+		checkPreconditions();
+		return dependenciesCache.getDirectlyDependentComponentsFor(compToSearchFor);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getExportedFunctionsForComponent(java.lang.String)
+	 */
+	public Collection<ExportFunctionData> getExportedFunctionsForComponent(
+			String componentNameWithExtension) {
+		return symbolsCache.getExportedFunctionsForComponent(componentNameWithExtension);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getParentImportedFunctionsForComponent(java.lang.String, java.lang.String)
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctionsForComponent(
+			String parentCmpName, String importedCmpName) {
+		checkPreconditions();
+		return dependenciesCache.getParentImportedFunctionsForComponent(parentCmpName, importedCmpName);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getUsingComponents(java.util.ArrayList, java.lang.String, java.lang.String)
+	 */
+	public void getUsingComponents( IJobProgressStatus progressCallback, 
+									ArrayList<ComponentPropertiesData> resultComponentsArrayList,
+									String componentName, String functionOrdinal,
+									int totalComponentCount) throws JobCancelledByUserException{
+		checkPreconditions();
+		dependenciesCache.getUsingComponents(progressCallback, resultComponentsArrayList, componentName, functionOrdinal, totalComponentCount);
+	}
+
+	/**
+	 * Sets reference to dependencies cache object (done only by CacheFactory).
+	 * @param dependenciesCache the dependenciesCache to set
+	 */
+	void setDependenciesCache(DependenciesCache dependenciesCache) {
+		this.dependenciesCache = dependenciesCache;
+	}
+
+	/**
+	 * Sets reference to dependencies cache object (done only by CacheFactory).
+	 * @param symbolsCache the symbolsCache to set
+	 */
+	void setSymbolsCache(SymbolsCache symbolsCache) {
+		this.symbolsCache = symbolsCache;
+	}
+
+	/**
+	 * Sets target cache version once it is sure that dependencies and symbols file versions match
+	 * @param Version number string to set.
+	 */
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getLibraries()
+	 */
+	public Collection<LibPropertiesData> getLibraries() {
+		return symbolsCache.getAllLibraryProperties();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.model.ITargetCache#getId()
+	 */
+	public String getId() {
+		return id;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/core/model/UsedComponentData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,73 @@
+/*
+* 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.appdep.core.model;
+
+import java.util.Collection;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * Stores import functions and other component specific data.
+ */
+public class UsedComponentData {
+
+	/**
+	 * Name of the component.
+	 */
+	private final String componentName;
+	
+	/**
+	 * Functions imported from the component by the using parent component.
+	 */
+	private SortedMap<Integer, ImportFunctionData> importedFunctions;
+
+	/**
+	 * Constructor.
+	 * @param componentName Name of the component.
+	 */
+	public UsedComponentData(String componentName) {
+		this.componentName = componentName;
+		importedFunctions = new TreeMap<Integer, ImportFunctionData>();
+	}
+	
+	/**
+	 * Adds a new import function to the library.
+	 * @param importFuncData Import function to be added.
+	 */
+	public void addImportedFunction(ImportFunctionData importFuncData) throws IllegalArgumentException {
+		Integer functionOrdinalAsInteger = importFuncData.getFunctionOrdinalAsInteger();
+		importedFunctions.put(functionOrdinalAsInteger, importFuncData);	
+	}
+
+	/**
+	 * Gets functions imported from the component by the using parent component.
+	 * @return Imported function collection in the ordinal order.
+	 */
+	public Collection<ImportFunctionData> getParentImportedFunctions(){
+		return importedFunctions.values();
+	}
+
+	/**
+	 * Gets component name.
+	 * @return the componentName
+	 */
+	public String getComponentName() {
+		return componentName;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/CacheFileDoesNotExistException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.exceptions;
+
+/**
+ * Thrown whenever cache files is not found.
+ */
+public class CacheFileDoesNotExistException extends Exception {
+		
+	/**
+	 * Serial version UID.
+	 */
+	static final long serialVersionUID = -9121983872766182745L;
+
+	/**
+	 * Default constructor usage if forbidden.
+	 */
+	@SuppressWarnings("unused")
+	private CacheFileDoesNotExistException(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message that should
+	 * inform catcher about what cache file was missing.
+	 * @param message Message informing catcher what cache file was missing. 
+	 */
+	public CacheFileDoesNotExistException( String message ){
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/CacheIndexNotReadyException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,47 @@
+/*
+* 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.appdep.exceptions;
+
+/**
+ * Thrown when trying to access cache index before it is created 
+ * and updated with up-to-date data.
+ */
+public class CacheIndexNotReadyException extends Exception {
+		
+	/**
+	 * Serial version UID.
+	 */
+	static final long serialVersionUID = -779456382616245857L;
+
+	/**
+	 * Default constructor. 
+	 */
+	public CacheIndexNotReadyException(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message.
+	 * @param message Detailed message for the user.
+	 */
+	public CacheIndexNotReadyException( String message ){
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/InvalidCmdLineToolSettingException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,46 @@
+/*
+* 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.appdep.exceptions;
+
+/**
+ * Thrown whenever trying to set invalid tool related settings into tool settings.
+ */
+public class InvalidCmdLineToolSettingException extends Exception {
+		
+	/**
+	 * Serial version UID.
+	 */
+	static final long serialVersionUID = -2523621839223100246L;
+
+	/**
+	 * Default constructor. 
+	 */
+	public InvalidCmdLineToolSettingException(){
+		super();
+	}
+
+	/**
+	 * Constructor with attached message.
+	 * @param message
+	 */
+	public InvalidCmdLineToolSettingException( String message ){
+		super(message);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/InvalidModelDataException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.exceptions;
+
+/**
+ * Thrown when invalid data is tried to store into a model.
+ */
+public class InvalidModelDataException extends Exception {
+
+	/**
+	 * Serial version UID.
+	 */
+	private static final long serialVersionUID = -5051997802316898070L;
+
+	/**
+	 * Constructor.
+	 * @param message Informative message about the error causing the exception.
+	 */
+	public InvalidModelDataException(String message){
+		super(message);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/exceptions/ZeroFunctionOrdinalException.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.exceptions;
+
+/**
+ * Thrown when zero ordinal is encountered for a function
+ * when loading cache file.
+ */
+public class ZeroFunctionOrdinalException extends RuntimeException {
+	
+	/**
+	 * Serial Version ID.
+	 */
+	private static final long serialVersionUID = -8929030211801349973L;
+	/**
+	 * Name of the function having zero ordinal
+	 */
+	private final String functionName;
+
+	/**
+	 * Constructor.
+	 */
+	public ZeroFunctionOrdinalException(String functionName){
+		super();
+		this.functionName = functionName;
+	}
+
+	/**
+	 * Gets name of the function having zero ordinal.
+	 * @return name of the function having zero ordinal.
+	 */
+	public String getFunctionName() {
+		return functionName;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/ExportJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,226 @@
+/*
+* 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.appdep.export;
+
+import java.io.FileNotFoundException;
+import java.util.Date;
+
+import javax.xml.transform.TransformerException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Job class managing exporting UI view contents
+ * into an external report.
+ */
+public class ExportJob extends Job implements IJobProgressStatus{
+
+	//
+	// Private members
+	//
+	
+	//Progress indication for components, @see ExportVisitor.COMPONENTS_EXPORT_PERCENTAGE	
+	private static final int PROGRESS_AFTER_PROPERTIES_PERCENTAGE = 94;
+	private static final int PROGRESS_AFTER_EXPORTEDFUNCTIONS_PERCENTAGE = 96;
+	private static final int PROGRESS_AFTER_XML_FILE_SAVE_PERCENTAGE = 97;
+	private static final int PROGRESS_COMPLETE_PERCENTAGE = 100;
+	int previousPercentage = 0;
+	private IProgressMonitor monitor = null;
+	private ComponentNode node;
+	private String exportHTMLFileName;
+	private String exportXMLFileName;	
+	final int steps = 100; // percentage figure
+	
+	/**
+	 * Constructor
+	 * @param name Job name (root component name)
+	 * @param node root node
+	 * @param exportHTMLFileName file name for exported html report
+	 * @param exportXMLFileName  file name for exported xml report
+	 */
+	public ExportJob(String name, 
+			ComponentNode node, 
+			String exportHTMLFileName, 
+			String exportXMLFileName) {
+		super(name);
+		setUser(true);
+		this.node = node;
+		this.exportHTMLFileName = exportHTMLFileName;
+		this.exportXMLFileName = exportXMLFileName;		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		this.monitor = monitor;
+		
+		IStatus status;
+		
+		String msg = Messages.getString("ExportJob.Exporting_Msg") +node.getName(); //$NON-NLS-1$
+		monitor.beginTask(msg , steps);
+		
+		try {
+			long runMethodStartTime = reportStartTime();
+			export();
+			reportEndTime(runMethodStartTime);
+			status = Status.OK_STATUS;
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();			
+			status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,Messages.getString("ExportJob.Export_Failed_Msg") + "! " + Messages.getString("ExportJob.File_Not_Found_Msg") + ": " + e.getMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			AppDepConsole.getInstance().println(Messages.getString("ExportJob.Export_Failed_Msg") + "! " +  Messages.getString("ExportJob.File_Not_Found_Msg") + ": " + e.getMessage(),  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+					                            IConsolePrintUtility.MSG_ERROR);
+			this.cancel();	
+		} catch (JobCancelledByUserException e) {
+			this.cancel();
+			status = Status.CANCEL_STATUS;
+		} catch (TransformerException e) {
+			e.printStackTrace();
+			this.cancel();	
+			status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,Messages.getString("ExportJob.Export_Failed_Msg") + "! " +  Messages.getString("ExportJob.Transform_Not_Complete_Msg") + ": " + e.getMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			AppDepConsole.getInstance().println(Messages.getString("ExportJob.Export_Failed_Msg") + "! " +  Messages.getString("ExportJob.Transform_Not_Complete_Msg") + ": "  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+												 + e.getMessage(),
+					                             IConsolePrintUtility.MSG_ERROR);
+		}
+		
+		return status;
+
+	}
+	
+	/**
+	 * Reports start time of the export.
+	 * @return start time of the export.
+	 */
+	private long reportStartTime(){
+		long runMethodStartTime = System.currentTimeMillis();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+							"Export started: "  //$NON-NLS-1$
+							+ new Date(runMethodStartTime).toString());	
+		return runMethodStartTime;	
+	}
+	
+	/**
+	 * Reports end time and time elapsed for the export.
+	 * @param runMethodStartTime start time of the export
+	 */
+	private void reportEndTime(long runMethodStartTime){
+		long endTime = System.currentTimeMillis();		
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+				"Export ended: " + new Date(endTime).toString()); //$NON-NLS-1$
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+						  "TOTAL: "  //$NON-NLS-1$
+				           + (endTime-runMethodStartTime)/1000.0 + " seconds!");		 //$NON-NLS-1$
+	}
+	
+	/**
+	 * Exports XML data.
+	 * @throws JobCancelledByUserException
+	 * @throws FileNotFoundException
+	 * @throws TransformerException
+	 */
+	private void export() 
+		throws JobCancelledByUserException, 
+				FileNotFoundException, 
+				TransformerException
+	{
+		AppDepSettings st = AppDepSettings.getActiveSettings();
+		SdkInformation sdkInfo = st.getCurrentlyUsedSdk();
+
+		progress(0, Messages.getString("ExportJob.Components_Str")); //$NON-NLS-1$
+		
+		ExportVisitor visitor = new ExportVisitor(sdkInfo.getSdkId(), 
+				st.getCurrentlyUsedTargetPlatformsAsString(),
+				st.getBuildType().getBuildTypeDescription(), 
+				node.getName(), node.getFullName(),
+				this);
+
+		//Progress will go up to ExportVisitor.COMPONENTS_EXPORT_PERCENTAGE = 85		
+		((ComponentParentNode)node).accept(visitor);
+		
+		visitor.createProperties();
+
+		progress(PROGRESS_AFTER_PROPERTIES_PERCENTAGE, Messages.getString("ExportJob.Exported_Functions_Str")); //$NON-NLS-1$
+				
+		visitor.createExportedFunctions();
+
+		progress(PROGRESS_AFTER_EXPORTEDFUNCTIONS_PERCENTAGE, Messages.getString("ExportJob.XML_Str")); //$NON-NLS-1$
+		
+		XMLUtils.parseXML(visitor.toString(), exportHTMLFileName);
+	
+		//Currently no one will
+		if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+			progress(PROGRESS_AFTER_XML_FILE_SAVE_PERCENTAGE, Messages.getString("ExportJob.File_Writing_Str"));		 //$NON-NLS-1$
+			visitor.toFile(exportXMLFileName);
+		}
+
+		progress(PROGRESS_COMPLETE_PERCENTAGE, Messages.getString("ExportJob.Complete_Str")); //$NON-NLS-1$				
+	
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.IJobProgressStatus#progress(int, java.lang.String)
+	 */
+	public void progress(int percentage, String prosessing) 
+		throws JobCancelledByUserException {
+				
+        if (isCanceled()){
+        	String msg = Messages.getString("ExportJob.Export_Canceled_By_User_Msg")  //$NON-NLS-1$
+        		         + "."; //$NON-NLS-1$
+        	AppDepConsole.getInstance().println(msg);    				
+		    throw new JobCancelledByUserException(msg);
+        }
+
+        monitor.subTask(percentage + Messages.getString("ExportJob.Percent_Complete_Msg")  //$NON-NLS-1$
+        		        + "."  //$NON-NLS-1$
+        		        + Messages.getString("ExportJob.Processing_Msg")  //$NON-NLS-1$
+        		        + ": "  //$NON-NLS-1$
+        		        + prosessing);			
+        monitor.worked(percentage - previousPercentage);
+        
+        previousPercentage = percentage;
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.IJobProgressStatus#isCanceled()
+	 */
+	public boolean isCanceled() {
+		return monitor.isCanceled();
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/ExportVisitor.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,737 @@
+/*
+* 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.appdep.export;
+
+import java.io.BufferedWriter;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewDataPopulator;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Visitor class from Export report -functionality.
+ */
+public class ExportVisitor implements IVisitor {
+	
+	//
+	// Private members and constants.
+	// 
+	private String sdkName;
+	private String targets;
+	private String build;
+	private String rootComponentName;
+	private String rootComponentFullName;
+	private StringBuffer components;
+	private StringBuffer properties;
+	private StringBuffer exportedFunctions;
+	private HashMap<String, String> componentNames;
+	private static final String LEAF_NODE = "leafNode"; //$NON-NLS-1$
+	private static final String PARENT_NODE = "parentNode"; //$NON-NLS-1$
+	
+	private IJobProgressStatus observer;
+	//Other progress percentage @see ExportJob.java
+	private int COMPONENTS_EXPORT_PERCENTAGE = 85;	
+	private int progressBarProgressedCount = 1;
+	private int progressBarComponentsCount = 1;
+	private boolean isExportFromRoot = true;
+		
+	/**
+	 * Constructor.
+	 * @param sdkName SDK the data is got for the export.
+	 * @param targets Targets the data is got for the export.
+	 * @param build Build type the data is got for the export.
+	 * @param rootComponentName Root component short name.
+	 * @param rootComponentFullName Root component fully qualified name.
+	 * @param observer Job progress observer
+	 */
+	public ExportVisitor(String sdkName, 
+			String targets, String build, String rootComponentName, 		
+			String rootComponentFullName,
+			IJobProgressStatus observer){
+		
+		this.sdkName = sdkName;
+		this.targets = targets;
+		this.build = build;		
+		this.rootComponentName = rootComponentName;
+		this.rootComponentFullName = rootComponentFullName;
+		
+		this.observer = observer;;
+		
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+				           "Visitor; this.rootComponentName = " +rootComponentName); //$NON-NLS-1$
+		
+		components = new StringBuffer();
+		properties = new StringBuffer();
+		exportedFunctions = new StringBuffer();
+		componentNames = new HashMap<String, String>();		
+	}
+
+	/**
+	 * Adds a single import function node.
+	 * @param node Component node.
+	 */
+	private void addImportedFunctions(ComponentNode node){
+		try {
+			addImportedFunctionsToComponent(node.getParent().getName(), node.getName());
+		} catch (NoSuchElementException e) {
+			addErrorCommentToComponents(node, e);
+			
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+					"Not found imported functions for: " +node.getFullName()  //$NON-NLS-1$
+					+". Error was: " +e); //$NON-NLS-1$
+		}	
+		catch (Exception e) {
+			addErrorCommentToComponents(node, e);
+			e.printStackTrace();		
+		}			
+		
+	}
+
+	/**
+	 * Adding error message info related to the component in question. 
+	 * @param node Component node in question.
+	 * @param e Exception encountered.
+	 */
+	private void addErrorCommentToComponents(ComponentNode node, Exception e) {
+		components.append("<!-- ERROR while getting Imported functions for: "); //$NON-NLS-1$
+		components.append(node.getName());
+		components.append(", parent: "); //$NON-NLS-1$
+		components.append(node.getParent().getName());
+		components.append("\nError was:\n"); //$NON-NLS-1$
+		components.append(e);
+		components.append("\n-->"); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Adding node name as key 
+	 * and this.PARENT_NODE as value if node is ComponentParentNode
+	 * or this.LEAF_NODE as value if node is ComponentLinkLeafNode 
+	 * if not exist in this.PARENT_NODE already
+	 * to this.componentNames
+	 * 
+	 * If adding this.PARENT_NODE and this.LEAF_NODE already exist, replacing
+	 * 
+	 * This is doing to know if a node exist as a parent in report or not,
+	 * this has a affect to generate anchors and links in html 
+	 * (from properties and external functions "<component name>" link points to
+	 * that component only if it exist as parent node
+	 * 
+	 * @param node Node to to be added as key, if it does not exist already.
+	 */
+	private void addNodeName(ComponentNode node){
+		
+		boolean isParent = false;
+		if(node instanceof ComponentParentNode){
+			isParent = true;
+		}
+				
+		//Collection all names of components for getting properties and exported functions
+		if(!componentNames.containsKey(node.getName())){
+			if(isParent){
+				componentNames.put(node.getName(),PARENT_NODE);
+			}
+			else {
+				componentNames.put(node.getName(),LEAF_NODE);
+			}
+			
+		}else{
+			String tmp = (String) componentNames.get(node.getName());
+			if(isParent && tmp.equals(LEAF_NODE)){
+				componentNames.put(node.getName(),PARENT_NODE);
+			}
+
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode)
+	 */
+	public void visit(ComponentLinkLeafNode node) {		
+		// Exporting XML for this node only because it is leaf
+		if(observer.isCanceled()){
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+					           "Cancelled by User when prosessing node: " +node.getName()); //$NON-NLS-1$
+			return;
+		}
+		addNodeName(node);
+		addComponent(node, true);
+		addImportedFunctions(node);
+		updateProgress(node);
+		components.append("</component>"); //$NON-NLS-1$
+				
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentParentNode)
+	 */
+	public void visit(ComponentParentNode node) {
+		
+		if(observer.isCanceled()){
+			return;
+		}
+		
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP,"Visiting in node: " +node.getFullName()); //$NON-NLS-1$
+		if(node.getFullName().equals(rootComponentFullName)){
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, "Found ROOT!"); //$NON-NLS-1$
+		}
+		
+		addNodeName(node);
+		
+		//when found root, counting 2nd and 3rd level components for progress bar
+		if ( node.isRootComponent() || node.getFullName().equals(rootComponentFullName)) {			
+			countComponents(node);
+		}	
+
+		addComponent(node, false);
+
+		addImportedFunctions(node);
+
+		// For progress bar assuming that components under root is equal sized
+		updateProgress(node);
+
+		// Exporting XML for this node and for all its children
+		ComponentNode[] childArray = node.getChildren();
+		for (int i = 0; i < childArray.length; i++) {
+			ComponentNode childNode = childArray[i];
+			childNode.accept(this);
+		}
+
+		components.append("</component>"); //$NON-NLS-1$
+
+		
+	}
+
+	/**
+	 * Sets this.isExportFromRoot false if Export is not selected to start from root
+	 * Sets progressBarComponentsCount
+	 * @param node Parent where to start counting, counts nodes under that node
+	 *        and nodes under those nodes
+	 */
+	private void countComponents(ComponentParentNode node) {
+		// update progress
+		int secondLevelComponentsCount = 0;
+		int rootLevelComponentsCount = 0;
+
+		try {
+			
+			if(!node.isRootComponent()){
+				isExportFromRoot = false;
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+						           "Selected Export node was not Root node"); //$NON-NLS-1$
+			}
+			
+			rootLevelComponentsCount = node.getChildren().length;
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+			                    "Export found "+ rootLevelComponentsCount  //$NON-NLS-1$
+			                    + " 2nd level components under root: "  //$NON-NLS-1$
+			                    + node.getFullName());
+
+			if(node.hasChildren()){
+				ComponentNode [] nodes = node.getChildren();
+				ComponentNode tmp;
+				ComponentParentNode parentTmp;
+				for(int i=0; i<nodes.length; i++){
+					tmp = nodes[i];
+					if(tmp instanceof ComponentParentNode){
+						parentTmp = (ComponentParentNode)tmp;
+						secondLevelComponentsCount += parentTmp.getChildren().length;
+						DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+								           "Adding: "+parentTmp.getChildren().length  //$NON-NLS-1$
+								           + " when name: " +parentTmp.getFullName()); //$NON-NLS-1$
+					}
+					//else it is a LeafNode, so under that there aren't any nodes
+				}
+			}
+		} catch (Exception e) {			
+			String msg = Messages.getString("ExportVisitor.Could_Not_Count_Components_Msg"); //$NON-NLS-1$
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, msg);
+			AppDepConsole.getInstance().println(msg, IConsolePrintUtility.MSG_WARNING);
+			e.printStackTrace();
+		}
+		
+		progressBarComponentsCount = rootLevelComponentsCount + secondLevelComponentsCount;
+		
+	}
+
+	/**
+	 * Adds one component to this.components.
+	 * @param node node to be added.
+	 * @param isReference if component is reference it will be typed on "reference" else for "base"
+	 */
+	private void addComponent(ComponentNode node, boolean isReference ) {
+		//<component> must close after calling, because under components will be imported functions 
+		components.append("<component name=\""); //$NON-NLS-1$
+		components.append(node.getName());
+		components.append("\" "); //$NON-NLS-1$
+		components.append(" fullName=\""); //$NON-NLS-1$
+		components.append(node.getFullName());
+		components.append("\" ");		 //$NON-NLS-1$
+		components.append(" type=\""); //$NON-NLS-1$
+		if(isReference){
+			components.append("reference"); //$NON-NLS-1$
+		}else{
+			components.append("base"); //$NON-NLS-1$
+		}		
+				
+		components.append("\" "); //$NON-NLS-1$
+		components.append(">"); //$NON-NLS-1$
+		components.append("\n"); //$NON-NLS-1$
+	}	
+	
+	/**
+	 * Updates progress status.
+	 * @param node  Node currently under exporting.
+	 */
+	private void updateProgress(ComponentNode node){
+
+		try {			
+			
+			if(node instanceof ComponentParentNode){
+				
+				ComponentParentNode tmp = (ComponentParentNode)node;
+			
+				if (isExportFromRoot && !tmp.isRootComponent() && 
+						(tmp.getParent().isRootComponent() || tmp.getParent().getParent().isRootComponent() )) {
+					//updateProgress(node.getName());
+					updateProgress(tmp.getName());									
+				}
+				else if(!isExportFromRoot){
+					//if parent or parents parent is selected export root
+					if( tmp.getParent().getFullName().equals(rootComponentFullName )
+							|| ( !tmp.getParent().isRootComponent() && tmp.getParent().getParent().getFullName().equals(rootComponentFullName) ) ){
+						updateProgress(tmp.getName());
+					}
+				}
+			}
+			else {
+				ComponentLinkLeafNode tmp = (ComponentLinkLeafNode)node;
+				if (isExportFromRoot && (tmp.getParent().isRootComponent() || tmp.getParent().getParent().isRootComponent() )) {
+					updateProgress(tmp.getName());					
+				}				
+				else if(!isExportFromRoot){
+					//if parent or parents parent is selected export root
+					if( tmp.getParent().getFullName().equals(rootComponentFullName )
+							|| ( !tmp.getParent().isRootComponent() && tmp.getParent().getParent().getFullName().equals(rootComponentFullName) ) ){
+						updateProgress(tmp.getName());
+					}
+				}
+
+			}
+		} catch (JobCancelledByUserException e) {
+			AppDepConsole.getInstance().println(Messages.getString("ExportVisitor.Process_Cancelled_ByUser_ConsoleMsg")  //$NON-NLS-1$
+									+ node.getName(), IConsolePrintUtility.MSG_NORMAL);
+		} catch (Exception e) {
+			// No exceptions forwarded if error occurs when updating progress
+			AppDepConsole.getInstance().println(Messages.getString("ExportVisitor.Progress_Update_Failed_ConsoleMsg") + e, //$NON-NLS-1$
+					                            IConsolePrintUtility.MSG_ERROR);
+		}					
+		
+	}
+
+	/**
+	 * Notifies observers about the progress.
+	 * @param componentName Component name currently at hand.
+	 * @throws Exception
+	 */
+	private void updateProgress(String componentName) throws Exception {
+		int percentage = 
+			COMPONENTS_EXPORT_PERCENTAGE * 
+			progressBarProgressedCount / progressBarComponentsCount;
+			
+		DbgUtility.println(DbgUtility.PRIORITY_LOOP,
+							"Updating progress to: " + percentage  //$NON-NLS-1$
+							+ " progressed so far: " +progressBarProgressedCount  //$NON-NLS-1$
+							+ ", all cout: " +progressBarComponentsCount); //$NON-NLS-1$
+
+		observer.progress(percentage, componentName);
+		//Avoid > 100% progressed just in case
+		if(progressBarProgressedCount < progressBarComponentsCount){
+			progressBarProgressedCount++;
+		}
+	}
+	
+	/**
+	 * Adds new imported function data for the selected component.
+	 * @param parentComponentName parent component for the selected component
+	 * @param selectedComponentName selected component.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 * @throws CacheFileDoesNotExistException
+	 */
+	private void addImportedFunctionsToComponent(
+			String parentComponentName, String selectedComponentName ) 
+			throws FileNotFoundException, 
+				IOException, 
+				CacheIndexNotReadyException, 
+				CacheFileDoesNotExistException
+	{		
+		Collection<ImportFunctionData> importedFunctionsColl 
+		= MainViewDataPopulator.
+			getParentImportedFunctionsForComponent(
+					parentComponentName,
+					selectedComponentName);		
+
+		
+		String fOrdinal = null;
+		String fName = null;
+		boolean fVirtualFlag = false;
+		String fOffset = null;
+		
+		//Using own buffer, so the XML will be well formed even if fails
+		StringBuffer importedFunctions = new StringBuffer();
+		
+		importedFunctions.append("<importedFunctions>");		 //$NON-NLS-1$
+		
+		for (ImportFunctionData importFunctionData : importedFunctionsColl) {
+			fOrdinal = importFunctionData.getFunctionOrdinal();
+			fName = importFunctionData.getFunctionName();
+			fVirtualFlag = importFunctionData.isVirtual();	
+			
+			importedFunctions.append("\n"); //$NON-NLS-1$
+			importedFunctions.append("<function ordinal=\""); //$NON-NLS-1$
+			importedFunctions.append(fOrdinal);
+			importedFunctions.append("\" name=\""); //$NON-NLS-1$
+			importedFunctions.append( StringUtils.replaceForbiddenCharacters( fName ));
+			importedFunctions.append("\" "); //$NON-NLS-1$			
+			
+			if(fVirtualFlag){
+				fOffset = importFunctionData.getFunctionOffsetAsString();
+				importedFunctions.append(" offset=\""); //$NON-NLS-1$
+				importedFunctions.append(fOffset);
+				importedFunctions.append("\" "); //$NON-NLS-1$
+				importedFunctions.append(" virtual=\"1\" "); //$NON-NLS-1$
+			}
+			else{
+				// Non-virtual methods do not have offset
+				fOffset = "";				 //$NON-NLS-1$
+				importedFunctions.append(" virtual=\"0\" "); //$NON-NLS-1$
+			}
+			importedFunctions.append("/>\n");			 //$NON-NLS-1$
+		}
+		importedFunctions.append("</importedFunctions>\n");		 //$NON-NLS-1$
+		components.append(importedFunctions);
+
+	}	
+	
+	/**
+	 * Created XML data blocks for component properties.
+	 */
+	public void createProperties(){
+		
+		if(observer.isCanceled()){
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION,
+					           Messages.getString("ExportVisitor.Process_Cancelled_ByUser_When_Processing_ConsoleMsg")); //$NON-NLS-1$
+			return;
+		}
+		
+		Collection<String> col = componentNames.keySet();
+		Iterator<String> it = col.iterator();
+		String name;
+		ComponentPropertiesData comPropData = null;
+		String [] cababilities;
+		
+		while(it.hasNext()){
+			name = (String)it.next();
+			properties.append("<component name=\""); //$NON-NLS-1$
+			properties.append(name);
+			
+			properties.append("\" foundAsParent=\""); //$NON-NLS-1$
+			properties.append(isComponentFoundAsParent(name));
+			
+			
+			properties.append("\" type=\"properties\">"); //$NON-NLS-1$
+			properties.append("\n"); //$NON-NLS-1$
+		
+
+			try {
+				comPropData = MainViewDataPopulator.getComponentPropertyArrayForComponent(name, null);
+
+				properties.append("<directory>"); //$NON-NLS-1$
+				properties.append(comPropData.getDirectory());
+				properties.append("</directory>");   //$NON-NLS-1$
+				properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<filename>"); //$NON-NLS-1$
+		        properties.append(comPropData.getFilename());
+		        properties.append("</filename>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<binaryFormat>"); //$NON-NLS-1$
+		        properties.append(comPropData.getBinaryFormat());
+		        properties.append("</binaryFormat>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<UID1>"); //$NON-NLS-1$
+		        properties.append(comPropData.getUid1());
+		        properties.append("</UID1>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<UID2>"); //$NON-NLS-1$
+		        properties.append(comPropData.getUid2());
+		        properties.append("</UID2>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<UID3>"); //$NON-NLS-1$
+		        properties.append(comPropData.getUid3());
+		        properties.append("</UID3>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<secureID>"); //$NON-NLS-1$
+		        properties.append(comPropData.getSecureId());
+		        properties.append("</secureID>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<vendorID>"); //$NON-NLS-1$
+		        properties.append(comPropData.getVendorId());
+		        properties.append("</vendorID>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<capabilities>"); //$NON-NLS-1$
+		        cababilities = comPropData.getCapabilities();
+		        for(int j=0; j<cababilities.length; j++){
+		        	properties.append(cababilities[j]);
+		        	properties.append("\n"); //$NON-NLS-1$
+		        }
+		        properties.append("</capabilities>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<minHeapSize>"); //$NON-NLS-1$
+		        properties.append(comPropData.getMinHeapSize());
+		        properties.append("</minHeapSize>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<maxHeapSize>"); //$NON-NLS-1$
+		        properties.append(comPropData.getMaxHeapSize());
+		        properties.append("</maxHeapSize>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<stackSize>"); //$NON-NLS-1$
+		        properties.append(comPropData.getStackSize());
+		        properties.append("</stackSize>"); //$NON-NLS-1$
+		        properties.append("\n");	 //$NON-NLS-1$
+		        properties.append("<dllRefTableCount>"); //$NON-NLS-1$
+		        properties.append(comPropData.getDllRefTableCount());
+		        properties.append("</dllRefTableCount>");				 //$NON-NLS-1$
+				properties.append("\n");					 //$NON-NLS-1$
+				
+			} catch (NoSuchElementException e) {
+				// The selected component does necessary
+				// have any data about exported functions.
+				// Therefore we can ignore this exception
+				//e.printStackTrace();
+				properties.append("<!-- Not found properties for: "); //$NON-NLS-1$
+				properties.append(name);
+				properties.append(" -->"); //$NON-NLS-1$
+			} catch (Exception e) {
+				e.printStackTrace();
+				
+				properties.append("<!-- Error: "); //$NON-NLS-1$
+				properties.append(e);
+				properties.append(" occurs when founding properties for: "); //$NON-NLS-1$
+				properties.append(name);
+				properties.append(" -->");				 //$NON-NLS-1$
+			}
+			
+			properties.append("\n"); //$NON-NLS-1$
+			properties.append("</component>"); //$NON-NLS-1$
+			properties.append("\n"); //$NON-NLS-1$
+		}		
+		
+	}
+	
+	/**
+	 * Checks if there is component parent node available for given component name.
+	 * @param name component name.
+	 * @return <code>true</code> if found, otherwise <code>false</code>.
+	 */
+	private String isComponentFoundAsParent(String name){
+		
+		String tmp = (String) componentNames.get(name);
+		
+		return (tmp.equals(PARENT_NODE)) ? "true" : "false" ; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/**
+	 * Creates XML data blocks for exported functions.
+	 */
+	public void createExportedFunctions(){
+		
+		if(observer.isCanceled()){
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP,Messages.getString("ExportVisitor.Process_Cancelled_ByUser_When_Processing_ExpFuncs_ConsoleMsg")); //$NON-NLS-1$
+			return;
+		}
+		
+		Collection<String> col = componentNames.keySet();		
+		Iterator<String> it = col.iterator();
+		String name;
+		
+		while(it.hasNext()){
+			name = (String)it.next();
+			exportedFunctions.append("<component name=\""); //$NON-NLS-1$
+			exportedFunctions.append(name);
+			
+			exportedFunctions.append("\" foundAsParent=\""); //$NON-NLS-1$
+			exportedFunctions.append(isComponentFoundAsParent(name));
+			
+			exportedFunctions.append("\" type=\"exportedFunctions\">"); //$NON-NLS-1$
+			exportedFunctions.append("\n"); //$NON-NLS-1$
+
+
+			try {
+				Collection<ExportFunctionData> exp = MainViewDataPopulator.getExportedFunctionsForComponent(name);
+
+				for (ExportFunctionData exportFunctionData : exp) {
+					exportedFunctions.append("<function ordinal=\""); //$NON-NLS-1$
+					exportedFunctions.append(exportFunctionData.getFunctionOrdinal());
+					exportedFunctions.append("\" name=\""); //$NON-NLS-1$
+					exportedFunctions.append(
+							StringUtils.replaceForbiddenCharacters( 
+									exportFunctionData.getFunctionName() ));
+					exportedFunctions.append("\"/>"); //$NON-NLS-1$
+					exportedFunctions.append("\n");					 //$NON-NLS-1$					
+				}
+				
+			} catch (NoSuchElementException e) {
+				// The selected component does necessary
+				// have any data about exported functions.
+				// Therefore we can ignore this exception
+				//e.printStackTrace();
+				exportedFunctions.append("<!-- Not found exported functions for: "); //$NON-NLS-1$
+				exportedFunctions.append(name);
+				exportedFunctions.append(" -->"); //$NON-NLS-1$
+			} catch (Exception e) {
+				e.printStackTrace();
+				
+				exportedFunctions.append("<!-- Error: "); //$NON-NLS-1$
+				exportedFunctions.append(e);
+				exportedFunctions.append(" occurs when founding exported functions for: "); //$NON-NLS-1$
+				exportedFunctions.append(name);
+				exportedFunctions.append(" -->");				 //$NON-NLS-1$
+			}
+			
+			exportedFunctions.append("\n"); //$NON-NLS-1$
+			exportedFunctions.append("</component>"); //$NON-NLS-1$
+			exportedFunctions.append("\n"); //$NON-NLS-1$
+		}
+		
+	}		
+	
+	public String toString(){
+		
+		if(observer.isCanceled()){
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, "Cancelled by User when prosessing String "); //$NON-NLS-1$
+			return ""; //$NON-NLS-1$
+		}
+		
+		StringBuffer b = new StringBuffer();
+		
+		//*********************************************************************
+		//Header
+		//*********************************************************************
+		
+//		 href=\"printReport.xsl\"
+		b.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><?xml-stylesheet type=\"text/xsl\" ?><report>");			 //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append("<info><sdk name=\""); //$NON-NLS-1$
+		b.append(this.sdkName);
+		b.append("\" target=\""); //$NON-NLS-1$
+		b.append(this.targets);
+		b.append("\" build=\""); //$NON-NLS-1$
+		b.append(this.build);
+		b.append("\"/></info>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		//*********************************************************************
+		//components
+		//*********************************************************************
+		b.append("<components>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append("<rootComponent name=\""); //$NON-NLS-1$
+		b.append(this.rootComponentName);
+		b.append("\">"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		//add all components
+		b.append(components);
+		
+		b.append("\n"); //$NON-NLS-1$
+		b.append("</rootComponent></components>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		//*********************************************************************
+		//properties
+		//*********************************************************************
+		b.append("<properties>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append(properties);
+		b.append("\n"); //$NON-NLS-1$
+		b.append("</properties>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		//*********************************************************************
+		//exported functions
+		//*********************************************************************		
+		b.append("<exportedFunctions>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append( exportedFunctions );
+		b.append("\n"); //$NON-NLS-1$
+		b.append("</exportedFunctions>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		//*********************************************************************
+		//footer
+		//*********************************************************************
+		b.append("</report>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		
+		return b.toString();
+	}	
+	
+	/**
+	 * Writes XML data to given destination file.
+	 * @param fileName destination file.
+	 */
+	public void toFile( String fileName ) {
+		
+		if(observer.isCanceled()){
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, Messages.getString("ExportVisitor.Process_Cancelled_ByUser_When_Processing_File_ConsoleMsg")); //$NON-NLS-1$
+			return;
+		}
+		
+		try {
+			BufferedWriter out = new BufferedWriter(new FileWriter(
+					fileName));
+			out.write(toString());
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/IsUsedByXMLReport.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,171 @@
+/*
+* 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.appdep.export;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.ui.views.data.PropertyData;
+
+/**
+ * Represents the XML report data selected from "is used by" -view with "Export report..." functionality. 
+ */
+public class IsUsedByXMLReport {
+	
+	/**
+	 * Data to be converted into XML.
+	 */
+	ArrayList<ComponentPropertiesData> isUsedByData;
+	/**
+	 * SDK the data is got from.
+	 */
+	private String sdkName;
+	/**
+	 * Targets the data is got from.
+	 */
+	private String targets;
+	/**
+	 * Build type the data is got from.
+	 */
+	private String build;
+	/**
+	 * Component or functions the 'is used by'-relation is asked for.
+	 */
+	private String usingComponentOrFunction;
+	/**
+	 * Sort criteria used in the component list -view used to show 
+	 * 'is used by'-relation data, and from which query for XML representation
+	 * is started from.
+	 */
+	private int sortCriteria;
+
+	/**
+	 * Constructor.
+	 * @param isUsedByData Data to be converted into XML
+	 * @param sdkName SDK the data is got from
+	 * @param targets Targets the data is got from.
+	 * @param build Build type the data is got from.
+	 * @param usingComponentOrFunction Component or functions the 'is used by'-relation is asked for.
+	 * @param sortCriteria Sort criteria used in the component list -view used to show 
+	 *                     'is used by'-relation data, and from which query for XML representation
+	 *                     is started from.
+	 */
+	public IsUsedByXMLReport(ArrayList<ComponentPropertiesData> isUsedByData, String sdkName, String targets, String build, String usingComponentOrFunction, int sortCriteria) {
+		this.isUsedByData = isUsedByData;
+		this.sdkName = sdkName;
+		this.targets = targets;
+		this.build = build;
+		this.usingComponentOrFunction = usingComponentOrFunction;
+		this.sortCriteria = sortCriteria;
+	}
+	
+	/**
+	 * Gets component properties for the export report functionality.
+	 * @return component properties for the export report functionality.
+	 */
+	private StringBuffer getExportProperties(){
+		
+		StringBuffer b = new StringBuffer (); 		
+		
+		ComponentPropertiesData data;
+		Iterator<ComponentPropertiesData> it = isUsedByData.iterator();
+		while(it.hasNext()){
+			data = it.next();
+			PropertyData [] props = data.toPropertyDataArray();
+			b.append("<isUsedBy>\n"); //$NON-NLS-1$
+			for(int i = 0; i<props.length; i++){
+				PropertyData prop =  props[i]; 				
+				b.append("<"); //$NON-NLS-1$
+				b.append(StringUtils.replace(prop.getPropertyDescription()," ", "_" )); //$NON-NLS-1$ //$NON-NLS-2$
+				b.append(">"); //$NON-NLS-1$
+				b.append(prop.getPropertyValue());
+				b.append("</"); //$NON-NLS-1$
+				b.append(StringUtils.replace(prop.getPropertyDescription()," ", "_" )); //$NON-NLS-1$ //$NON-NLS-2$
+				b.append(">\n"); //$NON-NLS-1$
+			
+			}
+			b.append("</isUsedBy>\n"); //$NON-NLS-1$
+		}		
+		
+		return b;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString(){		
+			
+		StringBuffer b = new StringBuffer();
+		
+		//*********************************************************************
+		//Header
+		//*********************************************************************
+		
+		//	 href=\"printReport.xsl\"
+		b.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><?xml-stylesheet type=\"text/xsl\" ?>");			 //$NON-NLS-1$
+		b.append("\n<report>\n"); //$NON-NLS-1$
+		b.append("<info><sdk name=\""); //$NON-NLS-1$
+		b.append(this.sdkName);
+		b.append("\" target=\""); //$NON-NLS-1$
+		b.append(this.targets);
+		b.append("\" build=\""); //$NON-NLS-1$
+		b.append(this.build);
+		b.append("\"/></info>"); //$NON-NLS-1$
+		b.append("\n");	 //$NON-NLS-1$
+		
+		b.append("\n"); //$NON-NLS-1$
+		b.append("<isUsedByData>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append("<component name=\""); //$NON-NLS-1$
+		b.append(usingComponentOrFunction);
+		b.append("\" sortCriteria= \""); //$NON-NLS-1$
+		b.append(sortCriteria);
+		b.append("\">\n"); //$NON-NLS-1$
+		
+		b.append(getExportProperties());
+
+		b.append("\n"); //$NON-NLS-1$
+		b.append("</component>");		 //$NON-NLS-1$
+		b.append("</isUsedByData>"); //$NON-NLS-1$
+		b.append("\n"); //$NON-NLS-1$
+		b.append("</report>"); //$NON-NLS-1$
+		b.append("\n");	 //$NON-NLS-1$
+		return b.toString();
+	}
+	
+	/**
+	 * Write data as XML into given destination file.
+	 * @param fileName Destination file.
+	 */
+	public void toFile( String fileName ) {		
+		
+		try {
+			BufferedWriter out = new BufferedWriter(new FileWriter(
+					fileName));
+			out.write(toString());
+			out.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/StringUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,57 @@
+/*
+* 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.appdep.export;
+
+
+/**
+ * String utilities used for character replacements 
+ * e.g. when creating XML reports.  
+ */
+public class StringUtils {
+
+	/**
+	 * Replaces those characters that are no allowed inside XML elements
+	 * with corresponding XML entities.
+	 * @param in string to replace forbidden characters from
+	 * @return string with forbidden characters replaced with corresponding entities.
+	 */
+	public static String replaceForbiddenCharacters(String in){
+		String out = in.replace("&","&#38;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("<","&#60;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace(">","&#62;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("\"","&#34;"); //$NON-NLS-1$ //$NON-NLS-2$
+		out = out.replace("'","&#39;"); //$NON-NLS-1$ //$NON-NLS-2$
+			
+		return out;
+		
+	}
+
+	/**
+	 * Replaces given sub string with given replacement if found from the input string.
+	 * @param in input string used for replacement
+	 * @param replaceMe sub string to be replaced
+	 * @param replaceWith sub string used as replacement
+	 * @return string with all occurrences replace if found.
+	 */
+	public static String replace(String in, String replaceMe, String replaceWith){
+		String out = in.replace(replaceMe,replaceWith);			
+		return out;		
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/export/XMLUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,100 @@
+/*
+* 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.appdep.export;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.StringReader;
+import java.util.Properties;
+
+import javax.xml.transform.Templates;
+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.appdep.core.AppDepSettings;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * XML utilities for the tool's export report functionality..
+ */
+public class XMLUtils {
+
+	
+	/**
+	 * Processes XML by applying XSL transformation, and stores result to an HTML file.
+	 * @param xmlIn XML to process.
+	 * @param xslInURI XSL transformation to apply.
+	 * @param htmlOutURI Destination HTML file URI.
+	 * @throws FileNotFoundException
+	 * @throws TransformerException
+	 */
+	public static void parseXML( 
+			String xmlIn, String xslInURI,  String htmlOutURI ) 
+		throws FileNotFoundException, TransformerException{
+		
+		String key = "javax.xml.transform.TransformerFactory"; //$NON-NLS-1$
+		String value = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"; //$NON-NLS-1$
+		Properties props = System.getProperties();
+		props.put(key, value);
+		System.setProperties(props);
+
+		// Instantiate the TransformerFactory, and use it with a StreamSource
+		TransformerFactory factory = TransformerFactory.newInstance();
+		Templates translet = factory.newTemplates(new StreamSource(xslInURI));
+		Transformer transformer = translet.newTransformer();
+		transformer.transform(new StreamSource(new StringReader(xmlIn)),
+				new StreamResult(new FileOutputStream(htmlOutURI)));
+	}
+	
+	/**
+	 * Processes XML by applying XSL transformation, and stores result to an HTML file.
+	 * The used XSLT file is queried from settings by using the method:
+	 *  <code>AppDepSettings.getActiveSettings().getXSLFileName()</code>.
+	 * @param xmlIn XML to process.
+	 * @param htmlOutURI Destination HTML file URI
+	 * @throws FileNotFoundException
+	 * @throws TransformerException
+	 */
+	public static void parseXML( String xmlIn, String htmlOutURI ) 
+		throws FileNotFoundException, TransformerException{
+		
+		String key = "javax.xml.transform.TransformerFactory"; //$NON-NLS-1$
+		String value = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"; //$NON-NLS-1$
+		Properties props = System.getProperties();
+		props.put(key, value);
+		System.setProperties(props);
+
+		//Instantiate the TransformerFactory, and use it with a StreamSource
+		TransformerFactory factory = TransformerFactory.newInstance();
+		String xslPath = AppDepSettings.getActiveSettings().getResourcesPath()
+			+ System.getProperty("file.separator") //$NON-NLS-1$
+			+ AppDepSettings.getActiveSettings().getXSLFileName();
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "XSL path="+xslPath); //$NON-NLS-1$
+		Templates translet = factory.newTemplates(new StreamSource(xslPath));
+		Transformer transformer = translet.newTransformer();
+		transformer.transform(new StreamSource(new StringReader(xmlIn)),
+				new StreamResult(new FileOutputStream(htmlOutURI)));
+		
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/find/FindVisitor.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.find;
+
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+
+/**
+ * Concrete visitor class for enabling find from component tree.
+ */
+public class FindVisitor implements IVisitor{
+
+	/**
+	 * String to look for.
+	 */
+	private final String matchString;
+	
+	/**
+	 * Find results to be returned to the client class 
+	 */
+	private final List<ComponentNode> findResultList;
+	
+	/**
+	 * Constructor.
+	 * @param findString String to find for
+	 * @param findResultList Find results to be returned in the list object.
+	 */
+	public FindVisitor(String findString, List<ComponentNode> findResultList){
+		this.matchString = findString;
+		this.findResultList = findResultList;
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode)
+	 */
+	public void visit(ComponentLinkLeafNode node) {
+		if(isMatch(node.toString())){
+			findResultList.add(node);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentParentNode)
+	 */
+	public void visit(ComponentParentNode node) {
+		
+		if(isMatch(node.toString())){
+			findResultList.add(node);
+		}
+
+		// Going through also all the childrens
+		ComponentNode[] childArray = node.getChildren();
+		for (int i = 0; i < childArray.length; i++) {
+			ComponentNode childNode = childArray[i];
+			childNode.accept(this);
+		}
+		
+	}
+
+	/**
+	 * Checks if the given component name matches the find.
+	 * @param cmpName component name
+	 * @return <code>true</code> if matches, otherwise <code>false</code>.
+	 */
+	private boolean isMatch(String cmpName) {		
+		return cmpName.toLowerCase().contains(matchString.toLowerCase());
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/find/IFindStartNodeProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,32 @@
+/*
+* 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.appdep.find;
+
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+
+/**
+ * Provides currently used start node for find operation.
+ */
+public interface IFindStartNodeProvider {
+	/**
+	 * Gets start node for find.
+	 * @return Start node for find.
+	 */
+	ComponentNode getSearchStartNode();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/CProjectJobStatus.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,70 @@
+/*
+* 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.appdep.locatecomponent;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * Class for holding {@link IStatus} and {@link ICProject} references.
+ */
+public class CProjectJobStatus {
+	
+	/**
+	 * Project job success/failure status.
+	 */
+	private IStatus status;
+	
+	/**
+	 * Project object.
+	 */
+	private ICProject cProject;
+
+	/**
+	 * Sets job success/failure status.
+	 * @return the status
+	 */
+	public IStatus getStatus() {
+		return status;
+	}
+
+	/**
+	 * Gets job success/failure status.
+	 * @param status the status to set
+	 */
+	public void setStatus(IStatus status) {
+		this.status = status;
+	}
+
+	/**
+	 * Gets the handled project object.
+	 * @return the cProject
+	 */
+	public ICProject getCProject() {
+		return cProject;
+	}
+
+	/**
+	 * Sets the handled project object.
+	 * @param project the cProject to set
+	 */
+	public void setCProject(ICProject project) {
+		cProject = project;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/CreateProjectJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,96 @@
+/*
+* 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.appdep.locatecomponent;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+
+/**
+ * Job for seeking possible concrete implementation of generic component name.
+ */
+public class CreateProjectJob extends Job{
+
+	/**
+	 * Source file location to be used.
+	 */
+	private SourceFileLocation location = null;
+
+	/**
+	 * Project instance after creation. 
+	 */
+	private ICProject cProject;
+	
+	/**
+	 * set to <code>true</code> if should be treated as user job, otherwise
+	 * treated as workspace level system job.
+	 */
+	private boolean isUserJob = false;
+	
+	/**
+	 * Creates a new project based on given source file location.
+	 * @param name Job name.
+	 * @param location Source location.
+	 * @param isUserJob set to <code>true</code> if should be treated as user job, otherwise
+	 *                  treated as workspace level system job.
+	 */
+	public CreateProjectJob(String name, SourceFileLocation location, boolean isUserJob) {
+		super(name);
+		setUser(isUserJob);
+		this.isUserJob = isUserJob;
+		this.location = location;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		// Informing user about progress if this is user visible foreground job
+		if(isUserJob == true){
+			monitor.beginTask(Messages.getString("CreateProjectJob.ShowSourceInProject_Task_Msg"), //$NON-NLS-1$
+					IProgressMonitor.UNKNOWN);
+		}
+		// Delegating actual project creation to project utilities which 
+		// takes care of error management and error reporting in case of an error.
+		CProjectJobStatus stat;
+		DEProjectUtils utils = new DEProjectUtils(AppDepConsole.getInstance());
+		stat = utils.createProjectImpl(monitor, location);
+		this.cProject = stat.getCProject();		
+		IStatus status = stat.getStatus();
+		if(status.getSeverity() == IStatus.ERROR){
+			this.cancel();
+		}
+		return status;
+	}
+	
+	/**
+	 * Gets the created C++ project.
+	 * @return the cProject where given source belongs to.
+	 */
+	public ICProject getCProject() {
+		return cProject;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/DEProjectUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,107 @@
+/*
+* 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.appdep.locatecomponent;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+import com.nokia.s60tools.util.sourcecode.ProjectUtils;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+
+/**
+ * Utility methods for handling Carbide/Eclipse projects, uses ProjectUtils class
+ * and captures IStatus messages so that project creation can be used outside {@link CreateProjectJob}.
+ */
+public class DEProjectUtils extends ProjectUtils{
+	
+	/**
+	 * Constructor
+	 * @param printUtility console for printing warning info, and error messages
+	 */
+	public DEProjectUtils(IConsolePrintUtility printUtility) {
+		super(printUtility);
+	}
+	
+	/**
+	 * Creates project pointed by the given bld.inf file.
+	 * @param monitor Job progress monitor.
+	 * @param bldInfFilePath Absolute path to bld.inf file
+	 * @return Project creation status object.
+	 */
+	public CProjectJobStatus createProjectImpl(IProgressMonitor monitor, String bldInfFilePath) {
+		return runImpl(monitor, null, bldInfFilePath);
+	}
+	/**
+	 * Creates project pointed by the given source file location.
+	 * @param monitor Job progress monitor.
+	 * @param location Source file location.
+	 * @return Project creation status object.
+	 */
+	public CProjectJobStatus createProjectImpl(IProgressMonitor monitor,  SourceFileLocation location) {
+		return runImpl(monitor, location, null);
+	}
+	
+	/**
+	 * Creates project pointed by the given bld.inf file and source file location.
+	 * @param monitor Job progress monitor.
+	 * @param location Source file location. Used as default input info, if defined.
+	 *                 If set to <code>null</code> using bld.inf file instead.
+	 * @param bldInfFilePath Absolute path to bld.inf file
+	 * @return Project creation status object.
+	 */
+	private CProjectJobStatus runImpl(IProgressMonitor monitor, SourceFileLocation location, String bldInfFilePath) {
+		IStatus status = null;		
+		ICProject cProject = null;
+		CProjectJobStatus ret = new CProjectJobStatus();
+		try {
+			AppDepSettings settings = AppDepSettings.getActiveSettings();
+			SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();		
+			
+			if(location != null){
+				cProject = createProject(monitor, location, sdkInfo.getSdkId());
+			}else{
+				cProject = createProject(monitor, bldInfFilePath, sdkInfo.getSdkId());
+			}
+			// Creation went OK, if we end up here.
+			status = Status.OK_STATUS;
+		} catch (JobCancelledByUserException e) {
+			status = Status.CANCEL_STATUS;
+		} catch (Exception e) {
+			e.printStackTrace();
+			String errMsg = Messages.getString("CreateProjectJob.Err_Msg"); //$NON-NLS-1$
+			status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,errMsg, e);
+			AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+
+		}finally{
+			ret.setCProject(cProject);
+			ret.setStatus(status);
+		}
+		return ret;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/LocateComponentJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.locatecomponent;
+
+import java.io.IOException;
+
+import javax.xml.transform.TransformerException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.core.data.CacheDataManager;
+import com.nokia.s60tools.appdep.core.data.ICacheDataManager;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+/**
+ * Job for seeking possible concrete implementation of generic component name.
+ */
+public class LocateComponentJob extends Job{
+
+	/**
+	 * Name of the component to locate. 
+	 */
+	private final String componentName;
+	/**
+	 * Concrete component list.
+	 */
+	private String concreteComponents[] = null;
+	
+	/**
+	 * Constructor.
+	 * @param name Job name (root component name)
+	 * @param node root node
+	 * @param component name
+	 */
+	public LocateComponentJob(String name, String componentName) {
+		super(name);
+		this.componentName = componentName;
+		setUser(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		
+		IStatus status; // Return status for the job.		
+		
+		try {
+			locateConcreteComponent();
+			status = Status.OK_STATUS;
+		} catch (JobCancelledByUserException e) {
+			this.cancel();
+			status = Status.CANCEL_STATUS;
+		} catch (Exception e) {
+			e.printStackTrace();			
+			String errMsg = Messages.getString("LocateComponentJob.Err_Msg") + ": " + e.getMessage(); //$NON-NLS-1$ //$NON-NLS-2$ 
+			status = new Status(
+					Status.ERROR,Platform.PI_RUNTIME,
+					Status.ERROR,errMsg, e);
+			AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+			this.cancel();	
+		}
+		return status;
+
+	}	
+
+	/**
+	 * Starts process for locating concrete components.
+	 * @throws TransformerException 
+	 * @throws IOException 
+	 * @throws CacheFileDoesNotExistException 
+	 */
+	private void locateConcreteComponent() 
+		throws JobCancelledByUserException, 
+				IOException, CacheFileDoesNotExistException
+	{
+		ICacheDataManager manager = CacheDataManager.getInstance();
+		concreteComponents = manager
+				.searchConcreteComponentsByGenericComponent(componentName);
+	}
+
+	/**
+	 * Gets array located components
+	 * @return array located components or <code>null</code> if not found any.
+	 */
+	public String[] getConcreteComponent() {
+		return concreteComponents;
+	}		
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/SeekParentNodesService.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,45 @@
+/*
+* 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.appdep.locatecomponent;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+
+/**
+ * Search service facade class offering utilities for seeking {@link ComponentParentNode}s under given node.
+ */
+public class SeekParentNodesService {
+
+	/**
+	 * Finds the child nodes for given node.
+	 * @param startNode Start node for the search. If root node is given, all {@link ComponentParentNode}s is returned.
+	 * @return Map of {@link ComponentParentNode}s under given node where map keys will be on lower case.
+	 */
+	public static Map<String, ComponentParentNode> findParentNodes(ComponentNode startNode){
+		Map<String, ComponentParentNode> searchResultList = new HashMap<String, ComponentParentNode>();
+		IVisitor v = new SeekParentNodesVisitor(searchResultList);
+		startNode.accept(v);
+		return searchResultList;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/SeekParentNodesVisitor.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.locatecomponent;
+
+import java.util.Map;
+
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+
+/**
+ * Concrete visitor class for seeking parent nodes from nodes.
+ */
+public class SeekParentNodesVisitor implements IVisitor{
+
+	
+	/**
+	 * Search results to be returned to the client class 
+	 */
+	private final Map<String, ComponentParentNode> searchResultList;
+	
+	/**
+	 * Constructor.
+	 * @param searchString String to search for
+	 * @param searchResultList Search results to be returned in the list object. Component names will be there in lower case.
+	 */
+	public SeekParentNodesVisitor( Map<String, ComponentParentNode> searchResultList){
+		this.searchResultList = searchResultList;
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode)
+	 */
+	public void visit(ComponentLinkLeafNode node) {
+		//No action with leaf nodes
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor#visit(com.nokia.s60tools.appdep.core.data.ComponentParentNode)
+	 */
+	public void visit(ComponentParentNode node) {
+	    // Adds node to search result list
+		searchResultList.put(node.getName().toLowerCase(), node);
+
+		// Going through also all the childrens
+		ComponentNode[] childArray = node.getChildren();
+		for (int i = 0; i < childArray.length; i++) {
+			ComponentNode childNode = childArray[i];
+			childNode.accept(this);
+		}	
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/locatecomponent/ShowMethodCallLocationsJob.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,658 @@
+/*
+* 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.appdep.locatecomponent;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.index.IIndexChangeEvent;
+import org.eclipse.cdt.core.index.IIndexChangeListener;
+import org.eclipse.cdt.core.index.IIndexManager;
+import org.eclipse.cdt.core.index.IIndexerStateEvent;
+import org.eclipse.cdt.core.index.IIndexerStateListener;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.internal.ui.search.CSearchMessages;
+import org.eclipse.cdt.internal.ui.search.PDOMSearchPatternQuery;
+import org.eclipse.cdt.internal.ui.search.PDOMSearchQuery;
+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.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.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.search.ui.IQueryListener;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewDataPopulator;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+import com.nokia.s60tools.util.sourcecode.CannotFoundFileException;
+import com.nokia.s60tools.util.sourcecode.IProjectFinder;
+import com.nokia.s60tools.util.sourcecode.ISourcesFinder;
+import com.nokia.s60tools.util.sourcecode.ProjectFinderFactory;
+import com.nokia.s60tools.util.sourcecode.SourceFinderFactory;
+
+/**
+ * Job for seeking possible concrete implementation of generic component name.
+ */
+// If public access to {@link PDOMSearchPatternQuery} is provided later on, the suppressing of warnings in here is no more needed.
+@SuppressWarnings("restriction")
+public class ShowMethodCallLocationsJob extends Job implements IQueryListener {
+
+	/**
+	 * Amount of steps used for the create project job progress follow-up.
+	 */
+	private static final int CREATING_PROJECT_STEPS = 5;
+	/**
+	 * Step amounts reserved for searching and indexing phase.
+	 */
+	private static final int SEARCH_AND_INDEX_STEPS = 85;
+
+	/**
+	 * Search string formed for the used search service-
+	 */
+	private String searchString = null;
+
+	/**
+	 * Project to be created for which contents the search is done.
+	 */
+	private ICProject cProject;
+
+	/**
+	 * File list defining valid search scope.
+	 */
+	private String[] filesBelongsToComponent;
+
+	/**
+	 * Job's progress monitor.
+	 */
+	private IProgressMonitor progressMonitor;
+	/**
+	 * Name of the component the method call locations are searched from.
+	 */
+	private String componentName = null;
+	
+	/**
+	 * Method name to be searched from the component.
+	 */
+	private String methodName = null;
+	/**
+	 * Name of main task that is show to the user in job progress dialog.
+	 */
+	private final String mainTaskMessage;
+
+	/**
+	 * Constructor.
+	 * @param jobName Job name 
+	 * @param mainTaskMessage Task name used for main task message
+	 * @param componentName Component name to search method calls from.
+	 * @param methodName Method name which occurrences to search from the component..
+	 * @param isUserJob if <code>true</code> job is set as user level job that prompts dialog.
+	 */
+	public ShowMethodCallLocationsJob(String jobName, String mainTaskMessage, String componentName, String methodName, boolean isUserJob) {
+		super(jobName);
+		this.mainTaskMessage = mainTaskMessage;
+		this.componentName = componentName;
+		this.methodName = methodName;
+		setUser(isUserJob);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus run(IProgressMonitor monitor) {
+		
+		progressMonitor = monitor;
+		IStatus status;		
+
+		try {
+		
+			progressMonitor.beginTask(mainTaskMessage,  100);
+
+			AppDepSettings settings = AppDepSettings.getActiveSettings();
+
+			SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();
+			String epocRootPath = sdkInfo.getEpocRootDir(); 			
+
+			progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.SearchingFiles_SubTask_Msg") +"\n" +componentName +"'..."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			
+			filesBelongsToComponent = getUsedComponentSourceFiles(settings, componentName, epocRootPath);			
+			//Limit number of files simple founding part of the method name, to decrease project files
+			setSearchString(methodName);
+									
+			checkIfCancelled();
+			progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.SearchingBldInf_SubTask_Msg")); //$NON-NLS-1$
+			progressMonitor.worked(CREATING_PROJECT_STEPS);
+			
+			//Finds and sets source files as IFile to variables
+			String bldFile = getBldInfFileName(filesBelongsToComponent);
+			
+			//If the project already exist, just executing the search
+			if(isProjectAllreadyExistingAndOpenIfClosed(bldFile, progressMonitor)){
+
+				progressMonitor.worked(SEARCH_AND_INDEX_STEPS);
+				checkIfCancelled();
+				executeSearch(searchString);
+				status = Status.OK_STATUS;
+
+			}
+			//otherwise first create a project, wait until indexed, and then execute the search
+			else{			
+				//Create a job to create project by bld.inf file if needed, and then execute search
+				progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.CreatingProjectFromBldInf_SubTask_Msg") +"\n" +bldFile +"'..."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				checkIfCancelled();
+				status = createAndRunProjectCreatingJobAndExecuteSearch(bldFile, progressMonitor);				
+				progressMonitor.worked(CREATING_PROJECT_STEPS);
+
+				if(status.getSeverity() == IStatus.ERROR){
+					this.cancel();
+				}
+				else{
+					startIndexingAndSearch();					
+					status = Job.ASYNC_FINISH;
+				}
+			}
+			
+		} catch (JobCancelledByUserException e) {
+			// Job cancel because of user request 
+			this.cancel();
+			status = Status.CANCEL_STATUS;
+		}catch (Exception e) {
+			// Job cancel because of an exception 
+			e.printStackTrace();
+			String errMsg = Messages.getString("CreateProjectJob.Err_Msg") + ": " + e.getMessage(); //$NON-NLS-1$ //$NON-NLS-2$ 
+			status = reportError(e, errMsg);
+			this.cancel();	
+		}
+		return status;
+	}
+
+	/**
+	 * Reports error to user.
+	 * @param e Encountered exception.
+	 * @param errMsg Error message.
+	 * @return status object.
+	 */
+	private IStatus reportError(Exception e, String errMsg) {
+		IStatus status;
+		status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,errMsg, e);
+		AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+		return status;
+	}
+	
+	/**
+	 * Gets all source files belonging to the given component.
+	 * @param settings Tool settings.
+	 * @param componentName component name to search method call locations from.
+	 * @param epocRootPath EPOCROOT path
+	 * @return Source file name array
+	 * @throws CannotFoundFileException
+	 * @throws CacheFileDoesNotExistException 
+	 * @throws CacheIndexNotReadyException 
+	 * @throws IOException 
+	 */
+	private String[] getUsedComponentSourceFiles(AppDepSettings settings,
+			String componentName, String epocRootPath)
+			throws CannotFoundFileException, IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException {
+
+		ISourcesFinder finder = SourceFinderFactory.createSourcesFinder(AppDepConsole.getInstance());
+		String  variant = MainViewDataPopulator.getTargetPlatformIdStringForComponent(settings, componentName);
+		String build = settings.getBuildType().getBuildTypeName();		
+		String [] files = finder.findSourceFiles(componentName, variant, build, epocRootPath);
+		return files;
+	}
+
+	/**
+	 * Sets search string based on the method name.
+	 * @param methodName Method name.
+	 */
+	private void setSearchString(String methodName) {
+		String shortMethodName = methodName;
+		int start = methodName.indexOf("::"); //$NON-NLS-1$
+		if(start != -1){
+			shortMethodName = methodName.substring(start + 2);
+			
+		}
+		int end = shortMethodName.indexOf("("); //$NON-NLS-1$
+		if(end != -1){
+			shortMethodName = shortMethodName.substring(0, end);
+		}
+		
+		String longMethodNameWithOutParams;
+		if(methodName.indexOf("(") != -1){ //$NON-NLS-1$
+			longMethodNameWithOutParams = methodName.substring(0, methodName.indexOf("(")); //$NON-NLS-1$
+		}else{
+			longMethodNameWithOutParams = methodName;
+		}
+		
+		searchString  =  longMethodNameWithOutParams;// methodName;// shortMethodName;				
+	}
+
+
+	/**
+	 * Seeks all files by bld.inf file and set them to filesInBldInf 
+	 * and seeks all bld.inf to add them to bldInfFiles
+	 * @param files File name array.
+	 * @return bld.inf file path and an empty string if not found.
+	 * @throws URISyntaxException
+	 * @throws JobCancelledByUserException 
+	 */
+	private String getBldInfFileName(String[] files) throws URISyntaxException, JobCancelledByUserException {
+		//Opening project(s) where source files belongs to
+		IProjectFinder prjFinder = ProjectFinderFactory.createProjectFinder(AppDepConsole.getInstance(), progressMonitor);
+		Vector<String> bldInfFiles = new Vector<String>();
+		int errorsCount = 0;
+		for (int i = 0; i < files.length; i++) {
+			String bldInfFile;
+			try {
+				String mmpFile = prjFinder.findMMPFile(files[i]);
+				//If search is canceled, null was returned from the previously called method				
+				if(mmpFile == null){
+					checkIfCancelled();
+				}else{
+					bldInfFile = prjFinder.findBLDINFFile(mmpFile);
+					//If search is canceled, null is returned, cancellation check will be check if null is returned
+					if(bldInfFile != null){
+						bldInfFiles.add(bldInfFile);
+					}else {
+						checkIfCancelled();
+					}
+				}
+			} catch (CannotFoundFileException e) {
+				errorsCount++;//Just counting errors, really doing nothing with those but skipping if some file does not exist
+			}
+		}
+
+		// Throwing an error in case bld.inf file was not found
+		if(bldInfFiles.size() == 0){
+			String errMsg = Messages.getString("ShowMethodCallLocationsJob.CouldNotFindBldInfFile_ErrMsg") //$NON-NLS-1$
+							+ componentName
+							+ "'"; //$NON-NLS-1$
+			throw new RuntimeException(errMsg);
+		}
+		// Returning found bld.inf file path name on success
+		return bldInfFiles.elementAt(0);
+	}
+
+	/**
+	 * Checks if job was cancelled by user.
+	 * @throws JobCancelledByUserException
+	 */
+	private void checkIfCancelled() throws JobCancelledByUserException {
+		if(progressMonitor.isCanceled()){
+			throw new JobCancelledByUserException(Messages.getString("ShowMethodCallLocationsJob.JobCanceledByUser_ErrMsg")); //$NON-NLS-1$
+		}
+	}	
+	
+	/**
+	 * Creates a project.
+	 * @param bldFile bld.inf file to create project based on.
+	 * @param monitor Progress monitor object
+	 * @throws IOException 
+	 * @throws CoreException 
+	 */
+	private IStatus createAndRunProjectCreatingJobAndExecuteSearch(String bldFile, IProgressMonitor monitor) throws IOException, CoreException {		
+			
+			DEProjectUtils utils = new DEProjectUtils(AppDepConsole.getInstance());
+			CProjectJobStatus stat = utils.createProjectImpl(progressMonitor, bldFile);
+
+			this.cProject = stat.getCProject();		
+			IStatus status = stat.getStatus();
+		
+			return status;
+	}	
+	
+	/**
+	 * Checks if project already exist in workspace.
+	 * @param bldFile bld.inf file to create project based on.
+	 * @param monitor Progress monitor object
+	 * @return <code>true</code> if project is found from workspace, otherwise <code>false</code>.
+	 * @throws IOException
+	 * @throws CoreException 
+	 */
+	private boolean isProjectAllreadyExistingAndOpenIfClosed(String bldFile, IProgressMonitor monitor) throws IOException, CoreException {
+
+		IPath path = new Path(bldFile);	
+		IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
+		
+		if(files.length > 0){	
+			
+			IProject prj = files[0].getProject();
+			if(prj.isOpen()){
+				return true;
+			}
+			else{
+				prj.open(monitor);				
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * Creates query and execute the search
+	 * @param searchText Search text
+	 * @throws JobCancelledByUserException 
+	 */
+	private void executeSearch(final String searchText){
+
+		progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.ExcecutingSearch_SubTask_Msg")); //$NON-NLS-1$
+		
+		final IResource[] resources = createResourcesTable();
+		
+		
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Starting to execute search with " +resources.length +" resources..."); //$NON-NLS-1$ //$NON-NLS-2$
+		
+			Runnable runSeach = new Runnable(){
+				public void run(){
+					try {
+						if(progressMonitor.isCanceled()){
+							cancelProgress();
+						}else{
+							ISearchQuery query = null;
+							//Query is created by CDT:s interal API
+							query = getSearchQuery(searchText, resources);
+							//Start to listen search query for noticing done() when its completed
+							NewSearchUI.addQueryListener(getIQueryListener());
+							NewSearchUI.activateSearchResultView();		
+							NewSearchUI.runQueryInBackground(query);
+						}
+					}
+					catch (Exception e) {
+						e.printStackTrace();
+						AppDepConsole.getInstance().println(Messages.getString("ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part2") +e, AppDepConsole.MSG_ERROR); //$NON-NLS-1$
+						errorProgress(Messages.getString("ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part1"), e);  //$NON-NLS-1$
+					}
+				}
+
+			};
+			
+			// Showing a visible message in its own thread
+			// in order not to cause invalid thread access
+			Display.getDefault().asyncExec(runSeach);									
+	}		
+	
+	/**
+	 * Get search query.
+	 * <p>
+	 * This method is using CDT:s internal API:s and if public access to {@link PDOMSearchPatternQuery}
+	 * is provided, implementation should be changed to use public implementation. 
+	 * Internal API is used, because of ready made implementation of find functions and methods references
+	 * is found in there. 
+	 * @param searchText, text to search, without parameters. Cut search String before first brace "(". 
+	 * With parameters and braces, you don't get any results. 
+	 * @param resources
+	 * @return query to give to Search engine.
+	 * @throws CoreException
+	 */
+	private ISearchQuery getSearchQuery(
+			final String searchText, final IResource[] resources)
+			throws CoreException {
+		
+		// get the list of elements for the scope
+		List<Object> elements = new ArrayList<Object>();
+		//Search from the given source files found in .map file
+		String scopeDescription = CSearchMessages.SelectionScope; 
+
+		for (int i = 0; i < resources.length; i++) {
+			elements.add(CoreModel.getDefault().create(resources[i]));
+		}
+
+		boolean isCaseSensitive = true;
+		//to Search query, we must give resources as ICElement
+		ICElement[] scope = elements.isEmpty() ? null : elements.toArray(new ICElement[elements.size()]);
+		//Same flags covers search for and limit to selections, we want to search functions/methods and only references
+		int searchFlags = PDOMSearchPatternQuery.FIND_FUNCTION | PDOMSearchPatternQuery.FIND_METHOD
+							| PDOMSearchQuery.FIND_REFERENCES;
+
+		//class to execute search is interal class provided in CDT, permission to use internal classes is granted.
+		//Parameters cannot be used wih Query, only class name(s) and method name
+		PDOMSearchPatternQuery query = new PDOMSearchPatternQuery(scope, scopeDescription, searchText, 
+				isCaseSensitive , searchFlags );		
+		
+		return query;
+	}
+	
+	/**
+	 * Creates a array containing IFile links to files that were found from map file.
+	 * @return Resource object array.
+	 */
+	private IResource[] createResourcesTable() {
+		HashSet<IFile> filesInBldInf = new HashSet<IFile>();
+		
+		for (int i = 0; i < filesBelongsToComponent.length; i++) {
+			String uriStr = filesBelongsToComponent[i].replace("\\", "/");; //$NON-NLS-1$ //$NON-NLS-2$
+			uriStr = "file://" + uriStr; //$NON-NLS-1$
+			IFile[] wsFile;
+			try {
+				wsFile = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(
+						new URI( uriStr));
+				for (int j = 0; j < wsFile.length; j++) {
+					filesInBldInf.add(wsFile[j]);							
+				}			
+			} catch (URISyntaxException e) {
+				e.printStackTrace();
+				AppDepConsole.getInstance().println(
+						Messages.getString("ShowMethodCallLocationsJob.UnableToAddFile_ErrMsg_Part1") +uriStr  //$NON-NLS-1$
+						+Messages.getString("ShowMethodCallLocationsJob.UnableToAddFile_ErrMsg_Part2") +e, AppDepConsole.MSG_ERROR); //$NON-NLS-1$
+				
+			}
+		}
+		
+		final IResource[] resources = (IFile[])filesInBldInf.toArray(new IFile[0]);
+		return resources;
+	}		
+
+	/**
+	 * Triggers indexing and searching.
+	 * @throws JobCancelledByUserException
+	 */
+	private void startIndexingAndSearch() throws JobCancelledByUserException {
+		checkIfCancelled();
+		IIndexManager indexManager = CCorePlugin.getIndexManager();		
+		boolean projectIndexed = indexManager.isProjectIndexed(cProject);
+		DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Project: " +cProject.getElementName() + " indexed: " +projectIndexed + " and indexer is idling: " +indexManager.isIndexerIdle()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		
+		//If project is already indexed, search can be started right away
+		if(projectIndexed && indexManager.isIndexerIdle()){
+			executeSearch( searchString);								
+		}
+		//otherwise starting to listen indexer, and when its done, executing search
+		else{						
+			progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.StartingIndexing_SubTask_Msg")); //$NON-NLS-1$
+			IndexerStateListener listener = new IndexerStateListener();
+			indexManager.addIndexerStateListener(listener);			
+			indexManager.addIndexChangeListener(listener);
+		}
+	}	
+	
+	/**
+	 * Listener class implementation for listening indexer state changes and start
+	 * execution of search when indexer is in idle state.
+	 */
+	private class IndexerStateListener implements IIndexerStateListener, IIndexChangeListener {
+	
+		public IndexerStateListener(){
+			progressMonitor.subTask(Messages.getString("ShowMethodCallLocationsJob.IndexingProject_SubTask_Msg") +cProject.getProject().getName() +"'..."); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		
+		private Double step = new Double (new Double(SEARCH_AND_INDEX_STEPS) / new Double( filesBelongsToComponent.length));
+		private double workLeftFromPreviousStep = 0;
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.cdt.core.index.IIndexerStateListener#indexChanged(org.eclipse.cdt.core.index.IIndexerStateEvent)
+		 */
+		public void indexChanged(IIndexerStateEvent event) {
+			try {
+				boolean indexerIsIdle = event.indexerIsIdle();
+				if(indexerIsIdle){
+					execute();
+				}
+			} catch (Exception e) {
+				errorProgress(Messages.getString("ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part1"), e); //$NON-NLS-1$
+			}
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.cdt.core.index.IIndexChangeListener#indexChanged(org.eclipse.cdt.core.index.IIndexChangeEvent)
+		 */
+		public void indexChanged(IIndexChangeEvent event) {
+
+			try{
+				if(progressMonitor.isCanceled()){
+					IIndexManager indexManager = CCorePlugin.getIndexManager();
+					removeListeners(indexManager);
+					cancelProgress();
+				}
+				
+				//Counting what's left from previous step and number of one step
+				double stepTo = workLeftFromPreviousStep + step;
+				Double stepNow = new Double(stepTo);
+				//Take out int value of this step (x from x.yyyyyy)
+				int workNow = stepNow.intValue();
+				stepNow = stepNow-workNow;
+				//put on hold what was left from this step to next step (yyyy from x.yyyy)			
+				workLeftFromPreviousStep = stepNow.doubleValue();
+				
+				progressMonitor.worked(workNow);
+				
+				//Continuing execution if indexer is idle.
+				IIndexManager indexManager = CCorePlugin.getIndexManager();
+				if(indexManager.isIndexerIdle()){
+					execute();
+				}
+			} catch (Exception e) {
+				errorProgress(Messages.getString("ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part1"), e);//$NON-NLS-1$
+			}			
+		}
+		
+		/**
+		 * Starts execution of search 
+		 * @throws JobCancelledByUserException 
+		 */
+		private void execute() {
+			IIndexManager indexManager = CCorePlugin.getIndexManager();
+			boolean projectIndexed = indexManager.isProjectIndexed(cProject);
+			
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Project indexed: " +projectIndexed  + " and indexer is idling: " +indexManager.isIndexerIdle());	//$NON-NLS-1$ //$NON-NLS-2$
+			//Search can be started if project is indexed and indexer is ready (not doing anything anymore).
+			if(projectIndexed && indexManager.isIndexerIdle()){
+				
+				removeListeners(indexManager);
+				executeSearch( searchString);								
+			}
+		}
+
+		/**
+		 * Removes listeners from index manager.
+		 * @param indexManager Index manager.
+		 */
+		private void removeListeners(IIndexManager indexManager) {
+			indexManager.removeIndexChangeListener(this);
+			indexManager.removeIndexerStateListener(this);
+		}
+		
+	}
+
+	/**
+	 * An error occurred, cancels progress and sends an error.
+	 */
+	private void errorProgress(String errMsg, Exception e) {
+		// Cancelling query
+		progressMonitor.done();
+		IStatus status = new Status(
+				Status.ERROR,Platform.PI_RUNTIME,
+				Status.ERROR,errMsg, e);		
+		done(status);
+	}	
+	
+	/**
+	 * Cancels progress without sending exception. 
+	 */
+	private void cancelProgress() {
+		// Cancelling query
+		progressMonitor.done();
+		done(Status.CANCEL_STATUS);
+	}
+
+	/**
+	 * Gets query listener interface.
+	 * @return this
+	 */
+	public IQueryListener getIQueryListener(){
+		return this;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.search.ui.IQueryListener#queryAdded(org.eclipse.search.ui.ISearchQuery)
+	 */
+	public void queryAdded(ISearchQuery query) {
+		// not needed
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.search.ui.IQueryListener#queryFinished(org.eclipse.search.ui.ISearchQuery)
+	 */
+	public void queryFinished(ISearchQuery query) {
+		//When query is finished, returning OK status
+		progressMonitor.done();
+        // Job has completed successfully
+	    done(Status.OK_STATUS);				
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.search.ui.IQueryListener#queryRemoved(org.eclipse.search.ui.ISearchQuery)
+	 */
+	public void queryRemoved(ISearchQuery query) {
+		cancelProgress();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.search.ui.IQueryListener#queryStarting(org.eclipse.search.ui.ISearchQuery)
+	 */
+	public void queryStarting(ISearchQuery query) {
+		// not needed		
+	}		
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/plugin/AppDepPlugin.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,408 @@
+/*
+* 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.appdep.plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.job.AppDepJobManager;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.RVCTToolChainInfo;
+import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException;
+import com.nokia.s60tools.sdk.SdkManager;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class AppDepPlugin extends AbstractUIPlugin {
+
+	/**
+	 * The shared instance. 
+	 */
+	private static AppDepPlugin plugin;
+	
+	/**
+	 * Command line tool settings should not be garbage collected
+	 * during the plugin's lifetime. Having a reference in here
+	 *  should enforce that singleton class is not garbage collected. 
+	 */
+	private static AppDepSettings settings;
+	
+	/**
+	 * Also <code>AppDepJobManager</code> instance should not be garbage collected
+	 * during the plugin's lifetime. Having a reference in here
+	 *  should enforce that singleton class is not garbage collected. 
+	 */
+	private static AppDepJobManager pluginJobManager;
+	
+	/**
+	 * Also <code>AppDepCacheIndexManager</code> instance should not be garbage collected
+	 * during the plugin's lifetime. Having a reference in here
+	 * should enforce that singleton class is not garbage collected. 
+	 */
+	private static AppDepCacheIndexManager cacheIndexManager;
+	
+	/**
+	 * Stores preferences
+	 */
+	private static IPreferenceStore prefsStore;
+
+	
+	/**
+	 * The constructor.
+	 */
+	public AppDepPlugin() {
+		plugin = this;
+		settings = AppDepSettings.getActiveSettings();
+		pluginJobManager = AppDepJobManager.getInstance();		
+		cacheIndexManager = AppDepCacheIndexManager.getInstance();		
+	}
+
+	/**
+	 * Gets plug-in install path.
+	 * @return plug-in install path
+	 * @throws IOException
+	 */
+	private 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.
+	 * @param pluginInstallPath Plugin installation path.
+	 * @return Path were image resources are located.
+	 * @throws IOException
+	 */
+	private String getImagesPath(String pluginInstallPath) throws IOException{
+		return pluginInstallPath
+				+ File.separatorChar
+				+ ProductInfoRegistry.getImagesDirectoryName();
+	}
+	
+	/**
+	 * This method is called upon plug-in activation
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {		
+		super.start(context);
+		
+		//Startup sequence starting message
+		//This debug println has been left into the code in purpose
+		System.out.println("*** AppDep Plugin STARTUP..."); //$NON-NLS-1$
+		
+		//Plug-in install location
+		String pluginInstallLocation = getPluginInstallPath();
+		//This debug println has been left into the code in purpose
+		System.out.println("pluginInstallLocation: " +  pluginInstallLocation); //$NON-NLS-1$
+
+		//Images path
+		String imagesPath = getImagesPath(pluginInstallLocation);		
+		//This 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);
+		
+		initializeSettings(pluginInstallLocation);
+
+		// Removing inconsistent partially created 
+		// cache files, if such exist
+		settings.cleanupPartiallyCreatedCacheFiles();
+						
+		//Startup sequence completed message
+		//This debug println has been left into the code in purpose
+		System.out.println("*** AppDep Plugin STARTED."); //$NON-NLS-1$
+	}
+
+	/**
+	 * Initializing tool settings.
+	 * @param pluginInstallPath Plugin installation path.
+	 */
+	private void initializeSettings(String pluginInstallPath) {
+
+		//
+		// Settings gained from SDK Support Plug-in
+		//
+		
+		// RVCT tools
+		resolveDefaultRvctToolBinaries();
+		//This debug println has been left into the code in purpose
+		System.out.println("RVCT Tool Binaries Directory: " + settings.getRvctToolsDir()); //$NON-NLS-1$
+		System.out.println("RVCT Tool Version: " + settings.getRvctToolsVersion()); //$NON-NLS-1$
+
+		// GCCE tools
+		try {
+			settings.setGcceToolsDir(SdkManager.getCSLArmToolchainInstallPathAndCheckReqTools());
+			settings.setGcceToolsInstalled( true );
+			//This debug println has been left into the code in purpose
+			System.out.println("GCCE Tool Binaries Directory: " + settings.getGcceToolsDir()); //$NON-NLS-1$
+		} catch (SdkEnvInfomationResolveFailureException e1) {
+			e1.printStackTrace();
+			settings.setGcceToolsInstalled( false );
+			AppDepConsole.getInstance().println(Messages.getString("AppDepPlugin.StartupFail_Msg_GCCE_Install_Location_Not_Found") //$NON-NLS-1$
+											+ e1.getMessage(),
+											IConsolePrintUtility.MSG_ERROR);    				
+		}
+
+		// Checking that at least GCCE or RVCT tools are installed.
+		// If not installed, showing an error message to user and aborting 
+		// plugin start by throwing an exception		
+		boolean isRequiredToolsInstalled = (settings.isGcceToolsInstalled() 
+										  || settings.isRvctToolsInstalled());
+		
+		if(! isRequiredToolsInstalled ){
+			String errorMsg = Messages.getString("AppDepPlugin.StartupFail_Msg_Could_Not_Detect_Required_Toolchains") //$NON-NLS-1$
+							  + Messages.getString("AppDepPlugin.StartupFail_Msg_Required_Tools_Tip") //$NON-NLS-1$
+							  + Messages.getString("AppDepPlugin.StartupFail_Msg_Install_Required_Tools_Tip_Cont") //$NON-NLS-1$
+							  + "\n\n" //$NON-NLS-1$
+							  + Messages.getString("AppDepPlugin.StartupFail_Msg_Timeout_Network_Check"); //$NON-NLS-1$
+			Shell sh = this.getWorkbench().getDisplay().getActiveShell();
+
+			String[] dlgButtonArr = { Messages.getString("AppDepPlugin.OK_Button_Label") }; //$NON-NLS-1$
+			MessageDialog dlg = new MessageDialog(sh,
+												  ProductInfoRegistry.getProductName(),
+												  ImageResourceManager.getImage(ImageKeys.IMG_APP_ICON),
+												  errorMsg,
+												  MessageDialog.ERROR,
+												  dlgButtonArr,
+												  0
+												  );
+			dlg.create();
+			dlg.open();
+			throw new RuntimeException(errorMsg);
+		}		
+		
+		//
+		// Setting location for external binaries
+		//					
+		String externalProgramsPath = pluginInstallPath
+										+ File.separatorChar
+										+ ProductInfoRegistry.getWin32BinariesRelativePath();
+		//External programs are to be found from this path
+		//This debug println has been left into the code in purpose
+		System.out.println("externalProgramsPath: " + externalProgramsPath); //$NON-NLS-1$
+		settings.setExternalProgramsPathName(externalProgramsPath);		
+		
+		// Resources path
+		String resourcesPath = pluginInstallPath 
+			+ File.separatorChar 
+			+ ProductInfoRegistry.getAppDepResourcesDirectory();
+		//This debug println has been left into the code in purpose
+		System.out.println("resourcesPath: " + resourcesPath); //$NON-NLS-1$
+		settings.setResourcesPath(resourcesPath);
+		
+		// Resolving XSL filename
+		String xslFileName =
+			 ProductInfoRegistry.getAppDepExportXSLFileName();
+		settings.setXSLFileName(xslFileName);
+		String isUsedByXSLFileName =
+			 ProductInfoRegistry.getAppDepIsUsedByXSLFileName();
+		settings.setIsUsedByXSLFileName(isUsedByXSLFileName);				
+	}
+
+	/**
+	 * Resolves which RVCT Tool Binaries should be used by default. 
+	 * The selection of the used RVCT toolchain is made based on 
+	 * the following criteria:
+	 *  - If there is several possibilities. 
+	 *    Using the binaries with newest timestamp. 
+	 *  - If only one possibility was available, using it. If none reporting 
+	 *    it to Console output.
+	 */
+	private void resolveDefaultRvctToolBinaries() {
+		
+		//Get all toolchains
+		RVCTToolChainInfo[] rvctTools = SdkManager.getInstalledRVCTTools();		
+		
+		if(rvctTools.length > 1){
+
+			// Environment variable is not defined or
+			// there was no match => Using the newest binaries.
+			useTheNewestAvailableRvctToolbinaries(rvctTools);							
+		}
+		else if(rvctTools.length == 1){
+			// There is only one possibility
+			useTheFirstAvailableToolchain(rvctTools);
+		}
+		else{
+			settings.setRvctToolsInstalled( false );
+
+			AppDepConsole.getInstance().println(Messages.getString("AppDepPlugin.StartupFail_Msg_RVCT_Install_Location_Not_Found"), //$NON-NLS-1$
+					 IConsolePrintUtility.MSG_ERROR);   
+		}
+	}
+
+	/**
+	 * Sets first encountered toolchain as used toolchain.
+	 * @param rvctTools RVCT toolchain info object array.
+	 */
+	private void useTheFirstAvailableToolchain(RVCTToolChainInfo[] rvctTools) {
+		String rvctToolBinariesDirectory = rvctTools[0].getRvctToolBinariesDirectory();
+		settings.setRvctToolsDir(rvctToolBinariesDirectory);
+		settings.setRvctToolsVersion(rvctTools[0].getRvctToolsVersion()); 
+		settings.setRvctToolsInstalled( true );
+	}
+
+	/**
+	 * Called when there is more than one available toolchain binaries.
+	 * Resolves which one is the newest, and sets it as default.
+	 * @param rvctTools Array to RVCT tool info structure.
+	 */
+	private void useTheNewestAvailableRvctToolbinaries(RVCTToolChainInfo[] rvctTools) {
+		String binDirStored = null;
+		String versionInfoStored = null;
+		long lastModifiedStored = 0;
+		for (int i = 0; i < rvctTools.length; i++) {
+			String binDirTmp = rvctTools[i].getRvctToolBinariesDirectory();
+			String elfProg = binDirTmp
+							 + File.separatorChar 
+							 + AppDepSettings.RVCT_FROM_ELF_EXECUTABLE;
+			File elfFile = new File(elfProg);
+			if(elfFile.exists()){
+				long modified = elfFile.lastModified();
+				if(modified > lastModifiedStored){
+					lastModifiedStored = modified;
+					binDirStored = binDirTmp;
+					versionInfoStored = rvctTools[i].getRvctToolsVersion();
+				}
+			}
+		}
+		if(binDirStored != null){
+			settings.setRvctToolsDir(binDirStored);
+			settings.setRvctToolsVersion(versionInfoStored); 
+			settings.setRvctToolsInstalled( true );			
+		}		
+		else{
+			useTheFirstAvailableToolchain(rvctTools);										
+		}
+	}
+	
+	/**
+	 * This method is called when the plug-in is stopped
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		
+		//Starting plugin shutdown sequence
+		//This debug println has been left into the code in purpose
+		System.out.println("AppDep Plugin SHUTDOWN..."); //$NON-NLS-1$
+		
+		// Shutting down registered ongoing background jobs
+		pluginJobManager.shutdown();
+		
+		// Informing also cache index manager about the shutdown
+		cacheIndexManager.shutdown();
+		
+		// Removing inconsistent partially created 
+		// cache files, if such exist
+		settings.cleanupPartiallyCreatedCacheFiles();
+		
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static AppDepPlugin 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.appdep.plugin", path); //$NON-NLS-1$
+	}
+	
+	/**
+	 * 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;
+	}	
+
+	/**
+	 * Bounds given context sensitive help ID into given UI control.
+	 * @param composite UI control to which bind given context-sensitive help ID.
+	 * @param contextHelpID Context-sensitive help ID.
+	 */
+	public static void setContextSensitiveHelpID(
+			Control composite, String contextHelpID) {
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, contextHelpID);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/ImageKeys.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,54 @@
+/*
+* 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.appdep.resources;
+
+/**
+ * Stores image key constants for the tool.
+ */
+public class ImageKeys {
+	public final static String IMG_APP_ICON = "APPDEP_IMG_APP_ICON"; //$NON-NLS-1$
+	public static final String BIN_OBJ = "APPDEP_BIN_OBJ"; //$NON-NLS-1$
+	public static final String BIN_OBJ_ERROR = "APPDEP_BIN_OBJ_ERROR"; //$NON-NLS-1$
+	public static final String BIN_OBJ_LINK = "APPDEP_BIN_OBJ_LINK"; //$NON-NLS-1$
+	public static final String BIN_OBJ_WARNING = "APPDEP_BIN_OBJ_WARNING"; //$NON-NLS-1$
+	public static final String BIN_OBJ_BIND = "APPDEP_BIN_OBJ_BIND"; //$NON-NLS-1$
+	public static final String SELECT_SDK = "APPDEP_SELECT_SDK"; //$NON-NLS-1$
+	public static final String NEW_ROOT_ACTION = "APPDEP_NEW_ROOT_ACTION"; //$NON-NLS-1$
+	public static final String ROOT_OBJ = "APPDEP_ROOT_OBJ"; //$NON-NLS-1$
+	public static final String ROOT_OBJ_ERROR = "APPDEP_ROOT_OBJ_ERROR"; //$NON-NLS-1$
+	public static final String FOLDER_OBJ = "APPDEP_FOLDER_OBJ"; //$NON-NLS-1$
+	public static final String IS_USED_BY_ACTION = "APPDEP_IS_USED_BY_ACTION"; //$NON-NLS-1$
+	public static final String EXPAND_ALL_ACTION = "APPDEP_EXPAND_ALL"; //$NON-NLS-1$
+	public static final String COLLAPSE_ALL_ACTION = "APPDEP_COLLAPSE_ALL"; //$NON-NLS-1$
+	public static final String WIZARD_BANNER = "APPDEP_WIZARD_BANNER"; //$NON-NLS-1$
+	public static final String CACHED_TARGET = "APPDEP_CACHED_TARGET"; //$NON-NLS-1$
+	public static final String NON_CACHED_TARGET = "APPDEP_NON_CACHED_TARGET"; //$NON-NLS-1$
+	public static final String NOT_SUPPORTED_TARGET = "APPDEP_NOT_SUPPORTED_TARGET"; //$NON-NLS-1$
+	public static final String CACHE_WARNING = "APPDEP_CACHE_WARNING"; //$NON-NLS-1$
+	public static final String FUNCTION_OBJ = "APPDEP_FUNCTION_OBJ"; //$NON-NLS-1$
+	public static final String EXPAND_SUBTREE = "APPDEP_EXPAND_SUBTREE"; //$NON-NLS-1$
+	public static final String VIRTUAL_FUNCTION_OBJ = "APPDEP_VIRTUAL_FUNCTION_OBJ"; //$NON-NLS-1$
+	public static final String CACHE_UPDATE_ACTION = "APPDEP_CACHE_UPDATE_ACTION"; //$NON-NLS-1$
+	public static final String FIND_ACTION = "APPDEP_FIND_ACTION"; //$NON-NLS-1$
+	public static final String FOLDER_OBJ_ERR = "APPDEP_FOLDER_OBJ_ERR"; //$NON-NLS-1$	
+	public static final String SEARCH = "APPDEP_SEARCH"; //$NON-NLS-1$
+	public static final String TRAFFIC_LIGHT_GREEN_OBJ = "APPDEP_TRAFFIC_LIGHT_GREEN_OBJ"; //$NON-NLS-1$
+	public static final String TRAFFIC_LIGHT_YELLOW_OBJ = "APPDEP_TRAFFIC_LIGHT_YELLOW_OBJ"; //$NON-NLS-1$
+	public static final String TRAFFIC_LIGHT_RED_OBJ = "APPDEP_TRAFFIC_LIGHT_RED_OBJ"; //$NON-NLS-1$
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/ImageResourceManager.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,191 @@
+/*
+* 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.appdep.resources;
+
+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.appdep.plugin.AppDepPlugin;
+
+/**
+ * Manages image resources for the tool.
+ */
+public class ImageResourceManager {
+
+	public static void loadImages(String imagesPath){
+		
+    	Display disp = Display.getCurrent();
+    	
+    	ImageRegistry imgReg = AppDepPlugin.getDefault().getImageRegistry();
+    	
+    	//
+    	// Storing images to image registry.
+    	//
+    	Image img = new Image( disp, imagesPath + "\\appdep.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.IMG_APP_ICON, img );
+
+        img = new Image( disp, imagesPath + "\\select_sdk_action.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.SELECT_SDK, img );
+        
+    	img = new Image( disp, imagesPath + "\\appdep_wizard_banner.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.WIZARD_BANNER, img );
+
+    	img = new Image( disp, imagesPath + "\\cached_target.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.CACHED_TARGET, img );
+
+    	img = new Image( disp, imagesPath + "\\non_cached_target.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.NON_CACHED_TARGET, img );
+
+    	img = new Image( disp, imagesPath + "\\not_supported_target.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.NOT_SUPPORTED_TARGET, img );
+        
+    	img = new Image( disp, imagesPath + "\\cache_warning.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.CACHE_WARNING, img );
+
+    	img = new Image( disp, imagesPath + "\\cache_update.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.CACHE_UPDATE_ACTION, img );
+        
+    	img = new Image( disp, imagesPath + "\\find.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.FIND_ACTION, img );
+       
+    	img = new Image( disp, imagesPath + "\\folder_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.FOLDER_OBJ, img );
+        
+        /*******************************************************************************
+         * The following pieces of the graphic are taken from from Eclipse 3.1 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
+         * 
+         * Note that Eclipse 3.1.2 installation was enhanced with CDT 3.0 plug-ins 
+         * and many graphics actually comes from CDT.
+         * 
+         *******************************************************************************/
+        
+        // Original location of the graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\bin_obj.gif
+    	img = new Image( disp, imagesPath + "\\bin_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.BIN_OBJ, img );              
+        
+        // Original location of the graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\function_obj.gif
+    	img = new Image( disp, imagesPath + "\\function_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.FUNCTION_OBJ, img );
+        
+        // Original location of the graphic:
+        // eclipse3.1.2\plugins\org.eclipse.help.webapp_3.1.0\advanced\images\plus.gif
+    	img = new Image( disp, imagesPath + "\\expand_subtree.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.EXPAND_SUBTREE, img );
+
+        // Original location of the graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.debug.ui_3.0.2\icons\elcl16\collapseall.gif
+    	img = new Image( disp, imagesPath + "\\collapse_all.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.COLLAPSE_ALL_ACTION, img );
+        
+        /*******************************************************************************
+         * The following pieces of the graphic are modified from the graphic taken from Eclipse 3.1 
+         * 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 (unless otherwise mentioned):
+         * eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\bin_obj.gif
+         *  
+         * Note that Eclipse 3.1.2 installation was enhanced with CDT 3.0 plug-ins 
+         * and many graphics actually comes from CDT.
+         * 
+         *******************************************************************************/
+    	img = new Image( disp, imagesPath + "\\bin_obj_error.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.BIN_OBJ_ERROR, img );
+	
+    	img = new Image( disp, imagesPath + "\\bin_obj_link.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.BIN_OBJ_LINK, img );
+	
+    	img = new Image( disp, imagesPath + "\\bin_obj_warning.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.BIN_OBJ_WARNING, img );
+
+    	img = new Image( disp, imagesPath + "\\bin_obj_bind.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.BIN_OBJ_BIND, img );          
+        
+    	img = new Image( disp, imagesPath + "\\new_root_action.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.NEW_ROOT_ACTION, img );
+	
+    	img = new Image( disp, imagesPath + "\\root_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.ROOT_OBJ, img );
+        
+    	img = new Image( disp, imagesPath + "\\is_used_by_action.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.IS_USED_BY_ACTION, img );	        
+        
+    	img = new Image( disp, imagesPath + "\\root_obj_error.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.ROOT_OBJ_ERROR, img );
+	
+    	img = new Image( disp, imagesPath + "\\expand_all.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.EXPAND_ALL_ACTION, img );
+
+        img = new Image( disp, imagesPath + "\\search.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.SEARCH, img );          
+        
+        //The image is modified based on following original graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\function_obj.gif
+    	img = new Image( disp, imagesPath + "\\virtual_func_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.VIRTUAL_FUNCTION_OBJ, img );
+        
+        //The image is modified based on following original graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\function_obj.gif
+    	img = new Image( disp, imagesPath + "\\traffic_light_green_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.TRAFFIC_LIGHT_GREEN_OBJ, img );
+        
+        //The image is modified based on following original graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\function_obj.gif
+    	img = new Image( disp, imagesPath + "\\traffic_light_yellow_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.TRAFFIC_LIGHT_YELLOW_OBJ, img );
+        
+        //The image is modified based on following original graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\obj16\function_obj.gif
+    	img = new Image( disp, imagesPath + "\\traffic_light_red_obj.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.TRAFFIC_LIGHT_RED_OBJ, img );
+        
+        //The image is modified based on following original graphic:
+        // eclipse3.1.2\plugins\org.eclipse.cdt.ui_3.0.2.5\icons\ovr16\error_co.gif
+    	img = new Image( disp, imagesPath + "\\folder_obj_err.png" );        	 //$NON-NLS-1$
+        imgReg.put( ImageKeys.FOLDER_OBJ_ERR, img );
+	}
+	
+	/**
+	 * Gets image descriptor for the given key.
+	 * @param key Image key.
+	 * @return image descriptor for the given key
+	 */
+	public static ImageDescriptor getImageDescriptor( String key ){
+    	ImageRegistry imgReg = AppDepPlugin.getDefault().getImageRegistry();
+    	return  imgReg.getDescriptor( key );		
+	}	
+
+	/**
+	 * Gets image for the given key.
+	 * @param key Image key.
+	 * @return image for the given key
+	 */
+	public static Image getImage( String key ){
+    	ImageRegistry imgReg = AppDepPlugin.getDefault().getImageRegistry();
+    	return  imgReg.get(key);		
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/Messages.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,42 @@
+/*
+* 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.appdep.resources;
+
+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.appdep.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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/resources/messages.properties	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,453 @@
+#
+# 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 the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+AbstractFunctionData.NotValidOrdinal_ErrMsg=Given function ordinal is not valid positive integer value from 1...N: 
+AbstractShowMethodCallLocationsAction.MainView_Action_Text=Show Method Call Locations
+AbstractShowMethodCallLocationsAction.MainView_Action_Tooltip=Show source locations where selected method is called.
+AbstractShowMethodCallLocationsAction.MethodCallLocSearch_Job_Name_Text=Searching Method Call Locations 
+AbstractShowMethodCallLocationsAction.OpeningFile_Msg=Opening source file: '
+AbstractShowMethodCallLocationsAction.SearchingMethodCallLocationsForMethod_JobInfoMsg=Searching method call locations for method:
+AbstractShowMethodCallLocationsAction.SourceFileDoesNotExist_ErrMsg_Part1=Searched source file: '
+AbstractShowMethodCallLocationsAction.SourceFileDoesNotExist_ErrMsg_Part2=' does not exist.
+AddComponentPrefixSearchOrderDialog.AddComponent_Txt=Add component
+AddComponentPrefixSearchOrderDialog.Help_Txt=Add component to prefix seach order list.
+AddSISFilesDialog.Add_BtnCaptionText=Add..
+AddSISFilesDialog.Complete_InfoMessage=Press OK to add SIS files.
+AddSISFilesDialog.Default_InfoMessage=Browse for SIS files to be added under analysis
+AddSISFilesDialog.DialogTitleText=Add SIS Files
+AddSISFilesDialog.Location_ColumnTitleText=Location
+AddSISFilesDialog.Name_ColumnTitleText=Name
+AddSISFilesDialog.NotSupportedSISFileDialog_ErrMsg=Only Symbian OS 9.x SIS files are supported.\n\nThe following SIS files are not in supported format and cannot be added under analysis:\n
+AddSISFilesDialog.Remove_BtnCaptionText=Remove
+AddSISFilesDialog.RemoveAll_BtnCaptionText=Remove All
+AddSISFilesDialog.SISFileBrowseDialog_TitleText=Select SIS file(s)
+AppDepCoreFacade.Cache_Dir_Create_Failed_Msg=Cache directory creation failed\!
+AppDepCoreFacade.EmptySymbolCahceFileCreation_ErrMsg=Errors when creating empty symbol cache file, error was: 
+AppDepCoreFacade.File_Delete_Failed_Msg=Failed to delete file
+AppDepCoreFacade.Is_Not_Supported_Msg_End=is not supported
+AppDepCoreFacade.Toolchain_Str=Toolchain 
+AppDepCoreFacade.UnexpectedException_In_prepareParameters_Method=Unexpected exception in prepareParameters method
+AppDepFindDialog.Cannot_Find_Components_FindDialog_InfoMsg=Cannot find components for
+AppDepFindDialog.EndOfTreeReached_ContinueFromBeginningQuery_FindDialog_InfoQueryMsg=End of tree reached. Do you want to continue from the beginning?
+AppDepFindDialog.Find_Components_FindDialog_TitleText=Find Components
+AppDepFindDialog.FindNext_FindDialog_ButtonText=Find Next
+AppDepFindDialog.FindWhat_FindDialog_LabelText=Find what:
+AppDepPlugin.OK_Button_Label=OK
+AppDepPlugin.StartupFail_Msg_Could_Not_Detect_Required_Toolchains=Could not detect any of the required build toolchain binaries. 
+AppDepPlugin.StartupFail_Msg_GCCE_Install_Location_Not_Found=Failed to resolve GCCE tool installation location: 
+AppDepPlugin.StartupFail_Msg_Install_Required_Tools_Tip_Cont=Please install either of the toolchains or both, restart workbench, and try again.
+AppDepPlugin.StartupFail_Msg_Required_Tools_Tip=Either RVCT or GCCE tools must be installed in order to run the application. 
+AppDepPlugin.StartupFail_Msg_RVCT_Install_Location_Not_Found=Failed to resolve RVCT tool installation location.
+AppDepPlugin.StartupFail_Msg_Timeout_Network_Check=If you have a license server checkout for RVCT, make sure that your internet connection is active and the armcc tool can be executed and restart the IDE.
+AppDepSearchDialog.Case_Sensitive_Msg=Case Sensitive
+AppDepSearchDialog.Components_Msg=Components
+AppDepSearchDialog.Contains_Msg=Contains
+AppDepSearchDialog.Ends_With_Msg=Ends With
+AppDepSearchDialog.Exact_Match_Msg=Exact Match
+AppDepSearchDialog.Exported_Functions_Msg=Exported Functions
+AppDepSearchDialog.Imported_Functions_Msg=Imported Functions
+AppDepSearchDialog.Match_Type_Msg=Match type:
+AppDepSearchDialog.Options_Msg=Options
+AppDepSearchDialog.Regular_Expression_Msg=Regular Expression
+AppDepSearchDialog.Search_Btn_Msg=Search
+AppDepSearchDialog.Search_Console_Err_Msg_Part1=Error encountered when searching: '
+AppDepSearchDialog.Search_Console_Err_Msg_Part2=', error was:
+AppDepSearchDialog.Search_For_Msg=Search For
+AppDepSearchDialog.Search_Msg=Search from SDK: 
+AppDepSearchDialog.Search_Results_Msg=Search results:
+AppDepSearchDialog.Search_String_Msg=Search string:
+AppDepSearchDialog.Search_User_Err_Msg=Error encountered on search. See console for details.
+AppDepSearchDialog.SetComponent_Console_Err_Msg_Part1=Error encountered when setting component: '
+AppDepSearchDialog.SetComponent_Console_Err_Msg_Part2=' to tree, error was:
+AppDepSearchDialog.Starts_With_Msg=Starts With
+AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_ComponentQuery=Uses component's name for matching.
+AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_FunctionQuery_UsingBaseName=Uses function's base name for matching (no prefix and parameters).
+AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_FunctionQuery_UsingLongName=Uses complete function name for matching (with prefix and parameters).
+AppDepSearchDialog.TooManyResults_ErrMsg_Part1=Too many Search results (
+AppDepSearchDialog.TooManyResults_ErrMsg_Part2=), please redefine Search string.
+AppDepSettings.Build_Type=Build type '
+AppDepSettings.CSL_Arm_Toolchain=CSL Arm Toolchain
+AppDepSettings.Failed_to_Delete_Cache_File=Failed to delete partially created cache file: 
+AppDepSettings.Failed_to_Delete_Symbols_File=Failed to delete symbol tables cache file: 
+AppDepSettings.Failed_to_Delete_Temp_Cache_File=Failed to delete temporary cache file: 
+AppDepSettings.GNU_Comp_Coll=GNU Compiler Collection
+AppDepSettings.Not_Supported_Toolchain=' does not have supported toolchain\!
+AppDepSettings.Not_Supported_Toolchains=' does not have any supported toolchains\!
+AppDepSettings.NotSupported=' is not supported\!
+AppDepSettings.Restore_NonExisting_Instance=Trying to restore non-existing command line tool settings instance.
+AppDepSettings.RVCT_Comp_Tools=RealView Compilation Tools
+AppDepSettings.Target_Array_Is_Empty=Trying to set currently used targets with an empty array.
+AppDepSettings.Target=Target '
+AppDepSettings.Targets_Does_Not_Map_To_Same_Toolchain=All target selections has to map to the same toolchain.
+AppDepSettings.Toolchain=Toolchain '
+BuildTargetEntry.CacheNeedsUpdateStatus_InfoMsg=Cache needs update
+BuildTargetEntry.CacheReadyStatus_InfoMsg=Cache ready
+BuildTargetEntry.Counting_InfoMsg=Counting...
+BuildTargetEntry.CreatingCacheIndexStatus_InfoMsg=Creating cache index
+BuildTargetEntry.EmptyTargetStatus_InfoMsg=Empty target
+BuildTargetEntry.GeneratingCacheStatus_InfoMsg=Generating cache
+BuildTargetEntry.NoCacheStatus_InfoMsg=No cache
+BuildTargetEntry.NotApplicable_Abbrev_Str=N/A
+BuildTargetEntry.NotSupportedStatus_InfoMsg=Not supported
+BuildTargetEntry.UnresolvedStatus_InfoMsg=Unresolved status
+BuildTargetEntryInfo.BuildTargetInfoValidateFailed_ErrMsg=Build target info entry cannot contain an empty fields.
+BuildTargetTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg=Unexpected sort criteria for build target entries encountered: 
+BuildTypeDebug.BuildType_Description=Debug
+BuildTypeRelease.BuildType_Description=Release
+CacheDataLoadProcessManager.CacheDataLoaded_InfoMsg=Cache data loaded. Updating view...
+CacheDataLoadProcessManager.CacheDataLoadFailed_ErrMsg=Failed to load cache data 
+CacheDataLoadProcessManager.LoadingCache_ProgressMsg=Loading cache...
+CacheDataManager.Size_Str=size
+CacheDataManager.TargetCacheListSizeNegative_ErrMsg=or targetCacheList size is negative
+CacheDataManager.TriedToAccessUninitializedSingletonInstance_ErrMsg=Tried to access unitialized instance of singleton class
+CacheFactory.CacheDataIntegriryFailure_Detailed_ErrMsg=). Detailed component information: 
+CacheFactory.CacheDataIntegriryFailure_ErrMsg=Cache integrity failure.
+CacheFactory.CacheDataIntegriryFailure_InvalidComponent_ErrMsg=Trying to add invalid component into cache data coming from (
+CacheFactory.CacheDataIntegriryFailure_NoEOF_Mark_ErrMsg=Cache data file does not have end of file mark (
+CacheFactory.CacheDataIntegriryFailure_NoMatch_ErrMsg=) does not match.
+CacheFactory.CacheDataIntegriryFailure_NoVersionNumber_ErrMsg=Cache data file does not have version number (
+CacheFactory.CacheDataIntegriryFailure_version_NoEOF_Mark_ErrMsg=Cache data file does not have end of file mark (
+CacheFactory.CacheDataIntegriryFailure_Version1_ErrMsg=Dependencies cache data version (
+CacheFactory.CacheDataIntegriryFailure_Version2_ErrMsg=) and symbols cache data version (
+CacheFactory.CacheDataLoadFailure_ErrMsg=Cache data load failure. Failed to load data from '
+CacheFactory.CacheDataLoadFailure_Unexpected_ErrMsg=' due to an unexpected exception (
+CacheGenerationOptions.Invalid_LibraryType_Msg=Invalid library type was given as cache generation option
+CacheGenerationOptionsWizardPage.Finish_Button_InfoMsg=Press Finish to start cache generation
+CacheGenerationOptionsWizardPage.ImportLibraryGroupd_Text=Import library type
+CacheGenerationOptionsWizardPage.Page_Title=Cache Generation Options
+CacheGenerationOptionsWizardPage.ToolchainSelCombo_Text=Toolchain
+CacheGenerationOptionsWizardPage.ToolchainSelCombo_Title_Label_Text=Toolchain: 
+CacheGenerationOptionsWizardPage.UseDsoFile_RadioButton_Text=Dynamic shared object (.dso)
+CacheGenerationOptionsWizardPage.UseImportLibrary_RadioButton_Text=Import library (.lib)
+CacheGenerationOptionsWizardPage.Window_Title=Cache Generation
+CacheIndex.CacheIndex_Generate_Failed_Msg=Failed to generate cache index
+CacheIndex.DuplicateComponents_Encountered_ErrMsg=Encountered a duplicate component in cache file
+CacheIndexCreator.Creating_Cache_Indices=Creating cache indices
+CacheUpdateMainViewAction.Cache_Is_Up_To_Date_InfoMsg=Currently selected target cache is already up-to-date.
+CacheUpdateMainViewAction.Caches_Are_Up_To_Date_InfoMsg=Currently selected target caches are already up-to-date.
+CacheUpdateMainViewAction.CacheUpdateMainView_Action_Text=Update Cache
+CacheUpdateMainViewAction.CacheUpdateMainView_Action_Tooltip=Update cache for currently selected targets
+CollapseAllMainViewAction.CollapseAll_Action_Text=Collapse All
+CollapseAllMainViewAction.CollapseAll_Action_Tooltip=Collapse the tree hierarchy
+ComponentIsUsedByMainViewAction.IsUsedBy_Action_Text=Is Used By...
+ComponentIsUsedByMainViewAction.IsUsedBy_Action_Tooltip=Search for the components that use the selected component
+ComponentIsUsedByMainViewAction.IsUsedBy_Job_Title_Text=Seeking using components
+ComponentIsUsedByMainViewAction.IsUsedBy_Query_Start_Console_Msg=Querying for the components that are using '
+ComponentListViewSorter.Unexpected_Sort_Criteria_Msg=Unexpected sort criteria for import functions encountered.
+ComponentPropertiesData.ComponentAlreadyAdded_ErrMsg_Part1=Cache data integrity violation attempt.
+ComponentPropertiesData.ComponentAlreadyAdded_ErrMsg_Part2=\ The component has been already added as a used component: 
+ComponentPropertiesData.ComponentIsNotUsed_ErrMsg_Part1=The queried component (
+ComponentPropertiesData.ComponentIsNotUsed_ErrMsg_Part2=) is not used by this component (
+ComponentPropertiesData.PropFieldDesc_BinaryFormat=Binary format
+ComponentPropertiesData.PropFieldDesc_CacheTimestamp=Cache Timestamp
+ComponentPropertiesData.PropFieldDesc_Capabilities=Capabilities
+ComponentPropertiesData.PropFieldDesc_Directory=Directory
+ComponentPropertiesData.PropFieldDesc_DllRefTableCount=Dll ref table count
+ComponentPropertiesData.PropFieldDesc_Filename=Filename
+ComponentPropertiesData.PropFieldDesc_MaxHeapSize=Max Heap Size
+ComponentPropertiesData.PropFieldDesc_MinHeapSize=Min Heap Size
+ComponentPropertiesData.PropFieldDesc_SecureID=Secure ID
+ComponentPropertiesData.PropFieldDesc_StackSize=Stack Size
+ComponentPropertiesData.PropFieldDesc_UID1=UID1
+ComponentPropertiesData.PropFieldDesc_UID2=UID2
+ComponentPropertiesData.PropFieldDesc_UID3=UID3
+ComponentPropertiesData.PropFieldDesc_VendorID=Vendor ID
+ComponentPropertiesMainViewAction.Component_Does_Not_Exist_In_Cache_Msg=Component does not exist in cache (or cache file is reserved due to ongoing background operation).
+ComponentPropertiesMainViewAction.ComponentProperties_Action_Text=Properties...
+ComponentPropertiesMainViewAction.ComponentProperties_Action_Tooltip=Show the component properties
+ComponentPropertiesMainViewAction.ComponentProperties_Dialog_Title=Component Properties
+ComponentTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg=Unexpected sort criteria for component list node entries encountered: 
+CreateProjectJob.Err_Msg=Error encountered when creating project.
+CreateProjectJob.ShowSourceInProject_Task_Msg=Searching for project files and creating the project
+DependenciesCache.ComponentNotFoundFromCache_ErrMsg=Queried component cannot be found from the cache
+DependenciesCache.DepCacheCannotHaveDuplicateComponents_ErrMsg=Dependencies cache cannot have duplicate component definitions\!
+DependenciesCache.ImportedComponentNotFoundFromCache_ErrMsgEnd=' cannot be found from the cache for parent component '
+DependenciesCache.ImportedComponentNotFoundFromCache_ErrMsgStart=Queried imported component '
+DEPreferencePage.ComponentPrefixSearchOrder_Group_Txt=Component prefix search order
+DEPreferencePage.DontAskAgain_Group_Txt=Confirm set as new root action
+DEPreferencePage.DontAskAgain_ToolTip_Txt=If you select, this questioner won't occur again. Selection can be changed from preferences afterwards.
+DEPreferencePage.DontAskAgain_Txt=Don't ask
+DEPreferencePage.Prefix_Add_tooltip_Txt=Add new component
+DEPreferencePage.Prefix_Add_Txt=Add
+DEPreferencePage.Prefix_Down_tooltip_Txt=Move component down in search order
+DEPreferencePage.Prefix_Down_Txt=Down
+DEPreferencePage.Prefix_Remove_tooltip_Txt=Remove component
+DEPreferencePage.Prefix_Remove_Txt=Remove
+DEPreferencePage.Prefix_Up_tooltip_Txt=Move component up in search order
+DEPreferencePage.Prefix_Up_Txt=Up
+ExpandAllMainViewAction.ExpandAllAction_Text=Expand All
+ExpandAllMainViewAction.ExpandAllAction_Tooltip=Expand the tree hierarchy
+ExpandSubtreeMainViewAction.ExpandSubTree_Action_Text=Expand Subtree
+ExpandSubtreeMainViewAction.ExpandSubTree_Action_Tooltip=Expand the subtree of the selected component
+ExportFunctionDataSorter.Unexpected_Sort_Criteria_Msg=Unexpected sort criteria for export functions encountered.
+ExportJob.Complete_Str=complete
+ExportJob.Components_Str=components
+ExportJob.Export_Canceled_By_User_Msg=Export report process was canceled by user
+ExportJob.Export_Failed_Msg=Export failed
+ExportJob.Exported_Functions_Str=exported functions
+ExportJob.Exporting_Msg=Exporting 
+ExportJob.File_Not_Found_Msg=File not found
+ExportJob.File_Writing_Str=file writing
+ExportJob.Percent_Complete_Msg=% complete
+ExportJob.Processing_Msg=Prosessing
+ExportJob.Transform_Not_Complete_Msg=XML transform was not complete
+ExportJob.XML_Str=XML
+ExportReportListViewAction.Error_Was_Msg=Error was
+ExportReportListViewAction.Export_Failed_Msg=Export failed\!
+ExportReportListViewAction.Export_Not_Complete_Msg=Exporting report was not complete\!
+ExportReportListViewAction.ExportReport_Action_Text=Export report...
+ExportReportListViewAction.ExportReport_Action_Tooltip=Export report to file
+ExportReportListViewAction.ExportReport_Msg_End=XML report will be exported to same directory with extension .xml
+ExportReportListViewAction.ExportReport_Msg_Start=Export report
+ExportReportListViewAction.HTMLReport_Exported_Msg=HTML report exported to file
+ExportReportListViewAction.IsUsedByReportPrefix=_IsUsedBy
+ExportReportListViewAction.Nothing_To_Export_Msg=Nothing to export\!
+ExportReportListViewAction.Str_Function=Function
+ExportReportListViewAction.XMLReport_Exported_Msg=XML report exported to file
+ExportReportMainViewAction.Export=Export
+ExportReportMainViewAction.ExportFilePrefix_String=ExportReport_
+ExportReportMainViewAction.ExportReport_Action_Text=Export report...
+ExportReportMainViewAction.ExportReport_Action_Tooltip=Export report to file
+ExportReportMainViewAction.ExportReport_Msg_End=XML report will be exported to same directory with extension .xml
+ExportReportMainViewAction.ExportReport_Msg_Start=Export report
+ExportReportMainViewAction.HTMLExported_Msg=HTML report exported to file
+ExportReportMainViewAction.XMLExported_Msg=XML report exported to file
+ExportVisitor.Could_Not_Count_Components_Msg=Export report - could not count components\!
+ExportVisitor.Process_Cancelled_ByUser_ConsoleMsg=Export process cancelled by user when processing: 
+ExportVisitor.Process_Cancelled_ByUser_When_Processing_ConsoleMsg=Cancelled by user when processing properties 
+ExportVisitor.Process_Cancelled_ByUser_When_Processing_ExpFuncs_ConsoleMsg=Cancelled by user when processing exported functions 
+ExportVisitor.Process_Cancelled_ByUser_When_Processing_File_ConsoleMsg=Cancelled by user when processing file 
+ExportVisitor.Progress_Update_Failed_ConsoleMsg=Progress update failed with error: 
+FindMainViewAction.FindMainView_Action_Text=Find...
+FindMainViewAction.FindMainView_Action_Tooltip=Find components from tree hierarchy
+FunctionIsUsedByExportFunctionMainViewAction.IsUsedByExportFunction_Action_Text=Is Used By...
+FunctionIsUsedByExportFunctionMainViewAction.IsUsedByExportFunction_Action_Tooltip=Search for the components that use the selected function
+FunctionIsUsedByImportFunctionMainViewAction.IsUsedByImportFunction_Action_Text=Is Used By...
+FunctionIsUsedByImportFunctionMainViewAction.IsUsedByImportFunction_Action_Tooltip=Search for the components that use the selected function
+FunctionIsUsedByMainViewAction.FunctionIsUsedBy_Job_Title_Text=Seeking using components
+FunctionIsUsedByMainViewAction.FunctionIsUsedBy_Query_Start_Console_Msg=Querying for the components that are using '
+GeneralMessages.CacheDataReload_Failed_For_Msg=Cache data load failed for
+GeneralMessages.CacheGeneration_Job_Title_Text=Cache generation
+GeneralMessages.Failed_To_Update_Current_Settings=Failed to update current settings\!
+GeneralMessages.Select_SDK_First_ErrMsg=Select an SDK first\!
+GeneralMessages.Unexpected_Column_Index_ErrMsg=Unexpected column index
+GenerateCacheJob.CacheGener_Canceled_By_User_Msg=Cache generation process was canceled by user.
+GenerateCacheJob.CacheGener_Completed_For_Msg=Cache creation was completed for 
+GenerateCacheJob.CacheGener_Do_You_Want_To_Select_Component_Question=Do you want to select component from the cache?
+GenerateCacheJob.CacheGener_Ended_WithExitVal_Msg=Cache generation process ended with exit value: 
+GenerateCacheJob.CacheGener_Failed_For_Msg=Cache generation failed for  
+GenerateCacheJob.CacheGener_Failed_WithCode_Msg=Cache generation failed with exit code=.
+GenerateCacheJob.CacheGener_For_Msg=Generating cache for 
+GenerateCacheJob.CacheGener_Interrupted_Msg=Cache generation process was interrupted\!
+GenerateCacheJob.CacheGener_Removing_Corrupted_Files_Msg=Removing possibly corrupted cache files.
+GenerateCacheJob.CacheGener_Removing_Partially_Generated_Files_Msg=Removing only partially generated cache files.
+GenerateCacheJob.CacheGener_Started_Msg=Cache generation process was started.
+GenerateCacheJob.CacheGenerFailed_Msg_InvalidSettings=Starting of cache generation failed (InvalidCmdLineToolSettingException): 
+GenerateCacheJob.CacheGenerFailed_Msg_OS_NotSupported=Starting of cache generation failed because host OS is not supported. Only Windows OS is supported.
+GenerateCacheJob.CacheIndex_Update_Failed_FileNotExist_Msg=Cache index update failed (CacheFileDoesNotExistException): 
+GenerateCacheJob.CacheIndex_Update_Failed_IOExecption_Msg=Cache index update failed (IOException): 
+GenerateCacheJob.CacheIndex_Update_Started_Msg=Update process started successfully.
+GenerateCacheJob.CacheIndex_Update_Starting_Msg=Starting cache index update process.
+GenerateCacheJob.CacheIndex_Updating_Msg=Updating cache index
+GenerateCacheJob.Exit_Code=exit code
+GenerateCacheJob.Percent_Complete=% complete
+GenerateCacheJob.See_Console_Log_Msg=See console log for error details.
+GenerateCacheJob.StartingCacheGener_Msg=Starting cache generation...
+ImportFunctionDataSorter.UnexpectedSortCriteria_Msg=Unexpected sort criteria for import functions encountered.
+LibPropertiesData.FunctionOrdinalMustBeUnique_ErrMsg=Each function ordinal must be unique inside a library.
+ListView.BinaryFormat_TableColumnTitle=Binary format
+ListView.MaxHeapSize_TableColumnTitle=Max Heap Size
+ListView.MinHeapSize_TableColumnTitle=Min Heap Size
+ListView.Name_TableColumnTitle=Name
+ListView.SecureId_TableColumnTitle=Secure ID
+ListView.StackSize_TableColumnTitle=Stack Size
+ListView.UID1_TableColumnTitle=UID1
+ListView.UID2_TableColumnTitle=UID2
+ListView.UID3_TableColumnTitle=UID3
+ListView.VendorID_TableColumnTitle=Vendor ID
+LocateComponentDialog.Label_Txt=Select a concrete component for:
+LocateComponentDialog.Link_ToolTip_Txt=Open Component prefix search order preferences
+LocateComponentDialog.Link_Txt=Open prefix preferences
+LocateComponentDialog.Shell_Txt=Select concrete component.
+LocateComponentJob.Err_Msg=Error encountered when locating component, error was
+LocateComponentMainViewAction.Locate_Action_Text=Locate Component...
+LocateComponentMainViewAction.Query_Start_Console_Msg=Starting to seek possible implementations of selected component: '
+LocateComponentMainViewAction.LocateJobName_Str=locating component
+LocateComponentMainViewAction.NoConcreteComponentsFound_InfoMsg_Part1=No concrete component matches were found for component '
+LocateComponentMainViewAction.NoConcreteComponentsFound_InfoMsg_Part2=' from cache.
+LocateSourceMainViewAction.Locate_Action_Tooltip=Locate concrete implementation of the selected component 
+MainView.ComponentProperties_TabTitle=Component Properties
+MainView.ExportedFunctions_TabTitle=Exported Functions
+MainView.Feature_Description=Dependency Explorer
+MainView.ImportedFunctions_TabTitle=Imported Functions
+MainView.KeyPresses_Disabled_While_Search_Is_Ongoing_InfoMsg=Key shortcuts are disabled while dependency search is ongoing.
+MainView.LicenseManager_LicenseCheck_ErrMsg=FLEXlm error checking out license for 
+MainView.LicenseManager_Verify_ErrMsg=License Manager did not verify
+MainView.Name_TableColumnTitle=Name
+MainView.Offset_TableColumnTitle=Offset
+MainView.Ordinal_TableColumnTitle=Ordinal
+MainView.Property_TableColumnTitle=Property
+MainView.Value_TableColumnTitle=Value
+MainViewComponentTreeContentProvider.ComponentTreeView_Msg_After_Extension_Startup=Double-click to select an SDK.
+MainViewComponentTreeLabelProvider.ComponentBindType_Auto=Auto bind from:
+MainViewComponentTreeLabelProvider.ComponentBindType_User=User bind from:
+MainViewComponentTreeLabelProvider.ComponentDoesNotExist_StatusMsg=Component does not exist
+MainViewComponentTreeLabelProvider.Search_Aborted_StatusMsg=Search aborted by user
+MainViewComponentTreeLabelProvider.Searching_StatusMsg=Searching...
+MainViewDataPopulator.Cache_File_Not_Found_Msg_End=' was not found.
+MainViewDataPopulator.Cache_File_Not_Found_Msg_Start=Cache file '
+MainViewDataPopulator.Failed_To_Create_Cache_Reader_Msg=Failed to create cache reader: 
+MainViewDataPopulator.View_Population_Failed_Msg=\u00B4View population failed: 
+MainViewPopulateProgressListener.Search_Aborted_Msg_End=\ components)
+MainViewPopulateProgressListener.Search_Aborted_Msg_Start=Search aborted (Found 
+MainViewPopulateProgressListener.Search_Complete_Msg_End=\ components)
+MainViewPopulateProgressListener.Search_Complete_Msg_Start=Search complete (Found 
+MainViewPopulateProgressListener.Searching_Msg_End=\ components)
+MainViewPopulateProgressListener.Searching_Msg_Start=Searching for indirect dependencies (Found 
+MainViewPopulateProgressListener.Searching_Msg=Searching for indirect dependencies...
+MainViewSelectionChangedListener.Component_Prefix=, Component: 
+MainViewSelectionChangedListener.SDK_Prefix=SDK: 
+PropertyDataSorter.Unexpected_Sort_Criteria_Msg=Unexpected sort criteria for import functions encountered.
+RefreshMainViewAction.Refresh_Action_Text=Refresh
+RefreshMainViewAction.Refresh_Action_Tooltip=Refresh the tree hierarchy
+SearchConfirmNewRootSelectionDialog.DontAskAgain_ToolTip_Txt=If you select, this confirmation won't be asked again. Selection can be changed from preferences afterwards.
+SearchConfirmNewRootSelectionDialog.DontAskAgain_Txt=Don't ask again 
+SearchConfirmNewRootSelectionDialog.Question_Txt_Part1=Do you want to set: '
+SearchConfirmNewRootSelectionDialog.Question_Txt_Part2=' as new root component?
+SearchConfirmNewRootSelectionDialog.Shell_Txt=Set as new root component?
+SearchMainViewAction.SearchMainView_Action_Text=Search...
+SearchMainViewAction.SearchMainView_Action_Tooltip=Search for components and functions
+SelectAllFromListAction.SelectAll_Action_Text=Select All
+SelectAllFromListAction.SelectAll_Action_Tooltip=Select all items
+SelectAllFromTableViewerComponentListViewAction.SelectAll_Action_Text=Select All
+SelectAllFromTableViewerComponentListViewAction.SelectAll_Action_Tooltip=Select all items
+SelectAllFromTableViewerMainViewAction.SelectAll_Action_Text=Select All
+SelectAllFromTableViewerMainViewAction.SelectAll_Action_Tooltip=Select all items
+SelectBuildTargetWizardPage.AddSISFile_BtnCaptionText=Add SIS files...
+SelectBuildTargetWizardPage.BuildType_Debug_InfoMsg=Debug (udeb)
+SelectBuildTargetWizardPage.BuildType_Release_InfoMsg=Release (urel)
+SelectBuildTargetWizardPage.BuildType_Str=Build type
+SelectBuildTargetWizardPage.Cache_Generation_Needed_For_SIS_Files=Cache generation is needed for SIS files, 
+SelectBuildTargetWizardPage.Cache_Generation_Needed=Cache generation is needed, 
+SelectBuildTargetWizardPage.Cache_Index_Not_Yet_Created=Cache index is not yet created, please wait a moment
+SelectBuildTargetWizardPage.Cache_Is_Being_Generated=Cache generation process is already active for this SDK, please wait for its completion before starting a new one
+SelectBuildTargetWizardPage.Cache_Needs_Update=Cache needs to be updated, press Finish to update, or press Next to modify update options
+SelectBuildTargetWizardPage.ComponentCount_ColumnText=Component count
+SelectBuildTargetWizardPage.Dumpsis.exe_Does_Not_Exist_ErrorMsg=Cache cannot be generated because dumpsis.exe is missing from selected SDK.
+SelectBuildTargetWizardPage.Invalid_Toolchain_Mix_ErrorMsg=All selected targets must use same default toolchain.
+SelectBuildTargetWizardPage.BinaryDumpTool_Does_Not_Exist_ErrorMsg=Cache cannot be generated because '%s' is missing from selected SDK.
+SelectBuildTargetWizardPage.Press_Finish_To_Start_Generation=press Finish to start generation, or 
+SelectBuildTargetWizardPage.Press_Next_To_Continue=Press Next to continue
+SelectBuildTargetWizardPage.Press_Next_To_To_Modify_Generation_Options=press Next to modify generation options
+SelectBuildTargetWizardPage.SDK_Str=SDK
+SelectBuildTargetWizardPage.Selected_Target_Does_Not_Have_BuiltComponents=Selected target(s) does not have any built components
+SelectBuildTargetWizardPage.ShowDebugBuild_CheckboxCaptionText=Show debug build targets instead of release targets
+SelectBuildTargetWizardPage.ShowSupportedAndNonEmptyTargets_CheckboxCaptionText=Show only supported and non-empty build targets
+SelectBuildTargetWizardPage.Startup_InfoMsg=Select a single, or multiple build targets to be analyzed
+SelectBuildTargetWizardPage.Status_ColumnText=Status
+SelectBuildTargetWizardPage.Target_Not_Supported=All selected targets must be supported
+SelectBuildTargetWizardPage.TargetType_ColumnText=Target type
+SelectBuildTargetWizardPage.WizardPageDescription=Select a single, or multiple build targets to be analyzed
+SelectBuildTargetWizardPage.WizardPageName=Build Target Selection
+SelectBuildTargetWizardPage.WizardPageTitle=Available Build Targets
+SelectComponentWizardPage.BuildTypeTitle_Text=Build type:
+SelectComponentWizardPage.DateModified_ColumnText=Date Modified
+SelectComponentWizardPage.Duplicate_Components_InfoMsg_Footer=Therefore the inclusion of components in the dependency\ntree is undeterministic for the components having more\nthan one instance.
+SelectComponentWizardPage.Duplicate_Components_InfoMsg_Header=The selected build targets contain the following\nduplicate components:
+SelectComponentWizardPage.Duplicate_Components_WarningMsg=Warning - duplicate components detected.
+SelectComponentWizardPage.Name_ColumnText=Name
+SelectComponentWizardPage.OnFinish_User_InfoMessage=Press Finish to continue
+SelectComponentWizardPage.Search_Field_Title=Search:
+SelectComponentWizardPage.SelectComponent_User_InfoMessage=Select component to be analyzed
+SelectComponentWizardPage.ShowOnlySISFiles_Msg=Show only components from SIS files
+SelectComponentWizardPage.Target_ColumnText=Target
+SelectComponentWizardPage.Title=Components
+SelectComponentWizardPage.Window_Title=Component Selection
+SelectComponentWizardPageContentProvider.Failed_To_Get_Component_List=Failed to get component list: 
+SelectNewRootComponentMainViewAction.Cache_For=Cache for 
+SelectNewRootComponentMainViewAction.Needs_Update=\ needs update. 
+SelectNewRootComponentMainViewAction.Perform_Cache_Update_Now_Question=Do you want to perform cache update now?
+SelectNewRootComponentMainViewAction.SelectNewRootComponen_Action_T=Select New Root Component...
+SelectNewRootComponentMainViewAction.SelectNewRootComponen_Action_Tooltip=Select a new root component
+SelectNewSDKMainViewAction.SelectNewSDK_Action_Text=Select New SDK...
+SelectNewSDKMainViewAction.SelectNewSDK_Action_Tooltip=Select a new SDK
+SelectSDKWizard.Failed_To_Set_Default_Gener_Options=Failed to set default cache generation options\!
+SelectSDKWizard.Failed_To_Set_Gener_Options=Failed to set cache generation options: 
+SelectSDKWizardPage.EPOCROOT_NotFound_ErrMsg=EPOCROOT directory cannot be found. Check SDK Preferences.
+SelectSDKWizardPage.Press_Next_To_Continue=Press Next to continue
+SelectSDKWizardPage.SDKListViewerComponentTitle=SDKs:
+SelectSDKWizardPage.WizardPageDescription=Select an SDK
+SelectSDKWizardPage.WizardPageName=SDK Selection
+SelectSDKWizardPage.WizardPageTitle=Available SDKs
+SetNewRootComponentListViewAction.SetNewRoot_Action_Text=Set As New Root Component
+SetNewRootComponentListViewAction.SetNewRoot_Action_Tooltip=Set the selected component as new root component
+SetNewRootMainViewAction.SetNewRoot_Action_Text=Set As New Root Component
+SetNewRootMainViewAction.SetNewRoot_Action_Tooltip=Set the selected component as new root component
+ShowMethodCallLocationsJob.CouldNotFindBldInfFile_ErrMsg=Could not find bld.inf file for component '
+ShowMethodCallLocationsJob.CreatingProjectFromBldInf_SubTask_Msg=Creating project by bld.inf file: '
+ShowMethodCallLocationsJob.ExcecutingSearch_SubTask_Msg=Excecuting search
+ShowMethodCallLocationsJob.IndexingProject_SubTask_Msg=Indexing project: '
+ShowMethodCallLocationsJob.JobCanceledByUser_ErrMsg=Job cancelled by user.
+ShowMethodCallLocationsJob.SearchingBldInf_SubTask_Msg=Searching bld.inf file...
+ShowMethodCallLocationsJob.SearchingFiles_SubTask_Msg=Searching files belongs to component: '
+ShowMethodCallLocationsJob.StartingIndexing_SubTask_Msg=Starting to indexing project
+ShowMethodCallLocationsJob.UnableToAddFile_ErrMsg_Part1=Show Method Call Locations was unable to add file: '
+ShowMethodCallLocationsJob.UnableToAddFile_ErrMsg_Part2=' to search targets, reason: 
+ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part1=Unable to execute search, see console for more specific details.
+ShowMethodCallLocationsJob.UnableToExecuteSearch_ErrMsg_Part2=Unable to execute search, reason: 
+ShowSourceFileAndCreateProjectMainViewAction.CreateProjectJob_Title_Text=\ creating project where is file: 
+ShowSourceFileAndCreateProjectMainViewAction.EmptySelection_ErrMsg=Cannot get selection for searching project files.
+ShowSourceFileActionGeneralMessage.OpenFileAndSetLineFocus_ErrMsg="Failed open source file and set focus on requested method.";
+ShowSourceFileAndCreateProjectMainViewAction.ShowSource_Action_Text=Show Source File In Project
+ShowSourceFileAndCreateProjectMainViewAction.ShowSource_Action_Tooltip=Show source file and open/create project where source file belongs to.
+ShowSourceFileAndCreateProjectMainViewAction.SourceFileOpenFailed_ErrMsg_ToUser=Failed to open source file in method location. See Console for more specific details.
+ShowSourceFileAndCreateProjectMainViewAction.SourceFileOpenFailed_ErrMsg=Error encountered when opening source file, error was: 
+ShowSourceFileMainViewAction.OpeningFile_Msg=Opening source file: '
+ShowSourceFileMainViewAction.ShowSource_Action_Text=Show Source File
+ShowSourceFileMainViewAction.ShowSource_Action_Tooltip=Show the source file, where method is implemented
+ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part1=Searching source file for component: '
+ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part2=', ordinal: '
+ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg_ToUser=Source file cannot be found. See Console for more specific details.
+ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg=Error encountered when searching source file, error was:
+ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part1=Cannot find source file for component: '
+ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part2=', ordinal: '
+ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part3=', method name: '
+ShowSourceFileMainViewAction.SourceFileDoesNotExist_ErrMsg_Part1=Searched source file: '
+ShowSourceFileMainViewAction.SourceFileDoesNotExist_ErrMsg_Part2=' does not exist.
+ShowSourceFileMainViewAction.SourceFileOpenedFromSISFile_Info_Msg=Source file to be opened might be different than one used when analyzed SIS file was build. 
+SISFileEntryTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg=Unexpected sort criteria for SIS file entries encountered: 
+SourceFileFeatureCommonMessages.EmptySelection_ErrMsg=Cannot get selection for searching source file.
+SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg_ToUser=Unable to show method call locations, see console for details.
+SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg=Unable to show method call locations, reason: 
+SourceFileFeatureCommonMessages.TheComponet_ErrMsg_Part3= The component 
+SourceFileFeatureCommonMessages.Reason_ErrMsg_Part4= is from SIS target and not present in selected Build
+SymbolsCache.ComponentNotFoundFromCache_ErrMsg=Queried component cannot be found from the library cache data
+SymbolsCache.SymbolHasDublicateDefinition_Err_Msg=Symbols cache cannot have duplicate library definitions\!
+TargetCache.CacheNotSetUpProperly_ErrMsg=Target cache instance members have not been set up properly\!
+UsedByOtherComponentsJob.Activatinb_View=Activating view
+UsedByOtherComponentsJob.Canceled_By_User_ConsoleMsg=Seeking of dependencies was canceled by user.
+UsedByOtherComponentsJob.Components_Using_Component=\ component(s) using the component 
+UsedByOtherComponentsJob.Components_Using_Function=\ component(s) using the function 
+UsedByOtherComponentsJob.Failed_To_Invoke_ListView_ConsoleMsg=Failed to invoke list view for showing the component information (
+UsedByOtherComponentsJob.Failed_To_Seek_IO_Exception=Failed to seek using components because an I/O Exception was thrown (
+UsedByOtherComponentsJob.Failed_To_Seek_No_Cache_File=Failed to seek using components because cache file did not exist.
+UsedByOtherComponentsJob.Found=Found 
+UsedByOtherComponentsJob.InvalidParams_ConsoleMsg=Invalid parameters were given to the UsedByOtherComponentsJob class.
+UsedByOtherComponentsJob.Percentage_Completed=% complete.
+UsedByOtherComponentsJob.Seeking_Components_Using_ConsoleMsg=Seeking components that are using 
+UsedByOtherComponentsJob.Seeking_dependencies_ConsoleMsg=Seeking for dependencies...
+WizardUtils.Unexpected_Wizard_Exit_Status=Encountered unexpected wizard exit status\!
+AddSisAndUpdateCacheMainViewAction.Cache_is_up_to_date_msg=Cache for currently selected target is already up-to-date. 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/search/MatchType.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.search;
+
+/**
+ * Class for search match type
+ */
+public class MatchType {
+	
+	/**
+	 * <code>true</code> in case of case sensitive search.
+	 */
+	private boolean isCaseSensitiveSearch = false;
+	
+	/**
+	 * Match type used for the search.
+	 */
+	private MatchTypes matchType;
+	
+	/**
+	 * Constructor.
+	 * @param matchType Match type used for the search.
+	 */
+	public MatchType(MatchTypes matchType){
+		this.matchType = matchType;		
+	}
+	
+	/**
+	 * Match types selectable in search Options
+	 */
+	public enum MatchTypes{
+		CONTAINS, // Matches when the search string is contained in object's name
+		STARTS_WITH, // Matches when object's name starts with the search string
+		ENDS_WITH, // Matches when object's name ends with the search string
+		EXACT_MATCH, // Matches when object's name and the search string equals
+		REGULAR_EXPRESSION, // Matches when the search string as regular expression matches with object's name
+	}
+
+	/**
+	 * Gets case sensitive check status.
+	 * @return <code>true</code> in case of case sensitive search, otherwise <code>false</code>.
+	 */
+	public boolean isCaseSensitiveSearch() {
+		return isCaseSensitiveSearch;
+	}
+
+	/**
+	 * Sets case sensitiveness for the search.
+	 * @param isCaseSensitiveSearch the isCaseSensitiveSearch to set
+	 */
+	public void setCaseSensitiveSearch(boolean isCaseSensitiveSearch) {
+		this.isCaseSensitiveSearch = isCaseSensitiveSearch;
+	}
+
+	/**
+	 * Gets match type.
+	 * @return the matchType
+	 */
+	public MatchTypes getMatchType() {
+		return matchType;
+	}
+
+	/**
+	 * Sets match type.
+	 * @param matchType the matchType to set
+	 */
+	public void setMatchType(MatchTypes matchType) {
+		this.matchType = matchType;
+	}	
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/search/SearchConstants.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,36 @@
+/*
+* 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.appdep.search;
+
+
+/**
+ * Search constants class offers search related constants and enumerators.
+ */
+public class SearchConstants {
+
+	/**
+	 * There are the following search types available.
+	 */
+	public enum SearchType{
+		SEARCH_COMPONENTS,
+		SEARCH_IMPORTED_FUNCTIONS,
+		SEARCH_EXPORTED_FUNCTION
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,54 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Common abstract base class for all main view
+ * related actions.
+ */
+public abstract class AbstractMainViewAction extends Action {
+
+	/**
+	 * Reference to the view.
+	 */
+	MainView view;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public AbstractMainViewAction(MainView view) {
+		super();
+		this.view = view;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		// Makes sure that action buttons states are updated 
+		// correctly whenever some action is performed.
+		view.updateViewActionEnabledStates();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractShowMethodCallLocationsAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,207 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.locatecomponent.ShowMethodCallLocationsJob;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Common service for implementation for show method call location actions.
+ */
+public abstract class AbstractShowMethodCallLocationsAction extends AbstractMainViewAction {
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public AbstractShowMethodCallLocationsAction(MainView view){
+		super(view);		
+		setText(Messages.getString("AbstractShowMethodCallLocationsAction.MainView_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("AbstractShowMethodCallLocationsAction.MainView_Action_Tooltip")); //$NON-NLS-1$			
+	}
+	
+	/**
+	 * Common run method implementation to method available for sub classes 
+	 * and to be called from run() method of the sub class. 
+	 * Method implementation that takes only method name as parameter.
+	 * @param methodName Method name to search method call locations for.
+	 * @param methodName method name from user selection
+	 */
+	protected void runImpl(String methodName) {
+			
+			String currentRootComponent = null;
+			AppDepSettings settings = AppDepSettings.getActiveSettings();
+			currentRootComponent =  settings.getCurrentlyAnalyzedComponentName();		
+			
+			Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+
+			if(currentRootComponent == null){
+				// User has not selected any components for analysis
+				String infoMsg = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+				AppDepMessageBox msgBox = new AppDepMessageBox(sh, infoMsg, SWT.OK | SWT.ICON_INFORMATION);
+				msgBox.open();
+				return;
+			}				
+			
+			Object obj = view.getComponentTreeSelectedElement();
+
+			if (obj == null) {
+				// We might get null-selections when
+				// tree is expanded/collapsed.
+				// Getting component node that is cached.
+				obj = view.getMostRecentlySelectedComponentNode();
+				if(obj == null){
+					return;
+				}
+			}			
+			
+			try {
+				// Component is for sure a component node
+				ComponentNode node = (ComponentNode) obj;
+				ComponentNode parent = node.getParent();
+				String componentName = parent.getName();
+				// Check whether can we proceed to start the Job or not .
+				if(canProceedToShowMethod(componentName)){
+					// Triggering method call location job
+					runImpl(methodName, componentName);	
+				}
+				else{
+					showErrorMsgDialog(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg_ToUser"));
+					AppDepConsole.getInstance().println(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg")
+							+Messages.getString("SourceFileFeatureCommonMessages.TheComponet_ErrMsg_Part3")+componentName+ " "
+							+Messages.getString("SourceFileFeatureCommonMessages.Reason_ErrMsg_Part4"),IConsolePrintUtility.MSG_ERROR);
+				}			
+			
+			} 		
+			 catch (Exception e) {
+				e.printStackTrace();
+				showErrorMsgDialog(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg_ToUser")); //$NON-NLS-1$
+				AppDepConsole.getInstance().println(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg") +e, AppDepConsole.MSG_ERROR); //$NON-NLS-1$
+			}		
+			 finally{
+				// Remember to always call AbstractMainViewAction
+				// base class implementation
+				super.run();
+			 }
+					
+		}
+
+	/**
+	 * Common run method implementation to method available for sub classes 
+	 * and to be called from run() method of the sub class. 
+	 * Method implementation that takes both method and component name as parameter.
+	 * @param methodName Method name to search method call locations for.
+	 * @param componentName Component name to search method call locations from.
+	 */
+	protected void runImpl(String methodName, String componentName) {
+		String jobName = ProductInfoRegistry.getProductName() 
+						+ " - " //$NON-NLS-1$ 
+						+ Messages.getString("AbstractShowMethodCallLocationsAction.MethodCallLocSearch_Job_Name_Text"); //$NON-NLS-1$
+		String mainTaskMessage = Messages.getString("AbstractShowMethodCallLocationsAction.SearchingMethodCallLocationsForMethod_JobInfoMsg")  + " " + methodName;  //$NON-NLS-1$ //$NON-NLS-2$
+
+		// Creating a job for executing the search
+		ShowMethodCallLocationsJob job = new ShowMethodCallLocationsJob(jobName, mainTaskMessage, componentName, methodName, true );
+		
+		job.setPriority(Job.DECORATE);
+		job.schedule();
+	}
+	
+	/**
+	 * Shows on error message
+	 * @param msg Error message.
+	 */
+	protected void showErrorMsgDialog(String msg){
+		AppDepMessageBox msgBox = new AppDepMessageBox(msg, SWT.ICON_ERROR | SWT.OK);
+		msgBox.open();			
+	}
+	
+	/**
+	 * This function will validate whether the componentName is from SIS target.
+	 * if it is from Sis Target & not present in another targets then return <code>false<code>
+	 * else if it is present in other targets then return <code>true<code> 
+	 * @param componentName in which searching the method locations.
+	 */
+	protected boolean canProceedToShowMethod(String componentName){
+		AppDepSettings settings = AppDepSettings.getActiveSettings();
+		if(settings.getCurrentlyAnalyzedComponentTargetPlatform().getId().equalsIgnoreCase("sis")){
+			// Storing component list nodes into here
+			List<String> allComponentNames = new ArrayList<String>();
+			List<String> duplicateItemsList = new ArrayList<String>();
+			String targetPlatformId = settings.getCurrentlyAnalyzedComponentTargetPlatform().getId();
+			String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathName(targetPlatformId);
+			File cacheFile = new File(cacheFileAbsolutePathName);
+			if(!cacheFile.exists()){
+				try {
+					throw new CacheFileDoesNotExistException(cacheFileAbsolutePathName);
+				} catch (CacheFileDoesNotExistException e) {
+					e.printStackTrace();
+				}
+			}
+			String buildDirectory = settings.getBuildDir(targetPlatformId);
+			// Getting existing or creating new instance of cache index 
+			CacheIndex cacheIndx = null;
+			Set<String> tmpSet = null;
+			Iterator<String> tmpIter = null;
+			try {
+				cacheIndx = CacheIndex.getCacheIndexInstance(cacheFile, buildDirectory);
+				tmpSet= cacheIndx.getComponentNameSet();
+				tmpIter = tmpSet.iterator();
+				CacheIndex.getComponentIteratorForGivenSettings(settings, duplicateItemsList);
+			} catch (IOException e) {
+				e.printStackTrace();
+			} catch (CacheFileDoesNotExistException e) {
+				e.printStackTrace();
+			}
+			// Iterating through the whole set
+			if(tmpIter != null){
+				while (tmpIter.hasNext()) {
+					String cmpName = tmpIter.next();
+					if(!allComponentNames.contains(cmpName))
+						allComponentNames.add(cmpName);
+				}
+			}
+			if(allComponentNames.contains(componentName)&& !duplicateItemsList.contains(componentName))
+				return false;
+		}
+		
+		return true;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AbstractShowSourceFileAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,377 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+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.Status;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.editors.text.TextFileDocumentProvider;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewDataPopulator;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.util.sourcecode.ISourceFinder;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+import com.nokia.s60tools.util.sourcecode.SourceFinderFactory;
+
+/**
+ * Real implementation for show source action.
+ */
+public abstract class AbstractShowSourceFileAction extends AbstractMainViewAction{
+	
+	/**
+	 * Build variant used for source file search (=target Platform used).
+	 */
+	protected String variant;
+	/**
+	 * SDK used for source file search.
+	 */
+	protected SdkInformation sdkInfo;
+	/**
+	 * Set to <code>true</code> if current target selection contains SIS file targets.
+	 */
+	protected boolean showSISfileWarningDialog = false;
+	/**
+	 * EPOCROOT used for source file search.
+	 */
+	protected String epocRootPath;
+	/**
+	 * Build type used for source file search.
+	 */
+	protected String build;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public AbstractShowSourceFileAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ShowSourceFileMainViewAction.ShowSource_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ShowSourceFileMainViewAction.ShowSource_Action_Tooltip")); //$NON-NLS-1$
+	
+	}
+	
+	/**
+	 * Real run method implementation for run() method.
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 * @param methodName method name from user selection
+	 * @param ordinal from user selection
+	 */
+	protected void runImpl(String methodName,
+	String ordinal) {
+		Object obj = view.getComponentTreeSelectedElement();
+
+		if (obj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// Getting component node that is cached.
+			obj = view.getMostRecentlySelectedComponentNode();
+			if(obj == null){
+				return;
+			}
+		}
+		try {
+			// Component is for sure a component node
+			ComponentNode node = (ComponentNode) obj;
+			String componentName = node.getName();
+
+			AppDepSettings settings = AppDepSettings.getActiveSettings();
+			if (settings.getCurrentlyAnalyzedComponentName() != null) {
+
+				AppDepConsole.getInstance().println(
+						Messages.getString("ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part1") //$NON-NLS-1$
+										+ componentName//$NON-NLS-1$ 
+										+Messages.getString("ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part2") //$NON-NLS-1$
+										+ ordinal//$NON-NLS-1$										
+										+ "'..."); //$NON-NLS-1$
+				
+				// Collection needed information to get source file path
+				ISourceFinder finder = SourceFinderFactory
+						.createSourceFinder(AppDepConsole.getInstance());
+				
+				// Resolving source search parameters based on the settings and component name
+				resolveSearchParameters(componentName, settings);
+
+				//Search source file location by collected information
+				SourceFileLocation location = finder.findSourceFile(ordinal,
+						methodName, componentName, variant, build, epocRootPath);
+
+				if(location.getSourceFileLocation() == null){
+					
+					String msg = Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part1") //$NON-NLS-1$
+						+ componentName//$NON-NLS-1$
+						+Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part2") //$NON-NLS-1$
+						+ ordinal//$NON-NLS-1$
+						+Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part3") //$NON-NLS-1$
+						+ methodName//$NON-NLS-1$
+						+"'";//$NON-NLS-1$
+					
+					AppDepConsole.getInstance().println(msg, AppDepConsole.MSG_WARNING); 
+					
+					showErrorMsgDialog(msg);
+					
+				}else{
+					//Open found file, and set focus to method line
+					openFileAndSetFocus(location);
+				}
+				
+				//If SIS file is in analysis, showing on information dialog, that opened suorce file is not neccessarily same than used when SIS was build.
+				if(showSISfileWarningDialog ){
+					AppDepMessageBox msgBox = new AppDepMessageBox(
+							Messages.getString("ShowSourceFileMainViewAction.SourceFileOpenedFromSISFile_Info_Msg"),  //$NON-NLS-1$
+							SWT.ICON_INFORMATION | SWT.OK);
+					msgBox.open();						
+				}
+				
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			String msg = Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg") //$NON-NLS-1$
+			+" "//$NON-NLS-1$
+			+ e;
+			AppDepConsole.getInstance().println(
+					msg,  //$NON-NLS-1$
+					AppDepConsole.MSG_ERROR);
+			showErrorMsgDialog(Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg_ToUser"));//$NON-NLS-1$
+			
+		}		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+
+	/**
+	 * Resolves source search parameters based on the settings and component name
+	 * @param componentName Component name.
+	 * @param settings Used settings.
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 * @throws CacheFileDoesNotExistException
+	 */
+	protected void resolveSearchParameters(String componentName,
+			AppDepSettings settings) throws IOException,
+			CacheIndexNotReadyException, CacheFileDoesNotExistException {
+		sdkInfo = settings.getCurrentlyUsedSdk();
+		epocRootPath = sdkInfo.getEpocRootDir();
+		build = settings.getBuildType().getBuildTypeName();
+		
+		variant = MainViewDataPopulator.getTargetPlatformIdStringForComponent(settings, componentName);		
+		
+		showSISfileWarningDialog = includesSISFileTarget(settings);
+	}
+
+	/**
+	 * Checks if target platform array includes a SIS file target.
+	 * @param settings settings object to be used for getting target platform data
+	 * @return <code>true</code> if includes a SIS file target, otherwise <code>false</code>.
+	 */
+	private boolean includesSISFileTarget(AppDepSettings settings) {
+		ITargetPlatform[] usedPlatforms = settings.getCurrentlyUsedTargetPlatforms();
+		for (int i = 0; i < usedPlatforms.length; i++) {
+			ITargetPlatform platform = usedPlatforms[i];
+			if(platform.getId().equals(AppDepSettings.TARGET_TYPE_ID_SIS)){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * Show on error message
+	 * @param msg Error message.
+	 */
+	protected void showErrorMsgDialog(String msg){
+		AppDepMessageBox msgBox = new AppDepMessageBox(msg, SWT.ICON_ERROR | SWT.OK);
+		msgBox.open();			
+	}
+
+	/**
+	 * OpensFile in editor
+	 * @param location Source file location
+	 * @throws URISyntaxException
+	 * @throws CoreException
+	 */
+	private void openFileAndSetFocus(final SourceFileLocation location) throws URISyntaxException, CoreException {
+
+		AppDepConsole.getInstance().println(
+				Messages.getString("ShowSourceFileMainViewAction.OpeningFile_Msg") //$NON-NLS-1$
+					+ location.getSourceFileLocation() //$NON-NLS-1$)					
+					+ "'"); //$NON-NLS-1$)
+		
+		File file = new File(location.getSourceFileLocation());
+		if(file == null || !file.exists()){
+			AppDepConsole.getInstance().println(
+					Messages.getString("ShowSourceFileMainViewAction.SourceFileDoesNotExist_ErrMsg_Part1") //$NON-NLS-1$
+						+ location.getSourceFileLocation() 
+						+Messages.getString("ShowSourceFileMainViewAction.SourceFileDoesNotExist_ErrMsg_Part2"), AppDepConsole.MSG_ERROR); //$NON-NLS-1$)
+			return;			
+		}
+
+		//Create URI to open file
+		String uriStr = location.getSourceFileLocation().replace("\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+		uriStr = "file://" + uriStr; //$NON-NLS-1$
+		final URI srcURI = new URI(uriStr);
+		
+		//Find default editor for that file
+		IEditorRegistry reg = PlatformUI.getWorkbench().getEditorRegistry();
+		
+		
+		IEditorDescriptor editor = reg.getDefaultEditor(file.getName());
+		//We open editor by it's ID
+		final String editorId = editor.getId();
+					
+		
+		//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 {
+
+					IEditorPart part = IDE.openEditor(page, srcURI, editorId, true);
+					
+					if(part != null){
+						//Set focus to correct line
+						 setFocusToLineWhereMethodIs(location);
+					}
+
+				} catch (PartInitException e) {
+					e.printStackTrace();
+					Status status = new Status(IStatus.ERROR,
+							"com.nokia.s60tools.metadataeditor", 0, e //$NON-NLS-1$
+									.getMessage(), e);
+
+					throw new CoreException(status);
+				} 
+
+			}
+		};		
+		ResourcesPlugin.getWorkspace().run(runOpen, null, IWorkspace.AVOID_UPDATE, null);
+		
+	}
+	
+	/**
+	 * Setting the focus in opened file there where the method name occurs,
+	 * must call after file is opened and only if opening was successful
+	 * @param location Source file location
+	 * @throws CoreException
+	 */
+	protected void setFocusToLineWhereMethodIs(
+			final SourceFileLocation location) throws CoreException {
+		//Runnable to open new file
+		final IWorkspaceRunnable runSetFocus = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// do the actual work in here
+
+				try {
+					//Setting focus to correct line
+					IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+					IEditorPart activeEditor = activePage.getActiveEditor();
+
+					if(activeEditor != null && activeEditor instanceof TextEditor){
+						
+						// This is actually an instance of 'org.eclipse.cdt.internal.ui.editor.CEditor' 
+						// that extends org.eclipse.ui.editors.text.TextEditor
+						TextEditor editor = (TextEditor) activeEditor;
+						IDocument doc =  getDocument(editor);
+						if(doc != null){
+
+							String text = doc.get();
+							int methodOffset = location.getMethodOffset();
+							if(methodOffset == SourceFileLocation.OFFSET_NOT_FOUND){
+								// Removing parameters and getting new offset.
+								String methodNameWithOutParams = location.getMethodName();
+								methodNameWithOutParams = methodNameWithOutParams.substring(0, methodNameWithOutParams.indexOf("(")); //$NON-NLS-1$
+								methodOffset = text.indexOf(methodNameWithOutParams);
+
+								if(methodOffset == SourceFileLocation.OFFSET_NOT_FOUND){
+									// Removing possible namespace and getting new offset.
+									String separator = "::"; //$NON-NLS-1$
+									int separatorLocation = methodNameWithOutParams.lastIndexOf(separator);
+									if(separatorLocation > 0){
+										methodNameWithOutParams = methodNameWithOutParams.substring(separatorLocation + separator.length());
+										methodOffset = text.indexOf(methodNameWithOutParams);
+									}
+								}
+							}
+							
+							editor.setHighlightRange(methodOffset, 0, true);
+						}							
+					}					
+
+				} catch (Exception e) {
+					e.printStackTrace();
+					Status status = new Status(IStatus.ERROR,
+							Messages.getString("ShowSourceFileActionGeneralMessage.OpenFileAndSetLineFocus_ErrMsg"), 0, e //$NON-NLS-1$
+									.getMessage(), e);
+					throw new CoreException(status);
+				} 
+
+			}
+		};
+		
+		
+		ResourcesPlugin.getWorkspace().run(runSetFocus, null, IWorkspace.AVOID_UPDATE, null);
+	}
+	
+	/**
+	 * Returns the document interface for the currently active document 
+	 * in the given editor.
+	 * @param editor Editor to ask currently active document from. 
+	 * @return Document interface if found, otherwise <code>null</code>.
+	 */
+	private IDocument getDocument(TextEditor editor) {
+		
+		TextFileDocumentProvider  documentProvider = (TextFileDocumentProvider) editor.getDocumentProvider();
+		if(documentProvider != null){
+			return  documentProvider.getDocument(editor.getEditorInput());
+			}								
+		return null;
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/AddSisAndUpdateCacheMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,175 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.s60tools.appdep.ui.actions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.job.GenerateCacheJob;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AddSISFilesDialog;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+public class AddSisAndUpdateCacheMainViewAction extends AbstractMainViewAction {
+
+    public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.AddSisAndUpdateCacheMainViewAction";  //$NON-NLS-1$
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public AddSisAndUpdateCacheMainViewAction(MainView view){
+		super(view);
+		setText("Add SIS files...");  //$NON-NLS-1$
+		setToolTipText("Add SIS files");  //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		
+		ImageDescriptor imageDesc = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ADD);
+		setImageDescriptor(imageDesc);
+			
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		
+		String currentRootComponent = null;
+		AppDepSettings activeSettings = AppDepSettings.getActiveSettings();
+		currentRootComponent =  activeSettings.getCurrentlyAnalyzedComponentName();	
+		
+		if(currentRootComponent == null){
+			// User has not selected any components for analysis
+			String infoMsg = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+			new AppDepMessageBox(infoMsg, SWT.OK | SWT.ICON_INFORMATION).open();
+			return;
+		}
+		
+		String[] previouslyAnalysedSISFiles = null;
+		Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+		AddSISFilesDialog entryDialog = new AddSISFilesDialog(sh);
+		entryDialog.create();
+		
+		// If already selected some set of SIS files getting the list...
+		if(activeSettings.isInSISFileAnalysisMode()){
+			//...and setting the initial list
+			previouslyAnalysedSISFiles = activeSettings.getSISFilesForAnalysis();
+			entryDialog.setInitialSISFileSet(previouslyAnalysedSISFiles);
+		}
+		int userSelection = entryDialog.open();
+		if(userSelection == Window.OK){
+			// Getting selected SIS files
+			String[] selectedSISFiles = entryDialog.getSelectedSISFiles();
+			if(selectedSISFiles.length > 0){
+				activeSettings.setSISFilesForAnalysis(selectedSISFiles );
+				
+				if( areNewSISFilesProvided(selectedSISFiles, previouslyAnalysedSISFiles)){
+					// Entering to SIS file mode...
+					activeSettings.setIsInSISFileAnalysisMode(true);
+					// ...and setting files to current settings
+					addSISTarget(activeSettings);
+					//Generate Cache with the modified active settings.
+					GenerateCacheJob.triggerCacheGenerationForCurrentlyActiveSettings();
+				}
+				else{
+					
+					String infoMsg = Messages.getString("AddSisAndUpdateCacheMainViewAction.Cache_is_up_to_date_msg");  //$NON-NLS-1$
+					new AppDepMessageBox(infoMsg, SWT.OK | SWT.ICON_INFORMATION).open();
+				}
+			}
+			else{
+				// Disabling SIS file mode
+				activeSettings.setIsInSISFileAnalysisMode(false);
+				activeSettings.setSISFilesForAnalysis(null);
+			}	
+						
+		}
+		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+	
+
+	/** 
+	 * The method adds SIS target to the given settings.
+	 * @param settings
+	 */
+	private void addSISTarget(AppDepSettings settings) {
+		
+		try{
+		// In SIS mode we need to add an extra target
+		if(settings.isInSISFileAnalysisMode()){
+			
+			ITargetPlatform[] targetPlatforms = settings.getCurrentlyUsedTargetPlatforms();
+			
+			ArrayList<String> targetPlatformNames = new ArrayList<String>();
+			
+			for(ITargetPlatform platform: targetPlatforms)
+				targetPlatformNames.add(platform.getId());
+			
+			if(! targetPlatformNames.contains(AppDepSettings.TARGET_TYPE_ID_SIS)){
+				settings.addTargetPlatform(AppDepSettings.TARGET_TYPE_ID_SIS);				
+			}
+		}
+		}catch (InvalidCmdLineToolSettingException e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Failed_To_Update_Current_Settings"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * The method compares list of newly provided sis files with the previous list of analysed files.
+	 * The method returns true if some files have been added or removed.
+	 */
+	private boolean areNewSISFilesProvided(String [] newFiles, String [] previouslyAnalysedFiles)
+	{
+		if(previouslyAnalysedFiles == null)
+			return true;		
+		else if (newFiles.length != previouslyAnalysedFiles.length)
+			return true;
+		else
+		{
+			List<String> analysedFilesList = Arrays.asList(previouslyAnalysedFiles);
+			
+			for(String file:newFiles)
+			{
+				if(!analysedFilesList.contains(file))
+					return true;
+			}
+			
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/CacheUpdateMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,95 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.swt.SWT;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.job.GenerateCacheJob;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Start cache update if needed from main view's toolbar.
+ */
+public class CacheUpdateMainViewAction extends AbstractMainViewAction {
+	
+	public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.CacheUpdateMainViewAction"; //$NON-NLS-1$
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public CacheUpdateMainViewAction(MainView view){
+		super(view);
+		setText(Messages.getString("CacheUpdateMainViewAction.CacheUpdateMainView_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("CacheUpdateMainViewAction.CacheUpdateMainView_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.CACHE_UPDATE_ACTION));	
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		
+		String currentRootComponent = null;
+		AppDepSettings activeSettings = AppDepSettings.getActiveSettings();
+		currentRootComponent =  activeSettings.getCurrentlyAnalyzedComponentName();		
+		
+		if(currentRootComponent == null){
+			// User has not selected any components for analysis
+			String infoMsg = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+			new AppDepMessageBox(infoMsg, SWT.OK | SWT.ICON_INFORMATION).open();
+			return;
+		}
+		
+		if(activeSettings.currentlySelectedCachesNeedsUpdate()){
+			// Aborting possible ongoing search
+			MainView.abortCurrentlyOngoingSearches();
+			
+			// Triggering cache generation job
+			GenerateCacheJob.triggerCacheGenerationForCurrentlyActiveSettings();			
+		}
+		else{
+			// Cache is up-to-date
+			String infoMsg = null;
+			if(activeSettings.getCurrentlyUsedTargetPlatforms().length > 1){
+				infoMsg = Messages.getString("CacheUpdateMainViewAction.Caches_Are_Up_To_Date_InfoMsg"); //$NON-NLS-1$				
+			}
+			else{
+				infoMsg = Messages.getString("CacheUpdateMainViewAction.Cache_Is_Up_To_Date_InfoMsg"); //$NON-NLS-1$								
+			}
+			new AppDepMessageBox(infoMsg, SWT.OK | SWT.ICON_INFORMATION).open();
+			return;			
+		}
+		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/CollapseAllMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,64 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Collapses all subtrees in main view's component tree.
+ */
+public class CollapseAllMainViewAction extends AbstractMainViewAction {
+		
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public CollapseAllMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("CollapseAllMainViewAction.CollapseAll_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("CollapseAllMainViewAction.CollapseAll_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.COLLAPSE_ALL_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		view.getComponentTreeViewer().collapseAll();
+		view.getComponentTreeViewer().refresh();
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ComponentIsUsedByMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,122 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.job.UsedByOtherComponentsJob;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Starts is used by query from main view's component tree.
+ */
+public class ComponentIsUsedByMainViewAction extends AbstractMainViewAction{
+	
+	/**
+	 * Result array from is used by query.
+	 */
+	ArrayList<ComponentPropertiesData> resultComponentsArrayList = null;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ComponentIsUsedByMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ComponentIsUsedByMainViewAction.IsUsedBy_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ComponentIsUsedByMainViewAction.IsUsedBy_Action_Tooltip")); //$NON-NLS-1$
+	
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.IS_USED_BY_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		Object obj = view.getComponentTreeSelectedElement();
+					
+		if(obj == null){
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			return;
+		}
+
+		// Component is for sure a component node
+		ComponentNode node = (ComponentNode) obj;
+		String componentName;
+		//If component was a generic component and is replaced with concrete component, must do search with original name
+		if(node instanceof ComponentParentNode){
+			ComponentParentNode parentNode = (ComponentParentNode)node;
+			if(parentNode.wasGenericComponent()){
+				componentName = parentNode.getOriginalName();
+			}
+			else{
+				componentName = node.getName();							
+			}
+		}else{
+			componentName = node.getName();			
+		}
+		
+
+		AppDepSettings settings = AppDepSettings.getActiveSettings();
+		if(settings.getCurrentlyAnalyzedComponentName() != null){
+			AppDepConsole.getInstance().println(Messages.getString("ComponentIsUsedByMainViewAction.IsUsedBy_Query_Start_Console_Msg") //$NON-NLS-1$
+                    + componentName + "'..."); //$NON-NLS-1$
+			
+			resultComponentsArrayList = new ArrayList<ComponentPropertiesData>();
+			Job jb = new UsedByOtherComponentsJob(Messages.getString("ComponentIsUsedByMainViewAction.IsUsedBy_Job_Title_Text"), settings, //$NON-NLS-1$
+													componentName,
+													null,
+													null,
+													resultComponentsArrayList,
+													AppDepPlugin.getCurrentlyActivePage());
+			
+			// We do not want cache generation to block other 
+			// jobs and therefore using the lowest priority
+			jb.setPriority(Job.DECORATE);
+			jb.schedule();
+		}
+				
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ComponentPropertiesMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,89 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.ui.dialogs.S60ToolsListBoxDialog;
+
+/**
+ * Opens up component properties dialog.
+ */
+public class ComponentPropertiesMainViewAction extends AbstractMainViewAction {
+		
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ComponentPropertiesMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ComponentPropertiesMainViewAction.ComponentProperties_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ComponentPropertiesMainViewAction.ComponentProperties_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId("com.nokia.s60tools.appdep.ui.actions.ComponentPropertiesMainViewAction"); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+
+		ComponentPropertiesData propData = view.getSelectedComponentPropertiesData();
+		// Parent shell
+		Shell sh = view.getViewSite().getShell();
+
+		if(propData != null){
+			// Launching properties dialog
+			String dialogTitle = Messages.getString("ComponentPropertiesMainViewAction.ComponentProperties_Dialog_Title"); //$NON-NLS-1$
+			String listBoxContent = propData.toString();
+			
+			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
+                                              false, // No cancel button
+                                              null,  // no extra label
+                                              AppDepHelpContextIDs.APPDEP_PROPERTIES // context-sensitive help ID
+																	);
+			dlg.create();
+			dlg.open();			
+		}
+		else{
+			String userMessage = Messages.getString("ComponentPropertiesMainViewAction.Component_Does_Not_Exist_In_Cache_Msg"); //$NON-NLS-1$
+			AppDepMessageBox msgBox = new AppDepMessageBox(sh, userMessage, SWT.OK | SWT.ICON_INFORMATION);
+			msgBox.open();
+		}
+		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExpandAllMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,64 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Expands all subtrees in main view's component tree.
+ */
+public class ExpandAllMainViewAction extends AbstractMainViewAction {
+		
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ExpandAllMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ExpandAllMainViewAction.ExpandAllAction_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ExpandAllMainViewAction.ExpandAllAction_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.EXPAND_ALL_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		view.getComponentTreeViewer().expandAll();
+		view.getComponentTreeViewer().refresh();
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExpandSubtreeMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Expands subtree in main view's component tree.
+ */
+public class ExpandSubtreeMainViewAction extends AbstractMainViewAction {
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ExpandSubtreeMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ExpandSubtreeMainViewAction.ExpandSubTree_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ExpandSubtreeMainViewAction.ExpandSubTree_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.EXPAND_SUBTREE));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		ISelection selection = view.getComponentTreeViewer().getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		view.getComponentTreeViewer().expandToLevel(obj, AbstractTreeViewer.ALL_LEVELS);
+		view.getComponentTreeViewer().refresh();
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExportReportListViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,339 @@
+/*
+* 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.appdep.ui.actions;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+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.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.export.IsUsedByXMLReport;
+import com.nokia.s60tools.appdep.export.XMLUtils;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.listview.ListView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+
+/**
+ * Starts export report from list view. 
+ */
+public class ExportReportListViewAction extends Action {
+
+	//
+	// Members
+	//
+	private final ListView view;	
+	private List<ComponentPropertiesData> isUsedByData;	
+	private String exportHTMLFileName;
+	private String exportXMLFileName;
+	private String exportPath = ""; //$NON-NLS-1$
+	private String exportFileSuffix = Messages.getString("ExportReportListViewAction.IsUsedByReportPrefix"); //$NON-NLS-1$
+	private String completedMessage;	
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ExportReportListViewAction(ListView view){
+		//super(view);
+		this.view = view;
+		
+		setText(Messages.getString("ExportReportListViewAction.ExportReport_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ExportReportListViewAction.ExportReport_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId("com.nokia.s60tools.appdep.ui.actions.ExportReportMainViewAction"); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+
+		// Parent shell
+		Shell sh = view.getViewSite().getShell();
+		
+		try {
+			if(isUsedByData == null || isUsedByData.isEmpty()){
+				completedMessage = Messages.getString("ExportReportListViewAction.Nothing_To_Export_Msg"); //$NON-NLS-1$
+				showCompletedMessage();
+				return;
+			}
+			
+			String componentName = view.getComponentName();
+			String functionName = view.getFunctionName();		
+			String componentOrFunctionNameString = null;
+			String functionNameForFile = null;
+			
+			if(functionName != null){
+				// Making sure that function name does not contain characters illegal for creating new files
+				functionNameForFile = removeIllegalFileCharactersFromFunctionName(functionName);
+				
+				if(functionNameForFile.contains("@")){  //$NON-NLS-1$
+					// If using format component@ordinal, then there is no need to replicate component name
+					setExportHTMLFileName( functionNameForFile + exportFileSuffix +  ".html"); //$NON-NLS-1$
+					setExportXMLFileName( functionNameForFile + exportFileSuffix + ".xml");			 //$NON-NLS-1$				
+				}
+				else{
+					int paramListStart = functionNameForFile.indexOf('(');
+					if(paramListStart != -1){
+						functionNameForFile = functionNameForFile.substring(0, paramListStart);
+					}
+					// Otherwise using format component_function
+					setExportHTMLFileName( componentName + "_" + functionNameForFile + exportFileSuffix +  ".html"); //$NON-NLS-1$ //$NON-NLS-2$
+					setExportXMLFileName( componentName + "_" + functionNameForFile + exportFileSuffix + ".xml");			 //$NON-NLS-1$ //$NON-NLS-2$				
+				}
+				componentOrFunctionNameString = componentName + " [" + Messages.getString("ExportReportListViewAction.Str_Function") + "=" + functionName + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			}
+			else{
+				setExportHTMLFileName( componentName + exportFileSuffix +  ".html"); //$NON-NLS-1$
+				setExportXMLFileName( componentName + exportFileSuffix + ".xml");			 //$NON-NLS-1$			
+				componentOrFunctionNameString = componentName;
+			}
+
+			FileDialog fdia = new FileDialog(sh, SWT.SAVE);
+			String path = AppDepSettings.getActiveSettings().getExportPrintReportPath();
+			if(path == null){
+				path ="";// AppDepSettings.getActiveSettings().getCacheBaseDir(); //$NON-NLS-1$
+			}
+			
+			setExportPath(path);
+			fdia.setFileName(getExportHTMLFileNameAndPath());
+
+			String msg = Messages.getString("ExportReportListViewAction.ExportReport_Msg_Start"); //$NON-NLS-1$
+			//If XML file is generated aswell, adding info for that to note
+			if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+				msg 
+					+= ". " + Messages.getString("ExportReportListViewAction.ExportReport_Msg_End"); //$NON-NLS-1$ //$NON-NLS-2$
+			}		
+			fdia.setText(msg);
+
+			String fullPath = fdia.open();		
+			
+			//User select "Cancel"
+			if(fullPath == null){
+				return;
+			}
+			setExportPath(fdia.getFilterPath());
+			setExportHTMLFileName(fdia.getFileName());
+			//Setting default paht to most recently used export path
+			AppDepSettings.getActiveSettings().setExportPrintReportPath(fdia.getFilterPath());
+				
+			exportReport(removeIllegalXMLCharactersFromStr(componentOrFunctionNameString));
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}				
+	
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+
+	/**
+	 * Replacing all possible characters that cannot be used in file names
+	 * @param functionName Function name string to be replaced for illegal characters.
+	 * @return Modified function name
+	 */
+	private String removeIllegalFileCharactersFromFunctionName(String functionName) {
+		String localFunctionNameVar = new String(functionName);
+		if(localFunctionNameVar != null){
+			// Replacing all possible characters that cannot be used in file names
+			localFunctionNameVar = localFunctionNameVar.replace("::", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("\\", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("/", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("*", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("?", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("<", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace(">", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localFunctionNameVar = localFunctionNameVar.replace("|", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return localFunctionNameVar;
+	}
+
+	/**
+	 * Replacing all possible characters that cannot be used in XML.
+	 * @param str Function name string to be replaced for illegal characters.
+	 * @return Modified function name
+	 */
+	private String removeIllegalXMLCharactersFromStr(String str) {
+		String localStr = new String(str);
+		if(localStr != null){
+			// Replacing all possible characters that cannot be used in file names
+			localStr = localStr.replace("<", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localStr = localStr.replace(">", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			localStr = localStr.replace("&", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return localStr;
+	}
+	
+	/**
+	 * Exports the report.
+	 * @param componentOrFunctionNameString Name of the component or component and function name combination
+	 *                                      to be shown in the report.
+	 */
+	private void exportReport(String componentOrFunctionNameString) {
+		
+		try {
+			AppDepSettings st = AppDepSettings.getActiveSettings();
+			SdkInformation sdkInfo = st.getCurrentlyUsedSdk();
+	
+			TableViewer viewer = view.getComponentListViewer();
+			
+			//For exporting report sorted as it is in GUI, getting data
+			//for new ArrayList one by one from TableViewer, witch
+			ArrayList<ComponentPropertiesData> sortedData = new ArrayList<ComponentPropertiesData>(isUsedByData.size());
+
+			for(int i =0; ; i++){
+				ComponentPropertiesData data = (ComponentPropertiesData)viewer.getElementAt(i);
+				if(data != null){
+					sortedData.add(data);
+				}
+				else{
+					break;					
+				}
+			}
+			
+			S60ToolsViewerSorter sorter = (S60ToolsViewerSorter) viewer.getSorter();
+			int sort = sorter.getSortCriteria(); 									
+			
+			IsUsedByXMLReport report = new IsUsedByXMLReport(sortedData, 
+					sdkInfo.getSdkId(), 
+					st.getCurrentlyUsedTargetPlatformsAsString(),
+					st.getBuildType().getBuildTypeDescription(), 
+					componentOrFunctionNameString,
+					sort);
+			
+			if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+				report.toFile(getExportXMLFileNameAndPath());
+			}
+	
+			String xslPath = AppDepSettings.getActiveSettings().getResourcesPath()
+				+ System.getProperty("file.separator") //$NON-NLS-1$
+				+ AppDepSettings.getActiveSettings().getIsUsedByXSLFileName();			
+		
+			XMLUtils.parseXML(report.toString(), xslPath, getExportHTMLFileNameAndPath());
+			
+			completedMessage = 
+				Messages.getString("ExportReportListViewAction.HTMLReport_Exported_Msg") + ": " +getExportHTMLFileNameAndPath(); //$NON-NLS-1$ //$NON-NLS-2$
+			//If XML file is generated aswell, adding info for that to note
+			if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+				completedMessage 
+					+= "\n" + Messages.getString("ExportReportListViewAction.XMLReport_Exported_Msg") + ": "  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						+getExportXMLFileNameAndPath();
+			}
+			showCompletedMessage();					
+			
+		} catch (Exception e) {			
+			e.printStackTrace();
+			completedMessage = Messages.getString("ExportReportListViewAction.Export_Not_Complete_Msg")  //$NON-NLS-1$
+				                + " "  //$NON-NLS-1$
+				                + Messages.getString("ExportReportListViewAction.Error_Was_Msg")  //$NON-NLS-1$
+				                + ": " + e.getMessage(); //$NON-NLS-1$
+			showCompletedMessage();
+			AppDepConsole.getInstance().println(Messages.getString("ExportReportListViewAction.Export_Failed_Msg")  //$NON-NLS-1$
+					                            + " "  //$NON-NLS-1$
+					                            + Messages.getString("ExportReportListViewAction.Error_Was_Msg")  //$NON-NLS-1$
+					                            + ": " + e.getMessage(),  //$NON-NLS-1$
+                    IConsolePrintUtility.MSG_ERROR);			
+		}
+	}
+
+	
+	/**
+	 * Gets file path name for exported HTML file.
+	 * @return file path name for exported HTML file.
+	 */
+	public String getExportHTMLFileNameAndPath() {
+		
+		String prefix = ("".equals(exportPath)) ? "" : exportPath  //$NON-NLS-1$ //$NON-NLS-2$
+				+ System.getProperty("file.separator");  //$NON-NLS-1$
+		
+		return prefix +exportHTMLFileName;
+	}
+
+	/**
+	 * Sets file path name for exported HTML file.
+	 * @param name file path name for exported HTML file
+	 */
+	private void setExportHTMLFileName(String name) {
+		this.exportHTMLFileName = name;
+	}
+
+	/**
+	 * Sets destination directory for export.
+	 * @param exportPath destination directory for export.
+	 */
+	private void setExportPath(String exportPath) {
+		this.exportPath = exportPath;
+	}
+
+	/**
+	 * Gets file path name for exported XML file.
+	 * @param name file path name for exported HTML file
+	 */
+	public String getExportXMLFileNameAndPath() {
+		return exportPath 
+			+ System.getProperty("file.separator")  //$NON-NLS-1$
+			+ exportXMLFileName;
+	}
+
+	/**
+	 * Sets file path name for exported XML file.
+	 * @param name file path name for exported HTML file
+	 */
+	private void setExportXMLFileName(String name) {
+		this.exportXMLFileName = name;
+	}
+
+	/**
+	 * Shows export completed message.
+	 */
+	private void showCompletedMessage() {
+		Shell sh = view.getViewSite().getShell();
+		AppDepMessageBox msgBox = new AppDepMessageBox(sh, completedMessage, SWT.OK | SWT.ICON_INFORMATION);
+		msgBox.open();
+	}
+
+	/**
+	 * @return Returns the isUsedByData.
+	 */
+	public List<ComponentPropertiesData> getIsUsedByData() {
+		return isUsedByData;
+	}
+
+	/**
+	 * @param isUsedByData The isUsedByData to set.
+	 */
+	public void setIsUsedByData(List<ComponentPropertiesData> isUsedByData) {
+		this.isUsedByData = isUsedByData;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ExportReportMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.export.ExportJob;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+
+/**
+ * Triggers export report functionality.
+ */
+public class ExportReportMainViewAction extends AbstractMainViewAction 
+	implements IJobChangeListener  {
+
+	//
+	// Members
+	//
+	private String exportHTMLFileName;
+	private String exportXMLFileName;
+	private String exportPath = ""; //$NON-NLS-1$
+	private String exportFilePrefix = Messages.getString("ExportReportMainViewAction.ExportFilePrefix_String"); //$NON-NLS-1$
+	private String completedMessage;	
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ExportReportMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("ExportReportMainViewAction.ExportReport_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("ExportReportMainViewAction.ExportReport_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId("com.nokia.s60tools.appdep.ui.actions.ExportReportMainViewAction"); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+
+		// Parent shell
+		Shell sh = view.getViewSite().getShell();
+
+		Object obj = view.getComponentTreeSelectedElement();		
+		if(obj == null){
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			return;
+		}
+					
+		// Component is for sure a component node
+		ComponentNode node = (ComponentNode) obj;
+
+		setExportHTMLFileName( exportFilePrefix + node.getName() + ".html"); //$NON-NLS-1$
+		setExportXMLFileName( exportFilePrefix + node.getName() + ".xml"); //$NON-NLS-1$
+		
+		String compToSearchFor = null;
+		compToSearchFor =  AppDepSettings.getActiveSettings().getCurrentlyAnalyzedComponentName();		
+		
+		if(compToSearchFor == null){
+			// No component to be analyzed
+			completedMessage = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+			showCompletedMessage();
+			return;
+		}		
+
+		FileDialog fdia = new FileDialog(sh, SWT.SAVE);
+
+		String path = AppDepSettings.getActiveSettings().getExportPrintReportPath();
+		if(path == null){
+			path =""; //$NON-NLS-1$
+		}
+		
+		setExportPath(path);
+		fdia.setFileName(getExportHTMLFileNameAndPath());
+
+		String msg = Messages.getString("ExportReportMainViewAction.ExportReport_Msg_Start"); //$NON-NLS-1$
+		//If XML file is generated aswell, adding info for that to note
+		if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+			msg 
+				+= ". " + Messages.getString("ExportReportMainViewAction.ExportReport_Msg_End"); //$NON-NLS-1$ //$NON-NLS-2$
+		}		
+		fdia.setText(msg);
+
+		String fullPath = fdia.open();		
+		
+		//User select "Cancel"
+		if(fullPath == null){
+			return;
+		}
+		setExportPath(fdia.getFilterPath());
+		setExportHTMLFileName(fdia.getFileName());
+		//Setting default path to most recently used export path
+		AppDepSettings.getActiveSettings().setExportPrintReportPath(fdia.getFilterPath());
+			
+		String jobName = ProductInfoRegistry.getProductName() 
+		                 + " " + Messages.getString("ExportReportMainViewAction.Export") + " "  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		                 + node.getName();
+		
+		ExportJob job = new ExportJob(
+				jobName, 
+				node, 
+				getExportHTMLFileNameAndPath(), 
+				getExportXMLFileNameAndPath() );
+		
+		job.addJobChangeListener(this);		
+		job.setPriority(Job.DECORATE);
+		job.schedule();
+	
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+
+	/**
+	 * Gets file path name for exported HTML file.
+	 * @return file path name for exported HTML file.
+	 */
+	public String getExportHTMLFileNameAndPath() {
+		
+		String prefix = ("".equals(exportPath)) ? "" : exportPath  //$NON-NLS-1$ //$NON-NLS-2$
+				+ System.getProperty("file.separator");  //$NON-NLS-1$
+		
+		return prefix +exportHTMLFileName;
+	}
+
+	/**
+	 * Sets file path name for exported HTML file.
+	 * @param name file path name for exported HTML file
+	 */
+	private void setExportHTMLFileName(String name) {
+		this.exportHTMLFileName = name;
+	}
+
+	/**
+	 * Sets destination directory for export.
+	 * @param exportPath destination directory for export.
+	 */
+	private void setExportPath(String exportPath) {
+		this.exportPath = exportPath;
+	}
+
+	/**
+	 * Gets file path name for exported XML file.
+	 * @param name file path name for exported HTML file
+	 */
+	public String getExportXMLFileNameAndPath() {
+		return exportPath 
+			+ System.getProperty("file.separator")  //$NON-NLS-1$
+			+ exportXMLFileName;
+	}
+
+	/**
+	 * Sets file path name for exported XML file.
+	 * @param name file path name for exported HTML file
+	 */
+	private void setExportXMLFileName(String name) {
+		this.exportXMLFileName = name;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+		// We do not need to do anything because of this event		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+		// We do not need to do anything because of this event		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void done(IJobChangeEvent event) {
+
+		IStatus status = event.getResult();
+		
+		//Showing note only if not cancelled
+		if(status.getSeverity() == IStatus.OK){
+
+			// Runnable implementing the actual printing to console
+			Runnable showCompletedMessagRunnable = new Runnable(){
+				public void run(){				
+						showCompletedMessage();										
+				}
+			};
+			
+			completedMessage = 
+				Messages.getString("ExportReportMainViewAction.HTMLExported_Msg") + ": " + getExportHTMLFileNameAndPath(); //$NON-NLS-1$ //$NON-NLS-2$
+			//If XML file is generated as well, adding info for that to note
+			if(AppDepSettings.getActiveSettings().isExportXMLreport()){
+				completedMessage 
+					+= "\n" + Messages.getString("ExportReportMainViewAction.XMLExported_Msg") + ": "  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						+getExportXMLFileNameAndPath();
+			}
+						
+			Display.getDefault().asyncExec(showCompletedMessagRunnable);   
+
+		}	
+
+		
+	}
+
+	/**
+	 * Shows export completed message.
+	 */
+	private void showCompletedMessage() {
+		Shell sh = view.getViewSite().getShell();
+		AppDepMessageBox msgBox = new AppDepMessageBox(sh, completedMessage, SWT.OK | SWT.ICON_INFORMATION);
+		msgBox.open();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+		// We do not need to do anything on this event		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+		// We do not need to do anything on this event		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+		// We do not need to do anything on this event		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FindMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,96 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.find.IFindStartNodeProvider;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepFindDialog;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Action for starting find dialog for component tree.
+ */
+public class FindMainViewAction extends AbstractMainViewAction implements IFindStartNodeProvider {
+	
+	/**
+	 * Action's ID.
+	 */
+	public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.FindMainViewAction"; //$NON-NLS-1$
+			
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public FindMainViewAction(MainView view){
+		super(view);
+		setText(Messages.getString("FindMainViewAction.FindMainView_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("FindMainViewAction.FindMainView_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.FIND_ACTION));	
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+				
+		String currentRootComponent = null;
+		currentRootComponent =  AppDepSettings.getActiveSettings().getCurrentlyAnalyzedComponentName();		
+		
+		Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+
+		if(currentRootComponent == null){
+			// User has not selected any components for analysis
+			String infoMsg = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+			AppDepMessageBox msgBox = new AppDepMessageBox(sh, infoMsg, SWT.OK | SWT.ICON_INFORMATION);
+			msgBox.open();
+			return;
+		 
+		}				
+		
+		// Starting dialog find dialog for the component node
+		AppDepFindDialog dlg = new AppDepFindDialog(sh, this, view);
+		dlg.create();
+		dlg.open();					
+				
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.search.ISearchStartNodeProvider#getSearchStartNode()
+	 */
+	public ComponentNode getSearchStartNode() {
+		return view.getRootComponentNode();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByExportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,91 @@
+/*
+* 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.appdep.ui.actions;
+
+
+
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Starts query for components that use certain export function.
+ */
+public class FunctionIsUsedByExportFunctionMainViewAction extends FunctionIsUsedByMainViewAction{
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public FunctionIsUsedByExportFunctionMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("FunctionIsUsedByExportFunctionMainViewAction.IsUsedByExportFunction_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("FunctionIsUsedByExportFunctionMainViewAction.IsUsedByExportFunction_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.IS_USED_BY_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		Object exportFunctionObj = view.getSelectedExportFunction();
+		Object compNodeObj = view.getComponentTreeSelectedElement();
+					
+		if(exportFunctionObj == null || compNodeObj == null){
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// or when Go Into -action is run.
+			
+			// Trying to check if we have valid selection cached
+			compNodeObj = view.getMostRecentlySelectedComponentNode();
+			if(exportFunctionObj == null || compNodeObj == null){
+				return;				
+			}
+		}
+
+		// Casting and getting the needed information
+		ComponentNode node = (ComponentNode) compNodeObj;
+		String componentName = node.getName();			
+		
+		ExportFunctionData efData = (ExportFunctionData) exportFunctionObj;
+		String functionName = efData.getFunctionName();
+		String ordinalAsString = efData.getFunctionOrdinal();
+
+		super.startIsUsedDependencyQueryJob(componentName, functionName, ordinalAsString);
+		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByImportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,91 @@
+/*
+* 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.appdep.ui.actions;
+
+
+
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Starts query for components that use certain import function.
+ */
+public class FunctionIsUsedByImportFunctionMainViewAction extends FunctionIsUsedByMainViewAction{
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public FunctionIsUsedByImportFunctionMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("FunctionIsUsedByImportFunctionMainViewAction.IsUsedByImportFunction_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("FunctionIsUsedByImportFunctionMainViewAction.IsUsedByImportFunction_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+							getImageDescriptor(ImageKeys.IS_USED_BY_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		Object importFunctionObj = view.getSelectedImportFunction();
+		Object compNodeObj = view.getComponentTreeSelectedElement();
+					
+		if(importFunctionObj == null || compNodeObj == null){			
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// or when Go Into -action is run.
+			
+			// Trying to check if we have valid selection cached
+			compNodeObj = view.getMostRecentlySelectedComponentNode();
+			if(importFunctionObj == null || compNodeObj == null){
+				return;				
+			}
+		}
+
+		// Casting and getting the needed information
+		ComponentNode node = (ComponentNode) compNodeObj;
+		String componentName = node.getName();			
+		
+		ImportFunctionData ifData = (ImportFunctionData) importFunctionObj;
+		String functionName = ifData.getFunctionName();
+		String ordinalAsString = ifData.getFunctionOrdinal();
+
+		super.startIsUsedDependencyQueryJob(componentName, functionName, ordinalAsString);
+				
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/FunctionIsUsedByMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,81 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.job.UsedByOtherComponentsJob;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Common base class for actions querying
+ * is used -relation ships for different 
+ * function types.
+ */
+public abstract class FunctionIsUsedByMainViewAction extends AbstractMainViewAction {
+
+	/**
+	 * Resulting components found by the query,
+	 */
+	ArrayList<ComponentPropertiesData> resultComponentsArrayList = null;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to main view.
+	 */
+	public FunctionIsUsedByMainViewAction(MainView view) {
+		super(view);
+	}
+
+	/**
+	 * Starts job that search for the components that are using
+	 * the function given as parameter.
+	 * @param componentName Component name scope for the functions.
+	 * @param functionName  Name of the function to search dependencies for.
+	 * @param ordinalAsString Ordinal of the function to search dependencies for.
+	 */
+	protected void startIsUsedDependencyQueryJob(String componentName, String functionName, String ordinalAsString) {
+		AppDepSettings settings = AppDepSettings.getActiveSettings();
+		if(settings.getCurrentlyAnalyzedComponentName() != null){
+			AppDepConsole.getInstance().println(Messages.getString("FunctionIsUsedByMainViewAction.FunctionIsUsedBy_Query_Start_Console_Msg") //$NON-NLS-1$
+	                + functionName + "'..."); //$NON-NLS-1$
+			
+			resultComponentsArrayList = new ArrayList<ComponentPropertiesData>();
+			Job jb = new UsedByOtherComponentsJob(Messages.getString("FunctionIsUsedByMainViewAction.FunctionIsUsedBy_Job_Title_Text"), settings, //$NON-NLS-1$
+													componentName,
+													functionName,
+													ordinalAsString,
+													resultComponentsArrayList,
+													AppDepPlugin.getCurrentlyActivePage());
+			
+			// We do not want cache generation to block other 
+			// jobs and therefore using the lowest priority
+			jb.setPriority(Job.DECORATE);
+			jb.schedule();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/LocateComponentMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,215 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.locatecomponent.LocateComponentJob;
+import com.nokia.s60tools.appdep.locatecomponent.SeekParentNodesService;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.dialogs.LocateComponentDialog;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewDataPopulator;
+import com.nokia.s60tools.appdep.ui.views.main.MainViewPopulateProgressListener;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Locates concrete component for the selected generic component from component tree.
+ */
+public class LocateComponentMainViewAction extends AbstractMainViewAction implements IJobChangeListener{
+	
+	/**
+	 * Name of the generic component.
+	 */
+	private String componentName;
+	/**
+	 * Selected node (=generic component) from component tree.
+	 */
+	private ComponentNode startNode;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public LocateComponentMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("LocateComponentMainViewAction.Locate_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("LocateSourceMainViewAction.Locate_Action_Tooltip")); //$NON-NLS-1$
+	
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/
+		//Adding image descriptor if an icon is created for this action		
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.BIN_OBJ_BIND));	
+				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		Object obj = view.getComponentTreeSelectedElement();
+					
+		if(obj == null){
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			return;
+		}
+
+		startNode = (ComponentNode) obj;
+		componentName = startNode.getName();
+		AppDepSettings settings = AppDepSettings.getActiveSettings();
+		if(settings.getCurrentlyAnalyzedComponentName() != null){
+			AppDepConsole.getInstance().println(Messages.getString("LocateComponentMainViewAction.Query_Start_Console_Msg") //$NON-NLS-1$
+                    + componentName + "'..."); //$NON-NLS-1$
+			
+			String jobName = ProductInfoRegistry.getProductName() 
+				+ " " + Messages.getString("LocateComponentMainViewAction.LocateJobName_Str") + " "  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+            	+ componentName;
+
+			//searching components in job.
+			LocateComponentJob job = new LocateComponentJob(
+				jobName, 
+				componentName );		
+			job.addJobChangeListener(this);		
+			job.setPriority(Job.DECORATE);
+			job.schedule();
+
+		}
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void aboutToRun(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void awake(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void done(IJobChangeEvent event) {
+		
+		IStatus status = event.getResult();
+		LocateComponentJob job = (LocateComponentJob) event.getJob();
+		final String [] components = job.getConcreteComponent();
+		
+		//Showing dialog only if not cancelled
+		if(status.getSeverity() == IStatus.OK){
+
+			// Runnable implementing the actual printing to console
+			Runnable completedRunnable = new Runnable(){
+				public void run(){				
+					openDialog(components);										
+				}
+			};
+									
+			Display.getDefault().asyncExec(completedRunnable);   
+		}					
+	}
+	
+	/**
+	 * Opens the dialog with search results
+	 * @param components Component alternatives to be shown in dialog.
+	 */
+	private void openDialog(String [] components){
+		Shell sh = view.getViewSite().getShell();
+		
+		// Did we found any concrete component candidates for generic component name? 
+		if(components.length == 0){
+			String infoMsg = Messages.getString("LocateComponentMainViewAction.NoConcreteComponentsFound_InfoMsg_Part1") + componentName + Messages.getString("LocateComponentMainViewAction.NoConcreteComponentsFound_InfoMsg_Part2"); //$NON-NLS-1$ //$NON-NLS-2$
+			new AppDepMessageBox(sh, infoMsg, SWT.ICON_INFORMATION).open();
+			return;
+		}
+		
+		LocateComponentDialog dialog = new LocateComponentDialog(sh, components, componentName );
+		int ok = dialog.open();
+		
+		if(ok == LocateComponentDialog.OK){
+			int selection = dialog.getSelectionIndex();
+			if(selection != -1){
+				String newComponentName = components[selection];
+				
+				//Get all already found Parent nodes to prevent them to occur more than once.
+				ComponentParentNode parent = startNode.getParent();
+				ComponentParentNode root = parent.getRootNode();
+				//Get components all ready added, to prevent duplicates
+				Map<String, ComponentParentNode> parentNodes = SeekParentNodesService.findParentNodes(root);				
+				MainViewPopulateProgressListener listener = new MainViewPopulateProgressListener(view);
+				//populate tree from parent node of selected component
+				MainViewDataPopulator.populatePartOfView(parent, newComponentName, listener, parentNodes, startNode);
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void running(IJobChangeEvent event) {
+		// Not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void scheduled(IJobChangeEvent event) {
+		//Not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void sleeping(IJobChangeEvent event) {
+		// Not needed		
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SearchMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,97 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.search.SearchConstants;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepSearchDialog;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Action for starting search dialog for certain search type.
+ */
+public class SearchMainViewAction extends AbstractMainViewAction {
+	
+	/**
+	 * Action's ID
+	 */
+	public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.SearchMainViewAction"; //$NON-NLS-1$
+		
+	/**
+	 * Search type for the action defines what kind of search scope
+	 * is used by default when this action is run.
+	 */
+	private final SearchConstants.SearchType searchType;
+
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 * @param searchType Default search type for this action instance.
+	 */
+	public SearchMainViewAction(MainView view, SearchConstants.SearchType searchType){
+		super(view);
+		this.searchType = searchType;
+		setText(Messages.getString("SearchMainViewAction.SearchMainView_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SearchMainViewAction.SearchMainView_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		//Adding image descriptor if an icon is created for this action		
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.SEARCH));	
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		
+		String currentRootComponent = null;
+		currentRootComponent =  AppDepSettings.getActiveSettings().getCurrentlyAnalyzedComponentName();		
+		
+		Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+
+		if(currentRootComponent == null){
+			// User has not selected any components for analysis
+			String infoMsg = Messages.getString("GeneralMessages.Select_SDK_First_ErrMsg"); //$NON-NLS-1$
+			AppDepMessageBox msgBox = new AppDepMessageBox(sh, infoMsg, SWT.OK | SWT.ICON_INFORMATION);
+			msgBox.open();
+			return;
+		}				
+		
+		// Opens search dialog
+		AppDepSearchDialog dlg = new AppDepSearchDialog(sh, searchType, view);
+		dlg.create();
+		dlg.open();
+				
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromListAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,53 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.widgets.List;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Selects all items from a list.
+ */
+public class SelectAllFromListAction extends Action{
+	
+	/**
+	 * Reference to list.
+	 */
+	private final List list;
+
+	/**
+	 * Constructor.
+	 * @param viewer Reference to a list.
+	 */
+	public SelectAllFromListAction(List list){
+		this.list = list;		
+		setText(Messages.getString("SelectAllFromListAction.SelectAll_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SelectAllFromListAction.SelectAll_Action_Tooltip")); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		list.selectAll();	
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromTableViewerComponentListViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.listview.ListView;
+
+/**
+ * Selects all items from component list view.
+ */
+public class SelectAllFromTableViewerComponentListViewAction extends Action{
+	
+	/**
+	 * Reference to component list view.
+	 */
+	private final ListView view;
+
+	/**
+	 * Constructor.
+	 * @param viewer Reference to component list view.
+	 */
+	public SelectAllFromTableViewerComponentListViewAction(ListView view){		
+		this.view = view;
+		setText(Messages.getString("SelectAllFromTableViewerComponentListViewAction.SelectAll_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SelectAllFromTableViewerComponentListViewAction.SelectAll_Action_Tooltip"));		 //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		TableViewer viewer = view.getComponentListViewer();
+		viewer.getTable().selectAll();	
+		// We must update context menu accordingly
+		view.updateViewActionEnabledStates();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectAllFromTableViewerMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Selects all items from a table viewer component.
+ */
+public class SelectAllFromTableViewerMainViewAction extends AbstractMainViewAction{
+	
+	/**
+	 * Reference to table viewer component.
+	 */
+	private final TableViewer viewer;
+
+	/**
+	 * Constructor.
+	 * @param viewer Reference to table viewer component.
+	 */
+	public SelectAllFromTableViewerMainViewAction(MainView view, TableViewer viewer){
+		super(view);
+		this.viewer = viewer;		
+		setText(Messages.getString("SelectAllFromTableViewerMainViewAction.SelectAll_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SelectAllFromTableViewerMainViewAction.SelectAll_Action_Tooltip"));		 //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		viewer.getTable().selectAll();	
+		// We must update context menu accordingly
+		view.updateImportFunctionsContextMenuStates(true);
+		super.run();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectNewRootComponentMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.job.GenerateCacheJob;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.ui.wizards.WizardUtils;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * Opens component selection wizard (and SDK selection 1st if no SDK selected previously).
+ */
+public class SelectNewRootComponentMainViewAction extends AbstractMainViewAction {
+	
+	/**
+	 * Action's ID
+	 */
+	public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.SelectNewRootComponentMainViewAction"; //$NON-NLS-1$
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public SelectNewRootComponentMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("SelectNewRootComponentMainViewAction.SelectNewRootComponen_Action_T")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SelectNewRootComponentMainViewAction.SelectNewRootComponen_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.ROOT_OBJ));	
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		
+		// Aborting possible ongoing search
+		MainView.abortCurrentlyOngoingSearches();
+		
+		Shell sh = view.getViewSite().getShell();
+
+		AppDepSettings st = AppDepSettings.getActiveSettings();
+		SdkInformation sdkInfo = st.getCurrentlyUsedSdk();
+		
+		
+		if(sdkInfo != null){
+			
+			boolean cacheNeedsUpdate = st.cacheNeedsUpdate(sdkInfo,
+															st.getCurrentlyUsedTargetPlatforms(),
+															st.getBuildType()
+															);
+					
+			if(cacheNeedsUpdate){
+				String targetPlatformStr = "'"  //$NON-NLS-1$
+											+ st.getCurrentlyUsedSdk().getSdkId()
+											+ " - " //$NON-NLS-1$
+											+ st.getCurrentlyUsedTargetPlatformsAsString()
+											+ " " //$NON-NLS-1$
+											+ st.getBuildType().getBuildTypeDescription()
+											+ "'"; //$NON-NLS-1$
+				String msg = Messages.getString("SelectNewRootComponentMainViewAction.Cache_For") + targetPlatformStr + Messages.getString("SelectNewRootComponentMainViewAction.Needs_Update")  //$NON-NLS-1$ //$NON-NLS-2$
+				             +  Messages.getString("SelectNewRootComponentMainViewAction.Perform_Cache_Update_Now_Question"); //$NON-NLS-1$
+				
+				AppDepMessageBox msgBox = new AppDepMessageBox(sh, msg, SWT.ICON_QUESTION | SWT.YES | SWT.NO);
+				int userResponse = msgBox.open();						
+				if(userResponse == SWT.YES){
+					// Triggering cache generation job
+					GenerateCacheJob.triggerCacheGenerationForCurrentlyActiveSettings();
+				}
+				else{
+					openComponentSelectionWizardPage(sh);					
+				}
+			}
+			else{
+				openComponentSelectionWizardPage(sh);					
+			}
+		}
+		//If there is no SDK selection, opening SDK selection page
+		else{
+			openSDKSelectionWizardPage(sh);
+		}
+		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+
+	/**
+	 * Opens component selection wizard page.
+	 * @param sh Parent shell to the opened wizard.
+	 */
+	private void openComponentSelectionWizardPage(Shell sh) {
+		// Otherwise opening component selection page
+		if(WizardUtils.invokeSDKAndTargetPlatformSelectionWizard(sh, 
+																 false,
+																 //Using current settings
+																 null,
+																 // Duplicate components have been already
+																 // reported earlier, no need to repeat.
+																 false)){
+			// If commenting this out, there is no refresh at normal component selection.
+			view.inputUpdated();    			
+		}
+	}
+	
+	/**
+	 * Opens component selection wizard page.
+	 * @param sh Parent shell to the opened wizard.
+	 */
+	private void openSDKSelectionWizardPage(Shell sh) {
+		// Otherwise opening component selection page
+		if(WizardUtils.invokeSDKAndTargetPlatformSelectionWizard(sh, 
+																 true)){
+			// NOTE: If uncommenting this out => there is no refresh at normal component selection
+			view.inputUpdated();    			
+		}
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SelectNewSDKMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,72 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.ui.wizards.WizardUtils;
+
+/**
+ * Starts SDK selection wizard.
+ */
+public class SelectNewSDKMainViewAction extends AbstractMainViewAction {
+	
+	/**
+	 * Action's ID
+	 */
+	public static final String ACTION_ID = "com.nokia.s60tools.appdep.ui.actions.SelectNewSDKMainViewAction"; //$NON-NLS-1$
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public SelectNewSDKMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("SelectNewSDKMainViewAction.SelectNewSDK_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SelectNewSDKMainViewAction.SelectNewSDK_Action_Tooltip")); //$NON-NLS-1$
+		
+		setId(ACTION_ID);
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.SELECT_SDK));	
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		
+		// Aborting possible ongoing search
+		MainView.abortCurrentlyOngoingSearches();
+		
+		Shell sh = view.getViewSite().getShell();
+		if(WizardUtils.invokeSDKAndTargetPlatformSelectionWizard(sh, true)){
+			view.inputUpdated();    			
+		}
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+				
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SetNewRootComponentListViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,95 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.listview.ListView;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Sets selected component as new root component.
+ * Available in component list view.
+ */
+public class SetNewRootComponentListViewAction extends Action {
+	
+	/**
+	 * Component list view reference.
+	 */
+	private final ListView listView;
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public SetNewRootComponentListViewAction(ListView view){
+		this.listView = view;
+		
+		setText(Messages.getString("SetNewRootComponentListViewAction.SetNewRoot_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SetNewRootComponentListViewAction.SetNewRoot_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.NEW_ROOT_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+
+		try {
+			Object obj = listView.getComponentListSelectedElement();
+
+			MainView.abortCurrentlyOngoingSearches();
+			
+			// The object is for sure an instance of ComponentPropertiesData
+			ComponentPropertiesData propData = (ComponentPropertiesData) obj;
+			String selectedComponentName = propData.getFilename();
+			ITargetPlatform targetPlatform = propData.getTargetPlatform();
+			
+			AppDepSettings st = AppDepSettings.getActiveSettings();
+			st.setCurrentlyAnalyzedComponentName(selectedComponentName);
+			st.setCurrentlyAnalyzedComponentTargetPlatform(targetPlatform);
+			MainView.update();
+						
+			// Remember to always call AbstractMainViewAction
+			// base class implementation
+			super.run();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+	}
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/SetNewRootMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,91 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Sets selected component as new root component.
+ * Available in component tree.
+ */
+public class SetNewRootMainViewAction extends AbstractMainViewAction {
+	
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public SetNewRootMainViewAction(MainView view){
+		super(view);
+		
+		setText(Messages.getString("SetNewRootMainViewAction.SetNewRoot_Action_Text")); //$NON-NLS-1$
+		setToolTipText(Messages.getString("SetNewRootMainViewAction.SetNewRoot_Action_Tooltip")); //$NON-NLS-1$
+		
+		
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		setImageDescriptor(ImageResourceManager.
+								getImageDescriptor(ImageKeys.NEW_ROOT_ACTION));				
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+
+		try {
+			
+			boolean isCurrentSelectionRootComponent = view.isRootNodeSelected();
+			if(isCurrentSelectionRootComponent){
+				// Selected node was already root component
+				return;				
+			}
+
+			// Aborting possible ongoing search
+			MainView.abortCurrentlyOngoingSearches();
+			
+			// The object is for sure an instance of ComponentNode
+			ComponentNode node = (ComponentNode) view.getComponentTreeSelectedElement();
+			String selectedComponentName = node.getName();
+			
+			AppDepSettings st = AppDepSettings.getActiveSettings();
+			st.setCurrentlyAnalyzedComponentName(selectedComponentName);
+			st.setCurrentlyAnalyzedComponentTargetPlatform(node.getTargetPlatform());
+
+			view.inputUpdated();    			
+						
+			// Remember to always call AbstractMainViewAction
+			// base class implementation
+			super.run();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowMethodCallLocationsImportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,69 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Public implementation for Imported functions tab's show method call locations action. 
+ * Real implementation is in abstract class {@link AbstractShowSourceFileAction}
+ */
+public class ShowMethodCallLocationsImportFunctionMainViewAction extends
+	AbstractShowMethodCallLocationsAction {
+
+	/**
+	 * Constructor.
+	 * @param view Reference to main view.
+	 */
+	public ShowMethodCallLocationsImportFunctionMainViewAction(MainView view) {
+		super(view);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+
+		//All we do here is found out method name and ordinal that user is selected
+		String methodName;
+
+		Object functionObj = view.getSelectedImportFunction();
+		if (functionObj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// or when Go Into -action is run.
+			AppDepConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("SourceFileFeatureCommonMessages.EmptySelection_ErrMsg"), AppDepConsole.MSG_WARNING); //$NON-NLS-1$
+
+			return;
+		}
+		ImportFunctionData efData = (ImportFunctionData) functionObj;
+		methodName = efData.getFunctionName();
+		
+		//Searching components in job triggered by base class implementation
+		super.runImpl(methodName);
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowMethodCallLocationsSearchDialogAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,78 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepSearchDialog;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Public implementation for Imported functions tab's for show method call locations action.
+ */
+public class ShowMethodCallLocationsSearchDialogAction extends AbstractShowMethodCallLocationsAction {
+
+	/**
+	 * Class that provides selected function.
+	 */
+	private AppDepSearchDialog searchDialog;
+
+	/**
+	 * Constructor.
+	 * @param searchDialog Reference to search dialog.
+	 * @param view Reference to main view.
+	 */
+	public ShowMethodCallLocationsSearchDialogAction(AppDepSearchDialog searchDialog, MainView view) {
+		super(view);
+		this.searchDialog = searchDialog;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+		
+		String functionName = searchDialog.getSelectedFunction();
+		if (functionName == null) {
+			AppDepConsole.getInstance().println(
+					Messages.getString("SourceFileFeatureCommonMessages.EmptySelection_ErrMsg"), AppDepConsole.MSG_WARNING); //$NON-NLS-1$
+			return;
+		}
+		
+		String componentName = searchDialog.getComponentForSelectedFunction();
+		if (componentName == null) {
+			AppDepConsole.getInstance().println(
+					Messages.getString("SourceFileFeatureCommonMessages.EmptySelection_ErrMsg"), AppDepConsole.MSG_WARNING); //$NON-NLS-1$
+			return;
+		}
+
+		// Search dialog can be closed, so that progress dialog can come in front.
+		searchDialog.close();
+		
+		try {
+			//Searching components in job triggered by base class implementation
+			runImpl(functionName, componentName);
+		} 		
+		catch (Exception e) {
+			e.printStackTrace();
+			showErrorMsgDialog(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg_ToUser")); //$NON-NLS-1$
+			AppDepConsole.getInstance().println(Messages.getString("SourceFileFeatureCommonMessages.UnableToShowLocations_ErrMsg") +e, AppDepConsole.MSG_ERROR); //$NON-NLS-1$
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectExportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,69 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Public implementation for Exported functions tab's show source file in project action. 
+ * Real implementation is in abstract class {@link AbstractShowSourceFileAction}
+ */
+public class ShowSourceFileAndCreateProjectExportFunctionMainViewAction extends
+	ShowSourceFileAndCreateProjectMainViewAction {
+
+	/**
+	 * Constructor.
+	 * @param view Reference to main view.
+	 */
+	public ShowSourceFileAndCreateProjectExportFunctionMainViewAction(MainView view) {
+		super(view);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+		
+		//All we do here is found out method name and ordinal that user is selected
+		String methodName;
+		String ordinal;
+
+		// If this is instance of export action
+
+		Object functionObj = view.getSelectedExportFunction();
+		if (functionObj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			AppDepConsole
+					.getInstance()
+					.println(Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.EmptySelection_ErrMsg"), //$NON-NLS-1$
+								AppDepConsole.MSG_WARNING);
+			return;
+		}
+		ExportFunctionData efData = (ExportFunctionData) functionObj;
+		methodName = efData.getFunctionName();
+		ordinal = efData.getFunctionOrdinal();
+		
+		super.runImpl(methodName, ordinal);
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectImportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * public implementation for Imported functions view show source action. 
+ * Real implementation is in abstract class {@link AbstractShowSourceFileAction}
+ */
+public class ShowSourceFileAndCreateProjectImportFunctionMainViewAction extends
+	ShowSourceFileAndCreateProjectMainViewAction {
+
+	/**
+	 * Constructor.
+	 * @param view Reference to main view.
+	 */
+	public ShowSourceFileAndCreateProjectImportFunctionMainViewAction(MainView view) {
+		super(view);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+
+		//All we do here is found out method name and ordinal that user is selected
+		String methodName;
+		String ordinal;
+
+		Object functionObj = view.getSelectedImportFunction();
+		if (functionObj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			AppDepConsole
+					.getInstance()
+					.println(Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.EmptySelection_ErrMsg"), //$NON-NLS-1$
+							AppDepConsole.MSG_WARNING);
+
+			return;
+		}
+		ImportFunctionData efData = (ImportFunctionData) functionObj;
+		methodName = efData.getFunctionName();
+		ordinal = efData.getFunctionOrdinal();
+		
+		super.runImpl(methodName, ordinal);
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileAndCreateProjectMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,327 @@
+/*
+* 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.appdep.ui.actions;
+
+import java.net.URISyntaxException;
+
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+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.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+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.ide.IDE;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.locatecomponent.CreateProjectJob;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.sourcecode.ISourceFinder;
+import com.nokia.s60tools.util.sourcecode.SourceFileLocation;
+import com.nokia.s60tools.util.sourcecode.SourceFinderFactory;
+
+/**
+ * Real implementation for show source file in project action.
+ */
+public abstract class ShowSourceFileAndCreateProjectMainViewAction extends AbstractShowSourceFileAction implements IJobChangeListener{
+	
+	/**
+	 * Source file location.
+	 */
+	private SourceFileLocation location = null;
+
+	/**
+	 * Constructor.
+	 * @param view Reference to the view.
+	 */
+	public ShowSourceFileAndCreateProjectMainViewAction(MainView view){
+		super(view);
+
+		setText(Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.ShowSource_Action_Text"));  //$NON-NLS-1$
+		setToolTipText(Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.ShowSource_Action_Tooltip"));  //$NON-NLS-1$
+	}
+	
+	/**
+	 * Real run method implementation for run() method.
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 * @param methodName method name from user selection
+	 * @param ordinal from user selection
+	 */
+	protected void runImpl(String methodName,
+	String ordinal) {
+		Object obj = view.getComponentTreeSelectedElement();
+
+		if (obj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// Getting component node that is cached.
+			obj = view.getMostRecentlySelectedComponentNode();
+			if(obj == null){
+				return;
+			}
+		}
+		try {
+			boolean showSISfileWarningDialog = false;
+
+			// Component is for sure a component node
+			ComponentNode node = (ComponentNode) obj;
+			String componentName = node.getName();
+
+			AppDepSettings settings = AppDepSettings.getActiveSettings();
+			if (settings.getCurrentlyAnalyzedComponentName() != null) {
+
+				AppDepConsole.getInstance().println(
+						Messages.getString("ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part1") //$NON-NLS-1$
+										+ componentName//$NON-NLS-1$ 
+										+Messages.getString("ShowSourceFileMainViewAction.ShowSource_Query_Start_Console_Msg_Part2") //$NON-NLS-1$
+										+ ordinal//$NON-NLS-1$										
+										+ "'..."); //$NON-NLS-1$
+				
+				// Collection needed information to get source file path
+				ISourceFinder finder = SourceFinderFactory
+						.createSourceFinder(AppDepConsole.getInstance());
+				
+				// Resolving source search parameters based on the settings and component name
+				resolveSearchParameters(componentName, settings);
+
+				location = finder.findSourceFile(ordinal,
+						methodName, componentName, variant, build, epocRootPath);
+				if(location.getSourceFileLocation() == null){
+					
+					String msg = Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part1") //$NON-NLS-1$
+						+ componentName//$NON-NLS-1$
+						+Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part2") //$NON-NLS-1$
+						+ ordinal//$NON-NLS-1$
+						+Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_Msg_Part3") //$NON-NLS-1$
+						+ methodName//$NON-NLS-1$
+						+"'";//$NON-NLS-1$
+					
+					AppDepConsole.getInstance().println(msg, AppDepConsole.MSG_WARNING); 
+					
+					showErrorMsgDialog(msg);
+					
+				}else{
+					
+					// Getting files in same location from workspace.
+					IPath path = new Path(location.getSourceFileLocation());	
+					IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
+					
+					if(files.length > 0){
+						// Same file was found from projects.
+						IWorkbench workbench = PlatformUI.getWorkbench();
+						IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();	
+						IWorkbenchPage page = window.getActivePage();
+						
+						IFile fileToOpen = files[0];
+						
+						if (page != null){
+							// Opening project if it isn't already open.
+							fileToOpen.getProject().open(null);
+							
+							// Opens first found file.
+							IEditorPart part = IDE.openEditor(page, fileToOpen);
+
+							if(part != null){
+								//Set focus to correct line
+								setFocusToLineWhereMethodIs(location);
+							}					   
+						}		
+					}
+					else {
+						// Creating new project from file.
+						String jobName = ProductInfoRegistry.getProductName() 
+			            	+ Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.CreateProjectJob_Title_Text")  //$NON-NLS-1$
+			            	+ location.getSourceFileLocation();					
+						//searching components in job.
+						CreateProjectJob job = new CreateProjectJob(
+							jobName, 
+							location, true );		
+						job.addJobChangeListener(this);		
+						job.setPriority(Job.DECORATE);
+						job.schedule();
+					}
+				}
+				//If SIS file is in analysis, showing on information dialog, that opened suorce file is not neccessarily same than used when SIS was build.
+				if(showSISfileWarningDialog ){
+					AppDepMessageBox msgBox = new AppDepMessageBox(
+							Messages.getString("ShowSourceFileMainViewAction.SourceFileOpenedFromSISFile_Info_Msg"),  //$NON-NLS-1$
+							SWT.ICON_INFORMATION | SWT.OK);
+					msgBox.open();						
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			String msg = Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg") //$NON-NLS-1$
+			+" "//$NON-NLS-1$
+			+ e.getMessage();
+			AppDepConsole.getInstance().println(
+					msg,  //$NON-NLS-1$
+					AppDepConsole.MSG_ERROR);
+			showErrorMsgDialog(Messages.getString("ShowSourceFileMainViewAction.SourceFileCannotBeFound_ErrMsg_ToUser"));//$NON-NLS-1$
+			
+		}		
+		// Remember to always call AbstractMainViewAction
+		// base class implementation
+		super.run();
+	}
+	
+	/**
+	 * Opening File in editor
+	 * @param location
+	 * @throws URISyntaxException
+	 * @throws CoreException
+	 */
+	private void openFileAndSetFocus(final SourceFileLocation location, final ICProject cProject) throws CoreException {
+
+		AppDepConsole.getInstance().println(
+				Messages.getString("ShowSourceFileMainViewAction.OpeningFile_Msg") //$NON-NLS-1$
+					+ location.getSourceFileLocation() //$NON-NLS-1$)					
+					+ "'"); //$NON-NLS-1$)
+		
+		//Runnable to open new file
+		final IWorkspaceRunnable runOpen = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// do the actual work in here
+				try {
+
+					IWorkbench workbench = PlatformUI.getWorkbench();
+					IPath path = new Path(location.getSourceFileLocation());		
+
+					// FindElement doesn't work with every with every file. Using it as default
+					// and opening file with link otherwise.
+					ICElement element = null;
+					IFile file = null;
+
+					// First try to get file with findElement.
+					try {
+						element = cProject.findElement(path);
+						// Removing first segment from path, because project folder is not needed.
+						file = cProject.getProject().getFile(element.getPath().removeFirstSegments(1));
+					} catch (CModelException e) {
+						// Finding element failed. Creating link instead.
+					}
+
+					// Getting file by creating a link only if file can't be opened.
+					if(element == null){
+						file = cProject.getProject().getFile(path.lastSegment());
+						file.createLink(path, IResource.REPLACE, null);
+					}
+
+					IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();	
+					IWorkbenchPage page = window.getActivePage();
+
+					if (page != null){
+						IEditorPart part = IDE.openEditor(page, file);
+
+						if(part != null){
+							//Set focus to correct line
+							setFocusToLineWhereMethodIs(location);
+						}					   
+					}					
+				} catch (PartInitException e) {
+					e.printStackTrace();
+					Status status = new Status(IStatus.ERROR,
+							Messages.getString("ShowSourceFileActionGeneralMessage.OpenFileAndSetLineFocus_ErrMsg"), 0, e //$NON-NLS-1$
+							.getMessage(), e);
+
+					throw new CoreException(status);
+				} 
+			}
+		};		
+		ResourcesPlugin.getWorkspace().run(runOpen, null, IWorkspace.AVOID_UPDATE, null);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+	 */
+	public void done(IJobChangeEvent event) {
+		
+		IStatus status = event.getResult();
+		CreateProjectJob job = (CreateProjectJob) event.getJob();
+
+		final ICProject cProject = job.getCProject();
+		
+		//Showing dialog only if not canceled
+		if(status.getSeverity() == IStatus.OK){
+
+			// Runnable implementing the actual printing to console
+			Runnable completedRunnable = new Runnable(){
+				public void run(){				
+					//Open found file, and set focus to method line
+					try {
+						openFileAndSetFocus(location, cProject);
+					} catch (CoreException e) {
+						String msg = Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.SourceFileOpenFailed_ErrMsg") //$NON-NLS-1$
+						+ e.getMessage();
+						AppDepConsole.getInstance().println(
+								msg,
+								AppDepConsole.MSG_ERROR);
+						showErrorMsgDialog(Messages.getString("ShowSourceFileAndCreateProjectMainViewAction.SourceFileOpenFailed_ErrMsg_ToUser")); //$NON-NLS-1$
+					}								
+				}
+			};
+
+			Display.getDefault().asyncExec(completedRunnable);   
+		}			
+	}
+	
+	public void aboutToRun(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	public void awake(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	public void running(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	public void scheduled(IJobChangeEvent event) {
+		// Not needed
+	}
+
+	public void sleeping(IJobChangeEvent event) {
+		// Not needed
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileExportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * public implementation for Exported functions view show source action. 
+ * Real implementation is in abstract class {@link AbstractShowSourceFileAction}
+ */
+public class ShowSourceFileExportFunctionMainViewAction extends
+		AbstractShowSourceFileAction {
+
+	/**
+	 * Constructor
+	 * @param view Reference to main view.
+	 */
+	public ShowSourceFileExportFunctionMainViewAction(MainView view) {
+		super(view);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+		
+		//All we do here is found out method name and ordinal that user is selected
+		String methodName;
+		String ordinal;
+
+		// If this is instance of export action
+
+		Object functionObj = view.getSelectedExportFunction();
+		if (functionObj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// or when Go Into -action is runned.
+			AppDepConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("SourceFileFeatureCommonMessages.EmptySelection_ErrMsg"), AppDepConsole.MSG_WARNING); //$NON-NLS-1$
+
+			return;
+		}
+		ExportFunctionData efData = (ExportFunctionData) functionObj;
+		methodName = efData.getFunctionName();
+		ordinal = efData.getFunctionOrdinal();
+		
+		super.runImpl(methodName, ordinal);
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ShowSourceFileImportFunctionMainViewAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,70 @@
+/*
+* 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.appdep.ui.actions;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * public implementation for Imported functions view show source action. 
+ * Real implementation is in abstract class {@link AbstractShowSourceFileAction}
+ */
+public class ShowSourceFileImportFunctionMainViewAction extends
+		AbstractShowSourceFileAction {
+
+	/**
+	 * Constructor.
+	 * @param view Reference to main view.
+	 */
+	public ShowSourceFileImportFunctionMainViewAction(MainView view) {
+		super(view);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.actions.AbstractMainViewAction#run()
+	 */
+	public void run() {
+
+		//All we do here is found out method name and ordinal that user is selected
+		String methodName;
+		String ordinal;
+
+		Object functionObj = view.getSelectedImportFunction();
+		if (functionObj == null) {
+			// We might get null-selections when
+			// tree is expanded/collapsed.
+			// or when Go Into -action is runned.
+			AppDepConsole
+					.getInstance()
+					.println(
+							Messages
+									.getString("SourceFileFeatureCommonMessages.EmptySelection_ErrMsg"), AppDepConsole.MSG_WARNING); //$NON-NLS-1$
+
+			return;
+		}
+		ImportFunctionData efData = (ImportFunctionData) functionObj;
+		methodName = efData.getFunctionName();
+		ordinal = efData.getFunctionOrdinal();
+		
+		super.runImpl(methodName, ordinal);
+
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/actions/ToolbarShortcutAction.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,124 @@
+/*
+* 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.appdep.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Our sample action implements workbench action delegate.
+ * The action proxy will be created by the workbench and
+ * shown in the UI. When the user tries to use the action,
+ * this delegate will be created and execution will be 
+ * delegated to it.
+ * @see IWorkbenchWindowActionDelegate
+ */
+public class ToolbarShortcutAction implements IWorkbenchWindowActionDelegate {
+	private IWorkbenchWindow window;
+	
+	/**
+	 * The constructor.
+	 */
+	public ToolbarShortcutAction() {
+	}
+
+	/**
+	 * The action has been activated. The argument of the
+	 * method represents the 'real' action sitting
+	 * in the workbench UI.
+	 * @see IWorkbenchWindowActionDelegate#run
+	 */
+	public void run(IAction action) {
+                
+    	try {
+    		IWorkbenchPage page = window.getActivePage();
+    		
+    		// 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)){
+					// Found, restoring the view
+					IViewPart viewPart = reference.getView(true);
+					page.activate(viewPart);
+		    		startDefaultWizard(viewPart);
+					return;
+				}
+			}
+    		
+    		// View was not found, opening it up as a new view.
+    		IViewPart viewPart = page.showView(MainView.ID);
+    		startDefaultWizard(viewPart);
+    		
+    	} catch (Exception e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(e.getMessage(), 
+										 IConsolePrintUtility.MSG_ERROR);
+		}
+    	
+	}
+
+	/**
+	 * Starts the default wizard of the tool.
+	 * @param viewPart Reference to the tools main view.
+	 */
+	private void startDefaultWizard(IViewPart viewPart) {
+		MainView view = (MainView) viewPart;		
+		// Starting default wizard
+		SelectNewSDKMainViewAction selectNewSDKMainViewAction = new SelectNewSDKMainViewAction(view);
+		selectNewSDKMainViewAction.run();
+	}
+
+	/**
+	 * Selection in the workbench has been changed. We 
+	 * can change the state of the 'real' action here
+	 * if we want, but this can only happen after 
+	 * the delegate has been created.
+	 * @see IWorkbenchWindowActionDelegate#selectionChanged
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	/**
+	 * We can use this method to dispose of any system
+	 * resources we previously allocated.
+	 * @see IWorkbenchWindowActionDelegate#dispose
+	 */
+	public void dispose() {
+	}
+
+	/**
+	 * We will cache window object in order to
+	 * be able to provide parent shell for the message dialog.
+	 * @see IWorkbenchWindowActionDelegate#init
+	 */
+	public void init(IWorkbenchWindow window) {
+		this.window = window;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AddComponentPrefixSearchOrderDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,150 @@
+/*
+* 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.appdep.ui.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;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Dialog to add component in prefix search order preferences page
+ */
+public class AddComponentPrefixSearchOrderDialog extends Dialog {
+		
+	/**
+	 * List box dialog text control for showing the content.
+	 */
+	private Text listBoxContentTextControl;
+	/**
+	 * Data for text control (available also after text control is disposed)
+	 */
+	private String text;	
+
+	/**
+	 * Constructor.
+	 * @param parentShell Parent shell.
+	 */
+	public AddComponentPrefixSearchOrderDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	/**
+	 * Constructor.
+	 * @param parentShell Parent shell provider.
+	 */
+	public AddComponentPrefixSearchOrderDialog(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,
+                true);     
+		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("AddComponentPrefixSearchOrderDialog.AddComponent_Txt")); //$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 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(Messages.getString("AddComponentPrefixSearchOrderDialog.Help_Txt")); //$NON-NLS-1$
+				
+		listBoxContentTextControl.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				text = listBoxContentTextControl.getText();
+				if(text != null  && text.trim().length() > 1){
+					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(){
+		text = ""; //$NON-NLS-1$
+		return super.open();
+	}
+	
+	/**
+	 * Gets prefix text entered by user.
+	 * @return prefix text entered by user.
+	 */
+	public String getText(){
+		return text;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AddSISFilesDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,637 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+ 
+package com.nokia.s60tools.appdep.ui.dialogs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Widget;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.appdep.util.SISFileUtils;
+import com.nokia.s60tools.ui.S60ToolsTable;
+import com.nokia.s60tools.ui.S60ToolsTableColumnData;
+import com.nokia.s60tools.ui.S60ToolsTableFactory;
+import com.nokia.s60tools.ui.S60ToolsUIConstants;
+
+
+
+/**
+ * Dialog for adding components from SIS file for analysis. 
+ */
+public class AddSISFilesDialog extends TitleAreaDialog  implements SelectionListener{	
+
+	//
+	// Private classes
+	//
+	
+	/**
+	 * Label provider for table viewer component.
+	 */
+	class SISFilesViewerLabelProvider extends LabelProvider implements ITableLabelProvider{
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null; // No images used
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			String label = element.toString();
+			
+			SISFileEntry entryData = (SISFileEntry) element;
+
+			switch (columnIndex) {
+		
+				case SISFileEntry.NAME_COLUMN_INDEX:
+					label = entryData.getFileName();
+					break;
+		
+				case SISFileEntry.LOCATION_COLUMN_INDEX:
+					label = entryData.getLocation();
+					break;
+							
+				default:
+					AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg") + ": " + columnIndex, AppDepConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+					break;
+			}
+			
+			return label;
+		}
+		
+	}
+	
+	//
+	// Private constants
+	//
+	
+	/**
+	 * Columns in the container area.
+	 */
+	private static final int COLUMN_COUNT = 2;	  
+
+	/**
+	 * Dialog width.
+	 */
+	private static final int DIALOG_WIDTH = 425;
+	
+	/**
+	 * Dialog height.
+	 */
+	private static final int DIALOG_HEIGHT = 425;
+		
+	/**
+	 * Percentage as decimal number how much table viewer is taking space hirizontally. 
+	 */
+	private static final double TABLE_VIEWER_WIDTH_PERCENTAGE = 0.8;
+	
+	/**
+	 * Default guiding message shown to the user in add new mode.
+	 */
+	private static final String DEFAULT_MESSAGE = Messages.getString("AddSISFilesDialog.Default_InfoMessage"); //$NON-NLS-1$
+	
+	/**
+	 * Complete message shown to the user in add new mode.
+	 */
+	private static final String COMPLETE_MESSAGE = Messages.getString("AddSISFilesDialog.Complete_InfoMessage");  //$NON-NLS-1$
+	
+	//
+	// Member data
+	//
+	
+	/**
+	 * Flag used to make sure that create() and open() are called in correct order.
+	 */
+	private boolean isCreateCalled = false;
+	
+	/**
+	 * Stores the currently selected SIS file entries.
+	 */
+	Map<String, SISFileEntry> sisFileEntries;
+
+	//
+	// UI Controls
+	//	
+	
+	/**
+	 * Container area for individual fields for the user for entering information.
+	 */
+	private Composite container;
+
+	/**
+	 * Reference to OK button that can be disabled/enabled 
+	 * due to information entered..
+	 */
+	private Button okActionBtn;
+
+	/**
+	 * Button for opening file dialog for selecting SIS file(s).
+	 */
+	private Button addButton;
+
+	/**
+	 * Button for removing currently selected SIS file from table viewer, 
+	 */
+	private Button removeButton;
+
+	/**
+	 * Button for removing all SIS files from table viewer,
+	 */
+	private Button removeAllButton;
+
+	/**
+	 * Viewer showing currently selected SIS file entries.
+	 */
+	private TableViewer sisFilesViewer;
+
+	
+	/**
+	 * Constructor. Used to open dialog in order to add new entry.
+	 * @param parentShell Parent shell for the dialog.
+	 */
+	public AddSISFilesDialog(Shell parentShell) {
+		super(parentShell);
+		sisFileEntries = new HashMap<String, SISFileEntry>();
+		// Setting banner image
+		String bannerImage = ImageKeys.WIZARD_BANNER;
+		setTitleImage(ImageResourceManager.getImage(bannerImage));
+	}
+
+    /* (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,
+                true);     
+		okActionBtn = getButton(IDialogConstants.OK_ID);
+		disableOk();        
+    }
+    
+    /* (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("AddSISFilesDialog.DialogTitleText"));			  //$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);
+		
+		//
+		// Creating container and layout for it
+		//
+		container = new Composite(dialogAreaComposite, SWT.NONE);
+		GridLayout gdl = new GridLayout(COLUMN_COUNT, false);
+		// Settings margins according Carbide branding guideline
+		gdl.marginLeft = S60ToolsUIConstants.MARGIN_BTW_FRAME_AND_CONTENTS;
+		gdl.marginRight = S60ToolsUIConstants.MARGIN_BTW_FRAME_AND_CONTENTS;
+		gdl.marginTop = S60ToolsUIConstants.MARGIN_BTW_FRAME_AND_CONTENTS;
+		gdl.marginBottom = S60ToolsUIConstants.MARGIN_BTW_FRAME_AND_CONTENTS;		
+		container.setLayout(gdl);
+		container.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		//
+		// Creating table viewer for showing SIS file entries
+		//
+		
+		sisFilesViewer = createSISFilesTableViewer(container);
+	    GridData sisFilesViewerGd = new GridData(GridData.FILL_BOTH);
+	    // Spanning as many rows as there are actions buttons on the right
+	    sisFilesViewerGd.verticalSpan = 3;
+	    sisFilesViewerGd.widthHint = (int) (TABLE_VIEWER_WIDTH_PERCENTAGE * DIALOG_WIDTH);
+		sisFilesViewer.getControl().setLayoutData(sisFilesViewerGd);
+		sisFilesViewer.setSorter(new SISFileEntryTableViewerSorter());
+		// Adding selection change listener
+		sisFilesViewer.addSelectionChangedListener(new ISelectionChangedListener(){
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+			 */
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+				// Just settings remove button enable/disable state based on the selection state
+				if(selection != null && selection.getFirstElement() != null){
+					removeButton.setEnabled(true);
+				}
+				else{
+					removeButton.setEnabled(false);					
+				}				
+			}
+			
+		});
+		
+		//
+		// Creating buttons
+		//
+		
+		int buttonGridDataStyleBits = GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING;
+		addButton = createButtonControl(Messages.getString("AddSISFilesDialog.Add_BtnCaptionText"), true, new GridData(buttonGridDataStyleBits)); //$NON-NLS-1$
+		removeButton = createButtonControl(Messages.getString("AddSISFilesDialog.Remove_BtnCaptionText"), false, new GridData(buttonGridDataStyleBits));		 //$NON-NLS-1$
+		removeAllButton = createButtonControl(Messages.getString("AddSISFilesDialog.RemoveAll_BtnCaptionText"), false, new GridData(buttonGridDataStyleBits)); //$NON-NLS-1$
+		
+		//
+		// Setting providers for table viewer
+		//
+		
+		// Creating content provider
+		IStructuredContentProvider sisFilesViewerContentProvider = new IStructuredContentProvider(){
+
+					/* (non-Javadoc)
+					 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+					 */
+					public Object[] getElements(Object inputElement) {
+						return sisFileEntries.values().toArray();
+					}
+		
+					/* (non-Javadoc)
+					 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+					 */
+					public void dispose() {
+						// Not needed but needs to be implemented
+					}
+		
+					public void inputChanged(Viewer viewer, Object oldInput,
+							Object newInput) {				
+						// Not used but needs to be implemented				
+					}
+	
+				};
+				
+		// Setting content provider
+		sisFilesViewer.setContentProvider(sisFilesViewerContentProvider);
+		sisFilesViewer.setInput(sisFilesViewerContentProvider);
+		
+		// Label provider
+		sisFilesViewer.setLabelProvider(new SISFilesViewerLabelProvider());
+
+		// Setting context-sensitive help ID
+		AppDepPlugin.setContextSensitiveHelpID(dialogAreaComposite, AppDepHelpContextIDs.APPDEP_DIALOG_ADD_SIS_FILES);
+		
+		// Dialog are composite ready
+		return dialogAreaComposite;
+	}
+
+	/**
+	 * Creates button with given label text.
+	 * @param labelText Label for the button.
+	 * @param isEnabled Set to <code>true</code> if button is enabled initially, otherwise <code>false</code>.
+	 * @param gridData Grid data to be applied to the button.
+	 * @return new instance of Button object.
+	 */
+	private Button createButtonControl(String labelText, boolean isEnabled, GridData gridData) {
+		  Button btn = new Button(container, SWT.PUSH );
+		  btn.setText(labelText); 
+		  btn.addSelectionListener(this);
+		  // What room is left horizontally from table viewer is given for buttons 
+		  gridData.widthHint = (int) (0.95 * (1-TABLE_VIEWER_WIDTH_PERCENTAGE) * DIALOG_WIDTH);
+		  btn.setLayoutData(gridData);
+		  btn.setEnabled(isEnabled);
+		  return btn;
+	}    
+		
+	 /* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()
+	 */
+	protected Point getInitialSize() {
+			return new Point(DIALOG_WIDTH, DIALOG_HEIGHT);
+	    }
+	 
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#create()
+	 */
+	public void create() {
+		super.create();
+		// Currently just does creation by super call and stores status
+		isCreateCalled = true;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		try {
+			// Making sure that create is called
+			if(!isCreateCalled){
+				create();
+			}
+			showDefaultMessage();			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return super.open();
+	}
+
+	/**
+	 * Resets possible error messages and show the default message.
+	 */
+	private void showDefaultMessage() {
+		setErrorMessage(null);
+		setMessage(DEFAULT_MESSAGE, IMessageProvider.INFORMATION);			
+	}
+
+	/**
+	 * Informs user that parameters are valid and dialog can be
+	 * dismissed with OK button..
+	 */
+	private void setCompleteOkMessage() {
+		setErrorMessage(null);
+		setMessage(COMPLETE_MESSAGE, IMessageProvider.INFORMATION);			
+	}
+
+	/**
+	 * Disables OK button.
+	 * This method is guarded against call during construction
+	 * when button row has not been created yet and widget is <code>null</code>.
+	 */
+	private void disableOk() {
+		if(okActionBtn != null){
+			okActionBtn.setEnabled(false);			
+		}
+	}
+
+	/**
+	 * Enables OK button.
+	 * This method is guarded against call during construction
+	 * when button row has not been created yet and widget is <code>null</code>.
+	 */
+	private void enableOk() {
+		if(okActionBtn != null){
+			okActionBtn.setEnabled(true);
+		}
+	}	
+			
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		// Not needed in here, but needs to be implemented		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		Widget widget = e.widget;
+		
+		if(widget.equals(addButton)){
+			queryAndAddNewEntries();
+		}
+		else if(widget.equals(removeAllButton)){
+			removeAllEntries();
+		}
+		else if(widget.equals(removeButton)){
+			// We have made sure by enabling/disabling button in selection 
+			// changed listener code that we have valid selection.
+			removeSelectedEntries();
+		}
+	}
+
+	/**
+	 * Launches SIS file selection and adds the selected and valid 
+	 * SIS files to the entries.
+	 */
+	private void queryAndAddNewEntries() {
+		List<String> illegalSISfilesList = new ArrayList<String>();
+		String[] selectedSISFiles = invokeAddSISFilesDialog(getShell());
+		for (int i = 0; i < selectedSISFiles.length; i++) {
+			String absolutePathFilename = selectedSISFiles[i];
+			if(checkSISFileValidity(absolutePathFilename, illegalSISfilesList)){
+				addEntry(absolutePathFilename);					
+			}
+		}
+		// Report user about the illegal SIS files that are not added to the table viewer
+		notifyIllegalSISFile(illegalSISfilesList);
+	}
+
+	/**
+	 * Shows an error dialog to user if there are any items 
+	 * in given list of illegal SIS files. 
+	 * @param illegalSISfilesList List of illegal SIS files.
+	 */
+	private void notifyIllegalSISFile(List<String> illegalSISfilesList) {
+		if(illegalSISfilesList.size() > 0){
+			String errMsg = Messages.getString("AddSISFilesDialog.NotSupportedSISFileDialog_ErrMsg"); //$NON-NLS-1$
+			for (int i = 0; i < illegalSISfilesList.size(); i++) {
+				String fileName = illegalSISfilesList.get(i);
+				errMsg = errMsg + "\n" + fileName; //$NON-NLS-1$
+			}
+			AppDepMessageBox msgBox = new AppDepMessageBox(getShell(), errMsg, SWT.ICON_ERROR);
+			msgBox.open();
+		}
+	}
+
+	/**
+	 * Checks validity of SIS file and in case file is not valid 
+	 * adds it into list of illegal SIS files passed as parameter. 
+	 * @param absolutePathFilename absolute file name to a SIS file.
+	 * @param illegalSISfilesList list of illegal SIS files 
+	 * @return <code>true</code> if file was a valid and supported SIS file. 
+	 */
+	private boolean checkSISFileValidity(String absolutePathFilename, List<String> illegalSISfilesList) {
+		boolean valid_9x_SISFile = SISFileUtils.isValid_9x_SISFile(absolutePathFilename);
+		if(!valid_9x_SISFile){
+			illegalSISfilesList.add(absolutePathFilename);
+		}
+		return valid_9x_SISFile;
+	}
+
+	/**
+	 * Removes the currently selected entries.
+	 * Precondition for calling this method to make sure 
+	 * that a valid selection exists.
+	 */
+	private void removeSelectedEntries() {
+		IStructuredSelection selection = (IStructuredSelection) sisFilesViewer.getSelection();
+		for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
+			SISFileEntry fileEntry = (SISFileEntry) iterator.next();
+			sisFileEntries.remove(fileEntry.getFullPathFileName());
+		}
+		notifyEntriesModified();
+	}
+
+	/**
+	 * Removes all entries from SIS files table viewer.
+	 */
+	private void removeAllEntries() {
+		sisFileEntries.clear();
+		notifyEntriesModified();		
+	}
+
+	/**
+	 * Adds SIS file entry and update buttons statuses.
+	 * @param absolutePathFilename absolute pathname to SIS file to be added.
+	 */
+	private void addEntry(String absolutePathFilename) {
+		File file = new File(absolutePathFilename);
+		String location = file.getParentFile().getAbsolutePath();
+		String sisFileName = file.getName();
+		SISFileEntry fileEntry = new SISFileEntry(location, sisFileName);
+		sisFileEntries.put(fileEntry.getFullPathFileName(), fileEntry);
+		notifyEntriesModified();
+	}
+		
+	/**
+	 * Updates buttons statuses according the current 
+	 * status of table entry viewer contents.
+	 */
+	private void notifyEntriesModified() {
+		if(sisFileEntries.size() > 0){
+			removeAllButton.setEnabled(true);
+			enableOk();
+			setCompleteOkMessage();
+		}
+		else{
+			removeAllButton.setEnabled(false);
+			showDefaultMessage();			
+		}		
+		sisFilesViewer.refresh();
+	}
+
+	/**
+	 * Creates viewer component for showing selected SIS files. 
+	 * @param parent Parent composite for the created composite.
+	 * @return New <code>TableViewer</code> object instance.
+	 */
+	protected TableViewer createSISFilesTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("AddSISFilesDialog.Name_ColumnTitleText"), //$NON-NLS-1$
+														140,
+														SISFileEntry.NAME_COLUMN_INDEX,
+														SISFileEntryTableViewerSorter.CRITERIA_NAME));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("AddSISFilesDialog.Location_ColumnTitleText"),  //$NON-NLS-1$
+														140,
+														SISFileEntry.LOCATION_COLUMN_INDEX,
+														SISFileEntryTableViewerSorter.CRITERIA_LOCATION));
+		
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tblViewer;
+	}
+	
+	/**
+	 * Opens the Open File(s) dialog.
+	 * @param sh parent shell
+	 * @return file name(s) selected, or <code>null</code> if canceled or errors occurs.
+	 */
+	public static String [] invokeAddSISFilesDialog(Shell sh){
+		//Open file dialog
+		FileDialog fdia = new FileDialog(sh, SWT.MULTI);	
+		fdia.setText(Messages.getString("AddSISFilesDialog.SISFileBrowseDialog_TitleText")); //$NON-NLS-1$
+		String [] extensions = new String[] {"*.SIS", "*.SISX"}; //$NON-NLS-1$ //$NON-NLS-2$
+		fdia.setFilterExtensions(extensions);
+		String file = fdia.open();
+		//If there is at least one file selected
+		if(file != null){
+			//get all selected file names
+			String [] files = fdia.getFileNames();
+			String path = fdia.getFilterPath();//Path (dir) where file(s) are
+			String [] filesWithPath = new String[files.length];
+			//Create absolute file paths <path>\<filename>
+			for (int i = 0; i < files.length; i++) {
+				filesWithPath[i] = path + File.separatorChar + files[i];
+			}
+			return filesWithPath;
+		}
+		else{
+			//User has canceled the operation
+			return null;
+		}
+	}
+
+	/**
+	 * Returns currently selected SIS files as string array containing absolute path names.
+	 * @return currently selected SIS files.
+	 */
+	public String[] getSelectedSISFiles() {
+		return sisFileEntries.keySet().toArray(new String[0]);
+	}
+
+	/**
+	 * Sets initial set of SIS file to be shown for the user.
+	 * Should be called before calling <code>open()</code> method.
+	 * @param initialSISFileSet initial file set to be shown for the user.
+	 */
+	public void setInitialSISFileSet(String[] initialSISFileSet) {
+		if(initialSISFileSet != null && initialSISFileSet.length > 0){
+			enableOk(); // Enabling OK because there is some content available
+			setCompleteOkMessage();
+			for (int i = 0; i < initialSISFileSet.length; i++) {
+				String fileFullPathName = initialSISFileSet[i];
+				addEntry(fileFullPathName);
+			}					
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepFindDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,386 @@
+/*
+* 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.appdep.ui.dialogs;
+
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+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 com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.IAppDepSettingsChangedListener;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.find.FindVisitor;
+import com.nokia.s60tools.appdep.find.IFindStartNodeProvider;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.IVisitor;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * 
+ * Implements find dialog for fetching components or
+ * imported/exported functions. 
+ *
+ * Usage example:
+ *
+ * <code>
+ * <pre>
+ * 
+ * // Parent shell
+ * Shell sh = Display.getCurrent().getActiveShell()
+ * 
+ * ComponentParentNode rootNode = view.getRootComponentNode();
+ * AppDepFindDialog dlg = new AppDepFindDialog(sh, rootNode);
+ * dlg.create();
+ * dlg.open();			
+ *  
+ * </pre> 
+ * </code>
+ * 
+ * @see org.eclipse.jface.dialogs.Dialog
+ */
+public class AppDepFindDialog extends TrayDialog implements SelectionListener,
+														  ModifyListener, 
+														  IAppDepSettingsChangedListener{
+	//
+	// Constants
+	//
+	
+	/**
+	 * Default width.
+	 */
+	private static final int DEFAULT_WIDTH = 300;
+
+	/**
+	 * Default height.
+	 */
+	private static final int DEFAULT_HEIGHT = 50;
+	
+	/**
+	 * Default column count for grid layouts.
+	 */
+	private final int DEFAULT_COLUMN_COUNT = 1;
+
+	/**
+	 * Find button ID
+	 */
+	private static final int FIND_BUTTON_ID = IDialogConstants.CLIENT_ID + 1;
+	
+    /**
+     * 'Find Nex't button finding for next matching component.
+     */
+	private Button findNextButton;
+    
+    /**
+     * Close button closes the dialog.
+     */
+	private Button closeButton;
+	
+	/**
+	 * Find string entering field. 
+	 */
+	private Text findStringTxtField;
+	
+	/**
+	 * Start node provider for the find. Needed because component
+	 * tree can change while dialog is opened.
+	 */
+	private final IFindStartNodeProvider startNodeProvider;
+
+	/**
+	 * Reference to main view showing the actual data to find for.
+	 */
+	private final MainView view;
+		
+	/**
+	 * List storing the latest find values. Set to <code>null</code> 
+	 * if there are no currently active find results.
+	 */
+	private List<ComponentNode> foundComponentsList = null;
+	
+	/**
+	 * Points to the index in found component list 
+	 * that is activated for user when 'Find Next'
+	 * is pressed for next time. 
+	 */
+	private int foundComponentIndex = 0;
+	
+	/**
+	 * Reference to current settings in order to listen for setting change events.
+	 */
+	private AppDepSettings currentSettings;
+	
+	/**
+	 * Constructor.
+	 * @param parentShell Parent shell.
+	 * @param startNodeProvider Start node provider for the find.
+	 * @param view Reference to main view.
+	 */
+	public AppDepFindDialog(Shell parentShell, 
+							  IFindStartNodeProvider startNodeProvider,
+			                  MainView view) {
+		super(parentShell);
+		this.startNodeProvider = startNodeProvider;
+		this.view = view;
+        setShellStyle(parentShell.getStyle() | SWT.MODELESS);
+        currentSettings = AppDepSettings.getActiveSettings();
+        currentSettings.addSettingsListener(this);
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		// Creating dialog area composite
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+	
+		//
+		// Defining dialog area layout
+		//
+		GridLayout gdl = new GridLayout(DEFAULT_COLUMN_COUNT, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = DEFAULT_WIDTH;
+		gd.heightHint = DEFAULT_HEIGHT;
+		gd.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN;
+		gd.verticalIndent = IDialogConstants.VERTICAL_MARGIN;
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);		
+		
+		//
+		// Adding find label and find text box
+		//
+		Composite findFieldsComposite = new Composite(dialogAreaComposite, SWT.NONE);
+		final int findFieldsColumnCount = 2;
+		GridLayout gdlComposite = new GridLayout(findFieldsColumnCount, false);
+		GridData gdComposite = new GridData(GridData.FILL_HORIZONTAL);
+		findFieldsComposite.setLayout(gdlComposite);
+		findFieldsComposite.setLayoutData(gdComposite);
+		
+		// Find string label
+		Label findStringTxtFieldLabel = new Label(findFieldsComposite, SWT.HORIZONTAL);		
+		findStringTxtFieldLabel.setText(Messages.getString("AppDepFindDialog.FindWhat_FindDialog_LabelText")); //$NON-NLS-1$
+
+		// Find string input fields
+		final int textFieldStyleBits = SWT.LEFT | SWT.SINGLE | SWT.BACKGROUND | SWT.BORDER;
+		findStringTxtField = new Text(findFieldsComposite, textFieldStyleBits);
+		findStringTxtField.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));
+		findStringTxtField.setEditable(true);
+		findStringTxtField.addModifyListener(this);
+		findStringTxtField.addSelectionListener(this);
+				
+		//
+		// And finally adding separator above the dialog button array
+		// 
+		Label separatorLine = new Label(dialogAreaComposite, SWT.HORIZONTAL | SWT.SEPARATOR);
+		separatorLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+		
+	    // Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(findStringTxtField, AppDepHelpContextIDs.APPDEP_FIND_DIALOG);
+	      
+		return dialogAreaComposite;
+	}
+
+    /* (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("AppDepFindDialog.Find_Components_FindDialog_TitleText"));  //$NON-NLS-1$
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        // Creating Find button
+		findNextButton = createButton(parent, FIND_BUTTON_ID, Messages.getString("AppDepFindDialog.FindNext_FindDialog_ButtonText"),true); //$NON-NLS-1$
+		findNextButton.setEnabled(false); // By default disabled
+		findNextButton.addSelectionListener(this);
+        //Creating Close button
+		closeButton = createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, false);
+		closeButton.addSelectionListener(this);
+		
+	    // Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(findNextButton, AppDepHelpContextIDs.APPDEP_FIND_DIALOG);
+	    AppDepPlugin.setContextSensitiveHelpID(closeButton, AppDepHelpContextIDs.APPDEP_FIND_DIALOG);
+    }
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		if(e.widget == findStringTxtField){
+			//  <code>widgetDefaultSelected</code> is typically called 
+			// when ENTER is pressed in a single-line text.
+			if(findStringTxtField.getText().length() > 0){
+				// Searching only when there is valid search string
+				performFindNextRunnableWrapper();
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		Widget w = e.widget;
+		
+		if(w.equals(findNextButton)){
+			performFindNextRunnableWrapper();
+		}		
+		else if(w.equals(closeButton)){
+			// Otherwise it must be Close button
+			// Stop listening setting changes...
+			currentSettings.removeSettingsListener(this);
+			// ... and closing the dialog
+			this.close();
+		}
+		
+	}
+
+	/**
+	 * Wraps find next functionality inside runnable for showing busy cursor.
+	 */
+	private void performFindNextRunnableWrapper() {
+		Runnable findNextQueryRunnable = new Runnable(){
+			public void run(){
+				performFindNext();
+			}
+		};
+		
+		// Showing busy cursor during operation			
+		Display d = getShell().getDisplay();
+		BusyIndicator.showWhile(d, findNextQueryRunnable);
+	}
+       
+	/**
+	 * Performs the find next based on the current find context.
+	 */
+	private void performFindNext() {
+		
+		// Do we have existing find context?
+		if(foundComponentsList == null){
+			// No we do not have => making new find
+			String searchString = findStringTxtField.getText();
+			foundComponentsList = findComponents(startNodeProvider.getSearchStartNode(), 
+					                                           searchString);			
+			// Did we found anything
+			if(foundComponentsList.size() == 0){
+				new AppDepMessageBox(Messages.getString("AppDepFindDialog.Cannot_Find_Components_FindDialog_InfoMsg")  //$NON-NLS-1$
+						              + " \"" + searchString + "\".",  //$NON-NLS-1$ //$NON-NLS-2$
+						              SWT.ICON_INFORMATION | SWT.OK).open();
+				resetFind();
+				return;
+			}
+		}
+		
+		// Do we have ended our search?
+		if(foundComponentIndex == foundComponentsList.size()){
+			// End reached
+			AppDepMessageBox mbox = new AppDepMessageBox(Messages.getString("AppDepFindDialog.EndOfTreeReached_ContinueFromBeginningQuery_FindDialog_InfoQueryMsg"), SWT.ICON_INFORMATION | SWT.YES | SWT.NO); //$NON-NLS-1$
+			int response = mbox.open();
+			if(response == SWT.YES){
+				// Resettings the index => find starts from beginning
+				foundComponentIndex = 0;				
+				findNextComponent();			
+			}
+		}
+		else{
+			// End not reached => Activating next found component from component tree			
+			findNextComponent();			
+		}
+	}
+
+	/**
+	 * Finds next component pointed by <code>foundComponentIndex</code> and
+	 * increments index count.
+	 */
+	private void findNextComponent() {
+		view.activateTreeViewComponent(foundComponentsList.get(foundComponentIndex));
+		// Incrementing count
+		foundComponentIndex++;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+	 */
+	public void modifyText(ModifyEvent e) {
+		
+		// Text field modification resets the current find
+		resetFind();
+		
+		// Settings button statuses according the text field contents
+		if(findStringTxtField.getText().length() > 0){
+			findNextButton.setEnabled(true);
+		}else{
+			findNextButton.setEnabled(false);
+		}
+	}
+		
+	/**
+	 * Resets current find context.
+	 */
+	private void resetFind(){
+		foundComponentsList = null;
+		foundComponentIndex = 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.IAppDepSettingsChangedListener#settingsChanged()
+	 */
+	public void settingsChanged(boolean isTargetBuildChanged) {		
+		// Resetting find context when settings have been changed
+		resetFind();		
+	}
+	
+	/**
+	 * Finds the components for given search string.
+	 * @param startNode Start node for the search.
+	 * @param searchString String to search for
+	 * @return List of component nodes matching to given search string
+	 */
+	private List<ComponentNode> findComponents(ComponentNode startNode, String searchString){
+		List<ComponentNode> searchResultList = new ArrayList<ComponentNode>();
+		IVisitor v = new FindVisitor(searchString, searchResultList);
+		startNode.accept(v);
+		return searchResultList;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepMessageBox.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,135 @@
+/*
+* 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.appdep.ui.dialogs;
+
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+
+/**
+ * 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 AppDepMessageBox {
+
+	/**
+	 * Message box class wrapped inside the tool-specific message box.
+	 */
+	MessageBox msgBox;
+
+	/**
+	 * Constructor.
+	 * @param message User visible message.
+	 * @param style Style bits.
+	 */
+	public AppDepMessageBox(String message, int style){		
+		Shell sh = AppDepPlugin.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 AppDepMessageBox(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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/AppDepSearchDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1013 @@
+/*
+* 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.appdep.ui.dialogs;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbenchActionConstants;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.CacheDataManager;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.data.ICacheDataManager;
+import com.nokia.s60tools.appdep.core.model.AbstractFunctionData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.locatecomponent.SeekParentNodesService;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.search.MatchType;
+import com.nokia.s60tools.appdep.search.SearchConstants;
+import com.nokia.s60tools.appdep.search.MatchType.MatchTypes;
+import com.nokia.s60tools.appdep.search.SearchConstants.SearchType;
+import com.nokia.s60tools.appdep.ui.actions.SelectAllFromListAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowMethodCallLocationsSearchDialogAction;
+import com.nokia.s60tools.appdep.ui.utils.UiUtils;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+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;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * 
+ * Implements search dialog for fetching components or
+ * imported/exported functions. 
+ *
+ * Usage example:
+ *
+ * <code>
+ * <pre>
+ * 
+ * // Parent shell
+ * Shell sh = Display.getCurrent().getActiveShell()
+ * 
+ * ComponentParentNode rootNode = view.getRootComponentNode();
+ * AppDepSearchDialog dlg = new AppDepSearchDialog(sh, SearchType.SEARCH_COMPONENTS, rootNode);
+ * dlg.create();
+ * dlg.open();			
+ *  
+ * </pre> 
+ * </code>
+ * 
+ * @see org.eclipse.jface.dialogs.Dialog
+ */
+public class AppDepSearchDialog extends TrayDialog implements SelectionListener,
+														  ModifyListener,
+														  IStringProvider{
+
+	/**
+	 * Tooltip shown to user when searching components. This is default message at start up when default values are selected from dialog.
+	 */
+	private static final String TOOLTIP_MSG_COMPONENT_QUERY = Messages.getString("AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_ComponentQuery"); //$NON-NLS-1$
+
+	/**
+	 * Tooltip shown to user when searching functions and 'StartsWith', 'EndsWith', or 'ExactMatch' is selected from math type selection combo box.
+	 */
+	private static final String TOOLTIP_MSG_USE_FUNC_BASE_NAME = Messages.getString("AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_FunctionQuery_UsingBaseName"); //$NON-NLS-1$
+	
+	/**
+	 * Tooltip shown to user when searching functions and 'Contains', or 'RegularExpression' is selected from math type selection combo box.
+	 */
+	private static final String TOOLTIP_MSG_USE_COMPLETE_FUNC_NAME = Messages.getString("AppDepSearchDialog.Tooltip_Msg_MatchTypeCombo_FunctionQuery_UsingLongName"); //$NON-NLS-1$
+	
+	/**
+	 * Maximum amount of data items that are reasonable to show in search result list without making user wait for too long time.
+	 * In case maximum result size is exceeded, an informative message is shown for a user.
+	 */
+	private static final int MAX_RESULTS_SIZE = 30000;
+
+	//
+	// Private types
+	//
+	private Action actionCompPropertiesDataCopy;
+	private Action actionSelectAllFromList;
+	private Action actionImportShowMethodLoc;	
+	
+	/**
+	 * Match type is attached with description shown in the UI
+	 */	
+	private class MatchTypeItem{
+
+		private final MatchTypes matchType;
+		private final String matchTypeDescription;
+
+		public MatchTypeItem(MatchTypes matchType, String matchTypeDescription){
+			this.matchType = matchType;
+			this.matchTypeDescription = matchTypeDescription;
+			
+		}
+
+		/**
+		 * @return the matchType
+		 */
+		public MatchTypes getMatchType() {
+			return matchType;
+		}
+
+		/**
+		 * @return the matchTypeDescription
+		 */
+		public String getMatchTypeDescription() {
+			return matchTypeDescription;
+		}
+
+	}
+	
+	/**
+	 * Single result item object in search result list box. 
+	 */
+	private class SearchResultItem{
+		
+		/**
+		 * Component name
+		 */
+		private String componentName = null;
+		/**
+		 * Function name
+		 */
+		private String functionName = null;
+		/**
+		 * Function ordinal
+		 */
+		private String functionOrdinal = null;
+		
+		/**
+		 * Constructor.
+		 */
+		public SearchResultItem(){			
+		}
+		
+		/**
+		 * Gets component name.
+		 * @return component name
+		 */
+		public String getComponentName() {
+			return componentName;
+		}
+
+		/**
+		 * Sets component name
+		 * @param componentName component name
+		 */
+		public void setComponentName(String componentName) {
+			this.componentName = componentName;
+		}
+
+		/**
+		 * Gets function name
+		 * @return function name
+		 */
+		public String getFunctionName() {
+			return functionName;
+		}
+
+		/**
+		 * Sets function name
+		 * @param functionName function name
+		 */
+		public void setFunctionName(String functionName) {
+			this.functionName = functionName;
+		}
+
+		/**
+		 * Gets function ordinal.
+		 * @return function ordinal
+		 */
+		public String getFunctionOrdinal() {
+			return functionOrdinal;
+		}
+
+		/**
+		 * Sets function ordinal
+		 * @param functionOrdinal function ordinal
+		 */
+		public void setFunctionOrdinal(String functionOrdinal) {
+			this.functionOrdinal = functionOrdinal;
+		}
+
+	}
+	
+	//
+	// Constants
+	//
+	
+	/**
+	 * Default width.
+	 */
+	private static final int DEFAULT_WIDTH = 500;
+
+	/**
+	 * Default height.
+	 */
+	private static final int DEFAULT_HEIGHT = 350;
+	
+	/**
+	 * Default column count for grid layouts.
+	 */
+	private final int DEFAULT_COLUMN_COUNT = 1;
+
+	/**
+	 * Search button ID
+	 */
+	private static final int SEARCH_BUTTON_ID = IDialogConstants.CLIENT_ID + 1;
+	
+	//
+	// Members
+	//
+	
+	/**
+	 * Possible match types available in search dialog.
+	 */
+	MatchTypeItem[] matchTypeItemArr = {
+											new MatchTypeItem(MatchTypes.CONTAINS, Messages.getString("AppDepSearchDialog.Contains_Msg")),  //$NON-NLS-1$
+											new MatchTypeItem(MatchTypes.STARTS_WITH, Messages.getString("AppDepSearchDialog.Starts_With_Msg")),  //$NON-NLS-1$
+											new MatchTypeItem(MatchTypes.ENDS_WITH, Messages.getString("AppDepSearchDialog.Ends_With_Msg")),  //$NON-NLS-1$
+											new MatchTypeItem(MatchTypes.EXACT_MATCH, Messages.getString("AppDepSearchDialog.Exact_Match_Msg")),  //$NON-NLS-1$											
+											new MatchTypeItem(MatchTypes.REGULAR_EXPRESSION, Messages.getString("AppDepSearchDialog.Regular_Expression_Msg")) //$NON-NLS-1$
+											};
+	
+    /**
+     * Search button starts the search.
+     */
+	private Button searchButton;
+    
+    /**
+     * Close button closes the dialog.
+     */
+	private Button closeButton;
+	
+	/**
+	 * Radio button for components search type 
+	 */
+	Button searchForComponentsRadioBtn;
+	
+	/**
+	 * Radio button for imported functions search type 
+	 */
+	Button searchForImportedFunctionsRadioBtn;
+	
+	/**
+	 * Radio button for exported functions search type 
+	 */
+	Button searchForExportedFunctionsRadioBtn;
+	
+	/**
+	 * Combobox for selecting the used match criterion.
+	 */
+	private Combo matchTypeSelCombo;
+	
+	/**
+	 * Background color for non-editable widgets. 
+	 */
+	Color nonEditableFieldBkgColor;
+
+	/**
+	 * Case sensitivity selection checkbox
+	 */
+	Button caseSensitivityOptionCheckbox;
+	/**
+	 * Search string entering field. 
+	 */
+	private Text searchStringTxtField;
+	
+	/**
+	 * List item for showing list of APIs 
+	 */
+	private List searchResultList;	
+			
+	/**
+	 * Search type used for actual search.
+	 */
+	private SearchType selectedSearchType;	
+		
+	/**
+	 * Reference to main view showing the actual data to search for.
+	 */
+	private final MainView view;
+
+	/**
+	 * Map where is results in list as keys and component name, where result belongs as value.
+	 * Really needed when results are exported or imported functions, and item in list is not really 
+	 * component name, but "<function name>   [<component name>]".  We need to know component name
+	 * when double click is performed. Also we need to . 
+	 */
+	private Map<String, SearchResultItem> resultsMap;
+	
+	/**
+	 * Keeps track if searchResultList contains data of imported functions.
+	 */
+	private boolean isImportedFunctionsSearched = false;
+		
+	/**
+	 * Constructor.
+	 * @param parentShell Parent shell.
+	 * @param searchType Default search type for this dialog instance at start-up.
+	 * @param view Reference to main view.
+	 */
+	public AppDepSearchDialog(Shell parentShell, SearchConstants.SearchType searchType,
+			                  MainView view) {
+		super(parentShell);
+    	int shellStyle = getShellStyle() | SWT.RESIZE;
+    	setShellStyle(shellStyle);	
+		this.selectedSearchType = searchType;
+		this.view = view;
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		
+		// Creating dialog area composite
+		Composite dialogAreaComposite = (Composite) super.createDialogArea(parent);		
+		//
+		// Defining dialog area layout
+		//
+		GridLayout gdl = new GridLayout(DEFAULT_COLUMN_COUNT, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.widthHint = DEFAULT_WIDTH;
+		gd.heightHint = DEFAULT_HEIGHT;
+		gd.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN;
+		gd.verticalIndent = IDialogConstants.VERTICAL_MARGIN;
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);		
+		// Allocating new color => should be dispose at close
+		nonEditableFieldBkgColor = getShell().getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
+		
+		//
+		// Adding search label and search text box
+		//
+		Composite searchFieldsComposite = new Composite(dialogAreaComposite, SWT.NONE);
+		final int searchFieldsColumnCount = 2;
+		GridLayout gdlComposite = new GridLayout(searchFieldsColumnCount, false);
+		GridData gdComposite = new GridData(GridData.FILL_HORIZONTAL);
+		searchFieldsComposite.setLayout(gdlComposite);
+		searchFieldsComposite.setLayoutData(gdComposite);
+		
+		// Search string label
+		Label searchStringTxtFieldLabel = new Label(searchFieldsComposite, SWT.HORIZONTAL);		
+		searchStringTxtFieldLabel.setText(Messages.getString("AppDepSearchDialog.Search_String_Msg")); //$NON-NLS-1$
+
+		// Search string input fields
+		final int textFieldStyleBits = SWT.LEFT | SWT.SINGLE | SWT.BACKGROUND | SWT.BORDER;
+		searchStringTxtField = new Text(searchFieldsComposite, textFieldStyleBits);
+		searchStringTxtField.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));
+		searchStringTxtField.setEditable(true);
+		searchStringTxtField.addModifyListener(this);
+		searchStringTxtField.addSelectionListener(this);
+		
+		//
+		// Search type
+		//
+		Group searchTypeGroup = new Group(dialogAreaComposite, SWT.SHADOW_NONE);
+		searchTypeGroup.setText(Messages.getString("AppDepSearchDialog.Search_For_Msg"));				 //$NON-NLS-1$
+		GridLayout gdl2 = new GridLayout(DEFAULT_COLUMN_COUNT , false);
+		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);				
+		searchTypeGroup.setLayout(gdl2);
+		searchTypeGroup.setLayoutData(gd2);
+
+		// Component search radio button
+		searchForComponentsRadioBtn = new Button(searchTypeGroup, SWT.RADIO);		
+		searchForComponentsRadioBtn.setText(Messages.getString("AppDepSearchDialog.Components_Msg")); //$NON-NLS-1$
+		searchForComponentsRadioBtn.addSelectionListener(this);
+				
+		// Imported functions search radio button
+		searchForImportedFunctionsRadioBtn = new Button(searchTypeGroup, SWT.RADIO);		
+		searchForImportedFunctionsRadioBtn.setText(Messages.getString("AppDepSearchDialog.Imported_Functions_Msg")); //$NON-NLS-1$
+		searchForImportedFunctionsRadioBtn.addSelectionListener(this);
+		
+		// Exported functions search radio button
+		searchForExportedFunctionsRadioBtn = new Button(searchTypeGroup, SWT.RADIO);		
+		searchForExportedFunctionsRadioBtn.setText(Messages.getString("AppDepSearchDialog.Exported_Functions_Msg")); //$NON-NLS-1$
+		searchForExportedFunctionsRadioBtn.addSelectionListener(this);
+
+		// Updating radio button selection states accoring currenlty selected search type
+		updateSearchTypeSelectionBtns();
+		
+		//
+		// Options group
+		//
+		Group searchOptionsGroup = new Group(dialogAreaComposite, SWT.SHADOW_NONE);
+		searchOptionsGroup.setText(Messages.getString("AppDepSearchDialog.Options_Msg"));				 //$NON-NLS-1$
+		final int optionsGroupColumnCount = 3;
+		GridLayout gdl3 = new GridLayout(optionsGroupColumnCount, false);
+		GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);				
+		searchOptionsGroup.setLayout(gdl3);
+		searchOptionsGroup.setLayoutData(gd3);
+		
+		// Match type combo label
+		Label matchTypeLabel = new Label(searchOptionsGroup, SWT.HORIZONTAL | SWT.LEFT);		
+		matchTypeLabel.setText(Messages.getString("AppDepSearchDialog.Match_Type_Msg"));		 //$NON-NLS-1$
+		
+		// Match type combo 
+		matchTypeSelCombo = new Combo(searchOptionsGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
+		matchTypeSelCombo.setText(Messages.getString("CacheGenerationOptionsWizardPage.ToolchainSelCombo_Text")); //$NON-NLS-1$
+		matchTypeSelCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		matchTypeSelCombo.setBackground(nonEditableFieldBkgColor);		
+		
+		for (int i = 0; i < matchTypeItemArr.length; i++) {
+			MatchTypeItem matchType = matchTypeItemArr[i];
+			matchTypeSelCombo.add(matchType.getMatchTypeDescription());			
+		}
+		matchTypeSelCombo.select(0); // Selecting first match type by default
+		matchTypeSelCombo.addSelectionListener(this);
+		
+		// Case sensitivity selection checbox 
+		caseSensitivityOptionCheckbox = new Button(searchOptionsGroup, SWT.CHECK);
+		caseSensitivityOptionCheckbox.setText(Messages.getString("AppDepSearchDialog.Case_Sensitive_Msg")); //$NON-NLS-1$
+		caseSensitivityOptionCheckbox.setSelection(false);
+		caseSensitivityOptionCheckbox.addSelectionListener(this);		
+		
+		//
+		// Search Results 
+		//
+		Label searchResultsLabel = new Label(dialogAreaComposite, SWT.HORIZONTAL);		
+		searchResultsLabel.setText(Messages.getString("AppDepSearchDialog.Search_Results_Msg"));		 //$NON-NLS-1$
+		
+		// List box for results
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL;
+		searchResultList = new List(dialogAreaComposite, listBoxStyleBits);
+		GridData listData1 = new GridData(GridData.FILL_BOTH);
+		searchResultList.setLayoutData(listData1);
+		searchResultList.setBackground(nonEditableFieldBkgColor);
+		
+		// Listening for user selections
+		MouseListener searchResultListSelListener = new MouseListener(){
+			public void mouseDoubleClick(MouseEvent e) {
+				searchListObjectDoubleClicked();
+			}
+			public void mouseDown(MouseEvent e) {
+				// No action				
+			}
+			public void mouseUp(MouseEvent e) {
+				// No action				
+			}
+		};
+		searchResultList.addMouseListener(searchResultListSelListener);
+		
+		// Listening for list selections to prevent using Show Method Call Location with multiple selections.
+		SelectionListener searchResultListSelectionListener = new SelectionListener(){
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// No action
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				// Enabling action if needed.
+				boolean enableMethodCallLocationsAction = (searchResultList.getSelectionCount() == 1) && isImportedFunctionsSearched; 
+				actionImportShowMethodLoc.setEnabled(enableMethodCallLocationsAction);
+			}
+		};
+		searchResultList.addSelectionListener(searchResultListSelectionListener);
+
+		//Adding context menu to list.
+		createActionMenu();
+		
+		// Updating tooltip texts according the current selection status
+		updateToolTipTexts();
+		
+		//
+		// And finally adding separator above the dialog button array
+		// 
+		Label separatorLine = new Label(dialogAreaComposite, SWT.HORIZONTAL | SWT.SEPARATOR);
+		separatorLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+		
+	    // Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(dialogAreaComposite, AppDepHelpContextIDs.APPDEP_SEARCH_DIALOG);
+		
+		return dialogAreaComposite;
+	}
+	
+
+	/**
+	 * Creating context menu
+	 */
+	private void createActionMenu(){
+
+		createActions();
+		
+		MenuManager menuMgr = new MenuManager("#PopupCopyMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				AppDepSearchDialog.this.fillViewContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(searchResultList);
+		searchResultList.setMenu(menu);
+			
+	}
+
+	/**
+	 * Adds items to context menu.
+	 * @param manager Menu manager
+	 */
+	private void fillViewContextMenu(IMenuManager manager) {
+		manager.add(actionCompPropertiesDataCopy);
+		manager.add(actionSelectAllFromList);
+		manager.add(actionImportShowMethodLoc);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}	
+	
+	/**
+	 * Creates actions for context menu
+	 */
+	private void createActions() {
+		
+		StringArrayClipboardCopyHandler copyHandler = new StringArrayClipboardCopyHandler();		
+		actionCompPropertiesDataCopy = new CopyFromStringProviderToClipboardAction(this /* listItemsViewer*/,
+                												new ICopyActionHandler[]{ copyHandler }
+					                                           );
+		actionSelectAllFromList = new SelectAllFromListAction(searchResultList);
+		actionImportShowMethodLoc = new ShowMethodCallLocationsSearchDialogAction(this, view);
+	}
+	
+	/**
+	 * Updates radio buttons states insided search type group
+	 * according the current selection.
+	 */
+	private void updateSearchTypeSelectionBtns() {
+		if(selectedSearchType.equals(SearchType.SEARCH_COMPONENTS)){
+			searchForComponentsRadioBtn.setSelection(true);			
+		}
+		else{
+			searchForComponentsRadioBtn.setSelection(false);
+		}
+		if(selectedSearchType.equals(SearchType.SEARCH_IMPORTED_FUNCTIONS)){
+			searchForImportedFunctionsRadioBtn.setSelection(true);			
+		}
+		else{
+			searchForImportedFunctionsRadioBtn.setSelection(false);
+		}
+		if(selectedSearchType.equals(SearchType.SEARCH_EXPORTED_FUNCTION)){
+			searchForExportedFunctionsRadioBtn.setSelection(true);			
+		}
+		else{
+			searchForExportedFunctionsRadioBtn.setSelection(false);
+		}
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell(Shell shell) {    	
+        super.configureShell(shell);
+        String dialogTopic = getDialogName();
+		shell.setText(dialogTopic);
+    }
+
+	/**
+	 * Gets the dialog name.
+	 * @return dialog name
+	 */
+	private String getDialogName() {
+        AppDepSettings st = AppDepSettings.getActiveSettings();
+
+		String currentlyUsedSDK = st.getCurrentlyUsedSdk().getSdkId();
+        String variant = st.getCurrentlyUsedTargetPlatformsAsString();
+        String build = st.getBuildType().getBuildTypeName();        
+        String usedSDKInfo = currentlyUsedSDK + " - " + variant + " " +build;//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ 
+        String dialogTopic = Messages.getString("AppDepSearchDialog.Search_Msg") +" " +usedSDKInfo ;//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		return dialogTopic;
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+     */
+    protected void createButtonsForButtonBar(Composite parent) {
+        // Creating Search button
+		searchButton = createButton(parent, SEARCH_BUTTON_ID, Messages.getString("AppDepSearchDialog.Search_Btn_Msg"),true); //$NON-NLS-1$
+		searchButton.setEnabled(false); // By default disabled
+		searchButton.addSelectionListener(this);
+        //Creating Close button
+		closeButton = createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, false);
+		closeButton.addSelectionListener(this);
+    }
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+		if(e.widget == searchStringTxtField){
+			//  <code>widgetDefaultSelected</code> is typically called 
+			// when ENTER is pressed in a single-line text.
+			}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		Widget w = e.widget;
+		
+		if(w.equals(searchButton)){
+			Runnable performAPIDetailsQueryRunnable = new Runnable(){
+				public void run(){
+					performSearch();
+				}
+			};
+			
+			// Showing busy cursor during operation			
+			Display d = getShell().getDisplay();
+			BusyIndicator.showWhile(d, performAPIDetailsQueryRunnable);
+		}		
+		else if(w.equals(closeButton)){
+			// Otherwise it must be Close button
+			this.close(); // close() method is overridden in the end of the file for making clean-up
+			return;
+		}
+		else if(w.equals(matchTypeSelCombo)){
+			int selIndex = matchTypeSelCombo.getSelectionIndex();
+			MatchTypes selType = matchTypeItemArr[selIndex].getMatchType();
+			// Setting enable/disable state of case sensitivity checkbox according the selected match type 
+			if(selType.equals(MatchTypes.REGULAR_EXPRESSION)){
+				caseSensitivityOptionCheckbox.setEnabled(false);
+				caseSensitivityOptionCheckbox.setSelection(false);
+			}
+			else{
+				caseSensitivityOptionCheckbox.setEnabled(true);				
+			}
+		}
+		else if(w.equals(searchForComponentsRadioBtn)){
+			selectedSearchType = SearchType.SEARCH_COMPONENTS;
+			updateSearchTypeSelectionBtns();
+		}
+		else if(w.equals(searchForImportedFunctionsRadioBtn)){
+			selectedSearchType = SearchType.SEARCH_IMPORTED_FUNCTIONS;
+			updateSearchTypeSelectionBtns();
+		}
+		else if(w.equals(searchForExportedFunctionsRadioBtn)){
+			selectedSearchType = SearchType.SEARCH_EXPORTED_FUNCTION;
+			updateSearchTypeSelectionBtns();
+		}
+		
+		// Updating tooltip texts according the current selection status
+		// This must be called here because selected search type has 
+		// to be set before calling the method.
+		updateToolTipTexts();
+	}
+
+	/**
+	 * Sets tooltip text according the selected match type 
+	 * and the used query type.
+	 * Calling of this method requires that all the referenced 
+	 * widgets are created/initialized properly.
+	 */
+	private void updateToolTipTexts() {
+		int selIndex = matchTypeSelCombo.getSelectionIndex();
+		MatchTypes selType = matchTypeItemArr[selIndex].getMatchType();
+		// Are we querying function data?
+		if(selectedSearchType == SearchType.SEARCH_IMPORTED_FUNCTIONS || selectedSearchType == SearchType.SEARCH_EXPORTED_FUNCTION){
+			if(selType.equals(MatchTypes.REGULAR_EXPRESSION) || selType.equals(MatchTypes.CONTAINS)){
+				matchTypeSelCombo.setToolTipText(TOOLTIP_MSG_USE_COMPLETE_FUNC_NAME);
+				return;
+			}
+			else{
+				matchTypeSelCombo.setToolTipText(TOOLTIP_MSG_USE_FUNC_BASE_NAME);
+				return;
+				}			
+		}
+		// Otherwise component data is to be queried
+		matchTypeSelCombo.setToolTipText(TOOLTIP_MSG_COMPONENT_QUERY);					
+	}
+       
+	/**
+	 * Performs the search based on the current dialog parameters.
+	 */
+	private void performSearch() {
+
+		String searchString = null;
+		try {
+			// Clearing old results
+			searchResultList.removeAll();
+			
+			// Disabling Show Method Call Locations functionality when list is cleared.
+			actionImportShowMethodLoc.setEnabled(false);
+			isImportedFunctionsSearched = false;
+			
+			ICacheDataManager manager = CacheDataManager.getInstance();
+			
+			searchString = searchStringTxtField.getText();
+			MatchType matchType = new MatchType( matchTypeItemArr[matchTypeSelCombo.getSelectionIndex()].matchType );
+			//Adding case sensitive parameters, only when its not regular expression 
+			if(matchType.getMatchType() != MatchTypes.REGULAR_EXPRESSION){
+				boolean isCaseSensitiveSearch = caseSensitivityOptionCheckbox.getSelection();
+				matchType.setCaseSensitiveSearch(isCaseSensitiveSearch);
+			}
+			
+			//Get results from manager
+			Map<String, java.util.List<AbstractFunctionData>> results = manager.searchCache(searchString, selectedSearchType, matchType);
+
+			if(results != null){
+				//Generate results map, where is list strings and component names
+				resultsMap = getResultMap(results, selectedSearchType);
+				//check if there is not too much results. Checked with imported functions search "L" 
+				//that 200000 results takes way too long to set dialog List items, but "newL" search with 13000 result is ok.
+				int size = resultsMap.size();
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Search returned "  //$NON-NLS-1$
+									+ size + " data items as result when searching with string '" + searchString + "'."); //$NON-NLS-1$ //$NON-NLS-2$
+				if(size > MAX_RESULTS_SIZE){
+					showTooManyResultsErrorMsg(size);
+				}else{
+					Set<String> listItems = resultsMap.keySet();
+					String[] resultString = (String[]) listItems.toArray(new String[0]);
+					searchResultList.setItems(resultString);
+					
+					// Enabling Show Method Call Locations functionality if imported functions were successfully searched. 
+					if(selectedSearchType == SearchType.SEARCH_IMPORTED_FUNCTIONS){
+						actionImportShowMethodLoc.setEnabled(true);
+						isImportedFunctionsSearched = true;
+					}
+				}
+			}			
+			
+		} catch (CacheFileDoesNotExistException e) {
+			// write to console, show error
+			e.printStackTrace();
+			String msg = Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part1")  //$NON-NLS-1$
+				+ searchString  //$NON-NLS-1$
+				+Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part2") //$NON-NLS-1$
+				+ e;
+			AppDepConsole.getInstance().println(
+					msg, AppDepConsole.MSG_ERROR);
+			showErrorDialog();
+		} catch (IOException e) {
+			//  write to console, show error
+			e.printStackTrace();
+			String msg = Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part1")  //$NON-NLS-1$
+				+ searchString  //$NON-NLS-1$
+				+Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part2") //$NON-NLS-1$
+				+ e;
+			AppDepConsole.getInstance().println(msg, AppDepConsole.MSG_ERROR);
+			showErrorDialog();
+		}
+		catch (Exception e) {
+			//  write to console, show error
+			e.printStackTrace();
+			String msg = Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part1")  //$NON-NLS-1$
+				+ searchString  //$NON-NLS-1$
+				+Messages.getString("AppDepSearchDialog.Search_Console_Err_Msg_Part2") //$NON-NLS-1$
+				+ e;
+			AppDepConsole.getInstance().println(msg, AppDepConsole.MSG_ERROR);
+			showErrorDialog();
+		}		
+		
+	}
+
+	/**
+	 * This message is shown in case query returns too many data items 
+	 * that cannot be shown in dialog withouth compromising user experience.
+	 * @param resultsSize Amount of data items returned as a results.
+	 */
+	private void showTooManyResultsErrorMsg(int resultsSize) {
+		String msg = Messages.getString("AppDepSearchDialog.TooManyResults_ErrMsg_Part1")//$NON-NLS-1$
+			+resultsSize + Messages.getString("AppDepSearchDialog.TooManyResults_ErrMsg_Part2");//$NON-NLS-1$
+		AppDepMessageBox msgBox = new AppDepMessageBox(msg , SWT.ICON_INFORMATION | SWT.OK );
+		msgBox.open();
+	}
+	
+	/**
+	 * Gets search results as map (converts the input data).
+	 * @param results Original search results to be converted.
+	 * @param searchType Type of search performed.
+	 * @return Search results as map (converted from the input data).
+	 */
+	private Map<String, SearchResultItem> getResultMap(Map<String, java.util.List<AbstractFunctionData>> results, SearchType searchType) {
+		
+		Set<String> keys = results.keySet();
+		Map<String, SearchResultItem> resultsArray = new HashMap<String, SearchResultItem>();
+		switch (searchType) {
+		case SEARCH_COMPONENTS:
+			for (String compName : keys) {
+				SearchResultItem compData = new SearchResultItem();
+				compData.setComponentName(compName);
+				resultsArray.put(compName, compData);					
+			}
+			break;
+		case SEARCH_EXPORTED_FUNCTION:
+		case SEARCH_IMPORTED_FUNCTIONS:
+			for (String compName : keys) {
+				java.util.List<AbstractFunctionData> datas = results.get(compName);
+				for (AbstractFunctionData data : datas) {
+					String functionNameAndCompName = data.getFunctionName() + "   [" + compName +"]"; //$NON-NLS-1$//$NON-NLS-2$
+					SearchResultItem compData = new SearchResultItem();
+					compData.setComponentName(compName);
+					compData.setFunctionName(data.getFunctionName());
+					compData.setFunctionOrdinal(data.getFunctionOrdinal());
+					resultsArray.put(functionNameAndCompName, compData);
+				}
+			}
+			break;
+		default:
+			break;		
+		}
+		return resultsArray;
+		
+	}
+
+	/**
+	 * Shows an error dialog
+	 */
+	private void showErrorDialog() {
+		String msg = Messages.getString("AppDepSearchDialog.Search_User_Err_Msg"); //$NON-NLS-1$
+		AppDepMessageBox msgBox = new AppDepMessageBox(msg , SWT.ICON_ERROR | SWT.OK );
+		msgBox.open();
+	}
+
+	/**
+	 * Checks what is selected object in the search results list
+	 * and activates and selects it from the UI.
+	 */
+	private void searchListObjectDoubleClicked() {
+
+		String selectedComponentName = null;
+		//get selected component name
+		try {
+			
+			String [] results = searchResultList.getItems();
+			//Get selected component name from List:s object data by selection index
+			String listItemId = results[searchResultList.getSelectionIndex()];
+			SearchResultItem value = resultsMap.get(listItemId);
+			selectedComponentName = value.getComponentName();
+			
+			//get root node of tree
+			ComponentParentNode root = getRootNode();
+			
+			//Seek all parent nodes of tree to find if we have selected component all ready in tree
+			Map<String, ComponentParentNode> parentNodes = SeekParentNodesService.findParentNodes(root);
+			
+			//If component can be found from current component tree, activating selection
+			if(parentNodes.containsKey(selectedComponentName.toLowerCase())){			
+				ComponentParentNode selectedNode = parentNodes.get(selectedComponentName.toLowerCase());			
+				view.activateTreeViewComponent(selectedNode);		
+			}
+			else{
+				//If component cannot be found from current component tree, setting selection as new root
+				UiUtils.setComponentAsNewRootInMainView(view, selectedComponentName, null);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			String msg = Messages.getString("AppDepSearchDialog.SetComponent_Console_Err_Msg_Part1")  //$NON-NLS-1$
+				+ selectedComponentName  //$NON-NLS-1$
+				+Messages.getString("AppDepSearchDialog.SetComponent_Console_Err_Msg_Part2") //$NON-NLS-1$
+				+ e;
+			AppDepConsole.getInstance().println(msg, AppDepConsole.MSG_ERROR);
+			showErrorDialog();			
+		}
+	}
+
+	/**
+	 * Gets current root node
+	 * @return root node
+	 */
+	private ComponentParentNode getRootNode() {		
+		//Getting new root node from view, not from start node!
+		ComponentParentNode root = view.getRootComponentNode();		
+		return root;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+	 */
+	public void modifyText(ModifyEvent e) {
+		if(searchStringTxtField.getText().length() > 0){
+			searchButton.setEnabled(true);
+		}else{
+			searchButton.setEnabled(false);
+		}
+	}
+
+	/**
+	 * Gets selected String from list.
+	 */
+	public String getString() {
+		String[] selectedItems = searchResultList.getSelection();
+		if(selectedItems.length > 0){
+			StringBuffer items = new StringBuffer();
+			
+			// There should be at least one item.
+			items.append(selectedItems[0]);
+			// Adding rest of the strings with new line.
+			for(int i = 1;i < selectedItems.length;i++){
+				items.append("\r\n"); //$NON-NLS-1$
+				items.append(selectedItems[i]);
+			}
+			return items.toString();
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.TrayDialog#close()
+	 */
+	@Override
+	public boolean close() {
+		// clean-up
+		nonEditableFieldBkgColor.dispose();
+		searchStringTxtField.removeSelectionListener(this);
+		searchStringTxtField.removeModifyListener(this);
+		// Calling super close
+		return super.close();
+	}
+
+	/**
+	 * Get currently selected function.
+	 * @return String or <code>null</code>.
+	 */
+	public String getSelectedFunction() {
+		if(searchResultList.getSelectionIndex() >= 0){
+			//Get selected function name from list.
+			String listItemId = searchResultList.getItem(searchResultList.getSelectionIndex());
+			SearchResultItem value = resultsMap.get(listItemId);
+			String functionName = value.getFunctionName();
+			return functionName;
+		}
+		return null;
+	}
+
+	/**
+	 * Get component for currently selected function.
+	 * @return String or<code>null</code>.
+	 */
+	public String getComponentForSelectedFunction() {
+		if(searchResultList.getSelectionIndex() >= 0){
+			//Get selected component name from list.
+			String listItemId = searchResultList.getItem(searchResultList.getSelectionIndex());
+			SearchResultItem value = resultsMap.get(listItemId);
+			String componentName = value.getComponentName();
+			return componentName;
+		}
+		return null;
+	}
+
+	/**
+	 * Gets the ordinal of selected function in search results list.
+	 * @return ordinal of selected function in search results list, if 
+	 * 					a function is selected, otherwise <code>null</code>
+	 * 					(i.e. component has been selected or there is 
+	 * 					 no selection made).
+	 */
+	public String getSelectedFunctionOrdinal() {
+		if(searchResultList.getSelectionIndex() >= 0){
+			//Get selected function ordinal from list.
+			String listItemId = searchResultList.getItem(searchResultList.getSelectionIndex());
+			SearchResultItem value = resultsMap.get(listItemId);
+			String functionOrdinal = value.getFunctionOrdinal();
+			return functionOrdinal;
+		}
+		return null;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/LocateComponentDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,247 @@
+/*
+* 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.appdep.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+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 org.eclipse.jface.window.IShellProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.preferences.DEPreferencePage;
+
+/**
+ * Dialog for selecting real implementation of selected generic component 
+ * @see org.eclipse.jface.dialogs.Dialog
+ */
+public class LocateComponentDialog extends Dialog {
+		
+
+	/**
+	 * List box dialog text control for showing the content.
+	 */
+	private List componentsList = null;
+	
+	/**
+	 * Components to be shown in the dialog.
+	 */
+	private String[] components = null;	
+
+	/**
+	 * Index of the selection.
+	 */
+	private int selectionIndex;
+	
+	// Fixed Width and height parameters to set UI components 
+	// precisely 
+	private static final int COMPONENT_LIST_ITEMS_HEIGHT_HINT = 8;		
+	public static final int COMPONENT_LIST_WIDTH = 300;
+	
+	/**
+	 * Generic component.
+	 */
+	private String componentName = null;
+
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell
+	 * @param components Component array.
+	 * @param componentName Name of the generic component.
+	 */
+	public LocateComponentDialog(Shell parentShell, String[] components, String componentName) {
+		super(parentShell);
+		this.components = components;
+		this.componentName = componentName;
+	}
+	
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell.
+	 */
+	@SuppressWarnings("unused")
+	private LocateComponentDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell provider.
+	 */
+	@SuppressWarnings("unused")
+	private LocateComponentDialog(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,
+                true);     
+		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("LocateComponentDialog.Shell_Txt") );//$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);			
+
+		//Label
+		Label label = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		label.setText(Messages.getString("LocateComponentDialog.Label_Txt") +" "  +componentName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$				
+
+		//Layout data for the component list
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);
+	
+		GridData gd2 = new GridData(GridData.FILL_BOTH);
+	
+		dialogAreaComposite.setLayoutData(gd2);
+
+		//Controls for the component list
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL;
+		componentsList = new List(dialogAreaComposite,listBoxStyleBits);
+		int listHeight = componentsList.getItemHeight() * COMPONENT_LIST_ITEMS_HEIGHT_HINT;
+		Rectangle trim = componentsList.computeTrim(0, 0, 0, listHeight);
+		GridData listData = new GridData(COMPONENT_LIST_WIDTH, SWT.DEFAULT);
+		listData.horizontalAlignment = GridData.FILL;
+		listData.grabExcessHorizontalSpace = true;
+		listData.verticalAlignment = GridData.FILL;
+		listData.grabExcessVerticalSpace = true;
+		listData.heightHint = trim.height;		
+		
+		listData.heightHint = trim.height;		
+		componentsList.setLayoutData(listData);
+		if(components != null){
+			componentsList.setItems(components);
+		}
+		
+		// Adding selection listener for the component list
+		componentsList.addSelectionListener(new SelectionListener(){
+			
+			public void widgetDefaultSelected(SelectionEvent e) {
+				//Not needed
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				selectionIndex = componentsList.getSelectionIndex();
+				if(selectionIndex != -1){
+					setOKEnabled();					
+				}
+			}			
+		});		
+		
+		//Button for opening preferences page
+		Link openPreferencePageLink = new Link(dialogAreaComposite, SWT.NULL);
+		openPreferencePageLink.setText("<a>" + Messages.getString("LocateComponentDialog.Link_Txt") +"</a>");//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		openPreferencePageLink.setToolTipText(Messages.getString("LocateComponentDialog.Link_ToolTip_Txt"));//$NON-NLS-1$
+		GridData btnData = new GridData();
+		openPreferencePageLink.setLayoutData(btnData);
+		
+		//listener for the add button
+		openPreferencePageLink.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				openPreferencePage();
+			}
+		});				
+ 				
+	    // Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(dialogAreaComposite, AppDepHelpContextIDs.APPDEP_LOCATE_COMPONENT_DIALOG);
+	    
+		return dialogAreaComposite;
+	}    
+	
+	/**
+	 * Sets OK button enabled
+	 */
+	private void setOKEnabled(){
+		Button ok = getButton(IDialogConstants.OK_ID);
+		ok.setEnabled(true);		
+	}
+	
+	/**
+	 * Opens Component prefix search order preference page.
+	 */
+	private void openPreferencePage(){
+		   IPreferencePage page = new DEPreferencePage();
+		   PreferenceManager mgr = new PreferenceManager();
+		   IPreferenceNode node = new PreferenceNode("1", page);//$NON-NLS-1$
+		   mgr.addToRoot(node);
+		   PreferenceDialog dialog = new PreferenceDialog(getShell(), mgr);
+		   dialog.create();
+		   dialog.setMessage(page.getTitle());
+		   dialog.open();		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.window.Window#open()
+	 */
+	public int open(){
+		selectionIndex=-1;
+		return super.open();
+	}
+	
+	/**
+	 * Get selection index from the concrete component list.
+	 * @return index of selected component or -1 if not selected
+	 */
+	public int getSelectionIndex(){
+		return selectionIndex;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SISFileEntry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,78 @@
+/*
+* 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.appdep.ui.dialogs;
+
+import java.io.File;
+
+
+/**
+ * Stores information on a single SIS file entry.
+ */
+public class SISFileEntry {
+	
+	//
+	// Column sorting indices for table column sorter
+	//
+	public static final int NAME_COLUMN_INDEX = 0;
+	public static final int LOCATION_COLUMN_INDEX = 1;
+	
+	/**
+	 * Path name of the directory SIS file is locating.
+	 */
+	private final String locationPath;
+	
+	/**
+	 * Name of the SIS file without path. 
+	 */
+	private final String fileName;
+		
+	/**
+	 * Constructor.
+	 * @param locationPath path name of the directory SIS file is locating.
+	 * @param fileName name of the SIS file without path.
+	 */
+	public SISFileEntry(String locationPath, String fileName){
+		this.locationPath = locationPath;
+		this.fileName = fileName;		
+	}
+
+	/**
+	 * Gets path name of the directory SIS file is locating.
+	 * @return path name of the directory SIS file is locating.
+	 */
+	public String getLocation() {
+		return locationPath;
+	}
+
+	/**
+	 * Gets name of the SIS file without path. 
+	 * @return name of the SIS file without path.
+	 */
+	public String getFileName() {
+		return fileName;
+	}
+	
+	/**
+	 * Gets name of the SIS file with absolute path. 
+	 * @return name of the SIS file with absolute path.
+	 */
+	public String getFullPathFileName() {
+		return getLocation() + File.separator + getFileName();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SISFileEntryTableViewerSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,79 @@
+/*
+* 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.appdep.ui.dialogs;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+
+/**
+ * Sorter implementation for SIS file entry data.
+ */
+public class SISFileEntryTableViewerSorter extends S60ToolsViewerSorter {
+
+	//
+	// Sorting criteria constants
+	//
+	public static final int CRITERIA_NAME = 1;
+	public static final int CRITERIA_LOCATION = 2;
+
+	public SISFileEntryTableViewerSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int compRes = 0;
+		
+		SISFileEntry entry1 = (SISFileEntry) e1;
+		SISFileEntry entry2 = (SISFileEntry) e2;
+		
+		switch (sortCriteria) {
+
+		case CRITERIA_NAME:
+			compRes = alphabeticSort(entry1.getFileName(), entry2.getFileName());
+			break;
+			
+		case CRITERIA_LOCATION:
+			compRes = alphabeticSort(entry1.getLocation(), entry2.getLocation());
+			break;
+
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:			
+			AppDepConsole.getInstance()
+					.println(
+							Messages.getString("SISFileEntryTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg") + sortCriteria, //$NON-NLS-1$
+							AppDepConsole.MSG_ERROR);
+			break;
+		}
+				
+		return compRes;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/dialogs/SearchConfirmNewRootSelectionDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,155 @@
+/*
+* 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.appdep.ui.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.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.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Dialog for asking if user wants or not to select selected component as new root component.
+ * Also possible to select that this dialog is not shown again.
+ * @see org.eclipse.jface.dialogs.Dialog
+ */
+public class SearchConfirmNewRootSelectionDialog extends Dialog {
+	
+	private String newRootComponentName = null;
+	private boolean dontAskAgain = false;
+
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell.
+	 * @param newRootComponentName Name of the new root component.
+	 */
+	public SearchConfirmNewRootSelectionDialog(Shell parentShell, String newRootComponentName) {
+		super(parentShell);
+		this.newRootComponentName = newRootComponentName;
+	}
+	
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell.
+	 */
+	@SuppressWarnings("unused")
+	private SearchConfirmNewRootSelectionDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	/**
+	 * Constructor
+	 * @param parentShell Parent shell provider.
+	 */
+	@SuppressWarnings("unused")
+	private SearchConfirmNewRootSelectionDialog(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,
+                true);     
+        
+    }
+    /* (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("SearchConfirmNewRootSelectionDialog.Shell_Txt") );//$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);		
+		
+		final int cols = 1;	  
+		GridLayout gdl = new GridLayout(cols, false);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+
+		dialogAreaComposite.setLayout(gdl);
+		dialogAreaComposite.setLayoutData(gd);
+
+
+		//Label
+		Label label = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		label.setText(
+				Messages.getString("SearchConfirmNewRootSelectionDialog.Question_Txt_Part1")//$NON-NLS-1$  
+				+newRootComponentName //$NON-NLS-1$ 
+				+Messages.getString("SearchConfirmNewRootSelectionDialog.Question_Txt_Part2"));//$NON-NLS-1$  
+				
+		//empty label just for empty row between items 
+		Label nullLabel = new Label(dialogAreaComposite,SWT.HORIZONTAL);
+		nullLabel.setText("");//$NON-NLS-1$
+
+		//Button for opening preferences page
+		final Button dontAskAgainBtn = new Button(dialogAreaComposite, SWT.CHECK);
+		dontAskAgainBtn.setText(Messages.getString("SearchConfirmNewRootSelectionDialog.DontAskAgain_Txt"));//$NON-NLS-1$ 
+		dontAskAgainBtn.setToolTipText(Messages.getString("SearchConfirmNewRootSelectionDialog.DontAskAgain_ToolTip_Txt"));//$NON-NLS-1$
+		GridData btnData = new GridData();
+		dontAskAgainBtn.setLayoutData(btnData);
+		
+		//listener for add button
+		dontAskAgainBtn.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				setDontAskAgain(dontAskAgainBtn.getSelection());
+			}
+		});				
+ 				
+		return dialogAreaComposite;
+	}    
+		
+
+	/**
+	 * Gets don't ask again setting status. 
+	 * @return the dontAskAgain
+	 */
+	public boolean isDontAskAgainChecked() {
+		return dontAskAgain;
+	}
+
+	/**
+	 * Sets don't ask again setting status. 
+	 * @param dontAskAgain
+	 */
+	private void setDontAskAgain(boolean dontAskAgain) {
+		this.dontAskAgain = dontAskAgain;
+	}
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferenceConstants.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.preferences;
+
+/**
+ * Class for storing keys to preferences.
+ */
+public class DEPreferenceConstants {
+	
+	/**
+	 * <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$
+	
+	/**
+	 * Separator for prefix search order components.
+	 */
+	public static final String PREFIX_SEARCH_ORDER_SEPARATOR = ";"; //$NON-NLS-1$
+
+	/**
+	 * preference DB key for prefix search order.
+	 */
+	public final static String DE_PREFIX_SEARCH_ORDER_VALUES = "dePrefixSeachOrderValues"; //$NON-NLS-1$
+	
+	/**
+	 * preference DB key for "don't ask again" in Search dialog for confirmation about set as new root component. 
+	 */
+	public final static String DE_DONT_ASK_SET_AS_NEW_ROOT_FROM_SEARCH = "deDontAskSetAsNewRootFromSearch";//$NON-NLS-1$
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferenceInitializer.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+/**
+ * Class used to initialize default preference values.
+ */
+public class DEPreferenceInitializer 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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferencePage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,338 @@
+/*
+* 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.appdep.ui.preferences;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+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.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AddComponentPrefixSearchOrderDialog;
+
+
+/**
+ * Preference page for DE plugin preferences
+ *
+ */
+public class DEPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage{
+
+	/**
+	 * Used for replacement of illegal characters from component
+	 * search order prefixes.
+	 */
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+	// Fixed Width and height hints to set UI components precisely 
+	private static final int COMPONENT_LIST_ITEMS_HEIGHT_HINT = 8;		
+	public static final int COMPONENT_LIST_WIDTH = 300;
+	
+	/**
+	 * Create the preference page
+	 */
+	public DEPreferencePage() {
+		super();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench arg0) {
+	}
+
+	// Controls for prefix search order
+	private Button prefixAddBtn;
+	private Button prefixRemoveBtn;
+	private Button prefixUpBtn;
+	private Button prefixDownBtn;	
+	private List prefixComponentsList;
+	// Don't ask again checkbox
+	private Button dontAskAgainBtn;
+
+	/* (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);		
+		//Create preference composite for Prefix search order
+		createPrefixSeachOrderComposite(container);			
+		
+		createDontAskAgainSearchComposite(container);				
+		
+		getPrefsStoreValues();
+
+		setHelps(parent);
+		
+		return container;
+	}
+
+	/**
+	 * Creates Don't ask controls for Search dialog's 'Set as new root component' feature.
+	 * @param container Parent container for the controls
+	 */
+	private void createDontAskAgainSearchComposite(
+			Composite container) {
+
+		//Group for all components
+		Group askGroup = new Group (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("DEPreferencePage.DontAskAgain_Group_Txt"));  //$NON-NLS-1$
+		askGroup.setLayout (gridLayout);		
+		
+		dontAskAgainBtn = new Button(askGroup, SWT.CHECK);
+		dontAskAgainBtn.setToolTipText(Messages.getString("DEPreferencePage.DontAskAgain_ToolTip_Txt"));//$NON-NLS-1$
+		dontAskAgainBtn.setSelection(DEPreferences.getDontAskSetAsNewRootFromSearch());
+
+		Label label = new Label(askGroup, SWT.HORIZONTAL);
+		label.setText(Messages.getString("DEPreferencePage.DontAskAgain_Txt"));//$NON-NLS-1$ 
+			
+	}
+	
+	/**
+	 * Creates composite for prefix search order.
+	 * @param container Parent composite
+	 */
+	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("DEPreferencePage.ComponentPrefixSearchOrder_Group_Txt"));  //$NON-NLS-1$
+		prefixGroup.setLayout (gridLayout);
+		
+		//composite for component list
+		Composite listComp = new Composite(prefixGroup,SWT.SIMPLE);
+		GridLayout listCompLayout = new GridLayout();
+		listCompLayout.numColumns = 1;
+		listComp.setLayout(listCompLayout);
+		
+		final int listBoxStyleBits = SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL;
+		prefixComponentsList = new List(listComp,listBoxStyleBits);
+		int listHeight = prefixComponentsList.getItemHeight() * COMPONENT_LIST_ITEMS_HEIGHT_HINT;
+		Rectangle trim = prefixComponentsList.computeTrim(0, 0, 0, listHeight);
+		GridData listData = new GridData(COMPONENT_LIST_WIDTH, SWT.DEFAULT);
+		listData.horizontalAlignment = GridData.FILL;
+		listData.grabExcessHorizontalSpace = true;
+		listData.verticalAlignment = GridData.FILL;
+		listData.grabExcessVerticalSpace = true;
+		listData.heightHint = trim.height;		
+		
+		listData.heightHint = trim.height;		
+		prefixComponentsList.setLayoutData(listData);		
+		
+		Composite btnComp = new Composite(prefixGroup,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;
+		
+		//Add button
+		prefixAddBtn = new Button(btnComp, SWT.PUSH);
+		prefixAddBtn.setLayoutData(btnData);
+		prefixAddBtn.setText(Messages.getString("DEPreferencePage.Prefix_Add_Txt"));  //$NON-NLS-1$
+		prefixAddBtn.setToolTipText(Messages.getString("DEPreferencePage.Prefix_Add_tooltip_Txt")); //$NON-NLS-1$
+		
+		//Add component dialog
+		final AddComponentPrefixSearchOrderDialog dialog = new AddComponentPrefixSearchOrderDialog(container.getShell());
+		
+		//listener for add button
+		prefixAddBtn.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				dialog.open();
+				if (dialog.getReturnCode() == IDialogConstants.OK_ID) {
+					String compName = dialog.getText();
+
+					//In component name, there cannot be ";" chars, but just in case, replace them.
+					if(compName.indexOf(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR) != -1){
+						compName.replace(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR, EMPTY_STRING);
+					}
+					
+					prefixComponentsList.add(compName);
+				}//else, cancel is pushed
+			}
+		});				
+		
+		//remove button
+		prefixRemoveBtn = new Button(btnComp, SWT.PUSH);
+		prefixRemoveBtn.setText(Messages.getString("DEPreferencePage.Prefix_Remove_Txt"));  //$NON-NLS-1$
+		prefixRemoveBtn.setToolTipText(Messages.getString("DEPreferencePage.Prefix_Remove_tooltip_Txt"));  //$NON-NLS-1$
+		
+		//listener for remove button
+		prefixRemoveBtn.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				int sel[] = prefixComponentsList.getSelectionIndices();
+				if(sel.length > 0){
+					prefixComponentsList.remove(sel);
+				}
+			}
+		});			
+		
+		//move up button
+		prefixUpBtn = new Button(btnComp, SWT.PUSH);
+		prefixUpBtn.setText(Messages.getString("DEPreferencePage.Prefix_Up_Txt"));  //$NON-NLS-1$
+		prefixUpBtn.setToolTipText(Messages.getString("DEPreferencePage.Prefix_Up_tooltip_Txt"));  //$NON-NLS-1$
+		prefixUpBtn.setLayoutData(btnData);
+		
+		//listener for move up botton
+		prefixUpBtn.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				int selectionIndex = prefixComponentsList.getSelectionIndex();
+				if(selectionIndex != -1 && selectionIndex > 0){
+					int newLocationIndex = selectionIndex-1;
+					String value = prefixComponentsList.getItem(selectionIndex);
+					prefixComponentsList.remove(selectionIndex);
+					prefixComponentsList.add(value,newLocationIndex );
+					prefixComponentsList.setSelection(newLocationIndex);
+				}
+			}
+		});					
+		
+		//move down button
+		prefixDownBtn = new Button(btnComp, SWT.PUSH);
+		prefixDownBtn.setText(Messages.getString("DEPreferencePage.Prefix_Down_Txt")); //$NON-NLS-1$
+		prefixDownBtn.setToolTipText(Messages.getString("DEPreferencePage.Prefix_Down_tooltip_Txt"));  //$NON-NLS-1$
+		prefixDownBtn.setLayoutData(btnData);
+		
+		//listener for move down button
+		prefixDownBtn.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+
+				int selectionIndex = prefixComponentsList.getSelectionIndex();
+				if(selectionIndex != -1 && selectionIndex < (prefixComponentsList.getItemCount() -1 )){
+					int newLocationIndex = selectionIndex+1;
+					String value = prefixComponentsList.getItem(selectionIndex);
+					prefixComponentsList.remove(selectionIndex);
+					prefixComponentsList.add(value, newLocationIndex);
+					prefixComponentsList.setSelection(newLocationIndex);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Sets old values back to UI controls.
+	 */
+	private void getPrefsStoreValues(){
+		IPreferenceStore store = AppDepPlugin.getPrefsStore();
+		
+		//Set Prefix search order values
+		String values = store.getString(DEPreferenceConstants.DE_PREFIX_SEARCH_ORDER_VALUES);
+		if(values != null && values.trim().length() > 0){
+			String [] valuesTable = values.split(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR);
+			prefixComponentsList.setItems(valuesTable);
+		}
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		// Resetting prefixes values.
+		String[] values = new String[0];
+		prefixComponentsList.setItems(values);
+		// Resetting dontAskAgain value.
+		dontAskAgainBtn.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 = AppDepPlugin.getPrefsStore();
+	
+		savePrefixSeachOrderPreferences(store);
+		saveDontAskAgainSearchConfirmation(store);
+		
+		return super.performOk();
+	}
+
+	/**
+	 * Saves prefix search order preferences.
+	 * @param store Preferences store.
+	 */
+	private void savePrefixSeachOrderPreferences(IPreferenceStore store) {
+		String [] values = prefixComponentsList.getItems();
+		StringBuffer valuesList = new StringBuffer();
+		for (int i = 0; i < values.length; i++) {
+			valuesList.append(values[i]);
+			if(i < (values.length-1)){
+				valuesList.append(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR);//Separator
+			}
+		}
+		store.setValue(DEPreferenceConstants.DE_PREFIX_SEARCH_ORDER_VALUES, valuesList.toString());
+	}
+	
+	/**
+	 * Saves prefix search order preferences
+	 * @param store Preferences store.
+	 */
+	private void saveDontAskAgainSearchConfirmation(IPreferenceStore store) {
+		
+		DEPreferences.setDontAskAtainAsNewRootFromSearch(dontAskAgainBtn.getSelection());
+	}
+	
+	/**
+	 * Sets this page's context sensitive help.
+	 */
+	private void setHelps(Composite helpContainer) {
+		AppDepPlugin.setContextSensitiveHelpID(helpContainer,
+															AppDepHelpContextIDs.APPDEP_PREF_PAGE);
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/preferences/DEPreferences.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,96 @@
+/*
+* 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.appdep.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+
+/**
+ * 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 DEPreferences {
+	
+	/**
+	 * Get search order prefixes
+	 * @return prefixes in order they appear in preference page, or <code>null</code> if none found. 
+	 */
+	public static String[] getSearchOrderPrefixs(){
+		String values = AppDepPlugin.getPrefsStore().getString(DEPreferenceConstants.DE_PREFIX_SEARCH_ORDER_VALUES);
+		String [] prefixs = null;
+		if(values != null){
+			prefixs = values.split(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR);
+		}
+		return prefixs;
+	}
+	
+	/**
+	 * Gets search order prefixes
+	 * @return prefixes in order they appear in preference page, or empty list if none found. 
+	 */
+	public static List<String> getSearchOrderPrefixsList(){
+		ArrayList<String> prefixList = new ArrayList<String>();
+		String values = AppDepPlugin.getPrefsStore().getString(DEPreferenceConstants.DE_PREFIX_SEARCH_ORDER_VALUES);
+		//Adding values only if there is something to add.
+		if(values != null && values.trim().length() > 0){
+			String [] prefixs = null;
+			prefixs = values.split(DEPreferenceConstants.PREFIX_SEARCH_ORDER_SEPARATOR);
+			for (int i = 0; i < prefixs.length; i++) {
+				prefixList.add(prefixs[i]);
+			}
+			
+		}
+				
+		return prefixList;
+	}	
+
+	/**
+	 * Gets "Don't ask again" value for Search set as new root confirmation.
+	 * @return <code>true</code> if preference "don't ask again" is cheked, <code>false</code> otherwise.
+	 */
+	public static boolean getDontAskSetAsNewRootFromSearch(){
+		
+		String value = AppDepPlugin.getPrefsStore().getString(DEPreferenceConstants.DE_DONT_ASK_SET_AS_NEW_ROOT_FROM_SEARCH);
+		if(value != null && value.equalsIgnoreCase(DEPreferenceConstants.TRUE)){
+			return true;
+		}else{
+			return false;
+		}
+		
+	}
+	
+	/**
+	 * Sets "Don't ask again" value for Search set as new root confirmation.
+	 * @param isDontAskAgainChecked <code>true</code> if don't ask again is selected, <code>false</code> otherwise.
+	 */
+	public static void setDontAskAtainAsNewRootFromSearch(boolean isDontAskAgainChecked){
+		
+		IPreferenceStore store = AppDepPlugin.getPrefsStore();
+
+		if(isDontAskAgainChecked){
+			store.setValue(DEPreferenceConstants.DE_DONT_ASK_SET_AS_NEW_ROOT_FROM_SEARCH, DEPreferenceConstants.TRUE);
+		}else{
+			store.setValue(DEPreferenceConstants.DE_DONT_ASK_SET_AS_NEW_ROOT_FROM_SEARCH, DEPreferenceConstants.FALSE);
+		}
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/utils/UiUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.utils;
+
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.ui.dialogs.SearchConfirmNewRootSelectionDialog;
+import com.nokia.s60tools.appdep.ui.preferences.DEPreferences;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+
+/**
+ * Contains static service methods that are needed by multiple
+ * UI related classes in order to prevent duplication of similar 
+ * functionality in multiple places.
+ */
+public class UiUtils {
+
+	/**
+	 * Opens ask dialog if needed and asks confirmation about if new root is to be set or not.
+	 * If in preferences there is selection, "dont ask again" dialog want be opened but <code>true</code> is returned.
+	 * @param newRootComponentName
+	 * @return <code>true</code> if new root is to be set, <code>false</code> otherwise.
+	 */
+	private static boolean handleSetAsNewRootComponentConfirmation(Shell sh, String newRootComponentName) {
+		
+		//checking if preferences has already value dontAskAgain
+		if(DEPreferences.getDontAskSetAsNewRootFromSearch()){
+			return true;
+		}
+		else {							
+			SearchConfirmNewRootSelectionDialog dialog = new SearchConfirmNewRootSelectionDialog(sh, newRootComponentName);
+			int doOpen = dialog.open();
+			boolean setAsNewRoot = (doOpen == SearchConfirmNewRootSelectionDialog.OK) ? true : false;
+			
+			//if canceled, preferences wont be changed.
+			if(setAsNewRoot){
+				boolean dontAskAgain = dialog.isDontAskAgainChecked();
+				//setting to preferences
+				DEPreferences.setDontAskAtainAsNewRootFromSearch(dontAskAgain);
+			}
+	
+			return setAsNewRoot;
+		}
+	}
+
+	/**
+	 * Sets given component as new root component (and optionally triggers
+	 * confirmation query). 
+	 * @param view Reference to main view.
+	 * @param selectedComponentName Component to be set as new root component.
+	 * @param targetPlatform Target platform for the component, or <code>null</code> if not known.
+	 */
+	public static void setComponentAsNewRootInMainView(MainView view, String selectedComponentName, ITargetPlatform targetPlatform) {
+		Shell sh = view.getViewSite().getShell();
+		if( handleSetAsNewRootComponentConfirmation(sh, selectedComponentName)){		
+			AppDepSettings st = AppDepSettings.getActiveSettings();
+			st.setCurrentlyAnalyzedComponentName(selectedComponentName);
+			st.setCurrentlyAnalyzedComponentTargetPlatform(targetPlatform);
+			view.inputUpdated();   		
+		}
+	}
+
+	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/ComponentListNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,128 @@
+/*
+* 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.appdep.ui.views.data;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+
+/**
+ * Represents a single component item in the
+ * list showing available components for 
+ * the currently selected target(s).
+ */
+public class ComponentListNode{
+		
+	//
+	// Column sorting indices for table column sorter
+	//
+	public static final int NAME_COLUMN_INDEX = 0;
+	public static final int TARGET_TYPE_COLUMN_INDEX = 1;
+	public static final int DATE_CACHED_COLUMN_INDEX = 2;
+	
+	/**
+	 * Component name
+	 */
+	private final String name;
+	/**
+	 * Target platform.
+	 */
+	private final ITargetPlatform buildTargetType;
+	/**
+	 * Last modification timestamp (unix time seconds) for component when cached.
+	 */
+	private final long cachedComponentModificationTimestamp;
+	
+	/**
+	 * Using SHORT length date string representation.
+	 * Using static member in order to prevent fetching of country/locale information 
+	 * for each date formatting operation.
+	 */
+	private static final DateFormat dtFormat = DateFormat.getDateInstance(DateFormat.SHORT);
+	
+	/**
+	 * Using MEDIUM length time string representation.
+	 * Using static member in order to prevent fetching of country/locale information 
+	 * for each date formatting operation.
+	 */
+	private DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);;	
+	
+	/**
+	 * @param name Component name
+	 * @param buildTargetType Target platform.
+	 * @param cachedComponentModificationTimestamp last modification time for component
+	 */
+	public ComponentListNode(String name, ITargetPlatform buildTargetType, long cachedComponentModificationTimestamp){
+		this.name = name;
+		this.buildTargetType = buildTargetType;
+		this.cachedComponentModificationTimestamp = cachedComponentModificationTimestamp;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString(){
+		return name;
+	}
+
+	/**
+	 * Gets build target type for the component as string.
+	 * @return build target type for the component as string.
+	 */
+	public String getBuildTargetTypeAsString() {
+		return buildTargetType.getId();
+	}
+	
+	/**
+	 * Gets last modification time for component when cached.
+	 * @return last modification time for component when cached
+	 */
+	public long getCachedComponentModificationTimestamp() {
+		return cachedComponentModificationTimestamp;
+	}
+
+	/**
+	 * Gets last modification time for component when cached as string representation.
+	 * @return last modification time for component when cached as string
+	 */
+	public String getCachedComponentModificationTimestampAsString() {
+		Date dt = new Date(cachedComponentModificationTimestamp);
+		String dateStr = dtFormat.format(dt);
+		String timeStr = timeFormat.format(dt);
+		return dateStr + " " + timeStr; //$NON-NLS-1$
+	}
+
+	/**
+	 * Gets component name.
+	 * @return component name.
+	 */
+	public String getComponentName() {
+		return name;
+	}
+
+	/**
+	 * Gets build target type for the component.
+	 * @return build target type for the component.
+	 */
+	public ITargetPlatform getBuildTargetType() {
+		return buildTargetType;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/IVisitable.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,37 @@
+/*
+* 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.appdep.ui.views.data;
+
+/**
+ * General interface for objects that can be visited
+ * by <code>IVisitor</code> instances.
+ * @see com.nokia.s60tools.appdep.ui.views.data.IVisitor
+ */
+public interface IVisitable {
+	
+	/**
+	 * Calls concrete method performing visiting 
+	 * from the <code>IVisitor</code> instance passes
+	 * as parameter. 
+	 * @param visitor Visitor to be used to perform 
+	 *                some concrete visit operation.
+	 */
+	public void accept(IVisitor visitor);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/IVisitor.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,41 @@
+/*
+* 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.appdep.ui.views.data;
+
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+
+/**
+ * General visitor interface for visiting component tree
+ * hierarchy. To be implemented by concrete visitors.
+ * @see com.nokia.s60tools.appdep.ui.views.data.IVisitable
+ */
+public interface IVisitor {
+	
+	/**
+	 * Visit method for component link leaf nodes.
+	 * @param node Component link leaf node to be visited.
+	 */
+	public void visit(ComponentLinkLeafNode node);
+	/**
+	 * Visit method for component parent nodes.
+	 * @param node Component parent node to be visited.
+	 */
+	public void visit(ComponentParentNode node);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/data/PropertyData.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,61 @@
+/*
+* 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.appdep.ui.views.data;
+
+/**
+ * Stores simple property description/propertyValue pairs.
+ */
+public class PropertyData {
+	
+	/**
+	 * Property description.
+	 */
+	private final String propertyDescription;
+	/**
+	 * Property value.
+	 */
+	private final String propertyValue;
+
+	/**
+	 * Constructor.
+	 * @param propertyDescription Property description.
+	 * @param propertyValue Property value.
+	 */
+	public PropertyData(String propertyDescription, String propertyValue){
+		this.propertyDescription = propertyDescription;
+		this.propertyValue = propertyValue;
+		
+	}
+
+	/**
+	 * Gets property description.
+	 * @return Returns the propertyDescription.
+	 */
+	public String getPropertyDescription() {
+		return propertyDescription;
+	}
+
+	/**
+	 * Gets property value.
+	 * @return Returns the propertyValue.
+	 */
+	public String getPropertyValue() {
+		return propertyValue;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ComponentListViewSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,126 @@
+/*
+* 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.appdep.ui.views.listview;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Sorter for component properties in component list.
+ */
+public class ComponentListViewSorter extends S60ToolsViewerSorter {
+
+	//
+	// Sorting criteria constants
+	//
+	public static final int CRITERIA_NAME = 1;
+	public static final int CRITERIA_BIN_FORMAT = 2;
+	public static final int CRITERIA_UID1 = 3;
+	public static final int CRITERIA_UID2 = 4;
+	public static final int CRITERIA_UID3 = 5;
+	public static final int CRITERIA_SECURE_ID = 6;
+	public static final int CRITERIA_VENDOR_ID = 7;
+	public static final int CRITERIA_MIN_HEAP = 8;
+	public static final int CRITERIA_MAX_HEAP = 9;
+	public static final int CRITERIA_STACK_SIZE = 10;
+
+	/**
+	 * Constructor.
+	 */
+	public ComponentListViewSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int compRes = 0;
+		
+		ComponentPropertiesData prop1 = (ComponentPropertiesData) e1;
+		ComponentPropertiesData prop2 = (ComponentPropertiesData) e2;
+		
+		switch (sortCriteria) {
+
+		case CRITERIA_NAME:
+			// Ignoring component name case during sorting
+			compRes = alphabeticSort(prop1.getFilename().toLowerCase(), prop2.getFilename().toLowerCase());
+			break;
+			
+		case CRITERIA_BIN_FORMAT:
+			compRes = alphabeticSort(prop1.getBinaryFormat(), prop2.getBinaryFormat());
+			break;
+
+		case CRITERIA_UID1:
+			compRes = numericSortFromHexString(prop1.getUid1(), prop2.getUid1());
+			break;
+
+		case CRITERIA_UID2:
+			compRes = numericSortFromHexString(prop1.getUid2(), prop2.getUid2());
+			break;
+
+		case CRITERIA_UID3:
+			compRes = numericSortFromHexString(prop1.getUid3(), prop2.getUid3());
+			break;
+
+		case CRITERIA_SECURE_ID:
+			compRes = numericSortFromHexString(prop1.getSecureId(), prop2.getSecureId());
+			break;
+
+		case CRITERIA_VENDOR_ID:
+			compRes = numericSortFromHexString(prop1.getVendorId(), prop2.getVendorId());
+			break;
+
+		case CRITERIA_MIN_HEAP:
+			compRes = numericSortFromDecString(prop1.getMinHeapSize(), prop2.getMinHeapSize());
+			break;
+
+		case CRITERIA_MAX_HEAP:
+			compRes = numericSortFromDecString(prop1.getMaxHeapSize(), prop2.getMaxHeapSize());
+			break;
+
+		case CRITERIA_STACK_SIZE:
+			compRes = numericSortFromDecString(prop1.getStackSize(), prop2.getStackSize());
+			break;
+
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:
+			AppDepConsole.getInstance()
+					.println(
+							Messages.getString("ComponentListViewSorter.Unexpected_Sort_Criteria_Msg"), //$NON-NLS-1$
+							IConsolePrintUtility.MSG_ERROR);
+			break;
+		}
+				
+		return compRes;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ComponentPropertiesClipboardCopyHandler.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,90 @@
+/*
+* 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.appdep.ui.views.listview;
+
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler;
+
+/**
+ * Clipboard copy handler for component properties.
+ */
+public class ComponentPropertiesClipboardCopyHandler extends AbstractTextClipboardCopyHandler{
+	
+	/**
+	 * Properties data to be copied.
+	 */
+	ComponentPropertiesData[] propDataArr = null;
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler#buildTextString()
+	 */
+	protected String buildTextString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		for (int i = 0; i < propDataArr.length; i++) {
+			ComponentPropertiesData prop = propDataArr[i];
+			
+			strBuf.append(prop.getFilename() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getBinaryFormat() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getUid1() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getUid2() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getUid3() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getSecureId() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getVendorId() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getMinHeapSize() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getMaxHeapSize() + "\t"); //$NON-NLS-1$
+			strBuf.append(prop.getStackSize() + "\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 ComponentPropertiesData)){
+					return false;
+				}
+			}
+			else{
+				// No objects to copy
+				return false;
+			}
+			propDataArr = (ComponentPropertiesData[]) objectsToCopy.toArray(new ComponentPropertiesData[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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListView.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,530 @@
+/*
+* 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.appdep.ui.views.listview;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+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.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.actions.ExportReportListViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SelectAllFromTableViewerComponentListViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SetNewRootComponentListViewAction;
+import com.nokia.s60tools.appdep.ui.utils.UiUtils;
+import com.nokia.s60tools.appdep.ui.views.main.MainView;
+import com.nokia.s60tools.ui.ICopyActionHandler;
+import com.nokia.s60tools.ui.S60ToolsTable;
+import com.nokia.s60tools.ui.S60ToolsTableColumnData;
+import com.nokia.s60tools.ui.S60ToolsTableFactory;
+import com.nokia.s60tools.ui.actions.CopyFromTableViewerAction;
+
+/**
+ * This class comprises the IsUsed By -component List view of the tool.
+ */
+public class ListView 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.appdep.ui.views.listview.ListView"; //$NON-NLS-1$
+		
+	//
+	// Controls and related classes (providers etc.)
+	// 
+		
+	private SashForm listViewSashForm;
+
+	private TableViewer listItemsViewer;
+	private Action actionCompPropertiesDataCopy;
+	private Action actionSelectAll;
+	private Action actionSetAsNewRoot;
+	private ExportReportListViewAction actionExportReport;
+	private ListViewContentProvider listViewContentProvider;
+
+	/**
+	 * Name of the component to query 'Is Use By' relationships for.
+	 */
+	private String componentName;
+		
+	/**
+	 * Name of the function to query 'Is Use By' relationships for.
+	 */
+	private String functionName;
+	
+	/**
+	 * The constructor.
+	 */
+	public ListView() {
+	}
+
+	/**
+	 * This is a callback that will allow us
+	 * to create the componentTreeViewer and initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		//
+		// Creating controls
+		//
+
+		// The left side contains component hierarchy tree view
+		listViewSashForm = new SashForm(parent, SWT.HORIZONTAL);
+
+		// List view viewer
+		listItemsViewer = createListViewTableViewer(listViewSashForm);
+				
+		listViewContentProvider = new ListViewContentProvider();
+		listItemsViewer.setContentProvider(listViewContentProvider);
+		listItemsViewer.setLabelProvider(new ListViewLabelProvider());
+		listItemsViewer.setInput(listViewContentProvider);
+		listItemsViewer.setSorter(new ComponentListViewSorter());
+		listItemsViewer.addSelectionChangedListener(new ListViewSelectionChangedListener(this));
+		// On double-click setting clicked component as new root component
+		listItemsViewer.addDoubleClickListener(new IDoubleClickListener(){
+
+				/* (non-Javadoc)
+				 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+				 */
+				public void doubleClick(DoubleClickEvent event) {
+					IStructuredSelection sel = (IStructuredSelection) event.getSelection();
+					if(sel.size() == 1){
+						Object firstElement = sel.getFirstElement();
+						if(firstElement instanceof ComponentPropertiesData){
+							ComponentPropertiesData propData = (ComponentPropertiesData)firstElement;
+							String selectedComponentName = propData.getFilename();
+							try {
+								MainView view = MainView.getViewInstance();
+								UiUtils.setComponentAsNewRootInMainView(view , selectedComponentName, propData.getTargetPlatform());				
+							} catch (PartInitException e) {
+								e.printStackTrace();
+							}						
+						}
+					}
+				} // doubleClick
+
+			} // new IDoubleClickListener()
+		);
+		
+		//
+		// Doing other initializations
+		//
+		createActions();
+		hookContextMenu();
+		contributeToActionBars();
+		
+		// Updating initial state of menu actions
+		updateViewActionEnabledStates();
+		
+		// Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(listItemsViewer.getControl(), 
+	    		AppDepHelpContextIDs.APPDEP_COMPONENT_LIST_VIEW);
+	}
+
+	/**
+	 * Creates table viewer for import functions tab item. 
+	 * @return New <code>TableViewer</code> object instance.
+	 */
+	private TableViewer createListViewTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indeces must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.Name_TableColumnTitle"), //$NON-NLS-1$
+														150,
+														ComponentPropertiesData.NAME_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_NAME));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.BinaryFormat_TableColumnTitle"), //$NON-NLS-1$
+														150,
+														ComponentPropertiesData.BIN_FORMAT_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_BIN_FORMAT));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.UID1_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.UID1_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_UID1));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.UID2_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.UID2_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_UID2));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.UID3_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.UID3_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_UID3));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.SecureId_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.SECURE_ID_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_SECURE_ID));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.VendorID_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.VENDOR_ID_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_VENDOR_ID));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.MinHeapSize_TableColumnTitle"), //$NON-NLS-1$
+														100,
+														ComponentPropertiesData.MIN_HEAP_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_MIN_HEAP));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.MaxHeapSize_TableColumnTitle"), //$NON-NLS-1$
+														100,
+														ComponentPropertiesData.MAX_HEAP_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_MAX_HEAP));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("ListView.StackSize_TableColumnTitle"), //$NON-NLS-1$
+														100,
+														ComponentPropertiesData.STACK_SIZE_COLUMN_INDEX,
+														ComponentListViewSorter.CRITERIA_STACK_SIZE));
+		
+		S60ToolsTableColumnData[] arr 
+				= (S60ToolsTableColumnData[]) columnDataArr.toArray(
+											   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tblViewer;
+	}
+		
+	/**
+	 * Creating context menu.
+	 */
+	private void hookContextMenu() {
+		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				ListView.this.fillViewContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(listItemsViewer.getControl());
+		listItemsViewer.getControl().setMenu(menu);
+		getSite().registerContextMenu(menuMgr, listItemsViewer);
+	}
+
+	/**
+	 * Contributing items to view menu and toolbar.
+	 */
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillViewPullDownMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * Fills view menu.
+	 * @param manager Menu manager.
+	 */
+	private void fillViewPullDownMenu(IMenuManager manager) {
+	}
+
+	/**
+	 * Fills view's context menu.
+	 * @param manager Menu manager.
+	 */
+	private void fillViewContextMenu(IMenuManager manager) {
+		manager.add(actionCompPropertiesDataCopy);
+		manager.add(actionSelectAll);
+		manager.add(new Separator());
+		manager.add(actionSetAsNewRoot);
+		manager.add(actionExportReport);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+	
+	/**
+	 * Fills view's toolbar.
+	 * @param manager Menu manager.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {
+	}
+
+	/**
+	 * Creating actions for the view.
+	 */
+	private void createActions() {
+		
+		ComponentPropertiesClipboardCopyHandler copyHandler = new ComponentPropertiesClipboardCopyHandler();		
+		actionCompPropertiesDataCopy = new CopyFromTableViewerAction(listItemsViewer,
+                												new ICopyActionHandler[]{ copyHandler }
+					                                           );
+		actionSelectAll = new SelectAllFromTableViewerComponentListViewAction(this);
+		actionSetAsNewRoot = new SetNewRootComponentListViewAction(this);
+		actionExportReport = new ExportReportListViewAction(this);
+	}
+	
+	/**	 
+	 * Passing the focus request to the listItemsViewer's control.
+	 */
+	public void setFocus() {
+		listItemsViewer.getControl().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);
+	}
+
+	/**
+	 * Refreshes the view.
+	 */
+	public void refresh(){
+		listItemsViewer.refresh();
+	}
+
+	/**
+	 * Returns currently selected element from list view.
+	 * @return Returns currently selected element or <code>null</code> 
+	 *         if there are no selection made.
+	 */
+	public Object getComponentListSelectedElement() {
+		ISelection selection = listItemsViewer.getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		return obj;
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+	}
+
+	/**
+	 * Sets input for the list view.
+	 * @param usingCompPropArrayList List of component properties data to set.
+	 */
+	public void setInput(List<ComponentPropertiesData> usingCompPropArrayList) {
+		listItemsViewer.setInput(usingCompPropArrayList);
+		actionExportReport.setIsUsedByData(usingCompPropArrayList);
+	}
+	
+	/**
+	 * Gets component list viewer.
+	 * @return component list viewer.
+	 */
+	public TableViewer getComponentListViewer(){
+		return listItemsViewer;
+	}
+
+	/**
+	 * Sets name of the component that was searched for using components.
+	 * @param componentName Component name
+	 */
+	public void setComponentName(String componentName) {
+		this.componentName = componentName;		
+	}
+	
+	/**
+	 * Gets name of the component that was searched for using components.
+	 * @return name of the component that was searched for using components.
+	 */
+	public String getComponentName() {
+		return componentName;		
+		
+	}
+
+	/**
+	 * Enables to get reference of the main view
+	 * from the classes that do not actually
+	 * have reference to the main view instance.
+	 * @throws PartInitException 
+	 */
+	private static ListView getViewInstance() throws PartInitException{
+		
+		IWorkbenchPage page = AppDepPlugin.getCurrentlyActivePage();
+		
+		IViewPart viewPart = null;
+		
+		IViewReference[] viewRefs = page.getViewReferences();
+		if(viewRefs == null){
+			return null;
+		}
+		for (int i = 0; i < viewRefs.length; i++) {
+			IViewReference reference = viewRefs[i];
+			String id = reference.getId();
+			if(id.equalsIgnoreCase(ListView.ID)){
+				viewPart = reference.getView(true);
+			}
+		}
+		if(viewPart == null){
+			return null;
+		}
+		return ((ListView) viewPart);
+	}
+
+	/**
+	 * Clears list view (By updating it with empty List).
+	 */
+	public static void clear(){
+		try {
+			ListView view = getViewInstance();
+			if(view != null){
+				ArrayList<ComponentPropertiesData> emptyData = new ArrayList<ComponentPropertiesData>();				
+				view.setInput(emptyData);
+			}
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Gets the name of the function that was searched for using components.
+	 * @return the name of the function that was searched for using components.
+	 */
+	public String getFunctionName() {
+		return functionName;
+	}
+
+	/**
+	 * Sets the name of the function that was searched for using components.
+	 * @param functionName the functionName to set
+	 */
+	public void setFunctionName(String functionName) {
+		this.functionName = functionName;
+	}
+
+	/**
+	 * Checks if the component list has currently any selections.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasComponentListSelection() {
+		int selectionCount = getListViewSelectionCount();
+		return (selectionCount > 0);
+	}
+
+	/**
+	 * Checks if only single component is selected.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasComponentListSingleSelection() {
+		int selectionCount = getListViewSelectionCount();
+		return (selectionCount == 1);
+	}	
+	
+	/**
+	 * Gets component list viewer selection count.
+	 * @return component list viewer selection count.
+	 */
+	private int getListViewSelectionCount() {
+		return listItemsViewer.getTable().getSelectionCount();
+	}
+
+	/**
+	 * Checks if all components has been selected.
+	 * @return <code>true</code> if all selected, otherwise <code>false</code>.
+	 */
+	private boolean isAllComponentsSelected() {
+		return (getListViewItemCount() == getListViewSelectionCount());
+	}
+
+	/**
+	 * Gets count of all elements in component list view.
+	 * @return count of all elements in component list view.
+	 */
+	private int getListViewItemCount() {
+		return listItemsViewer.getTable().getItemCount();
+	}
+
+	/**
+	 * Checks if the component list has currently any components.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasComponentsOnList() {
+		return (listItemsViewer.getTable().getItemCount() > 0);
+	}
+	
+	/**
+	 * 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 updateViewActionEnabledStates(){
+		
+		// Resolving current state		
+		boolean isRootComponentSelectedForAnalysis = AppDepSettings.isRootComponentSelectedForAnalysis();
+		boolean isValidComponentSelection = isRootComponentSelectedForAnalysis && (getComponentListSelectedElement() != null);
+		boolean isComponentListActionsEnabled = isValidComponentSelection && hasComponentsOnList();
+		boolean hasComponentListSelection = isComponentListActionsEnabled && hasComponentListSelection();
+		boolean isAllComponentsSelected = isComponentListActionsEnabled && isAllComponentsSelected();	
+		boolean hasComponentListSingleSelection = isComponentListActionsEnabled && hasComponentListSingleSelection();
+		
+		// Updating action enable/disable statuses
+		setEnableState(actionCompPropertiesDataCopy, hasComponentListSelection);
+		setEnableState(actionSelectAll, isComponentListActionsEnabled && !isAllComponentsSelected);
+		setEnableState(actionSetAsNewRoot, hasComponentListSingleSelection);
+		setEnableState(actionExportReport, hasComponentListSingleSelection);		
+	}
+
+	/**
+	 * Sets given enable state for an action if it is non <code>null</code>.
+	 * @param action Action to set enable status for.
+	 * @param enableStatus <code>true</code> if enabled, otherwise <code>false</code>.
+	 */
+	private void setEnableState(Action action, boolean enableStatus) {
+		if(action != null){
+			action.setEnabled(enableStatus);			
+		}
+	}	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,72 @@
+/*
+* 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.appdep.ui.views.listview;
+
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+
+/**
+ * Content provider for Import Functions tab item. 
+ */
+class ListViewContentProvider implements IStructuredContentProvider {
+		
+	/**
+	 * Array containing component properties data
+	 */
+	private ArrayList<ComponentPropertiesData> listViewItemsArrayList = null;
+
+	/**
+	 * Content provider's constructor.
+	 */
+	public ListViewContentProvider(){
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	@SuppressWarnings("unchecked")
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+		if(newInput instanceof ArrayList){
+			// Input is what we have expected
+			listViewItemsArrayList = (ArrayList<ComponentPropertiesData>)newInput;
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		if(listViewItemsArrayList != null){
+			return listViewItemsArrayList.toArray();			
+		}
+		return new Object[0];
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,132 @@
+/*
+* 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.appdep.ui.views.listview;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Label provider for Import Functions tab item.
+ */
+class ListViewLabelProvider extends LabelProvider 
+												implements ITableLabelProvider  {
+	
+	/**
+	 * Constructor
+	 */
+	public ListViewLabelProvider() {
+		super();
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		
+		// Currently no images is used
+		Image img = null;
+
+		switch (columnIndex) {
+
+		case ComponentPropertiesData.NAME_COLUMN_INDEX:
+		case ComponentPropertiesData.BIN_FORMAT_COLUMN_INDEX:
+		case ComponentPropertiesData.UID1_COLUMN_INDEX:
+		case ComponentPropertiesData.UID2_COLUMN_INDEX:
+		case ComponentPropertiesData.UID3_COLUMN_INDEX:
+		case ComponentPropertiesData.SECURE_ID_COLUMN_INDEX:
+		case ComponentPropertiesData.VENDOR_ID_COLUMN_INDEX:
+		case ComponentPropertiesData.MIN_HEAP_COLUMN_INDEX:
+		case ComponentPropertiesData.MAX_HEAP_COLUMN_INDEX:
+		case ComponentPropertiesData.STACK_SIZE_COLUMN_INDEX:
+			break;
+			
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return img;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		
+		String label = element.toString();
+		
+		ComponentPropertiesData propData = (ComponentPropertiesData) element;
+
+		switch (columnIndex) {
+	
+			case ComponentPropertiesData.NAME_COLUMN_INDEX:
+				label = propData.getFilename();
+				break;
+	
+			case ComponentPropertiesData.BIN_FORMAT_COLUMN_INDEX:
+				label = propData.getBinaryFormat();
+				break;
+	
+			case ComponentPropertiesData.UID1_COLUMN_INDEX:
+				label = propData.getUid1();
+				break;
+	
+			case ComponentPropertiesData.UID2_COLUMN_INDEX:
+				label = propData.getUid2();
+				break;
+	
+			case ComponentPropertiesData.UID3_COLUMN_INDEX:
+				label = propData.getUid3();
+				break;
+	
+			case ComponentPropertiesData.SECURE_ID_COLUMN_INDEX:
+				label = propData.getSecureId();
+				break;
+	
+			case ComponentPropertiesData.VENDOR_ID_COLUMN_INDEX:
+				label = propData.getVendorId();
+				break;
+	
+			case ComponentPropertiesData.MIN_HEAP_COLUMN_INDEX:
+				label = propData.getMinHeapSize();
+				break;
+	
+			case ComponentPropertiesData.MAX_HEAP_COLUMN_INDEX:
+				label = propData.getMaxHeapSize();
+				break;
+	
+			case ComponentPropertiesData.STACK_SIZE_COLUMN_INDEX:
+				label = propData.getStackSize();
+				break;
+			
+			default:
+				AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+				break;
+		}
+		
+		return label;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/listview/ListViewSelectionChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.views.listview;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * This class listens to the selection events happening in
+ * list view.
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener
+ */
+public class ListViewSelectionChangedListener implements ISelectionChangedListener {
+
+	/**
+	 * Reference to list view.
+	 */
+	private final ListView view;
+	
+	/**
+	 * Default constructor.
+	 * @param view Reference to list view
+	 */
+	public ListViewSelectionChangedListener(ListView view){
+		this.view = view;
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		try {
+			view.updateViewActionEnabledStates();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ComponentPropertyTabClipboardCopyHandler.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.views.main;
+
+import java.util.List;
+
+import com.nokia.s60tools.appdep.ui.views.data.PropertyData;
+import com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler;
+
+/**
+ * Clipboard copy handler for component properties tab.
+ */
+public class ComponentPropertyTabClipboardCopyHandler extends AbstractTextClipboardCopyHandler {
+	
+	/**
+	 * Property data to be copied.
+	 */
+	PropertyData[] propDataArr = null;
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler#buildTextString()
+	 */
+	protected String buildTextString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		for (int i = 0; i < propDataArr.length; i++) {
+			PropertyData propData = propDataArr[i];
+			strBuf.append(propData.getPropertyDescription()
+					      + "\t" //$NON-NLS-1$
+	  				      + propData.getPropertyValue()
+					      + "\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 PropertyData)){
+					return false;
+				}
+			}
+			else{
+				// No objects to copy
+				return false;
+			}
+			propDataArr = (PropertyData[]) objectsToCopy.toArray(new PropertyData[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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportFunctionDataSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,91 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Sorter for export functions tab.
+ */
+public class ExportFunctionDataSorter extends S60ToolsViewerSorter {
+
+	/**
+	 * Import function data is sorted by function ordinal.
+	 */
+	public static final int CRITERIA_ORDINAL = 1;
+	/**
+	 * Import function data is sorted by function name.
+	 */
+	public static final int CRITERIA_NAME = 2;
+	
+	/**
+	 * Constructor.
+	 */
+	public ExportFunctionDataSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int comparisonResult = 0;
+		
+		ExportFunctionData f1 = (ExportFunctionData) e1;
+		ExportFunctionData f2 = (ExportFunctionData) e2;
+		
+		switch (sortCriteria) {
+		
+		case CRITERIA_ORDINAL:			
+			comparisonResult 			
+				= numericSortFromDecString(f1.getFunctionOrdinal(), 
+													   f2.getFunctionOrdinal());
+			break;
+
+		case CRITERIA_NAME:
+			comparisonResult 
+			   = alphabeticSort(
+			        		f1.getFunctionName(), 
+			        		f2.getFunctionName());
+			break;
+			
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("ExportFunctionDataSorter.Unexpected_Sort_Criteria_Msg"),  //$NON-NLS-1$
+					                     IConsolePrintUtility.MSG_ERROR);
+			break;
+		}
+		
+		return comparisonResult;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportFunctionsClipboardCopyHandler.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,81 @@
+/*
+* 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.appdep.ui.views.main;
+
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler;
+
+/**
+ * Clipboard copy handler for export functions tab.
+ */
+public class ExportFunctionsClipboardCopyHandler extends AbstractTextClipboardCopyHandler {
+	
+	/**
+	 * Function data to be copied.
+	 */
+	ExportFunctionData[] funcDataArr = null;
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler#buildTextString()
+	 */
+	protected String buildTextString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		for (int i = 0; i < funcDataArr.length; i++) {
+			ExportFunctionData f = funcDataArr[i];
+			strBuf.append(f.getFunctionOrdinal() + "\t"); //$NON-NLS-1$
+			strBuf.append(f.getFunctionName());
+			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 ExportFunctionData)){
+					return false;
+				}
+			}
+			else{
+				// No objects to copy
+				return false;
+			}
+			funcDataArr = (ExportFunctionData[]) objectsToCopy.toArray(new ExportFunctionData[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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ExportedFunctionsTabSelectionChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,106 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+
+/**
+ * This class listens to the selection events happening in
+ * imported functions pane.
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener
+ */
+public class ExportedFunctionsTabSelectionChangedListener implements ISelectionChangedListener {
+
+	/**
+	 * Reference to main view.
+	 */
+	private final MainView view;
+	
+	/**
+	 * Default constructor.
+	 * @param view Reference to main view
+	 */
+	public ExportedFunctionsTabSelectionChangedListener(MainView view){
+		this.view = view;
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		try {
+			TableViewer viewer = view.getExportFunctionsViewer();
+			IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
+			if(sel.size() > 1){
+				view.updateExportFunctionsContextMenuStates(true);
+			}
+			else{
+				view.updateExportFunctionsContextMenuStates(false);				
+			}
+			
+			Object functionObj = view.getSelectedExportFunction();
+			if(functionObj == null){
+				return;
+			}
+			ExportFunctionData efData = (ExportFunctionData) functionObj;
+			String methodName = efData.getFunctionName();
+			enableOrDisableShowSourceMenuAction(methodName);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}		
+	}
+
+	/**
+	 * Enable or disable show source menu action, depending on method name
+	 * @param methodName Method name
+	 * @param mainView Reference to main view
+	 */
+	private void enableOrDisableShowSourceMenuAction(String methodName) {
+		
+		boolean disableShowSource = false;
+		if (methodName==null){
+			disableShowSource = true;
+		}
+		String [] disabledMethodNames = view.getDisableShowSourcePrefixes();
+		for (int i = 0; !disableShowSource && i < disabledMethodNames.length; i++) {
+			if(methodName.startsWith(disabledMethodNames[i])){
+				disableShowSource = true;
+			}
+		}
+		
+		// Getting if multiple lines is selected.
+		TableViewer viewer = view.getExportFunctionsViewer();
+		IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
+		boolean isMultipleLinesSelected = sel.size() > 1;
+		
+		if(disableShowSource || isMultipleLinesSelected){
+			view.disableExportShowSourceAction();
+		}
+		else{
+			view.enableExportShowSourceAction();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportFunctionDataSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,102 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Sorter  for import functions tab.
+ */
+public class ImportFunctionDataSorter extends S60ToolsViewerSorter {
+
+	/**
+	 * Import function data is sorted by function ordinal.
+	 */
+	public static final int CRITERIA_ORDINAL = 1;
+	/**
+	 * Import function data is sorted by function name.
+	 */
+	public static final int CRITERIA_NAME = 2;
+	
+	/**
+	 * Import function data is sorted by function offset.
+	 */
+	public static final int CRITERIA_OFFSET = 3;
+
+	/**
+	 * Constructor.
+	 */
+	public ImportFunctionDataSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int comparisonResult = 0;
+		
+		ImportFunctionData f1 = (ImportFunctionData) e1;
+		ImportFunctionData f2 = (ImportFunctionData) e2;
+		
+		switch (sortCriteria) {
+		
+		case CRITERIA_ORDINAL:			
+			comparisonResult 			
+				= numericSortFromDecString(f1.getFunctionOrdinal(), 
+													   f2.getFunctionOrdinal());
+			break;
+
+		case CRITERIA_NAME:
+			comparisonResult 
+			   = alphabeticSort(
+			        		f1.getFunctionName(), 
+			        		f2.getFunctionName());
+			break;
+			
+		case CRITERIA_OFFSET:
+			comparisonResult 			
+				= numericSortFromDecString(f1.getFunctionOffsetAsString(), 
+												       f2.getFunctionOffsetAsString());
+			break;
+			
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("ImportFunctionDataSorter.UnexpectedSortCriteria_Msg"),  //$NON-NLS-1$
+					                     IConsolePrintUtility.MSG_ERROR);
+			break;
+		}
+		
+		return comparisonResult;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportFunctionsClipboardCopyHandler.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,86 @@
+/*
+* 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.appdep.ui.views.main;
+
+import java.util.List;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler;
+
+/**
+ * Clipboard copy handler for import functions tab.
+ */
+public class ImportFunctionsClipboardCopyHandler extends AbstractTextClipboardCopyHandler {
+	
+	/**
+	 * Function data to be copied.
+	 */
+	ImportFunctionData[] funcDataArr = null;
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.AbstractTextClipboardCopyHandler#buildTextString()
+	 */
+	protected String buildTextString() {
+		StringBuffer strBuf = new StringBuffer();
+		
+		for (int i = 0; i < funcDataArr.length; i++) {
+			ImportFunctionData f = funcDataArr[i];
+			strBuf.append(f.getFunctionOrdinal() + "\t"); //$NON-NLS-1$
+			strBuf.append(f.getFunctionName());
+			if(f.isVirtual()){
+				strBuf.append("\t" + f.getFunctionOffset() + "\r\n");				 //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			else{
+				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 ImportFunctionData)){
+					return false;
+				}
+			}
+			else{
+				// No objects to copy
+				return false;
+			}
+			funcDataArr = (ImportFunctionData[]) objectsToCopy.toArray(new ImportFunctionData[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/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/ImportedFunctionsTabSelectionChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,106 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+
+/**
+ * This class listens to the selection events happening in
+ * imported functions pane.
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener
+ */
+public class ImportedFunctionsTabSelectionChangedListener implements ISelectionChangedListener {
+
+	/**
+	 * Reference to main view.
+	 */
+	private final MainView view;
+	
+	/**
+	 * Default constructor.
+	 * @param view Reference to main view
+	 */
+	public ImportedFunctionsTabSelectionChangedListener(MainView view){
+		this.view = view;
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		try {
+			TableViewer viewer = view.getImportFunctionsViewer();
+			IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
+			if(sel.size() > 1){
+				view.updateImportFunctionsContextMenuStates(true);
+			}
+			else{
+				view.updateImportFunctionsContextMenuStates(false);				
+			}
+			
+			Object functionObj = view.getSelectedImportFunction();
+			if(functionObj == null){
+				return;
+			}
+			ImportFunctionData efData = (ImportFunctionData) functionObj;
+			String methodName = efData.getFunctionName();
+			enableOrDisableShowSourceMenuAction(methodName);			
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}		
+	}
+	
+	/**
+	 * Enable or disable show source menu action, depending on method name
+	 * @param methodName Method name
+	 * @param mainView Reference to main view
+	 */
+	private void enableOrDisableShowSourceMenuAction(String methodName) {
+		
+		boolean disableShowSource = false;
+		if (methodName==null){
+			disableShowSource = true;
+		}
+		String [] disabledMethodNames = view.getDisableShowSourcePrefixes();
+		for (int i = 0; !disableShowSource && i < disabledMethodNames.length; i++) {
+			if(methodName.startsWith(disabledMethodNames[i])){
+				disableShowSource = true;
+			}
+		}
+		
+		// Getting if multiple lines is selected.
+		TableViewer viewer = view.getImportFunctionsViewer();
+		IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
+		boolean isMultipleLinesSelected = sel.size() > 1;
+		
+		if(disableShowSource || isMultipleLinesSelected){
+			view.disableImportShowSourceAction();
+		}
+		else{
+			view.enableImportShowSourceAction();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainView.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1430 @@
+/*
+* 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.appdep.ui.views.main;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+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.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+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.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+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.IMemento;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.DrillDownAdapter;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.search.SearchConstants;
+import com.nokia.s60tools.appdep.ui.actions.AbstractShowSourceFileAction;
+import com.nokia.s60tools.appdep.ui.actions.AddSisAndUpdateCacheMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.CacheUpdateMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.CollapseAllMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ComponentIsUsedByMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ComponentPropertiesMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ExpandAllMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ExpandSubtreeMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ExportReportMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.FindMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.FunctionIsUsedByExportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.FunctionIsUsedByImportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.LocateComponentMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SearchMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SelectAllFromTableViewerMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SelectNewRootComponentMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SelectNewSDKMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.SetNewRootMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowMethodCallLocationsImportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowSourceFileAndCreateProjectExportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowSourceFileAndCreateProjectImportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowSourceFileExportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.actions.ShowSourceFileImportFunctionMainViewAction;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.ui.ICopyActionHandler;
+import com.nokia.s60tools.ui.ProgrammaticSelection;
+import com.nokia.s60tools.ui.S60ToolsTable;
+import com.nokia.s60tools.ui.S60ToolsTableColumnData;
+import com.nokia.s60tools.ui.S60ToolsTableFactory;
+import com.nokia.s60tools.ui.actions.CopyFromTableViewerAction;
+
+/**
+ * This class comprises the Main View of the AppDep
+ * application.
+ */
+public class MainView extends ViewPart implements KeyListener {
+	
+	/**
+	 * 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.appdep.ui.views.main.MainView"; //$NON-NLS-1$
+		
+	/**
+	 * We will disable show source functionality for some "method" names,
+	 * which are no real method names. List for prefixes is stored in here and 
+	 * all clients of {@link MainView} can be used them. 
+	 */
+	private static final String [] DISABLE_SHOW_SOURCE_PREFIXES = {
+		"BC break", //$NON-NLS-1$
+		"vtable for", //$NON-NLS-1$
+		"typeinfo", //$NON-NLS-1$
+		"\"_._.absent_export_"}; //$NON-NLS-1$
+		
+	//
+	// Actions
+	//
+	
+	private Action actionSetAsNewRoot;
+	private Action actionComponentIsUsedBy;
+
+	private Action actionImportFunctionIsUsedBy;
+	private Action actionImportFunctionDataCopy;
+	private Action actionSelectAllImportFunctions;
+
+	private Action actionExportFunctionIsUsedBy;
+	private Action actionExportFunctionDataCopy;
+	private Action actionSelectAllExportFunctions;
+	
+	private Action actionCompPropertyDataCopy;
+	private Action actionSelectAllComponentProperties;
+	private Action actionExpandAll = null;
+	private Action actionCollapseAll = null;
+	private Action actionExpandSubtree = null;
+	private Action actionSelectNewRootComponent = null;
+	private Action actionComponentProperties;
+	private Action actionSelectNewSDK;
+	private Action actionExportReport;
+	private Action actionComponentFind;
+	private Action actionLocateComponent;
+	
+	private Action actionCacheUpdate;
+	private Action addSisFilesAndUpdateCache;
+	private Action actionComponentSearch;
+	private Action actionImportFunctionSearch;
+	private Action actionExportFunctionSearch;
+	
+	private AbstractShowSourceFileAction actionImportShowSource;	
+	private AbstractShowSourceFileAction actionExportShowSource;
+	
+	private ShowMethodCallLocationsImportFunctionMainViewAction actionImportShowMethodLoc;	
+		
+	private ShowSourceFileAndCreateProjectExportFunctionMainViewAction actionExportShowSourceInProject;
+	private ShowSourceFileAndCreateProjectImportFunctionMainViewAction actionImportShowSourceInProject;
+
+	/**
+	 * This flag is updated when the view is fully populated
+	 * i.e. all the indirect dependencies are searched.
+	 * This flag is set to <code>true</code> by population
+	 * progress listener when population has either finished
+	 * or aborted by the user. The value of this flag is used, 
+	 * for instance, by selection listener.
+	 */
+	static private boolean isDependencySearchOngoing = false;
+
+	//
+	// Controls and related classes (providers etc.)
+	// 
+	
+	private TreeViewer componentTreeViewer;
+	private DrillDownAdapter drillDownAdapter;
+	private MainViewComponentTreeContentProvider compTreeViewerContentProv = null;
+					
+	private CTabItem importFunctionsTab;
+	
+	private S60ToolsTable importFunctionsViewer;
+
+	private MainViewImportFunctionsTabContentProvider importFunctionsTabContentProvider;
+
+	private CTabItem componentPropertiesTab;
+	
+	private SashForm componentPropertiesSashForm;
+	
+	private TableViewer componentPropertiesViewer;
+
+	private MainViewComponentPropertiesTabContentProvider componentPropertiesTabContentProvider;
+	
+	private ArrayList<ImportFunctionData> importFunctionsArrayList;	
+	
+	private ComponentPropertiesData selectedComponentPropertiesData = null;
+
+	private CTabItem exportFunctionsTab;
+
+	private S60ToolsTable exportFunctionsViewer;
+
+	private MainViewExportFunctionsTabContentProvider exportFunctionsTabContentProvider;
+		
+	private ArrayList<ExportFunctionData> exportFunctionsArrayList;	
+
+	/**
+	 * 'Go Into' actions looses the selection from the tree view, and there is
+	 * no way to hook the action, therefore we store the recently selected
+	 * component in order to know for which the selected function is bound to.
+	 * 
+	 * This is used for "Is Used By..."-actions and also 
+	 * for "Show Source.."- and "Show Method.."-actions. 
+	 */
+	private Object mostRecentlySelectedComponentNode = null;
+
+	
+	/**
+	 * The constructor.
+	 */
+	public MainView() {		
+		setTitleToolTip(ProductInfoRegistry.getProductName());
+	}
+
+	/**
+	 * This is a callback that will allow us
+	 * to create the componentTreeViewer and initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		// Creating commonly used data structures
+		importFunctionsArrayList = new ArrayList<ImportFunctionData>();								
+		exportFunctionsArrayList = new ArrayList<ExportFunctionData>();								
+		
+		//
+		// 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.
+		//
+		createOnlyMainViewDependentActions();
+		
+		//
+		// Creating controls
+		//
+
+		// The left side contains component hierarchy tree view
+		SashForm componentHierarchySashForm = new SashForm(parent, SWT.HORIZONTAL);		
+		createComponentTreeViewControl(componentHierarchySashForm);
+		
+		// The right side contains tabbed panes for showing...
+		CTabFolder sidePaneTabFolder = new CTabFolder(componentHierarchySashForm, SWT.BOTTOM);		
+		//... parent imported functions
+		createImportFunctionsTabControl(sidePaneTabFolder);
+		// ...exported functions for the selected module
+		createExportFunctionsTabControl(sidePaneTabFolder);
+		//...component properties
+		createComponentPropertiesTabControl(sidePaneTabFolder);
+		
+		// Default selection for tab folder
+		sidePaneTabFolder.setSelection(importFunctionsTab);
+		
+		//
+		// Doing other initializations that may refer to the component
+		// that has been created above.
+		//
+		hookContextMenu();
+		contributeToActionBars();
+		
+		// Adding listeners
+		componentTreeViewer.getControl().addKeyListener(this);
+		
+		// Setting context help IDs		
+	    AppDepPlugin.setContextSensitiveHelpID(componentTreeViewer.getControl(), 
+	    		AppDepHelpContextIDs.APPDEP_MAIN_VIEW);
+
+	    AppDepPlugin.setContextSensitiveHelpID(importFunctionsViewer.getTableInstance(), 
+	    		AppDepHelpContextIDs.APPDEP_IMPORTED_FUNCTIONS);		
+
+	    AppDepPlugin.setContextSensitiveHelpID(exportFunctionsViewer.getTableInstance(), 
+	    		AppDepHelpContextIDs.APPDEP_EXPORTED_FUNCTIONS);		
+
+	    AppDepPlugin.setContextSensitiveHelpID(componentPropertiesViewer.getTable(), 
+	    		AppDepHelpContextIDs.APPDEP_PROPERTIES);		
+	}
+
+	/**
+	 * Creates component properties tab.
+	 * @param sidePaneTabFolder Parent tab folder.
+	 */
+	private void createComponentPropertiesTabControl(CTabFolder sidePaneTabFolder) {		
+		componentPropertiesSashForm = new SashForm(sidePaneTabFolder, SWT.VERTICAL);		
+		componentPropertiesTab = new CTabItem(sidePaneTabFolder, SWT.NONE);
+		componentPropertiesTab.setControl(componentPropertiesSashForm);
+		componentPropertiesTab.setText(Messages.getString("MainView.ComponentProperties_TabTitle")); //$NON-NLS-1$
+		// and viewer for those
+		componentPropertiesViewer = createComponentPropertiesTableViewer(componentPropertiesSashForm);		
+		// Creating pop-up menu actions that require the existence of componentPropertiesViewer
+		createComponentPropertiesTabPopUpMenuActions();
+		componentPropertiesTabContentProvider = new MainViewComponentPropertiesTabContentProvider(this);
+		componentPropertiesViewer.setContentProvider(componentPropertiesTabContentProvider);
+		componentPropertiesViewer.setLabelProvider(new MainViewComponentPropertiesTabLabelProvider());
+		componentPropertiesViewer.setInput(componentPropertiesTabContentProvider);
+		componentPropertiesViewer.setSorter(new PropertyDataSorter());
+	}
+
+	/**
+	 * Creates export functions tab.
+	 * @param sidePaneTabFolder Parent tab folder.
+	 */
+	private void createExportFunctionsTabControl(CTabFolder sidePaneTabFolder) {
+		SashForm exportFunctionsSashForm = new SashForm(sidePaneTabFolder, SWT.VERTICAL);		
+		exportFunctionsTab = new CTabItem(sidePaneTabFolder, SWT.NONE);
+		exportFunctionsTab.setControl(exportFunctionsSashForm);
+		exportFunctionsTab.setText(Messages.getString("MainView.ExportedFunctions_TabTitle"));		 //$NON-NLS-1$
+		// and viewer for those
+		exportFunctionsViewer = createExportFunctionsTableViewer(exportFunctionsSashForm);
+		// Creating pop-up menu actions that require the existence of exportFunctionsViewer
+		createExportFunctionsTabPopUpMenuActions();
+		exportFunctionsTabContentProvider = new MainViewExportFunctionsTabContentProvider(exportFunctionsArrayList);
+		exportFunctionsViewer.getHostingViewer().setContentProvider(exportFunctionsTabContentProvider);
+		exportFunctionsViewer.getHostingViewer().setLabelProvider(new MainViewExportFunctionsTabLabelProvider());
+		exportFunctionsViewer.getHostingViewer().setInput(exportFunctionsTabContentProvider);
+		exportFunctionsViewer.getHostingViewer().setSorter(new ExportFunctionDataSorter());
+		ExportedFunctionsTabSelectionChangedListener selListener = new ExportedFunctionsTabSelectionChangedListener(this);
+		exportFunctionsViewer.getHostingViewer().addSelectionChangedListener(selListener);
+	}
+	
+	
+	/**
+	 * Creates import functions tab.
+	 * @param sidePaneTabFolder Parent tab folder.
+	 */
+	private void createImportFunctionsTabControl(CTabFolder sidePaneTabFolder) {
+		SashForm importFunctionsSashForm = new SashForm(sidePaneTabFolder, SWT.VERTICAL);		
+		importFunctionsTab = new CTabItem(sidePaneTabFolder, SWT.NONE);
+		importFunctionsTab.setControl(importFunctionsSashForm);
+		importFunctionsTab.setText(Messages.getString("MainView.ImportedFunctions_TabTitle"));		 //$NON-NLS-1$
+		// and viewer for those
+		importFunctionsViewer = createImportFunctionsTableViewer(importFunctionsSashForm);
+		// Creating pop-up menu actions that require the existence of importFunctionsViewer
+		createImportFunctionsTabPopUpMenuActions();
+		importFunctionsTabContentProvider = new MainViewImportFunctionsTabContentProvider(importFunctionsArrayList);
+		importFunctionsViewer.getHostingViewer().setContentProvider(importFunctionsTabContentProvider);
+		importFunctionsViewer.getHostingViewer().setLabelProvider(new MainViewImportFunctionsTabLabelProvider());
+		importFunctionsViewer.getHostingViewer().setInput(importFunctionsTabContentProvider);
+		importFunctionsViewer.getHostingViewer().setSorter(new ImportFunctionDataSorter());
+		ImportedFunctionsTabSelectionChangedListener selListener = new ImportedFunctionsTabSelectionChangedListener(this);
+		importFunctionsViewer.getHostingViewer().addSelectionChangedListener(selListener);
+	}
+
+	/**
+	 * Creates component tree view control.
+	 * @param componentHierarchySashForm Parent SashForm for the tree view control.
+	 */
+	private void createComponentTreeViewControl(SashForm componentHierarchySashForm) {
+		componentTreeViewer = new TreeViewer(componentHierarchySashForm, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+		drillDownAdapter = new DrillDownAdapter(componentTreeViewer);
+		compTreeViewerContentProv = new MainViewComponentTreeContentProvider(this);
+		componentTreeViewer.setContentProvider(compTreeViewerContentProv);
+		componentTreeViewer.setLabelProvider(new MainViewComponentTreeLabelProvider());
+		componentTreeViewer.setInput(compTreeViewerContentProv.getInput());
+		componentTreeViewer.addDoubleClickListener(new MainViewDoubleClickListener(this, 
+																				   drillDownAdapter));
+		ISelectionChangedListener selChangedListener 
+									= new MainViewSelectionChangedListener(this, 
+																		   importFunctionsArrayList,
+																		   exportFunctionsArrayList);
+		componentTreeViewer.addSelectionChangedListener(selChangedListener);
+	}
+
+	/**
+	 * Creates table viewer for import functions tab item. 
+	 * @return New <code>S60ToolsTable</code> object instance.
+	 */
+	private S60ToolsTable createImportFunctionsTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Ordinal_TableColumnTitle"), //$NON-NLS-1$
+														60,
+														ImportFunctionData.ORDINAL_COLUMN_INDEX,
+														ImportFunctionDataSorter.CRITERIA_ORDINAL));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Name_TableColumnTitle"), //$NON-NLS-1$
+														340,
+														ImportFunctionData.NAME_COLUMN_INDEX,
+														ImportFunctionDataSorter.CRITERIA_NAME, true));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Offset_TableColumnTitle"), //$NON-NLS-1$
+														60,
+														ImportFunctionData.OFFSET_COLUMN_INDEX,
+														ImportFunctionDataSorter.CRITERIA_OFFSET));
+		
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr, 1);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tbl;
+	}
+
+	/**
+	 * Creates table viewer for export functions tab item. 
+	 * @return New <code>S60ToolsTable</code> object instance.
+	 */
+	private S60ToolsTable createExportFunctionsTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Ordinal_TableColumnTitle"), //$NON-NLS-1$
+														60,
+														ExportFunctionData.ORDINAL_COLUMN_INDEX,
+														ExportFunctionDataSorter.CRITERIA_ORDINAL));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Name_TableColumnTitle"), //$NON-NLS-1$
+														340,
+														ExportFunctionData.NAME_COLUMN_INDEX,
+														ExportFunctionDataSorter.CRITERIA_NAME, true));
+				
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr, 1);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tbl;
+	}
+	
+	
+	/**
+	 * Creates table viewer for component properties tab item. 
+	 * @return New <code>TableViewer</code> object instance.
+	 */
+	private TableViewer createComponentPropertiesTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Property_TableColumnTitle"), //$NON-NLS-1$
+														80,
+														ComponentPropertiesData.PROPERTY_COLUMN_INDEX,
+														PropertyDataSorter.CRITERIA_PROPERTY));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("MainView.Value_TableColumnTitle"), //$NON-NLS-1$
+														380,
+														ComponentPropertiesData.VALUE_COLUMN_INDEX,
+														PropertyDataSorter.CRITERIA_VALUE));
+		
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tblViewer;
+	}
+	
+
+	/**
+	 * Hooks view's context menu.
+	 */
+	private void hookContextMenu() {
+		//
+		// Context menu for tree viewer
+		//
+		MenuManager menuMgr = new MenuManager("#TreeViewPopupMenu"); //$NON-NLS-1$
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillTreeViewContextMenu(manager);
+			}
+		});		
+		Menu menu = menuMgr.createContextMenu(componentTreeViewer.getControl());
+		componentTreeViewer.getControl().setMenu(menu);
+		getSite().registerContextMenu(menuMgr, componentTreeViewer);
+		
+		//
+		// Context menu for import functions pane
+		//
+		MenuManager menuMgr2 = new MenuManager("#ImportFunctionsPopupMenu"); //$NON-NLS-1$
+		menuMgr2.setRemoveAllWhenShown(true);
+		menuMgr2.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillImportFunctionsTabContextMenu(manager);
+			}
+		});
+
+		Menu menu2 = menuMgr2.createContextMenu(importFunctionsViewer.getHostingViewer().getControl());
+		importFunctionsViewer.getHostingViewer().getControl().setMenu(menu2);
+		getSite().registerContextMenu(menuMgr2, importFunctionsViewer.getHostingViewer());
+		
+		//
+		// Context menu for export functions pane
+		//
+		MenuManager menuMgr3 = new MenuManager("#ExportFunctionsPopupMenu"); //$NON-NLS-1$
+		menuMgr3.setRemoveAllWhenShown(true);
+		menuMgr3.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillExportFunctionsTabContextMenu(manager);
+			}
+		});
+
+		Menu menu3 = menuMgr3.createContextMenu(exportFunctionsViewer.getHostingViewer().getControl());
+		exportFunctionsViewer.getHostingViewer().getControl().setMenu(menu3);
+		getSite().registerContextMenu(menuMgr3, exportFunctionsViewer.getHostingViewer());
+		
+		//
+		// Context menu for component properties pane
+		//
+		MenuManager menuMgr4 = new MenuManager("#ComponentPropertiesPopupMenu"); //$NON-NLS-1$
+		menuMgr4.setRemoveAllWhenShown(true);
+		menuMgr4.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillComponentPropertiesTabContextMenu(manager);
+			}
+		});
+
+		Menu menu4 = menuMgr4.createContextMenu(componentPropertiesViewer.getControl());
+		componentPropertiesViewer.getControl().setMenu(menu4);
+		getSite().registerContextMenu(menuMgr4, componentPropertiesViewer);		
+		
+	}
+
+	/**
+	 * Contributes to view's main menu and toolbar.
+	 */
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillViewPullDownMenu(bars.getMenuManager());
+		fillViewToolBar(bars.getToolBarManager());
+	}
+
+	/**
+	 * Fills view's main menu.
+	 * @param manager Menu manager.
+	 */
+	private void fillViewPullDownMenu(IMenuManager manager) {
+		manager.add(actionSelectNewSDK);
+		manager.add(actionSelectNewRootComponent);
+		manager.add(actionCacheUpdate);
+		manager.add(addSisFilesAndUpdateCache);
+		manager.add(new Separator());
+		manager.add(actionExpandAll);
+		manager.add(actionCollapseAll);
+		
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+
+	/**
+	 * Checks if given node is parent node.
+	 * @return <code>true</code> if parent node, otherwise <code>false</code>.
+	 */
+	private boolean isParentNode(){
+		Object obj = getComponentTreeSelectedElement();		
+		if(obj != null &&  obj instanceof ComponentParentNode){
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	/**
+	 * Fills tree view's context menu.
+	 * @param manager Menu manager.
+	 */
+	private void fillTreeViewContextMenu(IMenuManager manager) {
+		manager.add(actionSetAsNewRoot);
+		manager.add(actionComponentIsUsedBy);
+		manager.add(actionComponentSearch);
+		manager.add(actionComponentFind);
+		manager.add(actionLocateComponent);
+		//Can't export only LeafNode
+		if(isParentNode()){
+			manager.add(actionExportReport);
+		}
+		manager.add(new Separator());
+		manager.add(actionExpandSubtree);
+		manager.add(actionExpandAll);
+		manager.add(actionCollapseAll);
+		manager.add(new Separator());
+		manager.add(actionComponentProperties);		
+		manager.add(new Separator());
+		drillDownAdapter.addNavigationActions(manager);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+		
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+
+	/**
+	 * Fills context menu for import functions tab.
+	 * @param manager
+	 */
+	private void fillImportFunctionsTabContextMenu(IMenuManager manager) {
+		manager.add(actionImportFunctionIsUsedBy);
+		manager.add(actionImportShowSource);
+		manager.add(actionImportShowSourceInProject);
+		manager.add(actionImportShowMethodLoc);		
+		manager.add(actionImportFunctionSearch);
+		manager.add(actionImportFunctionDataCopy);
+		manager.add(actionSelectAllImportFunctions);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+	
+	/**
+	 * Fills context menu for export functions tab.
+	 * @param manager Menu manager.
+	 */
+	private void fillExportFunctionsTabContextMenu(IMenuManager manager) {
+		manager.add(actionExportFunctionIsUsedBy);
+		manager.add(actionExportShowSource);		
+		manager.add(actionExportShowSourceInProject);
+		manager.add(actionExportFunctionSearch);
+		manager.add(actionExportFunctionDataCopy);
+		manager.add(actionSelectAllExportFunctions);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+	
+	/**
+	 * Fills context menu for component properties tab. 
+	 * @param manager Menu manager.
+	 */
+	private void fillComponentPropertiesTabContextMenu(IMenuManager manager) {
+		manager.add(actionCompPropertyDataCopy);
+		manager.add(actionSelectAllComponentProperties);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+		
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+
+	/**
+	 * Fills toolbar.
+	 * @param manager Toolbar manager.
+	 */
+	private void fillViewToolBar(IToolBarManager manager) {
+		
+		manager.add(actionSelectNewSDK);
+		manager.add(actionSelectNewRootComponent);
+		manager.add(actionCacheUpdate);
+		manager.add(addSisFilesAndUpdateCache);
+		manager.add(actionComponentFind);
+		manager.add(actionComponentSearch);
+		manager.add(new Separator());
+		manager.add(actionExpandAll);
+		manager.add(actionCollapseAll);
+		manager.add(new Separator());
+		drillDownAdapter.addNavigationActions(manager);
+		
+		// Finally updating action states
+		updateViewActionEnabledStates();
+	}
+
+	/**
+	 * Creates context menu actions for import functions tab.
+	 */
+	private void createImportFunctionsTabPopUpMenuActions(){
+		actionImportFunctionIsUsedBy = new FunctionIsUsedByImportFunctionMainViewAction(this);		
+		actionImportShowSource = new ShowSourceFileImportFunctionMainViewAction(this);
+		actionImportShowSourceInProject = new ShowSourceFileAndCreateProjectImportFunctionMainViewAction(this);
+		actionImportShowMethodLoc = new ShowMethodCallLocationsImportFunctionMainViewAction(this);
+		ImportFunctionsClipboardCopyHandler funcCopyHandler = new ImportFunctionsClipboardCopyHandler();
+		actionImportFunctionDataCopy = new CopyFromTableViewerAction(importFunctionsViewer.getHostingViewer(),
+                                                               new ICopyActionHandler[]{ funcCopyHandler }
+																);
+		actionSelectAllImportFunctions = new SelectAllFromTableViewerMainViewAction(this, importFunctionsViewer.getHostingViewer());		
+	}
+	
+	/**
+	 * Creates context menu actions for export functions tab.
+	 */
+	private void createExportFunctionsTabPopUpMenuActions(){
+
+		actionExportFunctionIsUsedBy = new FunctionIsUsedByExportFunctionMainViewAction(this);
+		actionExportShowSource = new ShowSourceFileExportFunctionMainViewAction(this);		
+		actionExportShowSourceInProject = new ShowSourceFileAndCreateProjectExportFunctionMainViewAction(this);
+		ExportFunctionsClipboardCopyHandler funcCopyHandler = new ExportFunctionsClipboardCopyHandler();
+		actionExportFunctionDataCopy = new CopyFromTableViewerAction(exportFunctionsViewer.getHostingViewer(),
+                                                               new ICopyActionHandler[]{ funcCopyHandler }
+																);
+		actionSelectAllExportFunctions = new SelectAllFromTableViewerMainViewAction(this, exportFunctionsViewer.getHostingViewer());		
+	}
+
+	/**
+	 * Creates context menu actions for component properties tab.
+	 */
+	private void createComponentPropertiesTabPopUpMenuActions(){
+		ComponentPropertyTabClipboardCopyHandler propCopyHandler = new ComponentPropertyTabClipboardCopyHandler();
+		actionCompPropertyDataCopy = new CopyFromTableViewerAction(componentPropertiesViewer,
+                                                               new ICopyActionHandler[]{ propCopyHandler }
+																);	
+		actionSelectAllComponentProperties = new SelectAllFromTableViewerMainViewAction(this, componentPropertiesViewer);
+	}
+	
+	/**
+	 * Creates those actions that should be created very early in view creation
+	 * in order to be able to set their enable/disable states.
+	 */
+	private void createOnlyMainViewDependentActions() {
+		actionSetAsNewRoot = new SetNewRootMainViewAction(this); 		
+		actionComponentIsUsedBy = new ComponentIsUsedByMainViewAction(this);
+		actionComponentSearch = new SearchMainViewAction(this, SearchConstants.SearchType.SEARCH_COMPONENTS);
+		actionImportFunctionSearch = new SearchMainViewAction(this, SearchConstants.SearchType.SEARCH_IMPORTED_FUNCTIONS);
+		actionExportFunctionSearch = new SearchMainViewAction(this, SearchConstants.SearchType.SEARCH_EXPORTED_FUNCTION);
+		actionComponentFind = new FindMainViewAction(this);
+		actionLocateComponent = new LocateComponentMainViewAction(this);
+		actionExpandAll = new ExpandAllMainViewAction(this);
+		actionCollapseAll =  new CollapseAllMainViewAction(this);
+		actionExpandSubtree = new ExpandSubtreeMainViewAction(this);
+		actionSelectNewRootComponent = new SelectNewRootComponentMainViewAction(this);
+		actionSelectNewSDK = new SelectNewSDKMainViewAction(this);
+		actionCacheUpdate = new CacheUpdateMainViewAction(this);
+		addSisFilesAndUpdateCache = new AddSisAndUpdateCacheMainViewAction(this);
+		actionComponentProperties = new ComponentPropertiesMainViewAction(this);
+		actionExportReport =  new ExportReportMainViewAction(this);
+	}
+	
+	/**
+	 * Passing the focus request to the componentTreeViewer's control.
+	 */
+	public void setFocus() {
+		componentTreeViewer.getControl().setFocus();
+	}
+
+	/**
+	 * @return Returns the componentTreeViewer.
+	 */
+	public TreeViewer getComponentTreeViewer() {
+		return componentTreeViewer;
+	}
+	
+	/**
+	 * 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);
+	}
+
+	/**
+	 * Refereshes view contents.
+	 */
+	public void refresh(){
+		componentTreeViewer.refresh();
+		importFunctionsViewer.refreshHostingViewer(importFunctionsArrayList.size());
+		exportFunctionsViewer.refreshHostingViewer(exportFunctionsArrayList.size());
+		componentPropertiesViewer.refresh();
+	}
+
+	/**
+	 * @return Returns the isDependencySearchOngoing.
+	 */
+	static public boolean isDependencySearchOngoing() {
+		return isDependencySearchOngoing;
+	}
+
+	/**
+	 * Informs to main view that search was started.
+	 * Toolbar is updated accordingly.
+	 */
+	public void searchStarted() {
+		isDependencySearchOngoing = true;
+		
+		// Updating action states
+		updateViewActionEnabledStates();		
+	}
+	
+	/**
+	 * Informs to main view that search was ended.
+	 * Toolbar is updated accordingly.
+	 */
+	public void searchCompleted() {
+		
+		isDependencySearchOngoing = false;
+		
+		// Updating action states
+		updateViewActionEnabledStates();		
+	}
+
+	/**
+	 * Can be used to notify view that it's input data have changed.
+	 * Triggers actions for refreshing view contents properly. 
+	 */
+	public void inputUpdated() {
+		if(isDependencySearchOngoing){
+			// Aborting possible ongoing background searches
+			MainViewDataPopulator.abortCurrentSearch();			
+		}
+		componentTreeViewer.setInput(compTreeViewerContentProv.getInput());
+		// The previously shown function lists are no more valid
+		importFunctionsArrayList.clear();	
+		exportFunctionsArrayList.clear();
+		refresh();		
+		// Expanding tree view enabling the showing of 1st level of the
+		// used components (that is actually 2nd level in the tree).
+		componentTreeViewer.expandToLevel(2);	
+	    componentTreeViewer.getTree().notifyListeners(SWT.Selection, new Event());
+	}
+
+	
+	/**
+	 * Checks if the root node is selected.
+	 * @return Returns <code>true</code> if root node is selected
+	 *         otherwise <code>false</code>.
+	 */
+	public boolean isRootNodeSelected(){
+		Object obj = getComponentTreeSelectedElement();
+		if(obj != null){
+			if(obj instanceof ComponentParentNode){
+				ComponentParentNode parentNode = (ComponentParentNode) obj;
+				if(parentNode.isRootComponent()){
+					return true;
+				}
+			}			
+		}
+		return false;
+	}
+
+	/**
+	 * Checks if the selected component has subtree.
+	 * @return Returns <code>true</code> if selected component has subtree,
+	 *         otherwise <code>false</code> (also false returned in error situations).
+	 */
+	public boolean hasSelectedComponentSubtree(){
+		Object obj = getComponentTreeSelectedElement();
+		if(obj != null){
+			if(obj instanceof ComponentParentNode){
+				return componentTreeViewer.isExpandable(obj);
+			}
+		}
+		return false;
+	}	
+	
+	/**
+	 * Checks if the selected component exists.
+	 * @return Returns <code>true</code> if selected component exists,
+	 *         otherwise <code>false</code> (also false returned in error situations).
+	 */
+	public boolean selectedComponentExist(){
+		Object obj = getComponentTreeSelectedElement();
+		ComponentParentNode nodeToBeChecked;
+		if(obj != null){
+			if(obj instanceof ComponentParentNode){
+				nodeToBeChecked = (ComponentParentNode) obj;
+			}
+			else if(obj instanceof ComponentLinkLeafNode){
+				ComponentLinkLeafNode link = (ComponentLinkLeafNode) obj;
+				nodeToBeChecked = link.getReferredComponent();				
+			}
+			else{
+				return false;
+			}
+			// Checking if component exists in cache
+			if(!nodeToBeChecked.isMissing()){
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns currently selected element from 
+	 * component tree
+	 * @return Returns currently selected element or <code>null</code> 
+	 *         if there are no selection made.
+	 */
+	public Object getComponentTreeSelectedElement() {
+		ISelection selection = componentTreeViewer.getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		return obj;
+	}
+
+	/**
+	 * Returns currently selected element among 
+	 * the imported functions.
+	 * @return Returns currently selected element or <code>null</code> 
+	 *         if there are no selection made.
+	 */
+	public Object getSelectedImportFunction() {
+		ISelection selection = importFunctionsViewer.getHostingViewer().getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		return obj;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
+	 */
+	@Override
+	public void init(IViewSite site, IMemento memento) throws PartInitException {
+		super.init(site, memento);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	public void dispose() {
+		if(isDependencySearchOngoing){
+			// Aborting possible ongoing background searches
+			MainViewDataPopulator.abortCurrentSearch();			
+		}
+		
+		super.dispose();
+	}
+
+	/**
+	 * @return Returns the selectedComponentPropertiesData.
+	 */
+	public ComponentPropertiesData getSelectedComponentPropertiesData() {
+		return selectedComponentPropertiesData;
+	}
+
+	/**
+	 * @param selectedComponentPropertiesData The selectedComponentPropertiesData to set.
+	 */
+	public void setSelectedComponentPropertiesData(
+			ComponentPropertiesData selectedComponentPropertiesData) {
+		this.selectedComponentPropertiesData = selectedComponentPropertiesData;
+	}
+
+	/**
+	 * @return Returns the importFunctionsViewer.
+	 */
+	public TableViewer getImportFunctionsViewer() {
+		return importFunctionsViewer.getHostingViewer();
+	}
+
+	/**
+	 * Updates context menu for import functions tab.
+	 * @param isMultipleSelection <code>true</code> in case of multiple selection
+	 *                            otherwise <code>false</code>.
+	 */
+	public void updateImportFunctionsContextMenuStates(boolean isMultipleSelection) {
+		if(isMultipleSelection){
+			actionImportFunctionIsUsedBy.setEnabled(false);
+			enableImportShowSourceAction();
+		}
+		else{
+			actionImportFunctionIsUsedBy.setEnabled(true);
+			disableImportShowSourceAction();
+		}
+	}
+	
+	/**
+	 * Enables show source functionality
+	 */
+	public void enableImportShowSourceAction() {
+		actionImportShowSource.setEnabled(true);
+		actionImportShowMethodLoc.setEnabled(true);
+		actionImportShowSourceInProject.setEnabled(true);
+	}
+
+	/**
+	 * Disables show source functionality
+	 */
+	public void disableImportShowSourceAction() {
+		actionImportShowSource.setEnabled(false);
+		actionImportShowMethodLoc.setEnabled(false);
+		actionImportShowSourceInProject.setEnabled(false);
+	}
+	
+	/**
+	 * Disables Locate source action.
+	 */
+	public void disableLocateComponentAction(){
+		actionLocateComponent.setEnabled(false);			
+	}
+	
+	/**
+	 * Enables Locate source action.
+	 */
+	public void enableLocateComponentAction(){
+		actionLocateComponent.setEnabled(true);
+	}	
+	
+	/**
+	 * Disables actionSetAsNewRoot action.
+	 */
+	public void disableSetAsNewRootAction(){
+		actionSetAsNewRoot.setEnabled(false);			
+	}
+
+	/**
+	 * Enables actionSetAsNewRoot action.
+	 */
+	public void enableSetAsNewRootAction(){
+		actionSetAsNewRoot.setEnabled(true);
+	}
+	
+	/**
+	 * 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 MainView getViewInstance() throws PartInitException{
+		
+		IWorkbenchPage page = AppDepPlugin.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);
+			}
+		}
+		// View was not opened
+		if(! viewAlreadyVisible){
+			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().inputUpdated();
+			
+		} catch (PartInitException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Aborts currently ongoing search (if dependency search is ongoing).
+	 */
+	public static void abortCurrentlyOngoingSearches(){
+		if(isDependencySearchOngoing){
+			MainViewDataPopulator.abortCurrentSearch();
+		}
+	}
+	
+	/**
+	 * Because Window's native table component does not support
+	 * text wrapping, this method offers possibility to resize
+	 * Value column according to data. Resizing brings about
+	 * scroll bars that enable seeing of all the data.
+	 */
+	public void performValueColumnPackToPropertiesTab(){
+		Table table = componentPropertiesViewer.getTable();
+		TableColumn column = table.getColumn(ComponentPropertiesData.VALUE_COLUMN_INDEX);
+		column.pack();	
+	}
+
+	/**
+	 * Updates context menu for export functions tab.
+	 * @param isMultipleSelection <code>true</code> in case of multiple selection
+	 *                            otherwise <code>false</code>.
+	 */
+	public void updateExportFunctionsContextMenuStates(boolean isMultipleSelection) {
+		if(isMultipleSelection){
+			actionExportFunctionIsUsedBy.setEnabled(false);
+			disableExportShowSourceAction();
+		}
+		else{
+			actionExportFunctionIsUsedBy.setEnabled(true);
+			enableExportShowSourceAction();
+		}		
+	}
+
+	/**
+	 * Enables show source functionality
+	 */
+	public void enableExportShowSourceAction() {
+		actionExportShowSource.setEnabled(true);
+		actionExportShowSourceInProject.setEnabled(true);
+	}
+
+	/**
+	 * Disables show source functionality
+	 */
+	public void disableExportShowSourceAction() {
+		actionExportShowSource.setEnabled(false);
+		actionExportShowSourceInProject.setEnabled(false);
+	}
+	
+	/**
+	 * @return Returns the exportFunctionsViewer.
+	 */
+	public TableViewer getExportFunctionsViewer() {
+		return exportFunctionsViewer.getHostingViewer();
+	}
+
+	/**
+	 * Gets currently selected export function.
+	 * @return currently selected export function.
+	 */
+	public Object getSelectedExportFunction() {
+		ISelection selection = getExportFunctionsViewer().getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		return obj;
+	}
+
+	/**
+	 * Gets the most recently selected component from tree view.
+	 * @return Returns the mostRecentlySelectedComponentNode.
+	 */
+	public Object getMostRecentlySelectedComponentNode() {
+		return mostRecentlySelectedComponentNode;
+	}
+
+	/**
+	 * Sets the most recently selected component from tree view.
+	 * @param mostRecentlySelectedComponentNode The mostRecentlySelectedComponentNode to set.
+	 */
+	public void setMostRecentlySelectedComponentNode(
+			Object mostRecentlySelectedComponentNode) {
+		this.mostRecentlySelectedComponentNode = mostRecentlySelectedComponentNode;
+	}
+	
+	/**
+	 * Gets current root component node.
+	 * @return Current root component node.
+	 */
+	public ComponentParentNode getRootComponentNode() {
+		return (ComponentParentNode) compTreeViewerContentProv.getRootComponentNode();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyPressed(KeyEvent e) {
+		// Key presses are only enabled when there is no dependency search ongoing
+		if(isDependencySearchOngoing){
+			String infoMsg = Messages.getString("MainView.KeyPresses_Disabled_While_Search_Is_Ongoing_InfoMsg"); //$NON-NLS-1$
+			new AppDepMessageBox(infoMsg, SWT.OK | SWT.ICON_INFORMATION).open();
+		}
+		else{			
+			//
+			//  Checking if Ctrl+F was pressed and triggering find action, if pressed
+			//
+			final int CTRL_F = 0x6;
+			int charValue = e.character;
+			boolean ctrlFPressed = charValue == CTRL_F; // This should be enough
+			boolean ctrlPressed = (e.stateMask & SWT.CTRL) != 0; // But still checking that Ctrl is also pressed
+			if(ctrlPressed & ctrlFPressed){
+				// Triggering find action
+				actionComponentFind.run();
+			}			
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent e) {
+		// Not needed, but has to be implemented
+	}
+	
+	/**
+	 * Activates the given node in Main view's component tree.
+	 * The given node is set as current selection.
+	 * @param node Component node to be activated.
+	 */
+	public void activateTreeViewComponent(ComponentNode node) {
+		
+		// Making sure that referred component can be found
+		if(drillDownAdapter.canGoHome()){
+			drillDownAdapter.goHome();
+		}
+		
+		ProgrammaticSelection newSelection = null;
+		newSelection = new ProgrammaticSelection(
+											new ComponentNode[]{
+																node
+																}
+												);
+		getComponentTreeViewer().setSelection(newSelection, true);
+		refresh();
+	}
+
+	/**
+	 * We will disable show source functionality for some "method" names,
+	 * which are no real method names. List for prefixes is stored in here and 
+	 * all clients of {@link MainView} can be used them. 
+	 *
+	 * @return the DISABLE_SHOW_SOURCE_PREFIXES
+	 */
+	public String[] getDisableShowSourcePrefixes() {
+		return DISABLE_SHOW_SOURCE_PREFIXES;
+	}
+
+	/**
+	 * Checks if the imported functions tab has currently any imported functions.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasImportFunctions() {
+		return (importFunctionsArrayList.size() > 0);
+	}
+
+	/**
+	 * Checks if the imported functions tab has currently any selections.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasImportFunctionSelection() {
+		int selectionCount = importFunctionsSelectionCount();
+		return (selectionCount > 0);
+	}
+	
+	/**
+	 * Checks if only single imported functions is selected.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasImportFunctionSingleSelection() {
+		int selectionCount = importFunctionsSelectionCount();
+		return (selectionCount == 1);
+	}
+	
+	/**
+	 * Gets import functions viewer selection count.
+	 * @return import functions viewer selection count.
+	 */
+	private int importFunctionsSelectionCount() {
+		return importFunctionsViewer.getSelectionCount();
+	}
+
+	/**
+	 * Checks if all import functions has been selected.
+	 * @return <code>true</code> if all selected, otherwise <code>false</code>.
+	 */
+	private boolean isAllImportFunctionsSelected() {
+		return (importFunctionsArrayList.size() == importFunctionsSelectionCount());
+	}	
+
+	/**
+	 * Checks if the exported functions tab has currently any exported functions.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasExportFunctions() {
+		return (exportFunctionsArrayList.size() > 0);
+	}
+
+	/**
+	 * Checks if the exported functions tab has currently any selections.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasExportFunctionSelection() {
+		int selectionCount = exportFunctionsSelectionCount();
+		return (selectionCount > 0);
+	}
+	
+	/**
+	 * Checks if only single exported functions is selected.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasExportFunctionSingleSelection() {
+		int selectionCount = exportFunctionsSelectionCount();
+		return (selectionCount == 1);
+	}
+	
+	/**
+	 * Gets export functions viewer selection count.
+	 * @return export functions viewer selection count.
+	 */
+	private int exportFunctionsSelectionCount() {
+		return exportFunctionsViewer.getSelectionCount();
+	}
+
+	/**
+	 * Checks if all export functions has been selected.
+	 * @return <code>true</code> if all selected, otherwise <code>false</code>.
+	 */
+	private boolean isAllExportFunctionsSelected() {
+		return (exportFunctionsArrayList.size() == exportFunctionsSelectionCount());
+	}	
+	
+	/**
+	 * Checks if the component properties tab has currently any selections.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasCompPropertiesSelection() {
+		int selectionCount = componentPropertiesSelectionCount();
+		return (selectionCount > 0);
+	}
+
+	/**
+	 * Gets component properties viewer selection count.
+	 * @return component properties viewer selection count.
+	 */
+	private int componentPropertiesSelectionCount() {
+		return componentPropertiesViewer.getTable().getSelectionCount();
+	}
+
+	/**
+	 * Checks if all component properties has been selected.
+	 * @return <code>true</code> if all selected, otherwise <code>false</code>.
+	 */
+	private boolean isAllCompPropertiesSelected() {
+		return (ComponentPropertiesData.DESCRIPT_ARR.length == componentPropertiesSelectionCount());
+	}
+
+	/**
+	 * Checks if the component properties tab has currently any properties.
+	 * @return <code>true</code> if has, otherwise <code>false</code>.
+	 */
+	private boolean hasCompProperties() {
+		return (componentPropertiesViewer.getTable().getItemCount() > 0);
+	}
+
+	/**
+	 * 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 updateViewActionEnabledStates(){
+		
+		// Resolving current state		
+		boolean isRootComponentSelectedForAnalysis = AppDepSettings.isRootComponentSelectedForAnalysis();
+		boolean isValidComponentSelection = isRootComponentSelectedForAnalysis && (getComponentTreeSelectedElement() != null);
+		boolean isCurrentSelectionRootComponent = isRootNodeSelected();
+		
+		// Main menu & toolbar & common actions
+		setEnableState(actionSelectNewSDK, !isDependencySearchOngoing());		
+		setEnableState(actionSelectNewRootComponent, !isDependencySearchOngoing() && isRootComponentSelectedForAnalysis);
+		setEnableState(actionCacheUpdate, isRootComponentSelectedForAnalysis);
+		setEnableState(addSisFilesAndUpdateCache, isRootComponentSelectedForAnalysis);
+		setEnableState(actionComponentFind, isRootComponentSelectedForAnalysis);
+		setEnableState(actionComponentSearch, isRootComponentSelectedForAnalysis);
+		setEnableState(actionExpandAll, isRootComponentSelectedForAnalysis);
+		setEnableState(actionCollapseAll, isRootComponentSelectedForAnalysis);
+		
+		// Tree view
+		boolean selectedComponentExist = selectedComponentExist();
+		setEnableState(actionSetAsNewRoot, isValidComponentSelection && !isCurrentSelectionRootComponent && selectedComponentExist);
+		setEnableState(actionComponentIsUsedBy, isValidComponentSelection);
+		setEnableState(actionLocateComponent, isValidComponentSelection && !selectedComponentExist);
+		setEnableState(actionExportReport, isValidComponentSelection);
+		setEnableState(actionExpandSubtree, isValidComponentSelection && hasSelectedComponentSubtree());
+		setEnableState(actionComponentProperties, isValidComponentSelection && selectedComponentExist);		
+
+		// Import function
+		boolean isImportActionsEnabled = isValidComponentSelection && hasImportFunctions();
+		boolean hasImportFunctionSelection = isImportActionsEnabled && hasImportFunctionSelection();
+		boolean hasImportFunctionSingleSelection = isImportActionsEnabled && hasImportFunctionSingleSelection();		
+		boolean isAllImportFunctionsSelected = isImportActionsEnabled && isAllImportFunctionsSelected();		
+		setEnableState(actionImportFunctionIsUsedBy, hasImportFunctionSingleSelection);
+		setEnableState(actionImportShowSource, hasImportFunctionSingleSelection);
+		setEnableState(actionImportShowSourceInProject, hasImportFunctionSingleSelection);
+		setEnableState(actionImportShowMethodLoc, hasImportFunctionSingleSelection);		
+		setEnableState(actionImportFunctionSearch, isImportActionsEnabled);
+		setEnableState(actionImportFunctionDataCopy, hasImportFunctionSelection);
+		setEnableState(actionSelectAllImportFunctions, isImportActionsEnabled && !isAllImportFunctionsSelected);
+
+		// Export functions
+		boolean isExportActionsEnabled = isValidComponentSelection && hasExportFunctions();
+		boolean hasExportFunctionSelection = isExportActionsEnabled && hasExportFunctionSelection();
+		boolean hasExportFunctionSingleSelection = isExportActionsEnabled && hasExportFunctionSingleSelection();		
+		boolean isAllExportFunctionsSelected = isExportActionsEnabled && isAllExportFunctionsSelected();		
+		setEnableState(actionExportFunctionIsUsedBy, hasExportFunctionSingleSelection);
+		setEnableState(actionExportShowSource, hasExportFunctionSingleSelection);		
+		setEnableState(actionExportShowSourceInProject, hasExportFunctionSingleSelection);
+		setEnableState(actionExportFunctionSearch, isExportActionsEnabled);
+		setEnableState(actionExportFunctionDataCopy, hasExportFunctionSelection);
+		setEnableState(actionSelectAllExportFunctions, isExportActionsEnabled && !isAllExportFunctionsSelected);
+
+		// Component properties
+		boolean isCompPropActionsEnabled = isValidComponentSelection && hasCompProperties();
+		boolean hasCompPropertiesSelection = isCompPropActionsEnabled && hasCompPropertiesSelection();
+		boolean isAllCompPropertiesSelected = isCompPropActionsEnabled && isAllCompPropertiesSelected();		
+		setEnableState(actionCompPropertyDataCopy, hasCompPropertiesSelection);
+		setEnableState(actionSelectAllComponentProperties, isCompPropActionsEnabled && !isAllCompPropertiesSelected);
+		
+	}
+
+	/**
+	 * Sets given enable state for an action if it is non <code>null</code>.
+	 * @param action Action to set enable status for.
+	 * @param enableStatus <code>true</code> if enabled, otherwise <code>false</code>.
+	 */
+	private void setEnableState(Action action, boolean enableStatus) {
+		if(action != null){
+			action.setEnabled(enableStatus);			
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentPropertiesTabContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.views.main;
+
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+
+/**
+ * Content provider for Component Properties tab item.
+ */
+class MainViewComponentPropertiesTabContentProvider implements IStructuredContentProvider {
+		
+	/**
+	 * Reference to parent view.
+	 */
+	private final MainView view;
+	
+	/**
+	 * Content provider's constructor.
+	 * @param view Reference to parent view.
+	 */
+	public MainViewComponentPropertiesTabContentProvider(MainView view){
+		this.view = view;
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		ComponentPropertiesData componentProperties;
+		componentProperties = view.getSelectedComponentPropertiesData();
+		if(componentProperties != null){
+			return componentProperties.toPropertyDataArray();			
+		}
+		return new Object[0];
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentPropertiesTabLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.PropertyData;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Label provider class for Component Properties
+ * tab item.
+ */
+class MainViewComponentPropertiesTabLabelProvider extends LabelProvider 
+												implements ITableLabelProvider  {
+	
+	/**
+	 * Constructor.
+	 */
+	public MainViewComponentPropertiesTabLabelProvider() {
+		super();
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		// Property view does not use images
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		
+		String label = element.toString();
+		
+		PropertyData propData = (PropertyData) element;
+		
+		switch (columnIndex) {
+		
+		case ComponentPropertiesData.PROPERTY_COLUMN_INDEX:
+			label = propData.getPropertyDescription();
+			break;
+
+		case ComponentPropertiesData.VALUE_COLUMN_INDEX:
+			label = propData.getPropertyValue();
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return label;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentTreeContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,235 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.data.IComponentParentNodeListener;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * The content provider class is responsible for
+ * providing objects to the Main View. 
+ */
+class MainViewComponentTreeContentProvider implements IStructuredContentProvider, 
+									   ITreeContentProvider,
+									   IComponentParentNodeListener{
+	/**
+	 * Component tree's invisible root node.
+	 */
+	private ComponentParentNode invisibleRoot;
+	/**
+	 * Main view reference.
+	 */
+	private MainView view;
+	
+	private String sdkId = null;
+
+	/**
+	 * Constructor
+	 * @param view Main view reference.
+	 */
+	public MainViewComponentTreeContentProvider(MainView view){
+		invisibleRoot = new ComponentParentNode(""); //$NON-NLS-1$
+		invisibleRoot.setNodeListener(this);
+		this.view = view;
+	}
+	
+	/**
+	 * @return
+	 */
+	public Object getInput(){
+		return invisibleRoot;
+	}
+
+	/**
+	 * Gets root component node.
+	 * @return Returns root component node.
+	 */
+	public Object getRootComponentNode(){
+		// There is for sure only one child for invisible root
+		return invisibleRoot.getChildren()[0];
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		boolean sdkChanged = false;
+		
+		try {
+			if (parent.equals(getInput())) {
+				String currentlyAnalyzedComponentName = AppDepSettings.getActiveSettings().getCurrentlyAnalyzedComponentName();
+				ITargetPlatform currentlyAnalyzedComponentTargetPlatform = AppDepSettings.getActiveSettings().getCurrentlyAnalyzedComponentTargetPlatform();
+				
+				// Adding default start-up message as invisible root's new child if component has not selected, and 
+				// if invisible root does not have any children (either components, or the start-up message already added). 
+			   boolean isStartup = (currentlyAnalyzedComponentName == null) && (!invisibleRoot.hasChildren());
+			   // Component has been selected but tree needs to be populated (e.g. in view close/re-open situation)
+			   boolean noNodesButComponentIsSelected = (!invisibleRoot.hasChildren()) && (currentlyAnalyzedComponentName != null);
+			   //In case component tree is already populated it makes sense to make further checking
+			   boolean areNodesButComponentHasChanged = false; // default value in case not going to next if
+			   if(!isStartup && !noNodesButComponentIsSelected){
+				   if(sdkId == null && AppDepSettings.getActiveSettings().getCurrentlyUsedSdk() != null){
+					   //we have no previous SDK ID to compare with .
+					   // Storing the ID for future comparisons.
+					   sdkId = AppDepSettings.getActiveSettings().getCurrentlyUsedSdk().getSdkId();
+				   }
+				   //We have a previous SDK id . Let's check if it has been changed
+				   else if(sdkId != null && !sdkId.equalsIgnoreCase(AppDepSettings.getActiveSettings().getCurrentlyUsedSdk().getSdkId()))
+				   {
+					   sdkChanged = true;
+					   sdkId = AppDepSettings.getActiveSettings().getCurrentlyUsedSdk().getSdkId();
+				   }
+				   
+				   // Tree is already populated => safe to refer to root node.
+				   ComponentNode rootNode = invisibleRoot.getChildren()[0];
+				   ITargetPlatform rootNodeTargetPlatform = rootNode.getTargetPlatform();
+				   boolean targetPlatformHasChanged = (rootNodeTargetPlatform != null && currentlyAnalyzedComponentTargetPlatform != null) 
+				                                      && 
+				                                      !rootNodeTargetPlatform.idEquals(currentlyAnalyzedComponentTargetPlatform.getId()); 				   
+				   areNodesButComponentHasChanged = (currentlyAnalyzedComponentName != null)
+				   											&&
+					   										(invisibleRoot.hasChildren())
+				   											&& 
+				   											(!rootNode.getName().equals(currentlyAnalyzedComponentName)
+				   											|| sdkChanged
+															 || 
+															 targetPlatformHasChanged);					   
+			   }
+			   
+			   // Doing actions according analyzed situation
+				if(isStartup){
+					// No component to be analyzed has been selected by a user so far...giving initial prompt for the user
+					String userMsg = Messages.getString("MainViewComponentTreeContentProvider.ComponentTreeView_Msg_After_Extension_Startup"); //$NON-NLS-1$
+					ComponentParentNode root = new ComponentParentNode(userMsg);
+					root.setRootComponent(true);
+					invisibleRoot.addChild(root);				
+				}
+				else if(noNodesButComponentIsSelected || areNodesButComponentHasChanged){
+					MainViewDataPopulator.populateView(
+						                    invisibleRoot,
+											new MainViewPopulateProgressListener(view), 
+											currentlyAnalyzedComponentName,
+											currentlyAnalyzedComponentTargetPlatform
+													);
+				}
+				return getChildren(invisibleRoot);
+			}
+		} catch (RuntimeException e) {
+			e.printStackTrace();
+			throw e; // There is no way to recover...needed catch for debugging
+		}
+		return getChildren(parent);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+	 */
+	public Object getParent(Object child) {
+		if (child instanceof ComponentNode) {
+			return ((ComponentNode)child).getParent();
+		}
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+	 */
+	public Object [] getChildren(Object parent) {
+		if (parent instanceof ComponentParentNode) {
+			return ((ComponentParentNode)parent).getChildren();
+		}
+		return new Object[0];
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+	 */
+	public boolean hasChildren(Object parent) {
+		if (parent instanceof ComponentParentNode)
+			return ((ComponentParentNode)parent).hasChildren();
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentParentNodeListener#childAdded(com.nokia.s60tools.appdep.core.data.ComponentNode)
+	 */
+	public void childAdded(ComponentNode child) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentParentNodeListener#childRemoved(com.nokia.s60tools.appdep.core.data.ComponentNode)
+	 */
+	public void childRemoved(ComponentNode child) {
+		// not needed		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentParentNodeListener#allChildrensRemoved()
+	 */
+	public void allChildrensRemoved() {
+		// not needed		
+	}
+	
+	/**
+	 * Sets given component node as new root component.
+	 * @param node Component node to be set as new root component.
+	 */
+	public void setExistingNodeAsNewRoot(ComponentNode node){
+		ComponentParentNode pNode = null;
+		if(node instanceof ComponentParentNode){
+			pNode = (ComponentParentNode) node;
+		}
+		else if (node instanceof ComponentLinkLeafNode){
+			ComponentLinkLeafNode linkNode = (ComponentLinkLeafNode) node;
+			pNode = linkNode.getReferredComponent();			
+		}
+		
+		// Just sanity check in case earlier checks has been failed
+		if(pNode.isRootComponent()){
+			return;
+		}		
+		
+		invisibleRoot.removeAllChildren();
+		pNode.setRootComponent(true);
+		invisibleRoot.addChild(pNode);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewComponentTreeLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,120 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Main view's component tree's label provider.
+ */
+class MainViewComponentTreeLabelProvider extends LabelProvider {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+	 */
+	public String getText(Object obj) {
+		
+		String label = obj.toString();
+		
+		if (obj instanceof ComponentParentNode){
+			ComponentParentNode pn = (ComponentParentNode) obj;
+			if(! pn.isRootComponent()){
+				if (pn.isMissing()){
+					label = label
+						+ " (" + Messages.getString("MainViewComponentTreeLabelProvider.ComponentDoesNotExist_StatusMsg") + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				else if(! pn.isDirectChildrensResolved()){
+					if(MainView.isDependencySearchOngoing()){
+						label = label
+							+ " (" + Messages.getString("MainViewComponentTreeLabelProvider.Searching_StatusMsg") + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					}
+					else{
+						label = label
+							+ " (" + Messages.getString("MainViewComponentTreeLabelProvider.Search_Aborted_StatusMsg") + ")";						 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					}					
+				}
+				else if( pn.wasGenericComponent()){
+					if(pn.getGenericComponentBindType() == ComponentParentNode.CompBindType.AUTO_BIND){
+						label = label
+							+ " (" + Messages.getString("MainViewComponentTreeLabelProvider.ComponentBindType_Auto") +" " +pn.getOriginalName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+					}
+					else if(pn.getGenericComponentBindType() == ComponentParentNode.CompBindType.USER_BIND){
+						label = label
+							+ " (" + Messages.getString("MainViewComponentTreeLabelProvider.ComponentBindType_User") +" " +pn.getOriginalName() + ")";	 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+					}					
+				}				
+			}
+		}
+		return label;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object obj) {
+		
+		// Default image		
+        /*******************************************************************************
+         * This method uses graphics that are taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		String imageKey = ImageKeys.BIN_OBJ_LINK;
+		
+		if (obj instanceof ComponentParentNode){
+			ComponentParentNode pn = (ComponentParentNode) obj;
+			if(pn.isRootComponent()){
+				if (pn.isMissing()){					
+					imageKey = ImageKeys.ROOT_OBJ_ERROR;
+				}
+				else{
+					imageKey = ImageKeys.ROOT_OBJ;					
+				}
+			}
+			else if (pn.isMissing()){
+				imageKey = ImageKeys.BIN_OBJ_ERROR;				
+			}
+			else if (pn.wasGenericComponent()){
+				imageKey = ImageKeys.BIN_OBJ_BIND;				
+			}			
+			else if(! pn.isDirectChildrensResolved()){
+				if(MainView.isDependencySearchOngoing()){
+					imageKey = ImageKeys.BIN_OBJ_WARNING;									
+				}
+				else{
+					imageKey = ImageKeys.BIN_OBJ_ERROR;				
+				}
+			}
+			else{
+				imageKey = ImageKeys.BIN_OBJ;				
+			}
+		}
+		
+		return ImageResourceManager.getImage(imageKey);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewDataPopulator.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,834 @@
+/*
+* 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.appdep.ui.views.main;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Vector;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheDataManager;
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.data.ICacheDataManager;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode.CompBindType;
+import com.nokia.s60tools.appdep.core.job.IJobProgressStatus;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.core.model.UsedComponentData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.preferences.DEPreferences;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+import com.nokia.s60tools.util.exceptions.JobCancelledByUserException;
+
+
+/**
+ * This singleton class handles the population of main view.
+ */
+public class MainViewDataPopulator {
+	
+	/**
+	 * Reference to singleton instance.
+	 */
+	private static MainViewDataPopulator instance = null;
+	
+	/**
+	 * This vector is used to store all the currently
+	 * ongoing searches.
+	 */
+	private static Vector<SearchInstance> searchInstancesVector = null;
+
+	/**
+	 * Root node for the component tree to be modified.
+	 */
+	private static ComponentParentNode currentRootNode;
+	
+
+	/**
+	 * Search instance for currently ongoing data population.
+	 */
+	private static SearchInstance currentSearchInstance;
+
+	/**
+	 * Worker threads register themselves
+	 * when they start running and deregister itselves
+	 * when they are done their work. In this way we are able
+	 * to found out when all the threads have completed their
+	 * work.
+	 */
+	private class ThreadRegister{
+		
+		private List<String> registerList = null;
+		private final SearchInstance searchInst;
+		private final MainViewPopulateProgressListener searchProgressListener;
+		
+		public ThreadRegister(SearchInstance searchInst, 
+				              MainViewPopulateProgressListener searchProgressListener){
+			this.searchInst = searchInst;
+			this.searchProgressListener = searchProgressListener;
+			registerList = Collections.synchronizedList(new ArrayList<String>());
+		}
+		
+		public void register(String threadIdString){
+			registerList.add(threadIdString);
+		}
+
+		public void deregister(String threadIdString){
+			registerList.remove(threadIdString);
+			if(registerList.size() == 0){
+				// This search is over and can be removed from 
+				// the list of ongoing searches
+				searchInstancesVector.remove(searchInst);
+				if(searchInst.isSearchAborted()){
+					searchProgressListener.searchAborted(searchInst.getFoundComponentsCount());					
+				}
+				else{
+					searchProgressListener.searchFinished(searchInst.getFoundComponentsCount());					
+				}
+			}
+		}
+	}
+
+	/**
+	 * There might be temporarily multiple ongoing
+	 * searches. Therefore we must identify all the
+	 * searches and separate their data.
+	 */
+	private class SearchInstance{
+		
+		
+		/**
+		 * Map containing string-node pairs for already added components.
+		 * If a component can be found from the map, it wil be added as
+		 * link leaf node instead of as parent node.
+		 * The map is syncronized in order to enable multithread access.
+		 */
+		private Map<String, ComponentParentNode> componentMap = null;
+			
+		/**
+		 * This interface is used to report about search progress.
+		 */
+		MainViewPopulateProgressListener searchProgressListener = null;		
+		
+		/**
+		 * This member is used only for debugging purposes. It is used
+		 * to store start time of population, which enables the calculation
+		 * of total time that is spent for different threads that are doing
+		 * the actual tree population. Start time of the search can
+		 * be also used to identify uniquely different search instances.
+		 */
+		private final long startTime;
+		
+		/**
+		 * All threads checks time to time for this flag in order
+		 * to know if the search has been aborted by some reason.
+		 * For example, plugin is deactivated or user has aborted
+		 * the searching.
+		 */
+		private boolean isSearchAborted = false;
+		
+		/**
+		 * Thread register instance. A new instance is created
+		 * for each populateView call.
+		 */
+		private ThreadRegister threadReg = null;;		
+		
+		/**
+		 * Constructs search instance with unique identifier.
+	     * @param searchProgressListener Search progress listener.
+ 		 * @param initialMap initial values to componentMap, use in update mode only.
+		 */		
+		public SearchInstance(MainViewPopulateProgressListener searchProgressListener, Map<String,  ComponentParentNode> initialMap){
+			this(searchProgressListener);	
+			synchronized(componentMap){
+				componentMap.putAll(initialMap);
+			}
+			
+		}		
+		
+		/**
+		 * Constructs search instance with unique identifier.
+	     * @param searchProgressListener Search progress listener.
+		 */
+		public SearchInstance(MainViewPopulateProgressListener searchProgressListener){
+			startTime = System.currentTimeMillis();
+			this.searchProgressListener = searchProgressListener;
+			// Component map has to be synchronized for thread access
+			componentMap = Collections.synchronizedMap(new HashMap<String, ComponentParentNode>());
+		}
+
+		/**
+		 * Checks if we have already once added the component, and based
+		 * on the information adds the component either as parent or 
+		 * leaf link node.
+		 * @param parent Parent node under which to add the new node,
+		 * @param parentNodeList If component was parent node, it is added into this list.	
+		 * @param cmpName Name of the component that has been found.
+		 */
+		public void checkIfAlreadyAddedAndAddNode(ComponentParentNode parent, 
+												   ArrayList<ComponentParentNode> parentNodeList, String cmpName) {
+
+			ComponentParentNode child = null;
+			ComponentLinkLeafNode leaf = null;
+
+			//We needs to syncronize the map of already found components during check 
+			// and add operation for enabling safe multithread access into the map.
+			synchronized(componentMap){
+			
+				ComponentParentNode node = componentMap.get(cmpName);
+		
+				if(node != null){
+					// Component already added to map => leaf node
+					leaf = new ComponentLinkLeafNode(node);
+					parent.addChild(leaf);
+				}			
+				else if(parent.getRootNode().getName().equalsIgnoreCase(cmpName)){
+					// Component already added to map => leaf node
+					leaf = new ComponentLinkLeafNode(parent.getRootNode());
+					parent.addChild(leaf);				
+				}
+				else{
+					// Component is added to tree for the first time
+					child = new ComponentParentNode(cmpName);
+					// Always adding first into component map
+					componentMap.put(child.getName(), child);
+					child.setTargetPlatform(parent.getTargetPlatform());
+					parent.addChild(child);		
+					parentNodeList.add(child);
+					if(searchProgressListener != null){
+						searchProgressListener.componentAdded(child, componentMap.size());	
+					}
+				}
+				
+			} // synchronized
+			
+		}
+		
+		/**
+		 * @return Returns the isSearchAborted.
+		 */
+		public boolean isSearchAborted() {
+			return isSearchAborted;
+		}
+
+		/**
+		 * @param isSearchAborted The isSearchAborted to set.
+		 */
+		public void setSearchAborted(boolean isSearchAborted) {
+			this.isSearchAborted = isSearchAborted;
+		}
+
+		/**
+		 * @return Returns the startTime.
+		 */
+		public long getStartTime() {
+			return startTime;
+		}
+
+		/**
+		 * @return Returns the componentMap.
+		 */
+		public int getFoundComponentsCount() {
+			return componentMap.size();
+		}
+
+		public void createThreadRegister() {
+			threadReg = new ThreadRegister(this, searchProgressListener);
+		}
+
+		/**
+		 * @return Returns the searchProgressListener.
+		 */
+		public MainViewPopulateProgressListener getSearchProgressListener() {
+			return searchProgressListener;
+		}
+
+		/**
+		 * Informs search progress listener that search has finished successfully.
+		 */
+		public void searchFinished() {
+			searchProgressListener.searchFinished(getFoundComponentsCount());
+		}
+
+		/**
+		 * Registers dependency search thread.
+		 */
+		public void registerThread(String threadId) {
+			threadReg.register(threadId);
+		}
+
+		/**
+		 * Deregisters dependency search thread.
+		 */
+		public void deregisterThread(String threadId) {
+			threadReg.deregister(threadId);
+		}
+	
+	}
+	
+	/**
+	 * Singleton instance accessor. Sets given parameter also into current instance
+	 * if needed.
+	 * @return Returns singleton class instance.
+	 * @throws IOException 
+	 * @throws FileNotFoundException 
+	 */
+	private static MainViewDataPopulator getInstance(){
+		if( instance == null ){
+			instance = new MainViewDataPopulator();
+		}
+		return instance;		
+	}	
+	
+	/**
+	 * Default constructor 
+	 * @throws IOException 
+	 * @throws FileNotFoundException 
+	 */
+	private MainViewDataPopulator(){	
+		searchInstancesVector = new Vector<SearchInstance>();
+	}
+	
+	/**
+	 * Static delegate method for populateViewImpl.
+	 * @param invisibleRoot Invisible root node to add actual component
+	 *                      dependency tree.
+	 * @param searchProgressListener Search progress listener.
+	 * @param compToSearchFor Name of the component to search for
+	 * @param currentlyAnalyzedComponentTargetPlatform Target platform for the component to search for, or <code>null</code>
+	 *                                                 if target platform does not matter.
+	 */
+	public static void populateView(ComponentParentNode invisibleRoot, 
+									MainViewPopulateProgressListener searchProgressListener, 
+				                    String compToSearchFor, ITargetPlatform currentlyAnalyzedComponentTargetPlatform) {
+		// Storing root node for further reference
+		MainViewDataPopulator.currentRootNode = invisibleRoot;
+		// Making sure that instance is generated
+		MainViewDataPopulator inst = getInstance();
+		// Creating search instance and storing for further reference
+		currentSearchInstance = inst.new SearchInstance(searchProgressListener);
+		searchInstancesVector.add(currentSearchInstance);
+		// Populating the view
+		inst.populateViewImpl(currentSearchInstance, currentRootNode, compToSearchFor, currentlyAnalyzedComponentTargetPlatform);
+	}
+	
+
+	/**
+	 * Static delegate method for populateViewImpl. Populates only part of the view, not whole view.
+	 * @param parentNodeWhereToPopulatePartOfView a root node where populating starts
+	 * @param newComponentName a name of new component to be added to parentNodeWhereToPopulatePartOfView
+	 * @param searchProgressListener Search progress listener.
+	 * @param parentNodes nodes all ready added to tree
+	 * @param childToRemove a child to be removed from newComponentName or null if none
+	 */
+	public static void populatePartOfView(ComponentParentNode parentNodeWhereToPopulatePartOfView,
+			String newComponentName,
+			MainViewPopulateProgressListener searchProgressListener, 									
+			Map<String, ComponentParentNode> parentNodes, 
+			ComponentNode childToRemove) {
+		
+		// Making sure that instance is generated
+		MainViewDataPopulator inst = getInstance();
+		// Creating search instance and storing for further reference
+		currentSearchInstance = inst.new SearchInstance(searchProgressListener, parentNodes);
+		searchInstancesVector.add(currentSearchInstance);
+		//Cache must be already loaded, because this comes from user action
+		inst.populatePartOfViewImpl(currentSearchInstance, parentNodeWhereToPopulatePartOfView, newComponentName, childToRemove);
+	}
+
+	/**
+	 * Creates a new cache data manager object based on the currently
+	 * active settings.
+	 * @return New cache reader object
+	 * @throws CacheFileDoesNotExistException
+	 * @throws IOException
+	 */
+	private static ICacheDataManager createNewCacheDataManagerBasedOnActiveSettings() throws CacheFileDoesNotExistException, IOException{
+		return createNewCacheDataManagerBasedOnGivenSettings(AppDepSettings.getActiveSettings());
+	}
+		
+	/**
+	 * Creates a new cache data manager object based on the currently
+	 * active settings.
+	 * @param st Settings to be used for creating cache data reader.
+	 * @return New cache reader object
+	 * @throws CacheFileDoesNotExistException
+	 * @throws IOException
+	 */
+	private static ICacheDataManager createNewCacheDataManagerBasedOnGivenSettings(AppDepSettings st) throws CacheFileDoesNotExistException, IOException{
+		
+		ICacheDataManager cacheMgr = null;
+		
+		try {
+			// Making sure that instance is generated
+			getInstance();
+			
+			// Fetching current parameters
+			cacheMgr = CacheDataManager.getInstance();
+		} catch (CacheFileDoesNotExistException e) {
+    		AppDepConsole.getInstance().println(
+							Messages.getString("MainViewDataPopulator.Cache_File_Not_Found_Msg_Start") //$NON-NLS-1$
+							+ e.getMessage()
+							+ Messages.getString("MainViewDataPopulator.Cache_File_Not_Found_Msg_End"), //$NON-NLS-1$
+    						IConsolePrintUtility.MSG_ERROR);
+			throw e;
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(
+							Messages.getString("MainViewDataPopulator.Failed_To_Create_Cache_Reader_Msg") //$NON-NLS-1$
+							+ e.getMessage(),
+							IConsolePrintUtility.MSG_ERROR);	
+			throw e;
+		}
+		
+		return cacheMgr;
+	}
+	
+	/**
+	 * Populates the tree view from the data gained from cache file.
+	 * @param searchInst Search instance to start population for.
+	 * @param invisibleRoot Invisible root node to add actual component
+	 *                      dependency tree.
+	 * @param compToSearchFor Name of the component to search for
+	 * @param targetPlatform Target platform for the component to search for, or <code>null</code>
+	 *                                                 if target platform does not matter.
+	 */
+	private void populateViewImpl(SearchInstance searchInst,
+			                      ComponentParentNode invisibleRoot, 
+			                      String compToSearchFor, ITargetPlatform targetPlatform) {
+		
+		try {
+			
+			// Removing also old children from the invisible root
+			invisibleRoot.removeAllChildren();
+			
+			ComponentParentNode root =  new ComponentParentNode(compToSearchFor);
+			root.setRootComponent(true);
+			root.setTargetPlatform(targetPlatform);
+			invisibleRoot.addChild(root);
+			ComponentParentNode parent = root;			
+			
+			searchInst.createThreadRegister();
+			
+			ICacheDataManager cacheMgr = createNewCacheDataManagerBasedOnActiveSettings();
+
+			searchInst.getSearchProgressListener().searchStarted();		
+			
+			getDirectDependenciesForComponent(searchInst, cacheMgr, compToSearchFor, parent, true);			
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(
+							Messages.getString("MainViewDataPopulator.View_Population_Failed_Msg") //$NON-NLS-1$
+							+ e.getMessage(),
+							IConsolePrintUtility.MSG_ERROR);				
+		}
+	}	
+	
+	/**
+	 * Populates the tree view from the data gained from cache file.
+	 * @param searchInst Search instance to start population for.
+	 * @param nodeWhereToPopulate a node where populating starts
+	 * @param newComponentName a name of new component to be added to newComponentName
+	 * @param childToRemove a child to be removed from newComponentName
+	 * 
+	 */
+	private void populatePartOfViewImpl(SearchInstance searchInst,
+			                      ComponentParentNode nodeWhereToPopulate, String newComponentName, ComponentNode childToRemove) {
+		
+		try {			
+
+			// Component to be analyzed was set and we can continue, first we must create new component with name of the old component...
+			ComponentParentNode newComponent = new ComponentParentNode(childToRemove.getName());
+			//Set as concrete component - that will change the name of component to new, and set old component name as generic component name
+			newComponent.setConcreteName(newComponentName, CompBindType.USER_BIND);
+
+			//Replacing component with new. Component goes to same place as the old one.
+			nodeWhereToPopulate.replaceChild(childToRemove, newComponent);
+			
+			searchInst.createThreadRegister();
+			
+			ICacheDataManager cacheMgr = createNewCacheDataManagerBasedOnActiveSettings();
+
+			searchInst.getSearchProgressListener().searchStarted();		
+			
+			getDirectDependenciesForComponent(searchInst, cacheMgr, newComponentName, newComponent, true);			
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(
+							Messages.getString("MainViewDataPopulator.View_Population_Failed_Msg") //$NON-NLS-1$
+							+ e.getMessage(),
+							IConsolePrintUtility.MSG_ERROR);				
+		}
+	}
+
+	/**
+	 * Uses cache reader to get direct dependencies for the given component name.
+	 * @param cacheMgr Cache reader object to be used for reading cache.
+	 * @param compToSearchFor Name of the component to seek from cache.
+	 * @param parent Parenet node under which to add dependent components. 
+	 * @param isFirstLevel Flag value is set to <code>true</code> if we are resolving
+	 *                     dependencies for the highest level, otherwise set to 
+	 *                     <code>false</code>.
+	 * @throws IOException
+	 */
+	private void getDirectDependenciesForComponent(SearchInstance searchInst,
+			                                       ICacheDataManager cacheMgr, 
+												   String compToSearchFor, 
+												   ComponentParentNode parent, 
+												   boolean isFirstLevel) throws IOException {
+		List<UsedComponentData> directDepComponents = null;
+		
+		// Is search aborted?
+		if(searchInst.isSearchAborted()){
+			// If it is, just returning without doing anything.
+			return;
+		}
+
+		try {
+			directDepComponents = cacheMgr.getDirectlyDependentComponentsFor(compToSearchFor);						
+			addToTreeDataStructure(searchInst, cacheMgr, directDepComponents, parent, isFirstLevel);
+		} catch (NoSuchElementException e) {
+			//Try to get missing component by predefined component prefix list
+			getDirectDependenciesForMissingComponentByPrefixList(searchInst, cacheMgr, compToSearchFor, parent, isFirstLevel);			
+		}
+	}
+	
+	/**
+	 * Search missing (possible generic) components real concrete implementation
+	 * and if found, uses that as component. Uses DE preference page to get prefixes.
+	 * 
+	 * Uses cache reader to get direct dependencies for the given component name.
+	 * @param cacheMgr Cache reader object to be used for reading cache.
+	 * @param compToSearchFor Name of the component to seek from cache.
+	 * @param parent Parent node under which to add dependent components. 
+	 * @param isFirstLevel Flag value is set to <code>true</code> if we are resolving
+	 *                     dependencies for the highest level, otherwise set to 
+	 *                     <code>false</code>.
+	 * @throws IOException
+	 */
+	private void getDirectDependenciesForMissingComponentByPrefixList(SearchInstance searchInst,
+			                                       ICacheDataManager cacheMgr, 
+												   String compToSearchFor, 
+												   ComponentParentNode parent, 
+												   boolean isFirstLevel) throws IOException {
+		
+		List<UsedComponentData> directDepComponents = null;
+		
+		// Is search aborted?
+		if(searchInst.isSearchAborted()){
+			// If it is, just returning without doing anything.
+			return;
+		}
+
+
+		//Try to get missing component by predefined component prefix list
+		List<String> searchOrderPrefixsList = DEPreferences.getSearchOrderPrefixsList();
+
+
+		boolean setMissingAndReturn = searchOrderPrefixsList.isEmpty();
+
+		//If list is empty, there is no preferences added, just stop populating tree and returning
+
+		String concreteComponentName = null;
+		
+
+		try {
+			//Getting possible match by prefix list
+			//If found, setting component and keep on populating data, if not, set as missing and resolved and return
+			
+			if(!setMissingAndReturn){
+				ICacheDataManager manager = CacheDataManager.getInstance();
+				concreteComponentName = manager.searchComponentWithPrefix(searchOrderPrefixsList, parent.getName());
+			}
+			if(concreteComponentName==null){
+				setMissingAndReturn = true;
+			}
+			if(setMissingAndReturn){
+				parent.setMissing(true);
+				// No more searching further. Therefore, all the 
+				// children nodes can thought to be resolved.
+				parent.setDirectChildrensResolved(true);
+				return;		
+			}				
+
+			//Setting new concrete name for component and component to search for
+			parent.setConcreteName(concreteComponentName, ComponentParentNode.CompBindType.AUTO_BIND);
+			compToSearchFor = concreteComponentName;
+			directDepComponents = cacheMgr.getDirectlyDependentComponentsFor(compToSearchFor);						
+			addToTreeDataStructure(searchInst, cacheMgr, directDepComponents, parent, isFirstLevel);
+		} catch (NoSuchElementException e) {
+			parent.setMissing(true);
+			// No more searching further. Therefore, all the 
+			// children nodes can thought to be resolved.
+			parent.setDirectChildrensResolved(true);
+			return;
+		} catch (CacheFileDoesNotExistException e) {
+			e.printStackTrace();
+			throw new IOException(e.getMessage());
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			throw new IOException(e.getMessage());
+		}
+		
+	
+	}	
+	
+	/**
+	 * Goes through the component name array, and checks if already exists in the
+	 * component map. If not, added as a parent node, otherwise added as a leaf link 
+	 * node to the tree data structure. 
+	 * @param cacheMgr Cache reader object to be used for reading cache.
+	 * @param directDepComponents Component name string array to be examined.
+	 * @param parent Parent node to add newly created component nodes.
+	 * @param isFirstLevel Flag value is set to <code>true</code> if we are resolving
+	 *                     dependencies for the highest level, otherwise set to 
+	 *                     <code>false</code>.
+	 * @throws IOException 
+	 */
+	private void addToTreeDataStructure(SearchInstance searchInst,
+										ICacheDataManager cacheMgr,
+										List<UsedComponentData> directDepComponents, 
+										ComponentParentNode parent, 
+										boolean isFirstLevel) throws IOException {
+		
+		ArrayList<ComponentParentNode> parentNodeList = new ArrayList<ComponentParentNode>();
+		
+		// Is search aborted?
+		if(searchInst.isSearchAborted()){
+			// If it is, just returning without doing anything.
+			return;
+		}
+		
+		for (int i = 0; i < directDepComponents.size(); i++) {
+			String cmpName = directDepComponents.get(i).getComponentName().toLowerCase();
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, "directDepComponents[" + i + "]: " + cmpName);			 //$NON-NLS-1$ //$NON-NLS-2$
+			searchInst.checkIfAlreadyAddedAndAddNode(parent, parentNodeList, cmpName);
+		}
+
+		//Now we have successfully added all the childrens to the parent
+		parent.setDirectChildrensResolved(true);
+		
+		// If there were no components at first level, the following
+		// for loop is unnecessary and we are already finished searching
+		// in this early stage because there were no dependencies.
+		if(isFirstLevel && parentNodeList.size() == 0){
+			searchInst.searchFinished();
+			return;
+		}
+		
+		// Going through all the found parent nodes
+		for (Iterator<ComponentParentNode> iter = parentNodeList.iterator(); iter.hasNext();) {
+			ComponentParentNode node = iter.next();
+			
+			if(isFirstLevel){
+				final ComponentParentNode parentNode = node;
+				final SearchInstance currentSearchInstance = searchInst;
+				// Creating thread that resolves this sub-tree
+				Thread worker = new Thread(){
+					public void run() {
+
+						try {
+							
+							// Registering the thread
+							currentSearchInstance.registerThread(this.toString());							
+							
+							long runMethodStartTime = System.currentTimeMillis();
+							DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+												this.toString() + " started (" //$NON-NLS-1$
+												+ parentNode.getName() + " sub-tree): "  //$NON-NLS-1$
+												+ new Date(runMethodStartTime).toString());	
+
+							getDirectDependenciesForComponent(currentSearchInstance,
+															  CacheDataManager.getInstance(),
+															  parentNode.getName(), 
+															  parentNode, false);							
+						} catch (IOException e) {
+							e.printStackTrace();
+							throw new NoSuchElementException();
+						} catch (CacheFileDoesNotExistException e) {
+							e.printStackTrace();
+							String errMsg = Messages.getString("MainViewDataPopulator.Cache_File_Not_Found_Msg_Start") + e.getMessage() + Messages.getString("MainViewDataPopulator.Cache_File_Not_Found_Msg_End"); //$NON-NLS-1$ //$NON-NLS-2$
+							AppDepConsole.getInstance().println(errMsg, IConsolePrintUtility.MSG_ERROR);
+						}				
+						long endTime = System.currentTimeMillis();
+						
+						DbgUtility.println(DbgUtility.PRIORITY_OPERATION, 
+											this.toString() 
+											+ " ended: " + new Date(endTime).toString()); //$NON-NLS-1$
+						DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() + "TOTAL: "  //$NON-NLS-1$
+								           + (endTime-currentSearchInstance.getStartTime())/1000 + " seconds!"); //$NON-NLS-1$
+						DbgUtility.println(DbgUtility.PRIORITY_OPERATION, this.toString() + "Parent component count: "  //$NON-NLS-1$
+								           + currentSearchInstance.getFoundComponentsCount());
+						
+						// Deregistering the thread
+						currentSearchInstance.deregisterThread(this.toString());
+					}					
+				};
+				// Setting priority into lower that normal
+				// in order not to disturb UI threads.
+				worker.setPriority(Thread.NORM_PRIORITY-2);
+				// Kicking-off the thread
+				worker.start();
+			}
+			else{
+				getDirectDependenciesForComponent(searchInst, cacheMgr, node.getName(), node, false);								
+			}
+		}			
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.CacheDataManager#getParentImportedFunctionsForComponent(java.lang.String, java.lang.String)
+	 */
+	public static Collection<ImportFunctionData> getParentImportedFunctionsForComponent(String parentCmpName, String importedCmpName) throws FileNotFoundException, IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException  {
+		// Concurrent use of the current data reader may cause problems
+		// Therefore, creating a new reader instance.
+		ICacheDataManager localMgr = createNewCacheDataManagerBasedOnActiveSettings();
+		return localMgr.getParentImportedFunctionsForComponent(parentCmpName, importedCmpName);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.CacheDataManager#getParentExportedFunctionsForComponent(java.lang.String, java.lang.String)
+	 */
+	public static Collection<ExportFunctionData> getExportedFunctionsForComponent(String componentNameWithExtension) throws FileNotFoundException, IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException  {
+		// Concurrent use of the current data reader may cause problems
+		// Therefore, creating a new reader instance.
+		ICacheDataManager localMgr = createNewCacheDataManagerBasedOnActiveSettings();
+		return localMgr.getExportedFunctionsForComponent(componentNameWithExtension);
+	}
+
+	/**
+	 * Public method available for aborting the search.
+	 */
+	static public void abortCurrentSearch() {
+		getInstance().abortCurrentSearchImpl();
+	}
+		
+	/**
+	 * Sets abort flag to <code>true</code> in order to abort
+	 * the current search.
+	 */
+	private void abortCurrentSearchImpl() {
+		if(searchInstancesVector.size() > 0){
+			SearchInstance si = searchInstancesVector.lastElement();
+			si.setSearchAborted(true);
+		}
+	}
+
+	/**
+	 * Gets component property array.
+	 * @param cmpName Component name (mandatory)
+	 * @param targetPlatform Target platform restriction, or <code>null</code> if target platform does not matter.
+	 * @return component properties for the given component.
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 * @throws CacheFileDoesNotExistException
+	 */
+	public static ComponentPropertiesData getComponentPropertyArrayForComponent(String cmpName, ITargetPlatform targetPlatform) throws IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException  {
+		// Concurrent use of the current data reader may cause problems
+		// Therefore, creating a new reader instance.
+		ICacheDataManager localMgr = createNewCacheDataManagerBasedOnActiveSettings();
+		return localMgr.getComponentPropertyArrayForComponent(cmpName, targetPlatform);
+	}
+
+	/**
+	 * Gets the component properties for the components
+	 * that are using the given component. Delegates request further 
+	 * to CacheDataManager class.
+	 * @param settings Settings to be used for creating cache data reader.
+	 * @param progressCallback Job progress callback interface.
+	 * @param resultComponentsArrayList Array list object to return resulting components into. 
+	 * @param componentName Name of the component to search using components for. 
+	 * @param functionOrdinal Ordinal of the function to search using components for. 
+	 *                        This parameter can be set to <code>null</code> if we are
+	 *                        only interested in components that are using the given component.
+	 * @return Returns components with their properties that are using 
+	 * 		   the component given as parameter.
+	 * @throws IOException 
+	 * @throws CacheFileDoesNotExistException 
+	 * @throws JobCancelledByUserException 
+	 * @see com.nokia.s60tools.appdep.core.data.ICacheDataManager#getUsingComponents
+	 */
+	public static void getUsingComponents(AppDepSettings settings,
+									   IJobProgressStatus progressCallback,	
+									   ArrayList<ComponentPropertiesData> resultComponentsArrayList,
+									   String componentName,
+									   String functionOrdinal) throws CacheFileDoesNotExistException, 
+									   								  IOException, 
+									   								  JobCancelledByUserException {
+		// Concurrent use of the current data reader may cause problems
+		// Therefore, creating a new reader instance.
+		ICacheDataManager localManager = createNewCacheDataManagerBasedOnGivenSettings(settings);
+		localManager.getUsingComponents(progressCallback,
+									   resultComponentsArrayList, 
+									   componentName, 
+				                       functionOrdinal);
+	}
+
+	/**
+	 * Gets target platform ID string for the given component.
+	 * In case of multitarget selection gets data from component properties, otherwise
+	 * uses currently active target platform.
+	 * @param settings settings object to be used for getting target platform data
+	 * @param componentName  component to search target platform id string for
+	 * @return target platform ID string for the given component.
+	 * @throws CacheFileDoesNotExistException 
+	 * @throws CacheIndexNotReadyException 
+	 * @throws IOException 
+	 */
+	public static String getTargetPlatformIdStringForComponent(AppDepSettings settings, String componentName) throws IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException {
+		String targetPlatformId;
+		ITargetPlatform[] usedPlatforms = settings.getCurrentlyUsedTargetPlatforms();
+		
+		// Finding out the used target platform (=build variant)
+		if(usedPlatforms.length > 1){
+			// Multitarget selection, or 'SIS file + single target' selection
+			// Finding target platform from the component properties
+			ComponentPropertiesData comPropData = getComponentPropertyArrayForComponent(componentName, null);
+			targetPlatformId = comPropData.getTargetPlatform().getId();
+		}
+		else{
+			// Only single target is selected => string representation can be used directly.
+			targetPlatformId = settings
+			.getCurrentlyUsedTargetPlatformsAsString();						
+		}
+
+		return targetPlatformId;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewDoubleClickListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,103 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.part.DrillDownAdapter;
+
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.ui.wizards.WizardUtils;
+import com.nokia.s60tools.ui.ProgrammaticSelection;
+
+/**
+ * Main view's double-click listener.
+ */
+public class MainViewDoubleClickListener implements IDoubleClickListener {
+	
+	/**
+	 * Main view reference.
+	 */
+	private MainView view;
+	/**
+	 * Adapter used to implement double-click action.
+	 */
+	private DrillDownAdapter drillDownAdapter;
+	
+	/**
+	 * Constructor.
+	 * @param view Main view reference.
+	 * @param drillDownAdapter Adapter used to implement double-click action.
+	 */
+	public MainViewDoubleClickListener(MainView view, DrillDownAdapter drillDownAdapter){
+		this.view = view;
+		this.drillDownAdapter = drillDownAdapter;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+	 */
+	public void doubleClick(DoubleClickEvent event) {
+		try {			
+			ISelection selection = view.getComponentTreeViewer().getSelection();
+			Object obj = ((IStructuredSelection)selection).getFirstElement();
+			
+			if(obj instanceof ComponentLinkLeafNode){
+				
+				// Making sure that referred component can be found
+				if(drillDownAdapter.canGoHome()){
+					drillDownAdapter.goHome();
+				}
+				
+				ComponentLinkLeafNode link = (ComponentLinkLeafNode) obj;
+				ProgrammaticSelection newSelection = null;
+				newSelection = new ProgrammaticSelection(
+													new ComponentNode[]{
+															link.getReferredComponent()
+																		}
+														);
+				view.getComponentTreeViewer().setSelection(newSelection, true);
+			}
+			else if(obj instanceof ComponentParentNode){
+				ComponentParentNode pnode = (ComponentParentNode) obj;
+				if(pnode.isRootComponent()){
+
+					// Aborting possible ongoing search
+					MainView.abortCurrentlyOngoingSearches();
+					
+					// Opening wizard dialog
+					Shell sh = view.getViewSite().getShell();
+					if(WizardUtils.invokeSDKAndTargetPlatformSelectionWizard(sh)){
+						view.inputUpdated();    			
+					}											
+				}
+				else{
+					drillDownAdapter.goInto();								
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewExportFunctionsTabContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,71 @@
+/*
+* 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.appdep.ui.views.main;
+
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+
+/**
+ * Content provider for Import Functions tab item. 
+ */
+class MainViewExportFunctionsTabContentProvider implements IStructuredContentProvider {
+		
+	/**
+	 * Reference to <code>ArrayList</code> object that always 
+	 * contains the current list of imported functions.
+	 * This list is populated by <code>MainViewSelectionChangedListener</code> 
+	 * class.
+	 * @see com.nokia.s60tools.appdep.ui.views.main.MainViewSelectionChangedListener
+	 */
+	private ArrayList<ExportFunctionData> exportFunctionsArrayList = null;
+	
+	/**
+	 * Content provider's constructor.
+	 * @param exportFunctionsArrayList <code>ArrayList</code> object that always 
+	 * contains the current list of exported functions.
+	 */
+	public MainViewExportFunctionsTabContentProvider(ArrayList<ExportFunctionData> exportFunctionsArrayList){
+		this.exportFunctionsArrayList = exportFunctionsArrayList;
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		return exportFunctionsArrayList.toArray();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewExportFunctionsTabLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,109 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Label provider for Export Functions tab item.
+ */
+class MainViewExportFunctionsTabLabelProvider extends LabelProvider 
+												implements ITableLabelProvider  {
+	
+	/**
+	 * Constructor.
+	 */
+	public MainViewExportFunctionsTabLabelProvider() {
+		super();
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		
+		// Default is to have no image
+		Image img = null;
+
+		switch (columnIndex) {
+		
+		case ImportFunctionData.ORDINAL_COLUMN_INDEX:
+			// No image is used for the ordinals
+			break;
+
+		case ImportFunctionData.NAME_COLUMN_INDEX:			
+			// Column index uses the default function object image
+	        /*******************************************************************************
+	         * This piece of the graphic is taken/modified from a graphic that is made 
+	         * available under the terms of the Eclipse Public License v1.0.
+	         *
+	         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+	         * for detailed information about the original graphic.
+	         *  
+	         *******************************************************************************/        
+			String imageKey = ImageKeys.FUNCTION_OBJ;	
+			img = ImageResourceManager.getImage(imageKey);
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return img;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		
+		String label = element.toString();
+		
+		ExportFunctionData efData = (ExportFunctionData) element;
+		
+		switch (columnIndex) {
+		
+		case ImportFunctionData.ORDINAL_COLUMN_INDEX:
+			label = efData.getFunctionOrdinal();
+			break;
+
+		case ImportFunctionData.NAME_COLUMN_INDEX:
+			label = efData.getFunctionName();
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return label;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewImportFunctionsTabContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,71 @@
+/*
+* 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.appdep.ui.views.main;
+
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+
+/**
+ * Content provider for Import Functions tab item. 
+ */
+class MainViewImportFunctionsTabContentProvider implements IStructuredContentProvider {
+		
+	/**
+	 * Reference to <code>ArrayList</code> object that always 
+	 * contains the current list of imported functions.
+	 * This list is populated by <code>MainViewSelectionChangedListener</code> 
+	 * class.
+	 * @see com.nokia.s60tools.appdep.ui.views.main.MainViewSelectionChangedListener
+	 */
+	private ArrayList<ImportFunctionData> importFunctionsArrayList = null;
+	
+	/**
+	 * Content provider's constructor.
+	 * @param importFunctionsArrayList <code>ArrayList</code> object that always 
+	 * contains the current list of imported functions.
+	 */
+	public MainViewImportFunctionsTabContentProvider(ArrayList<ImportFunctionData> importFunctionsArrayList){
+		this.importFunctionsArrayList = importFunctionsArrayList;
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		return importFunctionsArrayList.toArray();
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewImportFunctionsTabLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,125 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Label provider for Import Functions tab item.
+ */
+class MainViewImportFunctionsTabLabelProvider extends LabelProvider 
+												implements ITableLabelProvider  {
+	
+	public MainViewImportFunctionsTabLabelProvider() {
+		super();
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		
+		// Default image
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		String imageKey = ImageKeys.FUNCTION_OBJ;	
+		Image img = ImageResourceManager.getImage(imageKey);
+		
+		ImportFunctionData ifData = (ImportFunctionData) element;
+
+		switch (columnIndex) {
+		
+		case ImportFunctionData.ORDINAL_COLUMN_INDEX:
+			img = null; // No image is used for the ordinals
+			break;
+
+		case ImportFunctionData.NAME_COLUMN_INDEX:			
+			// Using different image for virtual methods
+			if(ifData.isVirtual()){
+		        /*******************************************************************************
+		         * This piece of the graphic is taken/modified from a graphic that is made 
+		         * available under the terms of the Eclipse Public License v1.0.
+		         *
+		         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+		         * for detailed information about the original graphic.
+		         *  
+		         *******************************************************************************/        
+				img = ImageResourceManager.getImage(ImageKeys.VIRTUAL_FUNCTION_OBJ);
+			}
+			break;
+
+		case ImportFunctionData.OFFSET_COLUMN_INDEX:
+			img = null; // No image is used for the offset
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return img;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		
+		String label = element.toString();
+		
+		ImportFunctionData ifData = (ImportFunctionData) element;
+		
+		switch (columnIndex) {
+		
+		case ImportFunctionData.ORDINAL_COLUMN_INDEX:
+			label = ifData.getFunctionOrdinal();
+			break;
+
+		case ImportFunctionData.NAME_COLUMN_INDEX:
+			label = ifData.getFunctionName();
+			break;
+
+		case ImportFunctionData.OFFSET_COLUMN_INDEX:
+			label = ifData.getFunctionOffsetAsString();
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+			break;
+		}
+		
+		return label;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewPopulateProgressListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,133 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.IComponentSearchProgressListener;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+/**
+ * Main view population progress listener
+ */
+public class MainViewPopulateProgressListener implements IComponentSearchProgressListener {
+
+	/**
+	 * Determines the UI refresh cycle. The refresh is done after
+	 * UI_REFRESH_CYCLE amount of components has been added.
+	 */
+	private static final int UI_REFRESH_CYCLE = 20;
+	
+	/**
+	 * Determines how often component count information
+	 * on toolbar is updated.
+	 */
+	private static final int COMPONENT_COUNT_REFRESH_CYCLE = 5;
+	
+	/**
+	 * View into which report progress into.
+	 */
+	MainView view = null;
+	
+	/**
+	 * Default constructor
+	 * @param view View into which report progress into.
+	 */
+	public MainViewPopulateProgressListener(MainView view){
+		this.view = view;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentSearchProgressListener#searchStarted()
+	 */
+	public void searchStarted() {
+		view.searchStarted();
+		String descriptionText = Messages.getString("MainViewPopulateProgressListener.Searching_Msg"); //$NON-NLS-1$
+		view.updateDescription(descriptionText);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentSearchProgressListener#componentAdded(com.nokia.s60tools.appdep.core.data.ComponentNode, int)
+	 */
+	public void componentAdded(ComponentNode node, int componentTotalCount) {
+		final String descriptionText = Messages.getString("MainViewPopulateProgressListener.Searching_Msg_Start")  //$NON-NLS-1$
+			                     + componentTotalCount + Messages.getString("MainViewPopulateProgressListener.Searching_Msg_End"); //$NON-NLS-1$
+		
+		final int total = componentTotalCount;
+		
+		Runnable updateRunnable = new Runnable(){
+			public void run(){
+				if((total % COMPONENT_COUNT_REFRESH_CYCLE) == 0){
+					view.updateDescription(descriptionText);	
+				}
+				if((total % UI_REFRESH_CYCLE) == 0){
+					view.refresh();
+				}
+			}
+		};
+		
+		// Update request done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(updateRunnable);		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentSearchProgressListener#searchFinished(int)
+	 */
+	public void searchFinished(int componentTotalCount) {
+		final String descriptionText = Messages.getString("MainViewPopulateProgressListener.Search_Complete_Msg_Start")  //$NON-NLS-1$
+			                     + componentTotalCount + Messages.getString("MainViewPopulateProgressListener.Search_Complete_Msg_End"); //$NON-NLS-1$
+				
+		Runnable updateRunnable = new Runnable(){
+			public void run(){
+				view.updateDescription(descriptionText);	
+				view.searchCompleted();
+				view.refresh();
+			}
+		};
+		
+		// Update request done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(updateRunnable);		
+
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.data.IComponentSearchProgressListener#searchAborted(int)
+	 */
+	public void searchAborted(int componentTotalCount) {
+		final String descriptionText = Messages.getString("MainViewPopulateProgressListener.Search_Aborted_Msg_Start")  //$NON-NLS-1$
+			                     + componentTotalCount + Messages.getString("MainViewPopulateProgressListener.Search_Aborted_Msg_End"); //$NON-NLS-1$
+				
+		Runnable updateRunnable = new Runnable(){
+			public void run(){
+				view.updateDescription(descriptionText);	
+				view.searchCompleted();
+				view.refresh();
+			}
+		};
+		
+		// Update request done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(updateRunnable);		
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/MainViewSelectionChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,380 @@
+/*
+* 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.appdep.ui.views.main;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheDataConstants;
+import com.nokia.s60tools.appdep.core.data.ComponentLinkLeafNode;
+import com.nokia.s60tools.appdep.core.data.ComponentNode;
+import com.nokia.s60tools.appdep.core.data.ComponentParentNode;
+import com.nokia.s60tools.appdep.core.model.ComponentPropertiesData;
+import com.nokia.s60tools.appdep.core.model.ExportFunctionData;
+import com.nokia.s60tools.appdep.core.model.ImportFunctionData;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.CacheIndexNotReadyException;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * Selection change listener for main view.
+ */
+public class MainViewSelectionChangedListener implements
+		ISelectionChangedListener {
+
+	//
+	// Members
+	//
+	private final MainView view;
+	private final ArrayList<ImportFunctionData> importFunctionsArrayList;
+	private final ArrayList<ExportFunctionData> exportFunctionsArrayList;
+	private boolean propertiesFoundSuccessfully;
+	
+	/**
+	 * Default constructor.
+	 * @param view Reference to main view
+	 * @param importFunctionsArrayList Import function list to be updated on selection.
+	 * @param exportFunctionsArrayList Export function list to be updated on selection.
+	 */
+	public MainViewSelectionChangedListener(MainView view, 
+										    ArrayList<ImportFunctionData> importFunctionsArrayList,
+										    ArrayList<ExportFunctionData> exportFunctionsArrayList){
+		this.view = view;
+		this.importFunctionsArrayList = importFunctionsArrayList;
+		this.exportFunctionsArrayList = exportFunctionsArrayList;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		try {			
+			
+			Object obj = view.getComponentTreeSelectedElement();
+			
+			// By default component properties data reference
+			// is set to null
+			view.setSelectedComponentPropertiesData(null);
+						
+			if(obj == null){
+				// We might get null-selections when
+				// tree is expanded/collapsed.
+				return;
+			}
+			else{
+				// Storing the selection for further reference in case 
+				// selection is lost because of the user decides
+				// to use 'Go Into' functionality which loses the selection.
+				view.setMostRecentlySelectedComponentNode(obj);
+			}
+						
+			// The object is for sure an instance of ComponentNode
+			ComponentNode node = (ComponentNode) obj;
+			// Storing name of the selected component (that might be name of the concrete component replacing generic one).
+			String selectedComponentName = node.getName();
+			// Component node instance which is selected or selected leaf node refers to
+			ComponentParentNode componentNodeInstance;
+			// Storing original component name in here, if we are replacing a generic component
+			String selectedComponentOriginalName;
+			if(node instanceof ComponentParentNode){
+				componentNodeInstance = (ComponentParentNode)node;
+			}
+			else{
+				// We have leaf node 
+				ComponentLinkLeafNode leafNode = (ComponentLinkLeafNode)node;
+				// Getting referred component
+				componentNodeInstance = leafNode.getReferredComponent();
+			}
+			// Storing name of the original component if needed
+			if(componentNodeInstance.wasGenericComponent()){
+				selectedComponentOriginalName = componentNodeInstance.getOriginalName();	
+			}else{
+				// No concrete component replacement done and therefore selected component is the original one.
+				selectedComponentOriginalName = selectedComponentName;		
+			}
+			
+			String parentComponentName = node.getParent().getName();
+			
+			AppDepSettings st = AppDepSettings.getActiveSettings();
+			SdkInformation sdkInfo = st.getCurrentlyUsedSdk();
+
+			//Updating tool bar text if the view is fully populated
+			// i.e. dependency search is finished.
+			if(!MainView.isDependencySearchOngoing()){
+				String descr = null;
+				if(sdkInfo != null){
+					descr = 
+							Messages.getString("MainViewSelectionChangedListener.SDK_Prefix") //$NON-NLS-1$
+							+ sdkInfo.getSdkId()
+							+ " - " //$NON-NLS-1$
+							+  st.getCurrentlyUsedTargetPlatformsAsString()
+							+ " " //$NON-NLS-1$
+							+  st.getBuildType().getBuildTypeDescription()
+							+ Messages.getString("MainViewSelectionChangedListener.Component_Prefix") //$NON-NLS-1$
+							+ node.getFullName();
+							
+					view.updateDescription(descr);
+				}
+			}
+			
+			// Fetching property information for the selected component
+			//For properties, cannot use selectedComponentName, because it may point to generic component
+			propertiesFoundSuccessfully = updateComponentPropertyInformation(selectedComponentName, st.getCurrentlyAnalyzedComponentTargetPlatform());
+			
+			// Clearing old information for imported functions
+			importFunctionsArrayList.clear();
+			// and also for exported ones
+			exportFunctionsArrayList.clear();
+
+			// Is currently used SDK configured?
+			if(sdkInfo != null){
+				// Export functions array list can be populated
+				// if component is not an EXE file, because there
+				// might exist EXE and DLL files with the same name,
+				// and the export function information is only available
+				// for DLLs. If EXE files were passed further, it would
+				// give the information for the DLL with the same name.
+				if(! isExeFile(selectedComponentName)){
+					// For exported functions using always concrete component if available
+					updateExportFunctionsArray(selectedComponentName);
+				}				
+			}
+			
+			// Checking if root component has been selected
+			ComponentParentNode pNode = null;
+			if(obj instanceof ComponentParentNode){
+				pNode = (ComponentParentNode) obj;
+				if(pNode.isRootComponent()){
+					// Disabling action that are not valid for root component
+					view.disableSetAsNewRootAction();
+					// The showing of parent import functions
+					// is not applicable for the root component
+					// Just refreshing view when old imported
+					// functions information has been cleared.
+					refreshMainView();
+					return;
+				}
+			}
+			else if(obj instanceof ComponentLinkLeafNode){
+				ComponentLinkLeafNode linkNode = (ComponentLinkLeafNode) obj;
+				pNode = linkNode.getReferredComponent();
+			}
+
+			// Also link node can refer to root component
+			if(pNode.isMissing() || pNode.isRootComponent()){
+				view.disableSetAsNewRootAction();							
+				view.enableLocateComponentAction();
+			}
+			else{
+				view.enableSetAsNewRootAction();
+				view.disableLocateComponentAction();
+			}
+			
+			// Import functions can be fetched selected node is not root component
+			updateImportFunctionsArray(selectedComponentOriginalName, parentComponentName);
+			
+			// Checks if there are unresolved import function names and if those can be fetched from export function data
+			checkForUnresolvedImportFunctionNames();
+			
+			// Finally asking from main view that content providers gets updated data for showing.
+			refreshMainView();
+		}
+		catch (CacheIndexNotReadyException e) {
+			//
+			// This may happen when no SDK selection has been made and therefore
+			// no cache indexes has been created.
+			// There is only single node in tree view with help text available
+			// for selection that for sure raises this exception.
+			//
+			// => can be ignored safely
+			//
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Checks if there are unresolved import function names and if those can be fetched from export function data.
+	 * This method does not have any effects if there are no unresolved imported functions, and if there are no
+	 * exported function data available.
+	 * @precondition if there are unresolved imported function names, there has to be valid exported functions data 
+	 *               available for successful operation.
+	 * @postcondition names of unresolved imported function names in <code>importFunctionsArrayList</code> are replaced 
+	 *                by function names got from <code>exportFunctionsArrayList</code>.
+	 */
+	private void checkForUnresolvedImportFunctionNames() {
+		// In case there is no exported data available, there is no use to continue the checking
+		if(exportFunctionsArrayList.size() == 0) return;
+		
+		// Otherwise checking imported functions array for unresolved function names
+		for (int i = 0; i < importFunctionsArrayList.size(); i++) {
+			ImportFunctionData importFunc = importFunctionsArrayList.get(i);
+			if(importFunc.getFunctionName().endsWith(CacheDataConstants.FUNC_NAME_NOT_RESOLVED)){
+				String funcName = getFuncNameFromExportedFunctions(importFunc.getFunctionOrdinalAsInt()); 
+				if(funcName !=  null){
+					importFunc.setFunctionName(funcName);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Gets function name from exported function array list with given ordinal. 
+	 * @param ordinal function ordinal to get name for.
+	 * @return Function name or <code>null</code> if cannot be resolved.
+	 */
+	private String getFuncNameFromExportedFunctions(int ordinal) {
+		// If we have valid ordinal that exists also in exported functions data...
+		if(ordinal > 0 && ordinal <= exportFunctionsArrayList.size()){
+			//...returning the function name for it
+			return exportFunctionsArrayList.get(ordinal-1).getFunctionName();
+		}
+		//  Could not found match from exported function data 
+		return null;
+	}
+
+	/**
+	 * Checks is given file name has EXE extension, or not.
+	 * @param fileNameStr File name to be checked for.
+	 * @return Returns <code>true</code> if file has EXE extension, 
+	 *         otherwise <code>false</code>.
+	 */
+	private boolean isExeFile(String fileNameStr) {
+		int extIndex = fileNameStr.lastIndexOf("."); //$NON-NLS-1$
+		if(extIndex != -1){
+			String extStr = fileNameStr.substring(extIndex+1, fileNameStr.length());
+			if(extStr.equalsIgnoreCase("EXE")){ //$NON-NLS-1$
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Performs refresh and other operation needed to
+	 * run after refresh. 
+	 */
+	private void refreshMainView() {
+		view.refresh();
+		if(propertiesFoundSuccessfully){
+			// This resizes value column which enables the seeing
+			// of all the capabilities defined for the component.
+			view.performValueColumnPackToPropertiesTab();			
+		}
+	}
+
+	/**
+	 * Updates importFunctionsArrayList with information that was found
+	 * for the selected component.
+	 * @param selectedComponentName Name of the component that has been selected.
+	 * @param parentComponentName Parent component of the selected component.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 * @throws CacheFileDoesNotExistException 
+	 */
+	private void updateImportFunctionsArray(String selectedComponentName, String parentComponentName) throws FileNotFoundException, IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException {
+		
+		importFunctionsArrayList.clear(); // Making sure that array is cleared
+		try {
+			// Non-root component => seeking for the parent imported functions
+			importFunctionsArrayList.addAll(
+											MainViewDataPopulator.getParentImportedFunctionsForComponent(
+																	parentComponentName,
+																	selectedComponentName)
+											);												             												
+		} catch (Exception e) {
+			// Catching exceptions here, because throwing them upper level would prevent fetching of component properties.
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Updates property information for the currently
+	 * selected component.
+	 * @param selectedComponentName Name of the component that has been selected.
+	 * @param targetPlatform Target platform restriction, or <code>null</code> if target platform does not matter.
+	 * @return Returns <code>true</code> of component properties was found successfully, 
+	 *         otherwise returns <code>false</code>.
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 */
+	private boolean updateComponentPropertyInformation(String selectedComponentName, ITargetPlatform targetPlatform) throws IOException, CacheIndexNotReadyException {
+		
+		boolean propertiesFound = false;
+		
+		try {
+			
+			ComponentPropertiesData comPropData = MainViewDataPopulator
+														.getComponentPropertyArrayForComponent(selectedComponentName, targetPlatform);
+			propertiesFound = true;
+			view.setSelectedComponentPropertiesData(comPropData);
+		} catch (NoSuchElementException e1) {
+			// This can be ignored because there may be components 
+			// that does not exist in cache at all
+		} catch (java.lang.NullPointerException e1) {
+			// This can be ignored because we'll get this if
+			// currently used SDK is not yet configured and we
+			// select the root node that just advices the user
+			// to double-click the root node.
+		} catch (CacheFileDoesNotExistException e2) {
+			// This might happen during dialog to view transitions
+			// When cache file does not exist yet.
+		} catch (Exception e3) {
+			e3.printStackTrace();
+		}
+		return propertiesFound;
+	}
+
+	/**
+	 * Updates exportFunctionsArrayList with information that was found
+	 * for the selected component.
+	 * @param selectedComponentName Name of the component that has been selected.
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 * @throws CacheIndexNotReadyException
+	 * @throws CacheFileDoesNotExistException 
+	 */
+	private void updateExportFunctionsArray(String selectedComponentName) throws FileNotFoundException, IOException, CacheIndexNotReadyException, CacheFileDoesNotExistException {
+
+		try {
+			exportFunctionsArrayList.clear(); // Making sure that earlier results are destroyed
+			// Populating with new data
+			exportFunctionsArrayList.addAll(MainViewDataPopulator.getExportedFunctionsForComponent(selectedComponentName));
+
+		} catch (NoSuchElementException e) {
+			// The selected component does necessary
+			// have any data about exported functions.
+			// Therefore we can ignore this exception
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/views/main/PropertyDataSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,92 @@
+/*
+* 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.appdep.ui.views.main;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.PropertyData;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Data sorter class for Property Data
+ */
+public class PropertyDataSorter extends S60ToolsViewerSorter {
+
+	/**
+	 * Properties are sorted by Property field
+	 */
+	public static final int CRITERIA_PROPERTY = 1;
+	/**
+	 * Import function data is sorted by function.
+	 */
+	public static final int CRITERIA_VALUE = 2;
+	
+	/**
+	 * Constructor.
+	 */
+	public PropertyDataSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int comparisonResult = 0;
+		
+		PropertyData prop1 = (PropertyData) e1;
+		PropertyData prop2 = (PropertyData) e2;
+		
+		switch (sortCriteria) {
+		
+		case CRITERIA_PROPERTY:
+			comparisonResult 
+			   = alphabeticSort(
+			        		prop1.getPropertyDescription(), 
+			        		prop2.getPropertyDescription());
+			break;
+
+		case CRITERIA_VALUE:
+			comparisonResult 
+			   = alphabeticSort(
+			        		prop1.getPropertyValue(), 
+			        		prop2.getPropertyValue());
+			break;
+			
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("PropertyDataSorter.Unexpected_Sort_Criteria_Msg"),  //$NON-NLS-1$
+					                     IConsolePrintUtility.MSG_ERROR);
+			break;
+		}
+		
+		return comparisonResult;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/AbstractSelectSDKWizardPage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.swt.widgets.Composite;
+
+import com.nokia.s60tools.ui.wizards.S60ToolsWizardPage;
+
+/**
+ * Abstract base class for SDK selection wizard page
+ * making possible to make different concreted implementations.
+ */
+public abstract class AbstractSelectSDKWizardPage extends S60ToolsWizardPage{
+
+	/**
+	 * Constructor
+	 * @param pageName wizard page name
+	 */
+	public AbstractSelectSDKWizardPage(String pageName) {
+		super(pageName);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public abstract void recalculateButtonStates();
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage#setInitialFocus()
+	 */
+	public abstract void setInitialFocus();
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public abstract void createControl(Composite parent);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/AppDepWizardDialog.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,92 @@
+/*
+* 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.appdep.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Wizard dialog for extension specific wizards.
+ */
+public class AppDepWizardDialog extends WizardDialog {
+	
+	/**
+	 * Used AppDep Wizard.
+	 */
+	private ISelectSDKWizard wizard = null;
+	
+    /**
+     * Creates a new wizard dialog for the given wizard.
+     * Just calls the super constructor. 
+     * @param parentShell the parent shell
+     * @param newWizard The AppDep wizard this dialog is working on.
+     */
+	public AppDepWizardDialog(Shell parentShell, ISelectSDKWizard newWizard){
+		super(parentShell, newWizard);
+		this.wizard = newWizard;
+	}
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.WizardDialog#finishPressed()
+     */
+    protected void finishPressed() {
+    	int exitStatus = wizard.getExitStatus();
+    	super.finishPressed();
+    	setReturnCode(exitStatus);
+    }
+	
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
+     */
+    protected void cancelPressed() {
+    	super.cancelPressed();
+    	setReturnCode(ISelectSDKWizard.CANCEL);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.WizardDialog#backPressed()
+     */
+    @Override
+    protected void backPressed() {
+    	// Getting current wizard page
+    	IWizardPage currentPage = getCurrentPage();
+		if(currentPage instanceof SelectComponentWizardPage){
+			SelectComponentWizardPage scwp = (SelectComponentWizardPage)currentPage;
+			scwp.setShowDuplicateComponentInfo(true);
+    	}
+    	super.backPressed();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.WizardDialog#nextPressed()
+     */
+    @Override
+    protected void nextPressed() {
+    	// Getting current wizard page
+    	IWizardPage currentPage = getCurrentPage();
+    	
+		// Refreshing data on next page
+		IRefreshable nextPage = (IRefreshable) wizard.getNextPage(currentPage);
+		nextPage.refresh();
+		
+    	super.nextPressed();    	
+    }
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntry.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,214 @@
+/*
+* 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.appdep.ui.wizards;
+
+import com.nokia.s60tools.appdep.core.BuildTypeRelease;
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.resources.Messages;
+
+
+/**
+ * Stores information on a single build target entry.
+ * This contains data that is shown in UI.
+ * 
+ * <code>BuildTargetEntryInfo</code> class is used to fetch
+ * actual domain model data info for UI object.
+ * @see BuildTargetEntryInfo
+ */
+public class BuildTargetEntry {
+	
+	//
+	// Column sorting indices for table column sorter
+	//
+	public static final int TARGET_TYPE_COLUMN_INDEX = 0;
+	public static final int COMPONENT_COUNT_COLUMN_INDEX = 1;
+	public static final int STATUS_COLUMN_INDEX = 2;
+
+	/**
+	 * Build target status enumeration.
+	 *  - ECacheReady means that cache file has been created for the target and cache file is up-to-date.
+	 *  - ECacheNeedsUpdate means that cache file has been created for the target and cache file is up-to-date.
+	 *  - ENoCache means that no cache files has been created for the target yet.
+	 *  - EEmptyTarget means that no components are build for the target and therefore it is not possible to create cache file.
+	 *  - ENotSupported  means that target exists in the selected SDK but the tool does not support the target type.
+	 *  - ECachesIsBeingIndexed means that cache index generation for the target is currently ongoing.
+	 *  - ECacheIsBeingGenerated means that cache generation for the target is currently ongoing.
+	 */
+	public enum BuildTargetStatusEnum {
+		EUnresolved,					// Initial status							
+		ECacheReady,                        	
+		ECacheNeedsUpdate, 	          			
+		ENoCache,     							 
+		EEmptyTarget,  					     						 
+		ENotSupported, 	  						
+		ECachesIsBeingIndexed,  				
+		ECacheIsBeingGenerated 					 
+	};
+	
+	/**
+	 * Target entry info object that is used to get info about real world object.
+	 */
+	private BuildTargetEntryInfo targetEntryInfo;
+
+		
+	/**
+	 * Constructor.
+	 * @param targetEntryInfo Target entry info object that is used to get info about real world object. 
+	 */
+	public BuildTargetEntry(BuildTargetEntryInfo targetEntryInfo){
+		this.targetEntryInfo = targetEntryInfo;
+	}
+		
+	/**
+	 * Gets target's description string shown for the user.
+	 * The description is combination of target and build type.
+	 * @return target's description.
+	 */
+	public String getTargetDescription() {
+		return targetEntryInfo.getTargetType();
+	}
+
+	/**
+	 * Gets component count for the entry.
+	 * @return component count for the entry.
+	 */
+	public String getComponentCount() {
+		// Not counting components for non-supported targets
+		if(getStatus() == BuildTargetStatusEnum.ENotSupported){
+			return Messages.getString("BuildTargetEntry.NotApplicable_Abbrev_Str"); //$NON-NLS-1$
+		}
+		// Otherwise fetching component count from entry info object
+		int componentCount = targetEntryInfo.getComponentCount();
+		if(componentCount == BuildTargetEntryInfo.UNRESOLVED_COMPONENT_COUNT){
+			return Messages.getString("BuildTargetEntry.Counting_InfoMsg"); //$NON-NLS-1$
+		}
+		return new Integer(componentCount).toString();
+	}
+
+	/**
+	 * Gets status for the entry.
+	 * @return status for the entry.
+	 */
+	public BuildTargetStatusEnum getStatus() {
+		return targetEntryInfo.getStatus();
+	}
+	
+	/**
+	 * Gets status as string for the entry.
+	 * @return status as string for the entry.
+	 */
+	public String getStatusAsString(){
+		String statusStr = Messages.getString("BuildTargetEntry.UnresolvedStatus_InfoMsg"); //$NON-NLS-1$
+
+		switch (getStatus()) {
+		
+		case ECacheReady:
+			statusStr = Messages.getString("BuildTargetEntry.CacheReadyStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case ECacheNeedsUpdate:
+			statusStr = Messages.getString("BuildTargetEntry.CacheNeedsUpdateStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case ENoCache:
+			statusStr = Messages.getString("BuildTargetEntry.NoCacheStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case EEmptyTarget:
+			statusStr = Messages.getString("BuildTargetEntry.EmptyTargetStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case ENotSupported:
+			statusStr = Messages.getString("BuildTargetEntry.NotSupportedStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case ECachesIsBeingIndexed:
+			statusStr = Messages.getString("BuildTargetEntry.CreatingCacheIndexStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		case ECacheIsBeingGenerated:
+			statusStr = Messages.getString("BuildTargetEntry.GeneratingCacheStatus_InfoMsg"); //$NON-NLS-1$
+			break;
+
+		default:
+			break;
+		}
+		
+		return statusStr;
+	}
+	
+	/**
+	 * Checks if target entry is release target.
+	 * @return <code>true</code> if target entry is release target, otherwise <code>false</code>.
+	 */
+	public boolean isReleaseTarget() {
+		if(targetEntryInfo.getBuildType().getBuildTypeName().equals(BuildTypeRelease.NAME)){
+			return true;
+		}
+		return false;
+	}	
+	
+	/**
+	 * Checks if target entry is empty target.
+	 * @return <code>true</code> if target entry is empty, otherwise <code>false</code>.
+	 */
+	public boolean isEmptyTarget() {
+		return (getStatus() == BuildTargetStatusEnum.EEmptyTarget);
+	}
+	
+	/**
+	 * Checks if target entry is supported target.
+	 * @return <code>true</code> if target entry is empty, otherwise <code>false</code>.
+	 */
+	public boolean isSupportedTarget() {
+		return (getStatus() != BuildTargetStatusEnum.ENotSupported);
+	}		
+	
+	/**
+	 * Gets name of the build target without build type information.
+	 * @return name of the build target without build type information.
+	 */
+	public String getTargetName() {
+		return targetEntryInfo.getTargetType();
+	}
+
+	/**
+	 * Get build target's build type.
+	 * @return build target's build type.
+	 */
+	public IBuildType getBuildType() {
+		return targetEntryInfo.getBuildType();
+	}
+	
+	/**
+	 * Compares if given target platform and build type combination
+	 * equals this build target entry.
+	 * @param buildTargetName Target platform name.
+	 * @param buildTypeString Build type string.
+	 * @return <code>true</code> if combination equals this object.
+	 */
+	public boolean equals(String buildTargetName, String buildTypeString) {
+		// Build targets are considered as equal if both
+		// build target name and build type name matches.
+		return (
+				(getTargetName().equalsIgnoreCase(buildTargetName))
+				&&
+				(getBuildType().getBuildTypeName().equalsIgnoreCase(buildTypeString))
+				);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetEntryInfo.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.swt.SWTException;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.wizards.BuildTargetEntry.BuildTargetStatusEnum;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * This build target info object can be bound with UI object
+ * presenting build target related info, but this class binds
+ * <code>BuildTargetEntry</code> class into concrete world
+ * and provides information for it about the real build target.
+ * @see BuildTargetEntry
+ */
+public class BuildTargetEntryInfo implements ICacheIndexCreatorObserver {
+	
+	//
+	// Public constants
+	//
+	/**
+	 * Constant for unresolved component count.
+	 */
+	public static final int UNRESOLVED_COMPONENT_COUNT = -1;
+		
+	//
+	// Constants and members
+	//
+		
+	/**
+	 * Target type of the available build target e.g. armv5 Release.
+	 */
+	private ITargetPlatform targetPlatform;
+	
+	/**
+	 * Target's build type (urel/udeb).
+	 */
+	private IBuildType buildType;
+	
+	/**
+	 * Build target status. Initially unresolved.
+	 */
+	private BuildTargetStatusEnum status = BuildTargetStatusEnum.EUnresolved;
+
+	/**
+	 * Amount of components found from the target. 
+	 */
+	private int componentCount = UNRESOLVED_COMPONENT_COUNT;
+
+	/**
+	 * SDK information object the target belongs to.
+	 */
+	private final SdkInformation sdkInfo;
+	
+	/**
+	 * Currently used settings.
+	 */
+	private final AppDepSettings settings;
+
+	/**
+	 * Interface to notify about need to refresh UI.
+	 * Used to notify component count finishing for the target.
+	 */
+	private final IRefreshable notifyUIRefreshIf;
+
+	/**
+	 * Constructor.
+	 * @param settings Currently active settings. 
+	 * @param notifyUIRefreshIf Interface to notify about need to refresh UI. Used to notify component count finishing for the target.
+	 * @param sdkInfo SDK information object the target belongs to.
+	 * @param targetType target type of the available build target e.g. armv5 Release 
+	 * @param buildType target's build type (urel/udeb).
+	 * @param isSuppported set to <code>true</code> if target type is supported, otherwise <code>false</code>.
+	 */
+	public BuildTargetEntryInfo(IRefreshable notifyUIRefreshIf, AppDepSettings settings, SdkInformation sdkInfo, ITargetPlatform targetType, IBuildType buildType, boolean isSuppported){
+		validateArguments(notifyUIRefreshIf, settings, sdkInfo, targetType, buildType);
+		this.notifyUIRefreshIf = notifyUIRefreshIf;
+		this.settings = settings;
+		this.sdkInfo = sdkInfo;
+		this.targetPlatform = targetType;
+		this.buildType = buildType;
+		if(!isSuppported){
+			// In case target is not supported => no need to resolve any other information further
+			this.status = BuildTargetStatusEnum.ENotSupported;
+		}
+	}
+
+	/**
+	 * Validates that entry fields passed have some values.
+	 * @param notifyUIRefreshIf Interface to notify about need to refresh UI. Used to notify component count finishing for the target.
+	 * @param settings Currently active settings. 
+	 * @param sdkInfo SDK information object the target belongs to.
+	 * @param targetType target type of the available build target e.g. armv5 Release 
+	 * @param buildType target's build type (urel/udeb).
+	 * @throws IllegalArgumentException
+	 */
+	private void validateArguments(IRefreshable notifyUIRefreshIf, AppDepSettings settings, SdkInformation sdkInfo, ITargetPlatform targetType, IBuildType buildType) throws IllegalArgumentException{
+		if( (notifyUIRefreshIf == null || settings == null || sdkInfo == null || targetType == null || buildType == null)){
+			throw new IllegalArgumentException(new String(Messages.getString("BuildTargetEntryInfo.BuildTargetInfoValidateFailed_ErrMsg"))); //$NON-NLS-1$
+			}
+	}
+	
+	/**
+	 * @return the targetType
+	 */
+	public String getTargetType() {
+		return targetPlatform.getId();
+	}
+
+	/**
+	 * Get build target's build type.
+	 * @return build target's build type.
+	 */
+	public IBuildType getBuildType() {
+		return buildType;
+	}
+	
+	/**
+	 * Gets status for the entry.
+	 * @return status for the entry.
+	 */
+	public BuildTargetStatusEnum getStatus() {
+		if(status != BuildTargetStatusEnum.ENotSupported){
+			checkAndUpdateTargetStatus();
+		}
+		return status;
+	}
+	
+	/**
+	 * Checks current build target status and updates status field accordingly.
+	 */
+	private void checkAndUpdateTargetStatus() {
+		
+		// By default cache is not yet created for target or not under creation.
+		BuildTargetStatusEnum resolveStatus = BuildTargetStatusEnum.ENoCache;
+		
+		// Resolving current target status
+		if(getComponentCount() == 0){
+			resolveStatus = BuildTargetStatusEnum.EEmptyTarget;
+		}		
+		else if (settings.isCacheGenerationOngoingForTarget(sdkInfo, targetPlatform.getId(), buildType)){
+			resolveStatus = BuildTargetStatusEnum.ECacheIsBeingGenerated;				
+		}			
+		else if (isTargetCached()){						
+			String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathNameForSdkAndPlatform(
+																									sdkInfo,
+																									targetPlatform.getId(),
+																									buildType
+																								);
+			if (! CacheIndex.cacheIndexCreatedFor(cacheFileAbsolutePathName)){
+				resolveStatus = BuildTargetStatusEnum.ECachesIsBeingIndexed;									
+			}		
+			else if(settings.cacheNeedsUpdate(sdkInfo, new ITargetPlatform[]{targetPlatform}, buildType)){
+				resolveStatus = BuildTargetStatusEnum.ECacheNeedsUpdate;									
+			}
+			else{
+				resolveStatus = BuildTargetStatusEnum.ECacheReady;									
+			}
+		}			
+		// Updating status field with latest status info
+		status = resolveStatus;								
+	}
+
+	/**
+	 * Gets component count for the entry.
+	 * @return component count for the entry.
+	 */
+	public int getComponentCount() {
+		// Getting component count only once
+		if(componentCount == UNRESOLVED_COMPONENT_COUNT){
+			getComponentCountForSdkAndPlatform(settings, sdkInfo, targetPlatform.getId(), buildType);
+		}
+		return componentCount;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.ICacheIndexCreatorObserver#cacheIndexCreated(com.nokia.s60tools.appdep.core.data.CacheIndex)
+	 */
+	public void cacheIndexCreated(CacheIndex cacheIndexObj) {
+		// Not needing this information now but may be useful later on to get handle to created index object.
+	}
+
+	/**
+	 * Checks targets caching status. 
+	 * @return Returns <code>true</code> if target is cached, otherwise <code>false</code>.
+	 */
+	public boolean isTargetCached() {
+		return settings.isTargetPlatformCached(sdkInfo.getSdkId(), targetPlatform.getId(), buildType);
+	}
+	
+	/**
+	 * Gets component count for the target build pointed by given 
+	 * parameters. This is wrapper method for the corresponding method
+	 * in AppDepSettings class.
+	 * 
+	 * NOTE: The query may take some time! Therefore the actual query
+	 * is run in background thread withouth blockin UI.
+	 * 
+	 * @param settings Used AppDep settings. 
+	 * @param sdkInfo	SDK information for the queried SDK/Platform
+	 * @param targetName Target from the SDK/Platform.
+	 * @param buildType Build type for the target.
+	 * @return Component count for the selected target and build type.
+	 * @see com.nokia.s60tools.appdep.core.AppDepSettings#getComponentCountForSdkAndPlatform
+	 */
+	void getComponentCountForSdkAndPlatform(AppDepSettings settings, SdkInformation sdkInfo, 
+			                               String targetName, IBuildType buildType){
+		
+		final AppDepSettings settingsFinal = settings;
+		final SdkInformation sdkInfoFinal = sdkInfo; 
+        final String targetNameFinal = targetName;
+        final IBuildType buildTypeFinal = buildType;
+		
+		Thread queryComponentCountRunnable = new Thread(){
+			public void run(){
+				// Triggering component count calculation
+				int count = settingsFinal.getComponentCountForSdkAndPlatform(sdkInfoFinal, 
+						                                    targetNameFinal,
+						                                    buildTypeFinal);
+				// Updating component count member variable
+				componentCount = count;
+				// Requesting UI refresh
+				notifyUiRefresh();
+			}
+		};
+		// Run component
+		queryComponentCountRunnable.start();		
+	}
+
+	/**
+	 * Notifies UI to refresh itself.
+	 */
+	private void notifyUiRefresh() {
+		Runnable queryComponentCountRunnable = new Runnable(){
+			public void run(){
+				try {
+					notifyUIRefreshIf.refresh();					
+				} catch (SWTException e) {
+					// We'll get 'SWTException: Widget is disposed' exceptions whenever
+					// wizard dialog's page has been closed and try to do refresh.
+					// This exception can be therefore ignored safely.
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		};
+		// Refresh request is scheduled to UI thread because there is need to modify 
+		// UI components which cannot be done from background thread.
+		PlatformUI.getWorkbench().getDisplay().asyncExec(queryComponentCountRunnable);		
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetSelectionBuildTypeFilter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * Filters Build Target Selection -wizard page content based on the build type.
+ */
+public class BuildTargetSelectionBuildTypeFilter extends ViewerFilter {
+
+	/**
+	 * Mode for the filtering.
+	 */
+	public enum BuildTargetFilterModeEnum{
+		EShowReleaseTargets,
+		EShowDebugTargets
+	}
+
+	/**
+	 * Current filter mode.
+	 */
+	private BuildTargetFilterModeEnum filterMode;
+
+	/**
+	 * Constructor.
+	 * @param filterMode Initial filter mode used.
+	 */
+	public BuildTargetSelectionBuildTypeFilter(BuildTargetFilterModeEnum filterMode) {
+		super();
+		this.filterMode = filterMode;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		BuildTargetEntry targetEntry = (BuildTargetEntry) element;
+		if(filterMode == BuildTargetFilterModeEnum.EShowReleaseTargets){
+			return targetEntry.isReleaseTarget();
+		}
+		// Otherwise filter is in debug filter mode
+		return !targetEntry.isReleaseTarget();
+	}
+
+	/**
+	 * Sets filter mode to be used.
+	 * @param filterMode filter mode
+	 */
+	public void setFilterMode(BuildTargetFilterModeEnum filterMode) {
+		this.filterMode = filterMode;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetSelectionNonEmptyAndNonSuppTargetFilter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * Accepts in Build Target Selection -wizard page only the targets
+ * that are non-empty or supported.
+ * 
+ * The enabling and disabling of filter is managed using <code>setFilterEnabled</code>
+ * method because using <code>addFilter</code> and <code>removeFilter</code> methods
+ * did not produce wanted UI behavior (transient state while adding/removing could be
+ * detected by user by flicker and showing temporarily unwanted data set before filter
+ * was fully applied).
+ */
+public class BuildTargetSelectionNonEmptyAndNonSuppTargetFilter extends ViewerFilter {
+
+	
+	/**
+	 * By default the filter is enabled.
+	 */
+	boolean isFilterEnabled = true;
+	
+	/**
+	 * Constructor.
+	 * @param isFilterEnabled set to <code>true</code> to enable filter
+	 *                        and to <code>false</code> to disable filter.
+	 */
+	public BuildTargetSelectionNonEmptyAndNonSuppTargetFilter(boolean isFilterEnabled){
+		this.isFilterEnabled = isFilterEnabled;		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		BuildTargetEntry targetEntry = (BuildTargetEntry) element;
+		// If filter is enabled...
+		if(isFilterEnabled){
+			// The target entry must be both
+			// - non-empty target, and
+			// - supported one.
+			return (!targetEntry.isEmptyTarget()) && (targetEntry.isSupportedTarget());	
+		}
+		// Otherwise accepting all
+		return true;
+	}
+
+	/**
+	 * Sets filter into enabled or disabled state.
+	 * @param isFilterEnabled set to <code>true</code> to enable filter
+	 *                        and to <code>false</code> to disable filter.
+	 */
+	public void setFilterEnabled(boolean isFilterEnabled) {
+		this.isFilterEnabled = isFilterEnabled;
+	}
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/BuildTargetTableViewerSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,84 @@
+/*
+* 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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+
+/**
+ * Sorter implementation for build target entry data.
+ */
+public class BuildTargetTableViewerSorter extends S60ToolsViewerSorter {
+
+	//
+	// Sorting criteria constants
+	//
+	public static final int CRITERIA_TARGET_TYPE = 1;
+	public static final int CRITERIA_COMPONENT_COUNT = 2;
+	public static final int CRITERIA_STATUS = 3;
+
+	public BuildTargetTableViewerSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NO_SORT);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int compRes = 0;
+		
+		BuildTargetEntry entry1 = (BuildTargetEntry) e1;
+		BuildTargetEntry entry2 = (BuildTargetEntry) e2;
+		
+		switch (sortCriteria) {
+
+		case CRITERIA_TARGET_TYPE:
+			compRes = alphabeticSort(entry1.getTargetDescription(), entry2.getTargetDescription());
+			break;
+			
+		case CRITERIA_COMPONENT_COUNT:
+			compRes = numericSortFromDecString(entry1.getComponentCount(), entry2.getComponentCount());
+			break;
+
+		case CRITERIA_STATUS:
+			compRes = alphabeticSort(entry1.getStatusAsString(), entry2.getStatusAsString());
+			break;
+			
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:			
+			AppDepConsole.getInstance()
+					.println(
+							Messages.getString("BuildTargetTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg") + sortCriteria, //$NON-NLS-1$
+							AppDepConsole.MSG_ERROR);
+			break;
+		}
+				
+		return compRes;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/CacheGenerationOptionsWizardPage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,304 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+
+
+import java.util.ArrayList;
+
+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.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 com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.CacheGenerationOptions;
+import com.nokia.s60tools.appdep.core.IToolchain;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.ui.wizards.S60ToolsWizardPage;
+
+
+/**
+ * Cache generation options wizard implementation.
+ */
+public class CacheGenerationOptionsWizardPage extends S60ToolsWizardPage implements SelectionListener, 
+																					IRefreshable {
+	
+	//
+	// Constants
+	//
+	private static final int labelFieldStyleBits = SWT.LEFT;
+	  
+	//
+	// Members
+	//
+	private Label comboTitleLabel;
+    private Combo toolchainSelCombo;
+    private IToolchain[] toolchainsVisibleInCombo;
+	private Label spacerText;
+	private Group importLibraryGroup;
+	private Button useDsoFiles;
+	private Button useLibFiles;
+
+	/**
+	 * Constructor
+	 */
+	public CacheGenerationOptionsWizardPage(){
+			super(Messages.getString("CacheGenerationOptionsWizardPage.Window_Title"));		  //$NON-NLS-1$
+			
+			setTitle(Messages.getString("CacheGenerationOptionsWizardPage.Page_Title")); //$NON-NLS-1$
+			
+			setDescription(Messages.getString("CacheGenerationOptionsWizardPage.Finish_Button_InfoMsg")); //$NON-NLS-1$
+
+			// User cannot finish the page before some valid 
+			// selection is made.
+			setPageComplete(false);
+	 }
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		
+	  Composite c = new Composite(parent, SWT.NONE);
+	  
+	  final int cols = 1;	  
+	  GridLayout gdl = new GridLayout(cols, false);
+	  GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+	  c.setLayout(gdl);
+	  c.setLayoutData(gd);
+	  
+	  //
+	  // Creating controls
+	  //
+	  	  
+	  // Creating UI for cache generation options
+	  createCacheCreationOptionControls(c, cols);
+	  
+	  setInitialFocus();
+	  
+	  // Setting control for this page
+	  setControl(c);
+	  
+      // Setting context help IDs		
+      AppDepPlugin.setContextSensitiveHelpID(getControl(), AppDepHelpContextIDs.APPDEP_WIZARD_PAGE_CACHE_GEN_OPT);
+	}
+
+	/**
+	 * Creates UI for cache generation options.
+	 * @param parentComposite Parent composite control.
+	 * @param cols Number of columns to fit grid layout into.
+	 */
+	private void createCacheCreationOptionControls(Composite parentComposite, final int cols) {
+		
+		  // Creating toolchain selection combobox
+		  comboTitleLabel = new Label(parentComposite, SWT.LEFT);
+
+		  comboTitleLabel.setText(Messages.getString("CacheGenerationOptionsWizardPage.ToolchainSelCombo_Title_Label_Text")); //$NON-NLS-1$
+	  		  
+		  toolchainSelCombo = new Combo(parentComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+		  toolchainSelCombo.setText(Messages.getString("CacheGenerationOptionsWizardPage.ToolchainSelCombo_Text")); //$NON-NLS-1$
+		  toolchainSelCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		  
+		  // Creating spacer
+		  spacerText = new Label(parentComposite, labelFieldStyleBits);
+		  spacerText.setText(" "); //$NON-NLS-1$
+		  GridData gdSpacer = new GridData(GridData.FILL_HORIZONTAL);
+		  gdSpacer.heightHint = 2;
+		  spacerText.setLayoutData(gdSpacer);
+		  
+		  // Creating import library selection group within contents
+		  importLibraryGroup = new Group(parentComposite, SWT.SHADOW_NONE);
+
+		  importLibraryGroup.setText(Messages.getString("CacheGenerationOptionsWizardPage.ImportLibraryGroupd_Text")); //$NON-NLS-1$
+		  GridLayout gdl2 = new GridLayout(cols, false);
+		  GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+		  importLibraryGroup.setLayout(gdl2);
+		  importLibraryGroup.setLayoutData(gd2);
+		  
+		  useDsoFiles = new Button(importLibraryGroup, SWT.RADIO);
+
+		  useDsoFiles.setText(Messages.getString("CacheGenerationOptionsWizardPage.UseDsoFile_RadioButton_Text")); //$NON-NLS-1$
+		  useDsoFiles.setSelection(true);
+		  useDsoFiles.addSelectionListener(this);
+		  useLibFiles = new Button(importLibraryGroup, SWT.RADIO);
+
+		  useLibFiles.setText(Messages.getString("CacheGenerationOptionsWizardPage.UseImportLibrary_RadioButton_Text")); //$NON-NLS-1$
+		  useLibFiles.setSelection(false);
+		  useLibFiles.addSelectionListener(this);		  		  
+
+		  // Assuring wanted tab navigation order by settings tab list
+		  Control[] tabList = new Control[]{ toolchainSelCombo, importLibraryGroup };
+		  parentComposite.setTabList(tabList);
+	}
+
+	/**
+	 * Disables cache the use of cache generation options. 
+	 */
+	public void disableCacheGenerationOptions() {
+		useDsoFiles.setEnabled(false);
+		useLibFiles.setEnabled(false);
+		toolchainSelCombo.setEnabled(false);
+	}	
+
+	/**
+	 * Initializes cache generation options that are available based on the 
+	 * currently selected build target. 
+	 */
+	public void setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget() {
+		try {
+			
+		  // Getting supported toolchains
+		  AppDepSettings st = AppDepSettings.getActiveSettings();
+		  IToolchain[] toolchainArr;
+		  toolchainArr = st.getSupportedToolchainsForCurrentlyUsedTargets();
+		  
+		  // Enabling fields
+		  toolchainSelCombo.setEnabled(true);
+		  useLibFiles.setEnabled(true);
+		  useDsoFiles.setEnabled(true);
+		  
+		  // There is always at least one toolchain in the array
+		  if(toolchainArr.length == 1
+		     && 
+		     toolchainArr[0].getToolchainName().equalsIgnoreCase(AppDepSettings.STR_GCC)){
+			    // GCC toolchain uses always lib-files
+				useLibFiles.setSelection(true);
+				useDsoFiles.setSelection(false);											  
+				useLibFiles.setEnabled(false);
+				useDsoFiles.setEnabled(false);
+		  }
+		  else{
+			    // For other the user can select
+				useDsoFiles.setSelection(true);
+				useLibFiles.setSelection(false);											  
+		  }
+		  
+		  // Clearing and then filling the combobox
+		  toolchainSelCombo.removeAll();
+		  toolchainsVisibleInCombo = null;
+		  ArrayList<IToolchain> installedToolchains = new ArrayList<IToolchain>();
+		  int defaultToolchainIndex = 0;
+		  for (int i = 0; i < toolchainArr.length; i++) {
+			IToolchain toolchain = toolchainArr[i];
+			if(toolchain.isInstalled()){
+				String toolchainDescription = toolchain.getToolchainDescription();
+				String version = toolchain.getVersion();
+				if(version != null){
+					// Showing also version info, if available
+					toolchainDescription = toolchainDescription + " " + version;//$NON-NLS-1$
+				}
+				toolchainSelCombo.add(toolchainDescription);	
+				installedToolchains.add(toolchain);
+			}
+			if(toolchain.isDefault()){
+				defaultToolchainIndex = i;
+			}		
+		  }	  
+		  toolchainSelCombo.select(defaultToolchainIndex);
+		  // Storing the list of installed toolchains
+		  toolchainsVisibleInCombo = (IToolchain[]) installedToolchains.toArray(new IToolchain[0]);
+		  
+		} catch (InvalidCmdLineToolSettingException e) {
+			e.printStackTrace();
+		}
+		  
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#setInitialFocus()
+	 */
+	public void setInitialFocus() {
+		toolchainSelCombo.setFocus();			
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public void recalculateButtonStates() {
+		// This is an abstract method inherited/implemented from S60ToolsWizardPage
+		// and has to exist even there is nothing to do when this is called.
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		try {
+			if(event.widget.equals(useDsoFiles)){
+				useDsoFiles.setSelection(true);
+				useLibFiles.setSelection(false);								
+			}
+			else if(event.widget.equals(useLibFiles)){
+				useLibFiles.setSelection(true);
+				useDsoFiles.setSelection(false);								
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent event) {
+		// We can ignore this		
+	}
+		
+	/**
+	 * Gets the selected toolchain.
+	 * @return selected toolchain
+	 */
+	public IToolchain getCacheGenerationToolchain() {
+		return toolchainsVisibleInCombo[toolchainSelCombo.getSelectionIndex()];
+	}
+
+	/**
+	 * Gets the selected library type.
+	 * @return selected library type
+	 */
+	public int getCacheGenerationLibType() {
+		if(useDsoFiles.getSelection()){
+			return CacheGenerationOptions.USE_DSO_FILES;
+		}
+		else{
+			return CacheGenerationOptions.USE_LIB_FILES;			
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.IRefreshable#refresh()
+	 */
+	public void refresh() {
+		// This is a common interface for all SDK selection wizard pages.
+	}
+	
+} // class CacheGenerationOptionsWizardPage
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ComponentTableViewerSorter.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsViewerSorter;
+
+/**
+ * Sorter implementation for build target entry data.
+ */
+public class ComponentTableViewerSorter extends S60ToolsViewerSorter {
+
+	//
+	// Sorting criteria constants
+	//
+	public static final int CRITERIA_NAME = 1;
+	public static final int CRITERIA_TARGET_TYPE = 2;
+	public static final int CRITERIA_DATE_CACHED = 3;
+
+	public ComponentTableViewerSorter() {
+		super();		
+		// By default we are not sorting the information
+		setSortCriteria(CRITERIA_NAME);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		
+		// By default comparison does not do any ordering
+		int compRes = 0;
+		
+		ComponentListNode entry1 = (ComponentListNode) e1;
+		ComponentListNode entry2 = (ComponentListNode) e2;
+		
+		switch (sortCriteria) {
+
+		case CRITERIA_NAME:
+			compRes = alphabeticSort(entry1.getComponentName(), entry2.getComponentName());
+			break;
+
+		case CRITERIA_TARGET_TYPE:
+			compRes = alphabeticSort(entry1.getBuildTargetTypeAsString(), entry2.getBuildTargetTypeAsString());
+			break;
+			
+		case CRITERIA_DATE_CACHED:
+			compRes = numericSort(entry1.getCachedComponentModificationTimestamp(), entry2.getCachedComponentModificationTimestamp());
+			break;
+			
+		case CRITERIA_NO_SORT:
+			// No sorting criteria defined.
+			break;
+
+		default:			
+			AppDepConsole.getInstance()
+					.println(
+							Messages.getString("ComponentTableViewerSorter.Unexpected_Sort_Criteria_ErrMsg") + sortCriteria, //$NON-NLS-1$
+							AppDepConsole.MSG_ERROR);
+			break;
+		}
+				
+		return compRes;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ICacheIndexCreatorObserver.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+
+/**
+ * Notifies cache index creator observers about cache creation.
+ */
+public interface ICacheIndexCreatorObserver {
+	/**
+	 * Cache index was created for the passed object.
+	 * @param cacheIndexObj Cache index object just created.
+	 */
+	public void cacheIndexCreated(CacheIndex cacheIndexObj);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/IRefreshable.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.s60tools.appdep.ui.wizards;
+
+/**
+ * Interface enabling refreshing of object's information. 
+ */
+public interface IRefreshable {
+	/**
+	 * Refreshes the information hold or/and shown by object.
+	 */
+	public void refresh();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/ISelectSDKWizard.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,95 @@
+/*
+* 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.appdep.ui.wizards;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.wizard.IWizard;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+
+/**
+ * AppDep specific extensions to IWizard interface.
+ */
+public interface ISelectSDKWizard extends IWizard {
+
+	/**
+	 * In here is listed all the possible exit
+	 * status codes for the wizards that implement
+	 * this interface. Values are starting from 100
+	 * in order not to overlap with normally used
+	 * UI constants.
+	 */
+	public static final int FINISH_CACHE_CREATION = 100;
+	public static final int FINISH_COMPONENT_SELECTED = 200;
+	public static final int CANCEL = 300;
+	
+	/**
+	 * Gets exit status for the wizard.
+	 * @return Exit status for the wizard.
+	 */
+	public int getExitStatus();
+
+	/**
+	 * Gets component iterator for the currently configured/selected.
+	 * SDK/Target Platform.
+	 * @param duplicateItemsList Out parameter that contains the list of duplicate
+	 *                           components found from the selected targets.
+	 * @return Component Iterator, or <code>null</code> if component 
+	 *         iterator cannot be built.
+	 */
+	public Iterator<ComponentListNode> getComponentIterator(
+			List<String> duplicateItemsList);
+
+	/**
+	 * Gets settings object used by this wizard instance.
+	 * @return settings object used by this wizard instance.
+	 */
+	public AppDepSettings getSettings();
+
+	/**
+	 * Updates currently selected component name.
+	 * @param componentName Name of the component to be set as selected one.
+	 * @param targetPlatform Target platform of the component to be set as selected one. 
+	 */
+	public void updateAnalyzedComponentSelection(String componentName, ITargetPlatform targetPlatform);
+
+	/**
+	 * Sets canFinish flag to <code>true</code> and updates exit status.
+	 * @param exitStatus New exist status.
+	 */
+	public void enableCanFinish(int exitStatus);
+
+	/**
+	 * Sets canFinish flag <code>false</code> and updates exit status
+	 * by default to <code>IAppDepWizard.CANCEL</code>.
+	 */
+	public void disableCanFinish();
+
+	/**
+	 * Delegate method for initializes cache generation options that are available 
+	 * based on the currently selected build target. 
+	 * @see com.nokia.s60tools.appdep.ui.wizards.CacheGenerationOptionsWizardPage#setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget()
+	 */
+	public void setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/InvisibleRootNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,94 @@
+/*
+* 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.appdep.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * SDK Selection tree view's invisible root component used to add
+ * actual user visible data.
+ */
+class InvisibleRootNode extends TreeViewNode{
+
+	/**
+	 * SDK node objects owned by the root node.
+	 */
+	private ArrayList<SdkTreeViewNode> sdkList = null;
+	
+	/**
+	 * Adds new node.
+	 * @param sdkNode Node to add.
+	 */
+	public void addSdkNode(SdkTreeViewNode sdkNode){
+		sdkList.add(sdkNode);
+	}
+	
+	/**
+	 * Constructor.
+	 */
+	public InvisibleRootNode(){	
+		super(null);
+		sdkList = new ArrayList<SdkTreeViewNode>();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.TreeViewNode#getChildren()
+	 */
+	public Object[] getChildren() {
+		return sdkList.toArray();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.TreeViewNode#hasChildren()
+	 */
+	public boolean hasChildren() {
+		return (sdkList.size() > 0);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * Tries to find tree viewer node that matches
+	 * with the given parameters.
+	 * @param sdkIdString Id string of the SDK.
+	 * @return Returns the matching object if it was found, 
+	 *         otherwise return <code>null</code>.
+	 */
+	public Object find(String sdkIdString) {
+		for (Iterator<SdkTreeViewNode> iter = sdkList.iterator(); iter.hasNext();) {
+			SdkTreeViewNode sdkNode = iter.next();
+			Object obj = sdkNode.find(sdkIdString);
+			if(obj != null){
+				return obj;
+			}
+		}
+		// No matches were found
+		return null;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SdkTreeViewNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,98 @@
+/*
+* 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.appdep.ui.wizards;
+
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * Represents SDK node in SDK selection wizard's tree view 
+ */
+class SdkTreeViewNode  extends TreeViewNode{
+
+	/**
+	 * Empty object array returned whenever there is no content.
+	 */
+	static Object[] EMPTY_ARRAY = new Object[0];
+	
+	/**
+	 * SDK information object storing SDK data for .
+	 */
+	private SdkInformation sdkInfo = null;
+	
+	/**
+	 * Constructor.
+	 * @param sdkInfo SDK info object.
+	 * @param parent Parent node.
+	 */
+	public SdkTreeViewNode(SdkInformation sdkInfo, TreeViewNode parent){
+		super(parent);
+		this.sdkInfo = sdkInfo;
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.TreeViewNode#getChildren()
+	 */
+	public Object[] getChildren() {
+		return EMPTY_ARRAY;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.TreeViewNode#hasChildren()
+	 */
+	public boolean hasChildren() {
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		if(sdkInfo != null){
+			return sdkInfo.getSdkId();				
+		}
+		return null;
+	}
+
+	/**
+	 * Gets SDK information objecct for the node.
+	 * @return SDK information objecct for the node.
+	 */
+	public SdkInformation getSdkInfo() {
+		return sdkInfo;
+	}
+
+	/**
+	 * Tries to find tree viewer node that matches
+	 * with the given parameters.
+	 * @param sdkIdString Id string of the SDK.
+	 * @return Returns the matching object if it was found, 
+	 *         otherwise return <code>null</code>.
+	 */
+	public Object find(String sdkIdString) {
+		if(sdkInfo.getSdkId().equalsIgnoreCase(sdkIdString)){
+			// Match found
+			return this;
+		}
+		// Not matching
+		return null;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,1171 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+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.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.ICacheIndexListener;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.core.job.IJobCompletionListener;
+import com.nokia.s60tools.appdep.core.job.IManageableJob;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AddSISFilesDialog;
+import com.nokia.s60tools.appdep.ui.wizards.BuildTargetEntry.BuildTargetStatusEnum;
+import com.nokia.s60tools.appdep.ui.wizards.BuildTargetSelectionBuildTypeFilter.BuildTargetFilterModeEnum;
+import com.nokia.s60tools.appdep.util.LogUtils;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.ui.S60ToolsTable;
+import com.nokia.s60tools.ui.S60ToolsTableColumnData;
+import com.nokia.s60tools.ui.S60ToolsTableFactory;
+import com.nokia.s60tools.ui.wizards.S60ToolsWizardPage;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+
+/**
+ * Wizard page showing the available targets among which 
+ * the user select a target(s) for seeking components to analyze. 
+ */
+public class SelectBuildTargetWizardPage extends S60ToolsWizardPage implements SelectionListener,
+												   IJobCompletionListener,
+                                                   FocusListener,
+                                                   ICacheIndexListener, 
+                                                   IRefreshable{	
+	//
+	// Constants
+	//
+	
+	/**
+	 * Build type text for release (urel) builds.
+	 */
+	private static final String BUILD_TYPE_RELEASE_STR = Messages.getString("SelectBuildTargetWizardPage.BuildType_Release_InfoMsg");	 //$NON-NLS-1$
+	
+	/**
+	 * Build type text for release (urel) builds.
+	 */
+	private static final String BUILD_TYPE_DEBUG_STR = Messages.getString("SelectBuildTargetWizardPage.BuildType_Debug_InfoMsg");	 //$NON-NLS-1$
+
+	/**
+	 * Style bits used for read only labels.
+	 */
+	private static final int READ_ONLY_LABEL_FIELD_STYLEBITS = SWT.READ_ONLY | SWT.NO_FOCUS;
+	  
+	
+	/**
+	 * States used to store the button state
+	 * result based on the multiselection.
+	 * The actual resolution of button statuses
+	 * is done after the state for current selection
+	 * is resolved.
+	 * 
+	 * Cancel can be pressed in wizard regardless of the state.
+	 * The order of the state's under this enumerator is IMPORTANT!
+	 * Because values run from 0...N the states with bigger value
+	 * are regarded as more important problems to be reported to 
+	 * a user in case there are more than one problem issue in 
+	 * multiselection. I.e. problems that prohibit proceeding 
+	 * in the wizard.
+	 */
+	private enum TargetSelStateEnum {
+						 EStateNotSet,                        // Initial state that should not exist after target check.
+						 EAllTargetCachesUpToDate, 	          // => Can press Next not Finish,
+						 ECacheNotGeneratedForSomeTarget,     // => Can press Next or Finish 
+						 ECacheNeedsUpdateForSomeTarget,      // => Can press Next or Finish 
+						 ESISFileCacheNeedsToBeGenerated, 	  // => Can press Next or Finish, generation will be started
+						 EDumpsisDoesNotExist,                // => Cannot press Next nor Finish, dumpsis.exe does not exist, checked when in SIS analysis mode
+						 EElftranDoesNotExist,                 // => Cannot press Next nor Finish
+						 ECachesIsBeingIndexedForSomeTarget,  // => Cannot press Next nor Finish
+						 ENoComponentsForSomeTarget,          // => Cannot press Next nor Finish
+						 EInvalidToolchainMix,                // => Cannot press Next nor Finish
+						 ESomeTargetNotSupported,             // => Cannot press Next nor Finish
+						 ESomeTargetStateNotResolved,         // => Cannot press Next nor Finish
+						 ECacheIsBeingGeneratedForSomeTarget // => Cannot press Next nor Finish, severity changed into this level because cache generation forbids actions for whole SDK 
+		 								};
+	
+	/**
+	 * Title for the currently selected SDK.
+	 */
+	private Text sdkNameFieldTitleText;
+	
+	/**
+	 * Name of the currently selected SDK.
+	 */
+	private Text sdkNameFieldValueText;
+		 								
+	/**
+	 * Title for the currently used build type.
+	 */
+	private Text buildTypeFieldTitleText;
+	
+	/**
+	 * Name of the currently the currently used build type.
+	 */
+	private Text buildTypeFieldValueText;
+		
+	/**
+	 * Viewer component for showing available targets.
+	 */
+	private CheckboxTableViewer buildTargetViewer;
+	
+	/**
+	 * Checkbox that can be used to toggle between showing
+	 * of release and debug build type targets.
+	 */
+	private Button showDebugTargetsInsteadOfReleaseTargetsCheckbox;
+	
+	/**
+	 * Checkbox that can be used to limit amount of showed 
+	 * targets into supported and non-empty ones.
+	 */
+	private Button showOnlySupportedAndNonEmptyTargetsCheckbox;
+	
+	/**
+	 * Content provider for the viewer component.
+	 */
+	private SelectBuildTargetWizardPageContentProvider contentProvider;
+	
+	/**
+	 * This field determines the current status for the selection of multiple
+	 * targets.
+	 * IMPORTANT: Value should be set always by using setSelectionState method, not directly
+	 *            unless purpose is to initialize, or re-initialize the value!
+	 */
+	private TargetSelStateEnum selectionState = TargetSelStateEnum.EStateNotSet;
+
+	/**
+	 * This filter is used to filter target viewer elements based on the build type.
+	 */
+	private BuildTargetSelectionBuildTypeFilter buildTypeFilter;
+
+	/**
+	 * Accepts in Build Target Selection -wizard page only the targets
+	 * that are non-empty or supported. 
+	 */
+	private BuildTargetSelectionNonEmptyAndNonSuppTargetFilter nonEmptyAndNonSuppTargetFilter;
+
+	/**
+	 * Set to <code>true</code> if programmatic selection is ongoing, otherwise <code>false</code>.
+	 * If programmatic selection is ongoing and therefore
+	 * not need to trigger similar event handling as due to UI selection.
+	 */
+	private boolean isProgrammaticSelectionOngoingFlag;
+	
+	/**
+	 * Open Add SIS files dialog -button
+	 */
+	private Button addSISFilesButton = null;
+	
+	 /**
+	 * Constructor.
+	 */
+	public SelectBuildTargetWizardPage(){
+		super(Messages.getString("SelectBuildTargetWizardPage.WizardPageName")); //$NON-NLS-1$
+
+		setTitle(Messages.getString("SelectBuildTargetWizardPage.WizardPageTitle"));			 //$NON-NLS-1$
+		setDescription(Messages.getString("SelectBuildTargetWizardPage.WizardPageDescription"));  //$NON-NLS-1$
+
+		// User cannot finish the page before some valid 
+		// selection is made.
+		setPageComplete(false);
+	 }
+
+	/**
+	 * Creates checkbox viewer component for showing build targets. 
+	 * @param parent Parent composite for the created composite.
+	 * @return New <code>CheckboxTableViewer</code> object instance.
+	 */
+	protected CheckboxTableViewer createBuildTargetTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectBuildTargetWizardPage.TargetType_ColumnText"), //$NON-NLS-1$
+														120,
+														BuildTargetEntry.TARGET_TYPE_COLUMN_INDEX,
+														BuildTargetTableViewerSorter.CRITERIA_TARGET_TYPE));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectBuildTargetWizardPage.ComponentCount_ColumnText"),  //$NON-NLS-1$
+														100,
+														BuildTargetEntry.COMPONENT_COUNT_COLUMN_INDEX,
+														BuildTargetTableViewerSorter.CRITERIA_COMPONENT_COUNT,
+														SWT.RIGHT));
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectBuildTargetWizardPage.Status_ColumnText"), //$NON-NLS-1$
+														160,
+														BuildTargetEntry.STATUS_COLUMN_INDEX,
+														BuildTargetTableViewerSorter.CRITERIA_STATUS));
+		
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		S60ToolsTable tbl = S60ToolsTableFactory.createCheckboxTable(parent, arr);
+		
+		CheckboxTableViewer tblViewer = new CheckboxTableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tblViewer;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+	
+	  // Creating one column only sub composite for controls 	
+	  Composite c = new Composite(parent, SWT.NONE); 	  
+	  final int cols = 1;	  
+	  GridLayout gdl = new GridLayout(cols, false);	  
+	  GridData gd = new GridData(GridData.FILL_BOTH);
+	  c.setLayout(gdl);
+	  c.setLayoutData(gd);
+	  
+	  // Creating grid layout composite for information labels
+	  Composite titleAreaComposite = new Composite(c, SWT.NONE);
+	  GridLayout gdl2 = new GridLayout(2, false);
+	  GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+	  titleAreaComposite.setLayout(gdl2);
+	  titleAreaComposite.setLayoutData(gd2);
+	  
+	  // Adding SDK and build type information labels
+	  addSDKInformationLabels(titleAreaComposite);	  
+	  addBuildTypeInformationLabels(titleAreaComposite);
+	  
+	  // Creating build target viewer component
+	  buildTargetViewer = createBuildTargetTableViewer(c);
+	  GridData targetViewerGd = new GridData(GridData.FILL_BOTH);
+	  buildTargetViewer.getControl().setLayoutData(targetViewerGd);
+	  buildTargetViewer.setSorter(new BuildTargetTableViewerSorter());
+	  
+	  // Adding checkboxes and Add SIS files -button inside a new composite object
+	  final int compBottomControlsCols = 2;
+	  Composite compBottomControls = new Composite(c, SWT.NONE);
+	  GridLayout gLToBottomControls = new GridLayout(compBottomControlsCols, false);
+	  compBottomControls.setLayout(gLToBottomControls);
+	  compBottomControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	  
+	  // Checkbox for showing debug build type targets instead of release targets
+	  String checkBoxLabelText = Messages.getString("SelectBuildTargetWizardPage.ShowDebugBuild_CheckboxCaptionText"); //$NON-NLS-1$
+	  // Creating viewer filter for doing filtering according build type	  
+	  buildTypeFilter = new BuildTargetSelectionBuildTypeFilter(BuildTargetFilterModeEnum.EShowReleaseTargets);
+	  showDebugTargetsInsteadOfReleaseTargetsCheckbox = addCheckBoxControl(compBottomControls, checkBoxLabelText, false, 
+			  															   buildTypeFilter, null);	 
+	  
+	  // Adding SIS file addition dialog launching button		
+	  addSISFilesButton = new Button(compBottomControls, SWT.PUSH );
+	  addSISFilesButton.setText(Messages.getString("SelectBuildTargetWizardPage.AddSISFile_BtnCaptionText"));  //$NON-NLS-1$
+	  addSISFilesButton.addSelectionListener(this);
+	  GridData gDToButton = new GridData(GridData.HORIZONTAL_ALIGN_END);
+	  addSISFilesButton.setLayoutData(gDToButton);
+	  
+	  // Checkbox for showing only supported and non-empty targets
+	  checkBoxLabelText = Messages.getString("SelectBuildTargetWizardPage.ShowSupportedAndNonEmptyTargets_CheckboxCaptionText"); //$NON-NLS-1$
+	  // Creating viewer filter for checkbox  
+	  nonEmptyAndNonSuppTargetFilter = new BuildTargetSelectionNonEmptyAndNonSuppTargetFilter(true);
+	  GridData cbLayoutData2 = new GridData(GridData.GRAB_HORIZONTAL);
+	  showOnlySupportedAndNonEmptyTargetsCheckbox = addCheckBoxControl(compBottomControls, checkBoxLabelText, true, 
+			  														   nonEmptyAndNonSuppTargetFilter, cbLayoutData2);	 
+	  
+	  // Providers cannot be created before all the controls have been created
+	  setProvidersAndListenersForBuildTargetViewer();
+	  
+	  // Setting initial focus of the wizard page
+	  setInitialFocus();
+	  
+	  // Setting control for this page
+	  setControl(c);
+	
+	  // Setting context help ID	
+      AppDepPlugin.setContextSensitiveHelpID(getControl(), AppDepHelpContextIDs.APPDEP_WIZARD_PAGE_BUILD_TARGET_SELECT);
+	}
+
+	/**
+	 * Adds checkbox control with given parameters.
+	 * @param compBottomControls Parent composite.
+	 * @param checkBoxLabelText	 Label text for the checkbox.
+	 * @param initialSelectionStatus set to <code>true</code> if initially selected, otherwise <code>false</code>. 
+	 * @param filter Filter to be applied related to checkbox, or <code>null</code> if not used.
+	 * @param gdData grid data to be applied related to checkbox, or <code>null</code> if not used.
+	 */
+	private Button addCheckBoxControl(Composite compBottomControls, String checkBoxLabelText, boolean initialSelectionStatus, 
+									  ViewerFilter filter, GridData gdData) {
+		  Button checkboxControl  = new Button(compBottomControls, SWT.CHECK);
+		  checkboxControl.setText(checkBoxLabelText);
+		  checkboxControl.setSelection(initialSelectionStatus); // By default showing release targets
+		  checkboxControl.addSelectionListener(this);
+		  if(filter != null){
+			  buildTargetViewer.addFilter(filter);			  
+		  }
+		  if(gdData != null){
+			  checkboxControl.setLayoutData(gdData);
+		  }
+		  return checkboxControl;
+	}
+
+	/**
+	 * Adds SDK information labels.
+	 * @param titleAreaComposite parent composite to labels.
+	 */
+	private void addSDKInformationLabels(Composite titleAreaComposite) {
+		  sdkNameFieldTitleText = new Text(titleAreaComposite, READ_ONLY_LABEL_FIELD_STYLEBITS);	  
+		  String titleText = Messages.getString("SelectBuildTargetWizardPage.SDK_Str") + ": "; //$NON-NLS-1$ //$NON-NLS-2$
+		  sdkNameFieldTitleText.setText(titleText); 
+		  sdkNameFieldTitleText.addFocusListener(this);
+		  sdkNameFieldValueText = new Text(titleAreaComposite, READ_ONLY_LABEL_FIELD_STYLEBITS);	  	  
+		  sdkNameFieldValueText.addFocusListener(this);
+		}
+
+	/**
+	 * Adds build type information labels.
+	 * @param titleAreaComposite parent composite to labels.
+	 */
+	private void addBuildTypeInformationLabels(Composite titleAreaComposite) {
+		buildTypeFieldTitleText = new Text(titleAreaComposite, READ_ONLY_LABEL_FIELD_STYLEBITS);
+		buildTypeFieldTitleText.setText(Messages.getString("SelectBuildTargetWizardPage.BuildType_Str") + ": ");	   //$NON-NLS-1$ //$NON-NLS-2$
+		buildTypeFieldTitleText.addFocusListener(this);	  
+		buildTypeFieldValueText = new Text(titleAreaComposite, READ_ONLY_LABEL_FIELD_STYLEBITS);
+		// Setting default build type value...
+		buildTypeFieldValueText.setText(BUILD_TYPE_RELEASE_STR);
+		// ...and storing the default value also to dialog settings
+		updateDialogSettings(SelectSDKWizard.BUILD_TYPE_DESCR_DLG_SETTING_KEY, BUILD_TYPE_RELEASE_STR);
+		buildTypeFieldValueText.addFocusListener(this);
+		}
+
+	/**
+	 * Sets providers and listeners for build target viewer control.
+	 */
+	private void setProvidersAndListenersForBuildTargetViewer() {
+		contentProvider = new SelectBuildTargetWizardPageContentProvider(this);
+		  buildTargetViewer.setContentProvider(contentProvider); 
+		  buildTargetViewer.setLabelProvider(new SelectBuildTargetWizardPageLabelProvider());
+		  buildTargetViewer.setInput(contentProvider);
+		  
+		  // Adding selection change listener
+		  buildTargetViewer.addSelectionChangedListener(new ISelectionChangedListener(){
+				/* (non-Javadoc)
+				 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+				 */
+				public void selectionChanged(SelectionChangedEvent event) {
+					// Triggering status recalculation only if non-programmatic selection
+					if(! isProgrammaticSelectionOngoing()){
+						 // Skipping programmatic selection because we are sure that event came from UI selection
+						recalculateButtonStates(true, null); 								
+					}
+				}
+
+		  });
+
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#setInitialFocus()
+	 */
+	public void setInitialFocus() {
+		buildTargetViewer.getTable().setFocus();			
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public void recalculateButtonStates() {
+		// By default we check, if programmatic selection is possible
+		recalculateButtonStates(false, null);		
+	}
+	
+	/**
+	 * Page specific recalculate buttons implementation.
+	 * @param skipProgrammaticSelectionCheck set to <code>true</code> if needed to skip, automatic programmatic
+	 * 										 selection based on current settings, otherwise set to <code>false</code>.
+	 * @param forceCheckedEntriesArr If this is not <code>null</code>, using these entries instead of current selection
+	 * 								 if current selection do not have any components (used in double-click event).			
+	 */
+	public void recalculateButtonStates(boolean skipProgrammaticSelectionCheck, Object[] forceCheckedEntriesArr) {
+
+		try {			
+			SelectSDKWizard wiz = (SelectSDKWizard) getWizard();
+			AppDepSettings settings = wiz.getSettings();
+			Object[] checkedEntriesArr = buildTargetViewer.getCheckedElements();; // Getting all checked targets
+			if(checkedEntriesArr.length == 0 && forceCheckedEntriesArr != null){
+				// Using forced target set instead
+				checkedEntriesArr = forceCheckedEntriesArr;								
+			}
+			
+			// Re-initializing selection state
+			selectionState = TargetSelStateEnum.EStateNotSet;
+			
+			// If programmatic selection is not skipped and there are no target nodes selected...
+			if( checkedEntriesArr.length == 0){
+				// Trying to make selection based on the settings if allowed according boolean flag
+				if(!skipProgrammaticSelectionCheck && makeProgrammaticElementCheckingBasedOnSettings(settings)){
+					// Getting all targets checked by programmatic selection
+					checkedEntriesArr = buildTargetViewer.getCheckedElements(); 
+					if(checkedEntriesArr.length == 0){
+						// Trying to avoid internal errors, but this is something that should be trapped during 
+						// development time. Internal error messages are not localized.
+						String errMsg = "Programmatic selection failed unexpectedly in class '" //$NON-NLS-1$
+										+ SelectBuildTargetWizardPage.class.getSimpleName()
+										+ "'."; //$NON-NLS-1$
+						LogUtils.logInternalErrorAndThrowException(errMsg);
+						return;
+					}
+				}
+				else{
+					// Failed to make programmatic selection, or programmatic selection was skipped.
+					// Making sure that no targets are selected in settings
+					settings.clearCurrentlyUsedTargetPlatforms();
+					// And showing initial message, because no items are selected currently
+					showInitialStateMessage(wiz);
+					//.. and returning
+					return; 
+				}
+			}
+
+			// Going through all the selected nodes one by one and setting selection state.	
+			// State can be multiple times during method execution because only more severe
+			// error state will override existing selection state. 
+			// See comment block from TargetSelStateEnum enumeration for detailed info.
+			List<BuildTargetEntry> selectedTargetsArr = new ArrayList<BuildTargetEntry>();
+			// SDK information is needed for finding out SDK supports required tools (dumpsis.exe and elftran.exe)
+			SdkInformation sdkInfo = getSelectedSdk();
+			
+			// Checking if we are in SIS mode and settings selection state if needed
+			checkSISModeStatusAndSetSelectionStateIfNeeded(settings, sdkInfo);
+						
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, "----- Checked items START ==>"); // //$NON-NLS-1$
+			
+			//Recalculate state based on the selection made by a user
+			for (int i = 0; i < checkedEntriesArr.length; i++) {
+				// Casting selected node to correct type
+				BuildTargetEntry targetEntry = (BuildTargetEntry) checkedEntriesArr[i];
+				// Debug printing checked items
+				DbgUtility.println(DbgUtility.PRIORITY_LOOP, targetEntry.getTargetDescription()); 
+				// Added target to target selection array
+				selectedTargetsArr.add(targetEntry);
+				// Resolves selection state based on target's status
+				BuildTargetStatusEnum status = targetEntry.getStatus();
+				setSelectionStateBasedOnTargetStatus(settings, sdkInfo, status, targetEntry.getTargetName());
+				
+				// In case we are about to generate/update cache files...
+				if(selectionState == TargetSelStateEnum.ECacheNotGeneratedForSomeTarget
+				    ||
+				   selectionState == TargetSelStateEnum.ECacheNeedsUpdateForSomeTarget
+				    ||
+				   selectionState == TargetSelStateEnum.ESISFileCacheNeedsToBeGenerated){					
+					//... we finally check, if we cannot start cache generation due to fact
+					// that there is already a cache generation process for this SDK ongoing.
+					if(settings.isCacheGenerationOngoingForSdk(sdkInfo)){
+						setSelectionState(TargetSelStateEnum.ECacheIsBeingGeneratedForSomeTarget);
+					}					
+				}				
+			} 
+			
+			DbgUtility.println(DbgUtility.PRIORITY_LOOP, "<== Checked items END -----"); // //$NON-NLS-1$
+			
+			// Checking that the selected combination is otherwise valid.
+			// Updates selection state accordingly. Must be called before
+			// page completion check and before settings button statuses.
+			CheckValidityOfTargetSelection(selectedTargetsArr, settings);
+			
+			// Storing user selection if we have a valid selection
+			boolean isPageCompleted = checkPageCompleteStatus();
+			
+			//If page is completed it means there is a valid selection existing
+			if(isPageCompleted){
+				// Storing user selection
+				wiz.setUserSelection(sdkInfo, selectedTargetsArr.toArray(new BuildTargetEntry[0]));
+			}			
+
+			// Setting buttons states and visible messages according selection state.
+			// Must be called before calling updateInformationForNextPage.
+			setUserMessageAndButtonState(wiz, isPageCompleted, selectedTargetsArr);		
+
+		} catch (Exception e) {
+			e.printStackTrace(); // Development time trace.
+			String errMsg = e.getMessage();
+			LogUtils.logStackTrace(errMsg , e); // Trace for production environment
+			throw new RuntimeException(errMsg); // Mapping exception to anonymous run-time error
+		}		
+	}
+
+	/**
+	 * Shows initial message in state when there are no checked items.
+	 * @param wiz Wizard instance for setting button statuses.
+	 */
+	private void showInitialStateMessage(SelectSDKWizard wiz) {
+		this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Startup_InfoMsg"));  //$NON-NLS-1$
+		this.setErrorMessage(null);
+		setPageComplete(false);
+		// Finishing is forbidden
+		wiz.disableCanFinish();																								
+	}
+
+	/**
+	 * Checks possible SIS mode and sets selections state if needed.
+	 * @param settings settings used to check mode
+	 * @param sdkInfo selected SDK
+	 */
+	private void checkSISModeStatusAndSetSelectionStateIfNeeded(AppDepSettings settings, SdkInformation sdkInfo) {
+		//If we are about to add SIS files to be analyzed
+		if(settings.isInSISFileAnalysisMode()){
+			//Setting initial state as SIS generation (in the following for loop only 
+			//more serious errors will overwrite this state)
+			if(!settings.isDumpsisAvailable(sdkInfo)){
+				//If we are in SIS Analysis mode and there is no dumpsis.exe available
+				setSelectionState(TargetSelStateEnum.EDumpsisDoesNotExist);
+			}
+			else{
+				// Dumpsis available and we can continue into cache creation.
+				setSelectionState(TargetSelStateEnum.ESISFileCacheNeedsToBeGenerated);					
+			}
+		}
+	}
+
+	/**
+	 * Makes programmatic checking of elements based on the given settings if possible.
+	 * @param settings settings to be used for resolving the targets to be checked.
+	 * @return <code>true</code> if selection was made successfully, otherwise <code>false</code>.
+	 */
+	private boolean makeProgrammaticElementCheckingBasedOnSettings(
+			AppDepSettings settings) {
+		// ...checking if we can create a selection based on the
+		// currently used SDK and target platform information.
+		Object[] objectArr = resolveTargetsBasedOnCurrentSettings(settings);
+		if(objectArr.length  > 0){			
+			// No normal events triggered on programmatic selection
+			setProgrammaticSelectionOngoingFlag(true);
+			for (int i = 0; i < objectArr.length; i++) {
+				Object object = objectArr[i];
+				buildTargetViewer.setChecked(object, true);				
+			}
+			// Back to normal event handling
+			setProgrammaticSelectionOngoingFlag(false); 
+			return true; // Selection was made successfully
+		}
+
+		return false; // Could not make selection
+	}
+
+	/**
+	 * Checks build target's status and sets current selection state flag accordingly.
+	 * @param settings current settings
+	 * @param sdkInfo Selected SDK
+	 * @param status build target status
+	 * @param buildTargetId Build target id to based on which set status.
+	 */
+	private void setSelectionStateBasedOnTargetStatus(AppDepSettings settings,
+			SdkInformation sdkInfo, BuildTargetStatusEnum status, String buildTargetId) throws Exception{
+		
+		switch (status) {
+		
+		case ENotSupported:
+			// If the selected target is not supported, there is no sense to check
+			// other selections, because this is the most severe selection error.
+			setSelectionState(TargetSelStateEnum.ESomeTargetNotSupported);
+			break;
+
+		case EEmptyTarget:
+			setSelectionState(TargetSelStateEnum.ENoComponentsForSomeTarget);
+			break;
+
+		case ECacheNeedsUpdate:
+			if(settings.areToolsRequiredByCoreAvailable(sdkInfo, buildTargetId)){
+				// Informing about cache update need if elftran.exe available
+				setSelectionState(TargetSelStateEnum.ECacheNeedsUpdateForSomeTarget);									
+			}
+			else{
+				// Otherwise informing used that elftran is not available
+				setSelectionState(TargetSelStateEnum.EElftranDoesNotExist);														
+			}
+			break;
+
+		case ENoCache:
+			if(settings.areToolsRequiredByCoreAvailable(sdkInfo, buildTargetId)){
+				// Informing about cache creation need if elftran.exe available
+				setSelectionState(TargetSelStateEnum.ECacheNotGeneratedForSomeTarget);							
+			}
+			else{
+				// Otherwise informing used that elftran is not available
+				setSelectionState(TargetSelStateEnum.EElftranDoesNotExist);														
+			}
+			break;
+
+		case ECachesIsBeingIndexed:
+			setSelectionState(TargetSelStateEnum.ECachesIsBeingIndexedForSomeTarget);
+			break;
+
+		case ECacheIsBeingGenerated:
+			setSelectionState(TargetSelStateEnum.ECacheIsBeingGeneratedForSomeTarget);
+			break;
+
+		case ECacheReady:
+			setSelectionState(TargetSelStateEnum.EAllTargetCachesUpToDate);
+			break;
+
+		default:
+			// Trying to avoid internal errors, but this is something that should be trapped during development time.
+			// Because this method should be capable of handling all enum values and should be modified
+			// accordingly if new enum values are added. Internal error messages are not localised.
+			String errMsg = "Unexpected enum value for enumerator '" //$NON-NLS-1$
+							+ BuildTargetStatusEnum.class.getSimpleName()
+							+ "': " //$NON-NLS-1$
+							+ status.toString();
+			LogUtils.logInternalErrorAndThrowException(errMsg);
+		}
+	}
+
+	/**
+	 * Checks that the selected target combination is valid.
+	 * @param selectedTargetsArr Selected nodes to be checked for validity.
+	 * @param st Settings object to query settings related information from.
+	 * @return <code>true</code> if we have valid target selection
+	 */
+	private void CheckValidityOfTargetSelection(List<BuildTargetEntry> selectedTargetsArr, AppDepSettings st) {
+		// Only sensible to check if there is multiselection
+		if(selectedTargetsArr.size() > 1){
+			
+			// Checking that each target use the same default toolchain
+			String targetNameFirst = selectedTargetsArr.get(0).getTargetName();			
+			try {
+				String toolchainFirst = st.getDefaultToolchainForTarget(targetNameFirst).getToolchainName();
+				for (int i = 1; i < selectedTargetsArr.size(); i++) {
+					String targetName = selectedTargetsArr.get(i).getTargetName();
+					String toolchain = st.getDefaultToolchainForTarget(targetName).getToolchainName();
+					if(!toolchain.equals(toolchainFirst)){
+						setSelectionState(TargetSelStateEnum.EInvalidToolchainMix);
+					}				
+				}
+			} catch (InvalidCmdLineToolSettingException e) {
+				// We might get this exception when user has selected platform that is not supported.
+				// Just debug printing for development purposes for logging possible internal errors.
+				DbgUtility.println(DbgUtility.PRIORITY_OPERATION, e.getMessage());
+			}
+			
+		}		
+	}
+
+	/**
+	 * Checks page completion status based on selection state.
+	 * Return status tells if flip to next page is allowed.
+	 * @return <code>true</code> if page can be completed, otherwise <code>false</code>.
+	 */
+	boolean checkPageCompleteStatus(){
+		
+		boolean pageCompleteStatus = false;
+
+		if(selectionState.equals(TargetSelStateEnum.EAllTargetCachesUpToDate)){
+			// Can proceed to component selection
+			pageCompleteStatus = true;
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheNotGeneratedForSomeTarget)){
+			// Can proceed for cache generation options
+			pageCompleteStatus = true;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheNeedsUpdateForSomeTarget)){
+			// Can proceed for cache generation options
+			pageCompleteStatus = true;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ESISFileCacheNeedsToBeGenerated)){
+			// Can proceed for cache generation options or start SIS cache generation
+			pageCompleteStatus = true;				
+		}				
+		else if(selectionState.equals(TargetSelStateEnum.EDumpsisDoesNotExist)){
+			// Cannot proceed for cache generation options
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.EElftranDoesNotExist)){
+			// Cannot proceed for cache generation options
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECachesIsBeingIndexedForSomeTarget)){
+			// Cannot proceed until index has been created
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheIsBeingGeneratedForSomeTarget)){
+			// Cannot proceed until cache has been created for this SKD's target
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ENoComponentsForSomeTarget)){
+			// Cannot proceed if some selection does not have components
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ESomeTargetNotSupported)){
+			// Cannot proceed if some target is not supported
+			pageCompleteStatus = false;				
+		}
+		else if(selectionState.equals(TargetSelStateEnum.EInvalidToolchainMix)){
+			// Cannot proceed if toolchain mix is not allowed
+			pageCompleteStatus = false;				
+		}
+		else{
+			// Trying to avoid internal errors, but this is something that should be trapped during 
+			// development time. Internal error messages are not localized.
+			LogUtils.logInternalErrorAndThrowException("Unexpected target selection state:" + selectionState.ordinal()); //$NON-NLS-1$
+		}
+		
+		return pageCompleteStatus;
+	}
+	
+	/**
+	 * Sets user messages and button enable/disable states according the current selection state.
+	 * @param wiz Wizard object needed for settings button enable/disable states.
+	 * @param isPageCompleted Page completion status returned by <code>checkPageCompleteStatus</code>.
+	 * @param selectedTargetsArr Currently selected targets.
+	 */
+	private void setUserMessageAndButtonState(SelectSDKWizard wiz, boolean isPageCompleted, List<BuildTargetEntry> selectedTargetsArr) throws Exception{
+		
+		//
+		// Settings user messages and button state according the selection state
+		//
+		if(selectionState.equals(TargetSelStateEnum.EAllTargetCachesUpToDate)){
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Press_Next_To_Continue")); //$NON-NLS-1$
+			this.setErrorMessage(null);
+			setPageComplete(isPageCompleted);
+			// Finishing is forbidden
+			wiz.disableCanFinish();																								
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheNotGeneratedForSomeTarget)){
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Cache_Generation_Needed") //$NON-NLS-1$
+					+ Messages.getString("SelectBuildTargetWizardPage.Press_Finish_To_Start_Generation") //$NON-NLS-1$
+					+ Messages.getString("SelectBuildTargetWizardPage.Press_Next_To_To_Modify_Generation_Options"),  //$NON-NLS-1$
+					    IMessageProvider.WARNING);
+			this.setErrorMessage(null);
+			
+			// Updating available cache generation options
+			wiz.setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget();
+			
+			setPageComplete(isPageCompleted);				
+			// Pressing Finish in order to 
+			// start cache generation is allowed.
+			wiz.enableCanFinish(ISelectSDKWizard.FINISH_CACHE_CREATION);			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheNeedsUpdateForSomeTarget)){
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Cache_Needs_Update"),  //$NON-NLS-1$
+					    IMessageProvider.WARNING);
+			this.setErrorMessage(null);
+			// Updating available cache generation options
+			wiz.setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget();
+
+			setPageComplete(isPageCompleted);				
+			// User is also allowed to press Finish, 
+			// and start cache update with default generation
+			// options.
+			wiz.enableCanFinish(ISelectSDKWizard.FINISH_CACHE_CREATION);										
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ESISFileCacheNeedsToBeGenerated)){
+			// Can proceed for cache generation options or start SIS cache generation
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Cache_Generation_Needed_For_SIS_Files") //$NON-NLS-1$
+					+ Messages.getString("SelectBuildTargetWizardPage.Press_Finish_To_Start_Generation") //$NON-NLS-1$
+					+ Messages.getString("SelectBuildTargetWizardPage.Press_Next_To_To_Modify_Generation_Options"),  //$NON-NLS-1$
+					    IMessageProvider.WARNING);
+			this.setErrorMessage(null);
+			
+			// Updating available cache generation options
+			wiz.setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget();
+			
+			setPageComplete(isPageCompleted);				
+			// Pressing Finish in order to 
+			// start cache generation is allowed.
+			wiz.enableCanFinish(ISelectSDKWizard.FINISH_CACHE_CREATION);			
+		}					
+		else if(selectionState.equals(TargetSelStateEnum.EDumpsisDoesNotExist)){
+			this.setMessage(null);
+			this.setErrorMessage(Messages.getString("SelectBuildTargetWizardPage.Dumpsis.exe_Does_Not_Exist_ErrorMsg")); //$NON-NLS-1$
+			// Cannot proceed for cache generation options
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.EElftranDoesNotExist)){
+			this.setMessage(null);
+			// If we end-up here, there is at least a single target selected
+			String targetId = selectedTargetsArr.get(0).getTargetName(); // and all selected targets must use same toolchain (=dump tool)
+			String errMsgFormatString = Messages.getString("SelectBuildTargetWizardPage.BinaryDumpTool_Does_Not_Exist_ErrorMsg"); //$NON-NLS-1$		
+			this.setErrorMessage(String.format(errMsgFormatString, wiz.getSettings().getCurrentlyUsedCoreDumpToolName(targetId))); 
+			// Cannot proceed for cache generation options
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECachesIsBeingIndexedForSomeTarget)){
+			this.setMessage(null);
+
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Cache_Index_Not_Yet_Created"),  //$NON-NLS-1$
+				    IMessageProvider.WARNING);
+		    this.setErrorMessage(null);
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();										
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ECacheIsBeingGeneratedForSomeTarget)){
+			this.setMessage(Messages.getString("SelectBuildTargetWizardPage.Cache_Is_Being_Generated"),  //$NON-NLS-1$
+					    IMessageProvider.WARNING);
+			this.setErrorMessage(null);
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ENoComponentsForSomeTarget)){
+			// Disabling operations if there are not components built
+			this.setMessage(null);
+			this.setErrorMessage(Messages.getString("SelectBuildTargetWizardPage.Selected_Target_Does_Not_Have_BuiltComponents")); //$NON-NLS-1$
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.ESomeTargetNotSupported)){
+			this.setMessage(null);
+			this.setErrorMessage(Messages.getString("SelectBuildTargetWizardPage.Target_Not_Supported")); //$NON-NLS-1$
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();			
+		}
+		else if(selectionState.equals(TargetSelStateEnum.EInvalidToolchainMix)){
+			// Disabling operations if there cross-SDK/Platform target selections 
+			this.setMessage(null);
+			this.setErrorMessage(Messages.getString("SelectBuildTargetWizardPage.Invalid_Toolchain_Mix_ErrorMsg")); //$NON-NLS-1$
+			setPageComplete(isPageCompleted);				
+			// Finishing is forbidden
+			wiz.disableCanFinish();									
+		}
+		else{
+			// Trying to avoid internal errors, but this is something that should be trapped during 
+			// development time. Internal error messages are not localized.
+			LogUtils.logInternalErrorAndThrowException("Unexpected target selection state:" + selectionState.ordinal()); //$NON-NLS-1$
+		}
+	}
+	
+	/**
+	 * Resolve the target node based on the given settings.
+	 * @param settings Settings to get environment data from,
+	 * @return Wizard node matching with current settings, or 
+	 *         <code>null</code> if not found. 
+	 */
+	private Object[] resolveTargetsBasedOnCurrentSettings(AppDepSettings settings) {
+		ArrayList<Object> objs = new ArrayList<Object>();
+		SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();
+		ITargetPlatform[] targetPlatforms = settings.getCurrentlyUsedTargetPlatforms();
+		String buildTypeString = settings.getBuildType().getBuildTypeName();
+		if(sdkInfo != null && targetPlatforms.length > 0){
+			// Trying to resolve correct nodes
+			for (int i = 0; i < targetPlatforms.length; i++) {
+				ITargetPlatform platform = targetPlatforms[i];
+				String targetPlatformId = platform.getId();
+				if(!targetPlatformId.equals(AppDepSettings.TARGET_TYPE_ID_SIS)){
+					Object obj = contentProvider.find(sdkInfo.getSdkId(),targetPlatformId,
+	                        buildTypeString);
+	                if(obj!= null){
+	                	objs.add(obj);
+	                }									
+				}
+			}
+		}
+		return objs.toArray();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		try {
+			
+			final Widget w = event.widget;
+			
+			// Addi SIS files -button pressed?
+			if(w.equals(addSISFilesButton)){
+				addSISFilesButtonPressed();
+				return;
+			}
+			
+			// Otherwise we have been registered only to listen checkboxes, so we are always sure 
+			// that we do not get any other events than those already checked above.
+			Runnable checkboxRunnable = new Runnable(){
+
+				public void run() {
+					if (w.equals(showOnlySupportedAndNonEmptyTargetsCheckbox)) {
+							boolean isSelected = showOnlySupportedAndNonEmptyTargetsCheckbox.getSelection();
+							if(isSelected){
+								nonEmptyAndNonSuppTargetFilter.setFilterEnabled(true);
+							}
+							else{
+								nonEmptyAndNonSuppTargetFilter.setFilterEnabled(false);
+							}
+							// Refreshing page contents
+							refresh();
+							// And updating button statuses	and message area
+							recalculateButtonStates();
+						}
+						else if (w.equals(showDebugTargetsInsteadOfReleaseTargetsCheckbox)) {
+							// Always clearing already made target platform selections when switching mode
+							SelectSDKWizard wiz = (SelectSDKWizard) getWizard();
+							wiz.getSettings().clearCurrentlyUsedTargetPlatforms();
+							// Switching mode based on the checkbox selection
+							boolean isSelected = showDebugTargetsInsteadOfReleaseTargetsCheckbox.getSelection();
+							if(isSelected){
+								buildTypeFilter.setFilterMode(BuildTargetFilterModeEnum.EShowDebugTargets);
+								buildTypeFieldValueText.setText(BUILD_TYPE_DEBUG_STR);
+								updateDialogSettings(SelectSDKWizard.BUILD_TYPE_DESCR_DLG_SETTING_KEY, BUILD_TYPE_DEBUG_STR);
+								buildTypeFieldValueText.pack();
+							}
+							else{
+								buildTypeFilter.setFilterMode(BuildTargetFilterModeEnum.EShowReleaseTargets);
+								buildTypeFieldValueText.setText(BUILD_TYPE_RELEASE_STR);
+								updateDialogSettings(SelectSDKWizard.BUILD_TYPE_DESCR_DLG_SETTING_KEY, BUILD_TYPE_RELEASE_STR);
+								buildTypeFieldValueText.pack();
+							}
+							// Refreshing page contents
+							refresh();
+							// And updating button statuses	and message area	
+							recalculateButtonStates();
+						}
+					}
+
+			};
+
+			// Showing busy cursor while updating UI because may take some time
+			Display d = getShell().getDisplay();
+			BusyIndicator.showWhile(d, checkboxRunnable);			
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent event) {
+		// We can ignore this		
+	}
+		
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.job.IJobCompletionListener#backgroundJobCompleted(com.nokia.s60tools.appdep.core.job.IManageableJob)
+	 */
+	public void backgroundJobCompleted(IManageableJob jobObject) {		
+		refreshTreeViewerAndButtonsStatusesInUIThread();
+	}
+
+	/**
+	 * Refreshes tree view and updates button statuses.
+	 */
+	private void refreshTreeViewerAndButtonsStatusesInUIThread() {
+		
+		Runnable refreshTreeViewerAndButtonsStatusesRunnable = new Runnable(){
+			public void run(){
+				try {
+					// Refreshing page contents
+					refresh();
+					recalculateButtonStates();
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		};
+		
+		// Update request will be done in its own thread
+		// in order not to cause invalid thread access
+		Display.getDefault().asyncExec(refreshTreeViewerAndButtonsStatusesRunnable);		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusGained(FocusEvent e) {
+		Widget w = e.widget;
+		if(w.equals(sdkNameFieldTitleText)
+			||
+			w.equals(sdkNameFieldValueText)	
+			||
+			w.equals(buildTypeFieldTitleText)	
+			||
+			w.equals(buildTypeFieldValueText)	
+				){
+			setInitialFocus();			
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusLost(FocusEvent e) {
+		// No need to do anything		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.core.ICacheIndexListener#cacheIndexCreationCompleted(com.nokia.s60tools.appdep.core.data.CacheIndex)
+	 */
+	public void cacheIndexCreationCompleted(CacheIndex cacheIndexObj) {
+		refreshTreeViewerAndButtonsStatusesInUIThread();
+	}
+
+	/**
+	 * @return the selectionState
+	 */
+	public TargetSelStateEnum getSelectionState() {
+		return selectionState;
+	}
+
+	/**
+	 * @param selectionState the selectionState to set
+	 */
+	public void setSelectionState(TargetSelStateEnum selectionState) {
+		// Changing current selection state ordinal is greater than previous
+		if(selectionState.ordinal() > this.selectionState.ordinal()){
+			this.selectionState = selectionState;			
+		}
+	}
+
+	/**
+	 * Gets build target viewer component.
+	 * @return build target viewer component.
+	 */
+	public CheckboxTableViewer getBuildTargetViewer() {
+		return buildTargetViewer;
+	}
+
+	/**
+	 * Gets the SDK selected for the wizard page.
+	 * @return SDK selected for the wizard page.
+	 */
+	public SdkInformation getSelectedSdk() {
+		AppDepSettings settings = getSettings();
+		return settings.getCurrentlyUsedSdk();
+	}
+
+	/**
+	 * Gets settings used for this wizard page.
+	 * @return settings used for this wizard page.
+	 */
+	public AppDepSettings getSettings() {
+		SelectSDKWizard wiz = (SelectSDKWizard) getWizard();
+		return wiz.getSettings();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.IRefreshable#refresh()
+	 */
+	public void refresh() {
+		// Refreshing selected SDK text if needed
+		String sdkId = getSelectedSdk().getSdkId();
+		if(!sdkId.equals(sdkNameFieldValueText.getText())){
+			sdkNameFieldValueText.setText(sdkId);
+			sdkNameFieldValueText.pack();			
+		}
+		
+		// Refreshing target table
+		buildTargetViewer.refresh();				
+	}
+
+	/**
+	 * Checking if programmatic selection is ongoing and therefore
+	 * not need to trigger similar event handling as due to UI selection.
+	 * @return <code>true</code> if programmatic selection is ongoing, otherwise <code>false</code>.
+	 */
+	private boolean isProgrammaticSelectionOngoing() {
+		return isProgrammaticSelectionOngoingFlag;
+	}	
+	
+	/**
+	 * Sets or unsets programmatic selection flag.
+	 * @param isProgrammaticSelectionOngoingFlag <code>true</code> if programmatic selection is ongoing, otherwise <code>false</code>.
+	 */
+	public void setProgrammaticSelectionOngoingFlag(
+			boolean isProgrammaticSelectionOngoingFlag) {
+		this.isProgrammaticSelectionOngoingFlag = isProgrammaticSelectionOngoingFlag;
+	}
+	
+	/**
+	 * Handles Add SIS files -button press event.
+	 */
+	public void addSISFilesButtonPressed() {
+		Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+		AddSISFilesDialog entryDialog = new AddSISFilesDialog(sh);
+		entryDialog.create();
+		// If already selected some set of SIS files getting the list...
+		if(getSettings().isInSISFileAnalysisMode()){
+			//...and setting the initial list
+			String[] filesForAnalysis = getSettings().getSISFilesForAnalysis();
+			entryDialog.setInitialSISFileSet(filesForAnalysis);
+		}
+		int userSelection = entryDialog.open();
+		if(userSelection == Window.OK){
+			// Getting selected SIS files
+			String[] selectedSISFiles = entryDialog.getSelectedSISFiles();
+			if(selectedSISFiles.length > 0){
+				// Entering to SIS file mode...
+				getSettings().setIsInSISFileAnalysisMode(true);
+				// ...and setting files to current settings
+				getSettings().setSISFilesForAnalysis(selectedSISFiles );
+			}
+			else{
+				// Disabling SIS file mode
+				getSettings().setIsInSISFileAnalysisMode(false);
+				getSettings().setSISFilesForAnalysis(null);					
+			}	
+			// SIS analysis mode may have toggled, therefore needing to update button status.
+			recalculateButtonStates();
+		}
+	}
+
+	/**
+	 * Stores value for given key into dialog settings.
+	 * @param key key for the setting
+	 * @param value value for the setting
+	 */
+	private void updateDialogSettings(String key, String value) {
+		SelectSDKWizard wiz = (SelectSDKWizard) getWizard();
+		wiz.updateDialogSettings(key, value);
+	}
+	
+	public SelectBuildTargetWizardPageContentProvider getContentProvider(){
+		return contentProvider;
+	}
+	
+} 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPageContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,253 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IWorkbenchWindow;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.IBuildType;
+import com.nokia.s60tools.appdep.core.TargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndexCreator;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.sdk.SdkInformation;
+
+/**
+ * The content provider class is responsible for providing objects to 
+ * the Build Target Selection Wizard page. The content provider preserves
+ * existing domain objects as long same SDK is selected and build target
+ * list is only refreshed in case SDK selection changes.
+ * 
+ * This is done because if domain objects change in every query, the checkbox 
+ * table viewer component loses check statuses done by user.
+ */
+class SelectBuildTargetWizardPageContentProvider implements IStructuredContentProvider{
+	
+	/**
+	 * Empty object array returned whenever there is no content.
+	 */
+	static Object[] EMPTY_ARRAY = new Object[0];
+
+	/**
+	 * Wizard page for which offering content. 
+	 */
+	private final SelectBuildTargetWizardPage page;
+	
+	/**
+	 * Used to trigger cache index creation
+	 * whenever needed.  
+	 */
+	CacheIndexCreator indexCreator;
+
+	/**
+	 * Currently used targets. If SDK does not change the contents are only updated.
+	 *  
+	 */
+	private List<BuildTargetEntry> targetList;
+
+	/**
+	 * Currently used SDK to fetch targets.
+	 */
+	private SdkInformation currentlyUsedSdk;
+	
+	/**
+	 * Content provider's constructor
+	 */
+	public SelectBuildTargetWizardPageContentProvider(SelectBuildTargetWizardPage page){
+		this.page = page;
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		
+		// Getting SDK from settings and initializing element array
+		AppDepSettings settings = page.getSettings();
+		SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();		
+		
+		// If no SDK selection is made yet...
+		if(sdkInfo == null){
+			return  EMPTY_ARRAY; // ...returning an empty array
+		}
+		
+		// If target list is not yet created or SDK selection has changed	
+		if(targetList == null || currentlyUsedSdk == null ){
+			// Storing the used SDK and creating new build target list
+			currentlyUsedSdk = sdkInfo;
+			createBuildTargetList(settings, currentlyUsedSdk);
+		}
+		
+		return targetList.toArray();
+	}
+
+	/**
+	 * Creates build target list based on given settings and used SDK.
+	 * @param settings used settings
+	 * @param sdkInfo used SDK.
+	 */
+	private void createBuildTargetList(AppDepSettings settings, SdkInformation sdkInfo) {
+
+		targetList = new ArrayList<BuildTargetEntry>();
+		
+		// Making sure that index creator is uninitialized at this point
+		indexCreator = null; // thus preventing messing up with already running instance
+		
+		// Going through all the build targets platforms and corresponding build types available for SDK 
+		String[] platforms = sdkInfo.getPlatforms();
+		
+		for (int i = 0; i < platforms.length; i++) {
+			String targetTypeName = platforms[i];
+			
+			String buildTypes[] = sdkInfo.getBuildTypesForPlatform(targetTypeName);
+			for (int j = 0; j < buildTypes.length; j++) {
+				String buildTypeString = buildTypes[j];
+				try {
+					addBuilTargetEntry(targetTypeName, buildTypeString, targetList, settings);
+				} catch (InvalidCmdLineToolSettingException e1) {
+					// We will get this exception if the given build type string
+					// is not supported by the tool. We can ignore the exception
+					// and continue the for loop normally.
+				}
+								
+			} // for
+			
+		} // for		
+		
+		// Finally launching cache index creation if needed i.e. whenever index creator 
+		// object has been created on need basis only.
+		if(indexCreator != null){
+			launchCacheIndexCreation();
+		}
+	}
+
+	/**
+	 * Creates build target entry info and build target object and adds it to target list.
+	 * @param targetTypeName name of the target to add.
+	 * @param buildTypeString build type name string.
+	 * @param targetList target list to add new target into.
+	 * @param settings settings for the target to be created.
+	 * @throws InvalidCmdLineToolSettingException 
+	 */
+	private void addBuilTargetEntry(String targetTypeName, String buildTypeString, List<BuildTargetEntry> targetList,
+			AppDepSettings settings) throws InvalidCmdLineToolSettingException {
+		// Creating build target entry and adding it into element array
+		SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();	
+		IBuildType buildType = settings.getBuildTypeFromString(buildTypeString);
+		boolean isSupportedTargetPlatform = settings.isSupportedTargetPlatform(targetTypeName); 
+		BuildTargetEntryInfo buildTargetEntryInfo = new BuildTargetEntryInfo(page, settings, sdkInfo, new TargetPlatform(targetTypeName), buildType, isSupportedTargetPlatform);
+		BuildTargetEntry buildTargetEntry = new BuildTargetEntry(buildTargetEntryInfo);
+		// Creating cache index in case cache exist for the target
+		if(buildTargetEntryInfo.isTargetCached()){
+			String cacheFileAbsolutePathName = settings.getCacheFileAbsolutePathNameForSdkAndPlatform(
+																										sdkInfo,
+																										targetTypeName,
+																										buildType
+																									);
+			String buildDirAbsolutePathName = settings.getBuildDirectoryForSdkAndPlatform(sdkInfo, targetTypeName, buildType);
+			registerCacheIndexCreation(buildTargetEntryInfo, cacheFileAbsolutePathName, buildDirAbsolutePathName);
+		}
+		targetList.add(buildTargetEntry);
+	}
+	
+	/**
+	 * Launches cache index creation runnable.
+	 */
+	public void launchCacheIndexCreation() {
+		if(indexCreator != null && indexCreator.hasIndexCreationRequests()){
+			try {
+				IWorkbenchWindow wbw = AppDepPlugin.getCurrentlyActivePage().getWorkbenchWindow();
+				wbw.run(true, false, indexCreator);
+			   } catch (InvocationTargetException e) {
+				   e.printStackTrace();
+			   } catch (InterruptedException e) {
+				   e.printStackTrace();
+			   } catch (Exception e) {
+				      e.printStackTrace();
+			   }
+		}		
+	}
+	
+	/**
+	 * Registering a new instance of cache index creation.
+	 * @param entryInfo target entry info object listening or cache creation completion.
+	 * @param cacheFileAbsolutePathName Absolute path name to cache file.
+	 * @param buildDirAbsolutePathName Absolute path name to build directory..
+	 */
+	public void registerCacheIndexCreation(BuildTargetEntryInfo entryInfo, String cacheFileAbsolutePathName, 
+			String buildDirAbsolutePathName) {
+		if(indexCreator == null){
+			indexCreator = new CacheIndexCreator(entryInfo);
+		}		
+		indexCreator.registerCacheIndexCreation(cacheFileAbsolutePathName, 
+				buildDirAbsolutePathName);
+	}
+
+	/**
+	 * Tries to find build target node that matches
+	 * with the given parameters.
+	 * @param sdkIdString Id string of the SDK.
+	 * @param buildTargetName Name of the platform.
+	 * @param buildTypeString Build type of the node to search for.
+	 * @return Returns the matching object if it was found, 
+	 *         otherwise return <code>null</code>.
+	 */
+	public Object find(String sdkId, String buildTargetName,
+			String buildTypeString) {
+		if(currentlyUsedSdk.getSdkId().equals(sdkId)){
+			for (Iterator<BuildTargetEntry> iterator = targetList.iterator(); iterator.hasNext();) {
+				BuildTargetEntry entry = (BuildTargetEntry) iterator.next();
+				if(entry.equals(buildTargetName, buildTypeString)){
+					return entry;
+				}
+			}			
+		}
+		// Match not found
+		return null;
+	}
+
+	/**
+	 * This method clears the previously fetched target list.
+	 *
+	 */
+	public void clearBuildTargetsList()
+	{
+		this.targetList = null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectBuildTargetWizardPageLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,133 @@
+/*
+* 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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.wizards.BuildTargetEntry.BuildTargetStatusEnum;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Select Build Target wizard page label provider.
+ */
+class SelectBuildTargetWizardPageLabelProvider extends LabelProvider 
+															implements ITableLabelProvider  {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		
+		// By default no images are used
+		Image img = null;
+		BuildTargetEntry entryData = (BuildTargetEntry) element;
+
+		switch (columnIndex) {
+
+		case BuildTargetEntry.TARGET_TYPE_COLUMN_INDEX:
+		case BuildTargetEntry.COMPONENT_COUNT_COLUMN_INDEX:
+			// fall-through, no image used for these in the moment
+			break;
+
+		case BuildTargetEntry.STATUS_COLUMN_INDEX:
+			img = getStatusColumneImage(entryData);
+			break;
+			
+		default:
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg") + ": " +columnIndex, AppDepConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+			break;
+		}
+		
+		return img;
+	}
+	
+	/**
+	 * Gets status column image for an entry data object.
+	 * @param entryData entry data.
+	 * @return status column image for an entry data object.
+	 */
+	private Image getStatusColumneImage(BuildTargetEntry entryData) {
+		
+		BuildTargetStatusEnum status = entryData.getStatus();
+		String imageKey = ImageKeys.TRAFFIC_LIGHT_RED_OBJ;
+		
+		switch (status) {
+		
+		case ECacheReady:
+			imageKey = ImageKeys.TRAFFIC_LIGHT_GREEN_OBJ;
+			break;
+
+		case ECacheNeedsUpdate:
+		case ENoCache:
+			// fall-through
+			imageKey = ImageKeys.TRAFFIC_LIGHT_YELLOW_OBJ;
+			break;
+
+		case EEmptyTarget:
+		case ENotSupported:
+		case ECachesIsBeingIndexed:
+		case ECacheIsBeingGenerated:
+			// fall-through
+			imageKey = ImageKeys.TRAFFIC_LIGHT_RED_OBJ;
+			break;
+
+		default:
+			break;
+		}
+		
+		return ImageResourceManager.getImage(imageKey);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		
+		String label = element.toString();
+		
+		BuildTargetEntry entryData = (BuildTargetEntry) element;
+
+		switch (columnIndex) {
+	
+			case BuildTargetEntry.TARGET_TYPE_COLUMN_INDEX:
+				label = entryData.getTargetDescription();
+				break;
+	
+			case BuildTargetEntry.COMPONENT_COUNT_COLUMN_INDEX:
+				label = entryData.getComponentCount();
+				break;
+	
+			case BuildTargetEntry.STATUS_COLUMN_INDEX:
+				label = entryData.getStatusAsString();
+				break;
+				
+			default:
+				AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg") + ": " +columnIndex, AppDepConsole.MSG_ERROR);  //$NON-NLS-1$ //$NON-NLS-2$
+				break;
+		}
+		
+		return label;
+	}	
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,417 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+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.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.ui.S60ToolsTable;
+import com.nokia.s60tools.ui.S60ToolsTableColumnData;
+import com.nokia.s60tools.ui.S60ToolsTableFactory;
+import com.nokia.s60tools.ui.dialogs.S60ToolsListBoxDialog;
+import com.nokia.s60tools.ui.wizards.S60ToolsWizardPage;
+
+/**
+ * Select component wizard page implementation.
+ */
+public class SelectComponentWizardPage extends S60ToolsWizardPage implements ModifyListener,
+                                                                             FocusListener,
+                                                                             SelectionListener, 
+                                                                             IRefreshable{
+	//
+	// Constants
+	//
+	private final int DUPLICATE_COMP_DLG_WIDTH = 350;
+	private final int DUPLICATE_COMP_DLG_HEIGHT = 250;
+	
+	//
+	// Members
+	//
+	private Text searchFieldTitle = null;
+	private Text searchField = null;
+	private Text buildTypeTitle = null;
+	private Text buildTypeValue = null;
+	private TableViewer componentViewer = null;
+	private S60ToolsTable componentViewerAsS60Table = null;
+	private Text showSISTitle = null;
+	private Button showSISCheckBox = null;
+	
+	private SelectComponentWizardPageContentProvider contentProvider = null;
+	private List<String> duplicateComponentList = null;
+	private boolean showDuplicateComponentInfo;
+	
+	 /**
+	 * Constructor.
+	 * @param showDuplicateComponentInfo <code>true</code> if we want to inform user about duplicate components, 
+	 * 									 otherwise <code>false</code>.
+	 */
+	public SelectComponentWizardPage(boolean showDuplicateComponentInfo){
+			super(Messages.getString("SelectComponentWizardPage.Window_Title")); //$NON-NLS-1$
+			setTitle(Messages.getString("SelectComponentWizardPage.Title")); //$NON-NLS-1$			
+			setDescription(Messages.getString("SelectComponentWizardPage.SelectComponent_User_InfoMessage")); //$NON-NLS-1$
+			
+			// This is used to store information about the possible duplicate components
+			duplicateComponentList = new ArrayList<String>();
+			this.showDuplicateComponentInfo = showDuplicateComponentInfo;
+			
+			// User cannot finish the page before a selection is made.
+			setPageComplete(false);
+	 }
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		
+	  GridData gd = new GridData(GridData.FILL_BOTH);
+	  Composite c = createGridLayoutComposite(parent, SWT.NONE, 1, gd); 
+		  
+	  final int readOnlyLabelFieldStyleBits = SWT.READ_ONLY | SWT.NO_FOCUS;
+	  
+	  searchFieldTitle = new Text(c, readOnlyLabelFieldStyleBits); 
+	  searchFieldTitle.setText(Messages.getString("SelectComponentWizardPage.Search_Field_Title")); //$NON-NLS-1$
+	  searchFieldTitle.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	  searchFieldTitle.addFocusListener(this);
+
+	  searchField = new Text(c, SWT.SINGLE | SWT.BORDER); 
+	  searchField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	  searchField.addModifyListener(this);
+
+	  // Adding two column composite for build type info text.
+	  GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
+	  Composite titleAreaComposite = createGridLayoutComposite(c, SWT.NONE, 2, gd2); 
+	  
+	  buildTypeTitle = new Text(titleAreaComposite, readOnlyLabelFieldStyleBits); 
+	  buildTypeTitle.setText(Messages.getString("SelectComponentWizardPage.BuildTypeTitle_Text")); //$NON-NLS-1$
+	  buildTypeTitle.setLayoutData(new GridData(GridData.BEGINNING));	  
+	  buildTypeTitle.addFocusListener(this);
+	  
+	  buildTypeValue = new Text(titleAreaComposite, readOnlyLabelFieldStyleBits); 
+	  buildTypeValue.setText(""); // Value for this is set during run time //$NON-NLS-1$
+	  buildTypeValue.setLayoutData(new GridData(GridData.BEGINNING));	  
+	  buildTypeValue.addFocusListener(this);
+	  
+	  componentViewerAsS60Table = createComponentTableViewer(c);
+	  componentViewer = componentViewerAsS60Table.getHostingViewer();
+	  componentViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+	  contentProvider = new SelectComponentWizardPageContentProvider(this);
+	  componentViewer.setContentProvider(contentProvider); 
+	  componentViewer.setLabelProvider(new SelectComponentWizardPageLabelProvider());
+	  componentViewer.setInput(contentProvider);
+	  componentViewer.addSelectionChangedListener(new SelectComponentWizardPageTableViewerSelectionChangedListener(this));
+	  componentViewer.addDoubleClickListener(new SelectComponentWizardPageTableViewerDoubleClickListener(this));
+	  componentViewer.setSorter(new ComponentTableViewerSorter());
+	  componentViewer.getTable().addFocusListener(this);
+	  	  
+	  //Add check box and label for SIS components if this is a SIS wizard
+	  final ISelectSDKWizard wiz = (ISelectSDKWizard) getWizard();
+	  if (wiz.getSettings().isInSISFileAnalysisMode()) {
+
+			Composite cSIS = new Composite(c, SWT.NONE);
+
+			int colsSIS = 2;
+			GridLayout gdlSIS = new GridLayout(colsSIS, false);
+			GridData gdSIS = new GridData();
+			cSIS.setLayout(gdlSIS);
+			cSIS.setLayoutData(gdSIS);
+
+			showSISCheckBox = new Button(cSIS, SWT.CHECK);
+			showSISCheckBox.setLayoutData(new GridData());
+			// Add listener to button, to set components visible or not (Show only SIS components or not)
+			showSISCheckBox.addSelectionListener(this);
+			showSISCheckBox.setSelection(true);
+			
+			showSISTitle = new Text(cSIS, readOnlyLabelFieldStyleBits);
+			showSISTitle.setText(Messages.getString("SelectComponentWizardPage.ShowOnlySISFiles_Msg")); //$NON-NLS-1$
+			showSISTitle.setLayoutData(new GridData());
+		}
+
+		// Setting control for this page
+		setControl(c);
+		  
+		// Setting context help ID		
+		AppDepPlugin.setContextSensitiveHelpID(getControl(), AppDepHelpContextIDs.APPDEP_WIZARD_PAGE_COMP_SELECT);
+	}
+
+	/**
+	 * Creates new composite object using GridLayout.
+	 * @param parent parent composite
+	 * @param style Style bits for the composite.
+	 * @param cols column count
+	 * @param gd grid data attached to composite
+	 * @return new composite object using GridLayout.
+	 */
+	private Composite createGridLayoutComposite(Composite parent, int style, int cols, GridData gd) {
+		Composite c =   new Composite(parent, style);		  
+		GridLayout gdl = new GridLayout(cols, false);
+		c.setLayout(gdl);
+		c.setLayoutData(gd);
+		  
+		return c;
+	}
+
+	/**
+	 * Creates viewer component for showing selected SIS files. 
+	 * @param parent Parent composite for the created composite.
+	 * @return New <code>S60ToolsTable</code> object instance.
+	 */
+	protected S60ToolsTable createComponentTableViewer(Composite parent) {
+		
+		ArrayList<S60ToolsTableColumnData> columnDataArr = new ArrayList<S60ToolsTableColumnData>();
+		
+		//
+		// NOTE: Column indices must start from zero (0) and
+		// the columns must be added in ascending numeric
+		// order.
+		//
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectComponentWizardPage.Name_ColumnText"), //$NON-NLS-1$
+														200,
+														ComponentListNode.NAME_COLUMN_INDEX,
+														ComponentTableViewerSorter.CRITERIA_NAME, 
+														true));
+
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectComponentWizardPage.Target_ColumnText"),  //$NON-NLS-1$
+														60,
+														ComponentListNode.TARGET_TYPE_COLUMN_INDEX,
+														ComponentTableViewerSorter.CRITERIA_TARGET_TYPE,
+														SWT.CENTER));
+		
+		columnDataArr.add(new S60ToolsTableColumnData(Messages.getString("SelectComponentWizardPage.DateModified_ColumnText"),  //$NON-NLS-1$
+														120,
+														ComponentListNode.DATE_CACHED_COLUMN_INDEX,
+														ComponentTableViewerSorter.CRITERIA_DATE_CACHED));
+		
+		S60ToolsTableColumnData[] arr 
+				= columnDataArr.toArray(
+									   new S60ToolsTableColumnData[0]);
+		
+		int showItemCountInColumn = 0;
+		S60ToolsTable tbl = S60ToolsTableFactory.create(parent, arr, showItemCountInColumn);
+		
+		TableViewer tblViewer = new TableViewer(tbl.getTableInstance());
+		tbl.setHostingViewer(tblViewer);
+		
+		return tbl;
+	}
+	
+	/**
+	 * Refreshes wizard page components.
+	 */
+	public void refresh() {
+		//Updating build type value field if it is changed
+		String currBuildType = buildTypeValue.getText();
+		SelectSDKWizard wizard = (SelectSDKWizard) getWizard();
+		String buildTypedialogSetting = wizard.getDialogSetting(SelectSDKWizard.BUILD_TYPE_DESCR_DLG_SETTING_KEY);
+		if(!currBuildType.equals(buildTypedialogSetting)){
+			buildTypeValue.setText(buildTypedialogSetting);
+			buildTypeValue.pack();
+		}		
+		// Refreshing controls 
+		componentViewer.refresh();	
+		componentViewerAsS60Table.refreshHostingViewer(contentProvider.getElementCount());
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#setInitialFocus()
+	 */
+	public void setInitialFocus(){
+		// Clearing search text field
+		searchField.setText(""); //$NON-NLS-1$
+	    // Informing about duplicate components if showDuplicateComponentInfo is set.
+	    informUserAboutDuplicateComponentsIfExists();		
+		searchField.setFocus();			
+	}
+	
+	/**
+	 * Checks and informs user with dialog if there are duplicate components
+	 */
+	private void informUserAboutDuplicateComponentsIfExists() {
+		// Only showing message if wanted and there is reason for it because of duplicate components
+		if(showDuplicateComponentInfo && duplicateComponentList.size() > 0){
+			Shell sh = AppDepPlugin.getCurrentlyActiveWbWindowShell();
+			
+			String listBoxContentMsg = Messages.getString("SelectComponentWizardPage.Duplicate_Components_InfoMsg_Header") + "\n";//$NON-NLS-1$ //$NON-NLS-2$
+			
+			for (String cmpName : duplicateComponentList) {
+				listBoxContentMsg += "\n- " + cmpName; //$NON-NLS-1$
+			}
+
+			listBoxContentMsg += "\n\n" + Messages.getString("SelectComponentWizardPage.Duplicate_Components_InfoMsg_Footer");//$NON-NLS-1$ //$NON-NLS-2$
+			
+			String textAboveListBoxMessagesStr = Messages.getString("SelectComponentWizardPage.Duplicate_Components_WarningMsg"); //$NON-NLS-1$
+			
+			String dialogTitle = ProductInfoRegistry.getProductName(); //$NON-NLS-1$
+			S60ToolsListBoxDialog mbox = new S60ToolsListBoxDialog(sh, 
+						dialogTitle, 
+						listBoxContentMsg, 
+						false, // not resizable
+						true,  // has vertical scroll bar
+						true,  // has horizontal scroll bar
+						DUPLICATE_COMP_DLG_WIDTH,  // default width
+						DUPLICATE_COMP_DLG_HEIGHT, // default height
+						false, //No Cancel button
+						textAboveListBoxMessagesStr
+	                );		
+			mbox.create();
+			mbox.open();			
+		}		
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public void recalculateButtonStates() {
+		ISelection selection = componentViewer.getSelection();
+		Object obj = ((IStructuredSelection)selection).getFirstElement();
+		
+		ISelectSDKWizard wiz = (ISelectSDKWizard) getWizard();
+		
+		if(obj == null){
+			wiz.updateAnalyzedComponentSelection(null, null);
+			wiz.disableCanFinish();
+			return;
+		}
+		
+		setMessage(Messages.getString("SelectComponentWizardPage.OnFinish_User_InfoMessage")); //$NON-NLS-1$
+		setErrorMessage(null);
+		ComponentListNode compListNodeObj = (ComponentListNode) obj;
+		wiz.updateAnalyzedComponentSelection(compListNodeObj.toString(), compListNodeObj.getBuildTargetType());
+		wiz.enableCanFinish(ISelectSDKWizard.FINISH_COMPONENT_SELECTED);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+	 */
+	public void modifyText(ModifyEvent event) {
+		if(event.widget.equals(searchField)){
+			contentProvider.setFilter(searchField.getText());;
+			refresh();
+		}
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusGained(FocusEvent e) {
+		Widget w = e.widget;
+		if(w.equals(searchFieldTitle)){
+			searchField.setFocus();
+		}
+		else if(w.equals(buildTypeTitle) || w.equals(buildTypeValue)){
+			componentViewer.getTable().setFocus();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusLost(FocusEvent e) {
+		// No need to do anything		
+	}
+	
+	/**
+	 * Gets the items currently visible in the table viewer's table
+	 * and selects the first item that is visible in the table.
+	 */
+	public void selectFirstVisibleComponentFromList(){
+		Table table = componentViewer.getTable();
+		TableItem[] items = table.getItems();
+		if(items.length > 0){
+			table.setSelection(0);
+		}
+		recalculateButtonStates();
+	}
+
+	/**
+	 * Gets data member used to store information about duplicate component instances.
+	 * @return Data member used to store information about duplicate component instances.
+	 */
+	public List<String> getDuplicateComponentListInstance() {
+		return duplicateComponentList;
+	}
+
+	/**
+	 * Checks if only SIS components should be shown.
+	 * @return <code>true</code> If user has been selected "Show only components from SIS files"
+	 */
+	public boolean showOnlySISComponents() {
+		final ISelectSDKWizard wiz = (ISelectSDKWizard) getWizard();
+		if (wiz.getSettings().isInSISFileAnalysisMode()) {
+			return showSISCheckBox.getSelection();
+		}
+		else{
+			return false;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent event) {
+		//Not needed, but Interface implementation needs this.		
+	}
+
+	/* Occurs when "Show only components from SIS file" -check box was clicked.
+	 * Occurrence will update component list. 
+	 * (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent event) {
+		contentProvider.setFilter(searchField.getText());;
+		refresh();
+	}
+	
+	/**
+	 * Sets show duplicate component info flag.
+	 * This is reset to true in case user goes back in wizard.
+	 * @param showDuplicateComponentInfo <code>true</code> if we want to inform user about duplicate components.
+	 */
+	public void setShowDuplicateComponentInfo(boolean showDuplicateComponentInfo) {
+		this.showDuplicateComponentInfo = showDuplicateComponentInfo;
+	}
+
+} // class SelectComponentWizardPage
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,157 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * The content provider class is responsible for
+ * providing objects to the Component Selection Wizard. 
+ */
+class SelectComponentWizardPageContentProvider implements IStructuredContentProvider {
+		
+	/**
+	 * Wizard page to provide content for.
+	 */
+	private SelectComponentWizardPage wizardPage = null;
+	/**
+	 * Filter string that can be used to filter the contents.
+	 */
+	private String filterString = null;
+	/**
+	 * Component list used currently
+	 */
+	private ArrayList<ComponentListNode> components;
+	
+	/**
+	 * Content provider's constructor
+	 * @param wizardPage Wizard page to provide content for.
+	 */
+	public SelectComponentWizardPageContentProvider(SelectComponentWizardPage wizardPage){
+		this.wizardPage = wizardPage;
+	}
+	
+	/* (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() {
+		// Not needed
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		
+		components = new ArrayList<ComponentListNode>();
+		
+		ISelectSDKWizard wiz = (ISelectSDKWizard) wizardPage.getWizard();
+		
+		try {
+			
+			Iterator<ComponentListNode> compIter = wiz.getComponentIterator(wizardPage.getDuplicateComponentListInstance());
+			if(compIter != null){
+				for (; compIter.hasNext();) {
+					ComponentListNode componentNode = compIter.next();
+					if(filterString != null){
+						String componentName = componentNode.toString();
+						if(componentName.contains(filterString)){
+							addComponent(components, componentNode);													
+						}
+					}
+					else{
+						addComponent(components, componentNode);						
+					}
+				}				
+			}
+			
+		} catch (NullPointerException e) {
+			// We can ignore this this happens because there
+			// are no SDK or Target Platform selected yet.
+		} catch (Exception e) {
+			AppDepConsole.getInstance().println(Messages.getString("SelectComponentWizardPageContentProvider.Failed_To_Get_Component_List") //$NON-NLS-1$
+												+ e.getMessage(), 
+												IConsolePrintUtility.MSG_ERROR);
+			e.printStackTrace();
+		}
+		
+		return components.toArray();
+	}
+
+	/**
+	 * Adds a component to UI list. Check also if we are in SIS mode and want to 
+	 * show only SIS components.
+	 * @param components
+	 * @param componentNode
+	 */
+	private void addComponent(ArrayList<ComponentListNode> components,
+			ComponentListNode componentNode) {
+		
+		//If We are in SIS Analysis mode, and user has been selecting to show only SIS components
+		if(wizardPage.showOnlySISComponents()){
+			//Then we show only SIS components (components that starts with "sis"
+			if(componentNode.getBuildTargetType().getId().toLowerCase().startsWith(
+					AppDepSettings.TARGET_TYPE_ID_SIS.toLowerCase())){
+				components.add(componentNode);							
+			}
+		}else{
+			components.add(componentNode);			
+		}
+	}
+
+	/**
+	 * Sets the criteria to filter out the components
+	 * that does not match with it.
+	 * @param searchText Search criteria to run match with.
+	 */
+	void setFilter(String searchText) {
+		filterString = searchText;
+	}
+
+	/**
+	 * Gets current element count shown by content provider.
+	 * @return current element count shown by content provider.
+	 */
+	public int getElementCount() {
+		if(components != null){
+			return components.size();
+		}
+		// Components array not initialized
+		return 0;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageLabelProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,96 @@
+/*
+* 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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+
+/**
+ * Select component wizard page label provider.
+ */
+class SelectComponentWizardPageLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		
+		// Only using image for name columns
+		if(columnIndex == ComponentListNode.NAME_COLUMN_INDEX){
+			return getNameColumnImage();
+		}
+		
+		// Otherwise no images are used
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		String label = element.toString();
+		
+		ComponentListNode entryData = (ComponentListNode) element;
+
+		switch (columnIndex) {
+	
+			case ComponentListNode.NAME_COLUMN_INDEX:
+				label = entryData.getComponentName();
+				break;
+	
+			case ComponentListNode.TARGET_TYPE_COLUMN_INDEX:
+				label = entryData.getBuildTargetTypeAsString();
+				break;
+	
+			case ComponentListNode.DATE_CACHED_COLUMN_INDEX:
+				label = entryData.getCachedComponentModificationTimestampAsString();
+				break;
+	
+			default:
+				AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Unexpected_Column_Index_ErrMsg") + ": " + columnIndex, AppDepConsole.MSG_ERROR); //$NON-NLS-1$ //$NON-NLS-2$
+				break;
+		}
+		
+		return label;
+	}
+	
+	/**
+	 * Gets image for name columns.
+	 * @return image for name columns.
+	 */
+	public Image getNameColumnImage() {
+        /*******************************************************************************
+         * This piece of the graphic is taken/modified from a graphic that is made 
+         * available under the terms of the Eclipse Public License v1.0.
+         *
+         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+         * for detailed information about the original graphic.
+         *  
+         *******************************************************************************/        
+		String imageKey = ImageKeys.BIN_OBJ;								
+		return ImageResourceManager.getImage(imageKey);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageTableViewerDoubleClickListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,67 @@
+/*
+* 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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardContainer;
+
+/**
+ * Listens for double-click event, and finishes dialog
+ * when a valid component is double-clicked from the
+ * component selection wizard.
+ */
+class SelectComponentWizardPageTableViewerDoubleClickListener implements
+		IDoubleClickListener {
+	
+	/**
+	 * Wizard page instance to listen for.
+	 */
+	private final SelectComponentWizardPage page;
+	
+	/**
+	 * Constructor.
+	 * @param page Wizard page instance to listen for.
+	 */
+	public SelectComponentWizardPageTableViewerDoubleClickListener(SelectComponentWizardPage page){
+		this.page = page;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+	 */
+	public void doubleClick(DoubleClickEvent event) {
+		//Asking page to update it button states
+		this.page.recalculateButtonStates();	
+		// Checking if we can perform finish
+		IWizard wiz = page.getWizard();
+		if(wiz.canFinish()){
+			IWizardContainer container = wiz.getContainer();
+			if(container != null){
+				if(container instanceof AppDepWizardDialog){
+					AppDepWizardDialog dlg = (AppDepWizardDialog) container;
+					dlg.finishPressed();
+				}
+			}
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectComponentWizardPageTableViewerSelectionChangedListener.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,57 @@
+/*
+* 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:
+*
+*/
+ 
+ 
+/**
+ * Listens to selection changes and updated buttons
+ * states after the selection has been changed.
+ */
+package com.nokia.s60tools.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * Select component wizard page tree viewer listener.
+ */
+class SelectComponentWizardPageTableViewerSelectionChangedListener implements ISelectionChangedListener{
+	
+	/**
+	 * Wizard page instance to listen for.
+	 */
+	private final SelectComponentWizardPage page;
+	
+	/**
+	 * Constructor
+	 * @param page Wizard page instance to listen for.
+	 */
+	public SelectComponentWizardPageTableViewerSelectionChangedListener(SelectComponentWizardPage page){
+		this.page = page;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {		
+		try {
+			//Asking page to update it button states
+			this.page.recalculateButtonStates(); 
+		} catch (Exception e) {
+			e.printStackTrace();
+		}	
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizard.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,434 @@
+/*
+* 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.appdep.ui.wizards;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.DialogSettings;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.SWT;
+
+import com.nokia.s60tools.appdep.core.AppDepCacheIndexManager;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.CacheGenerationOptions;
+import com.nokia.s60tools.appdep.core.ITargetPlatform;
+import com.nokia.s60tools.appdep.core.data.CacheIndex;
+import com.nokia.s60tools.appdep.core.job.AppDepJobManager;
+import com.nokia.s60tools.appdep.exceptions.CacheFileDoesNotExistException;
+import com.nokia.s60tools.appdep.exceptions.InvalidCmdLineToolSettingException;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.ui.views.data.ComponentListNode;
+import com.nokia.s60tools.appdep.ui.views.listview.ListView;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.ui.UiUtils;
+import com.nokia.s60tools.ui.wizards.S60ToolsWizard;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * SDK Selection wizard implementation.
+ */
+public class SelectSDKWizard extends S60ToolsWizard  implements ISelectSDKWizard {
+
+	//
+	// Constants
+	//
+	/**
+	 * Dialog settings key used for storing currently selected/used build type.
+	 */
+	public static final String BUILD_TYPE_DESCR_DLG_SETTING_KEY = "BuildTypeDescrKey"; //$NON-NLS-1$
+	
+	//
+	// Private members
+	//	
+	private boolean canFinish = false;
+	private int exitStatus = ISelectSDKWizard.CANCEL;
+	private SelectSDKWizardPage sdkPage = null;
+	private SelectBuildTargetWizardPage buildTargetPage = null;
+	private CacheGenerationOptionsWizardPage cacheGenerOptPage = null;
+	private SelectComponentWizardPage compSelPage = null;
+	AppDepSettings settings = null;	
+	private AppDepJobManager backgroundJobManager = null;
+	private AppDepCacheIndexManager cacheIndexMgr = null;
+	private final boolean openSDKSelectionPage;
+	static private final ImageDescriptor bannerImgDescriptor = UiUtils.getBannerImageDescriptor(ImageResourceManager.getImageDescriptor(ImageKeys.WIZARD_BANNER));
+	private final boolean showDuplicateComponentInfo;
+	
+	/**
+	 * Constructor. 
+	 * @param settings Settings object used for the wizard.
+	 * @param openSDKSelectionPage	<code>true</code> if we SDK selection page is the starting page, otherwise component selection page is shown.
+	 * @param showDuplicateComponentInfo set to <code>true</code> if one wants to inform user about the duplicate components.
+	 */	
+	public SelectSDKWizard(AppDepSettings settings,
+							boolean openSDKSelectionPage, boolean showDuplicateComponentInfo) {
+		super(bannerImgDescriptor);
+		this.settings = settings;
+		this.openSDKSelectionPage = openSDKSelectionPage;
+		this.showDuplicateComponentInfo = showDuplicateComponentInfo;
+		// Creating dialog settings object with root section
+		setDialogSettings(new DialogSettings("DialogSettingRootSection")); //$NON-NLS-1$
+		
+		backgroundJobManager = AppDepJobManager.getInstance();
+		cacheIndexMgr = AppDepCacheIndexManager.getInstance();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.ui.wizards.S60ToolsWizard#addPages()
+	 */
+	public void addPages() {
+		
+		//By default, the order of the pages are added is also
+		// the order they are represented to the user.
+		sdkPage = new SelectSDKWizardPage();
+		addPage(sdkPage);
+		
+		compSelPage = new SelectComponentWizardPage(showDuplicateComponentInfo);
+		
+		cacheGenerOptPage = new CacheGenerationOptionsWizardPage();
+		addPage(cacheGenerOptPage);
+		
+		buildTargetPage = new SelectBuildTargetWizardPage();
+		addPage(buildTargetPage);
+		cacheIndexMgr.addListener(buildTargetPage);
+		backgroundJobManager.addListener(buildTargetPage);
+		
+		addPage(compSelPage);
+		setWindowTitle(sdkPage.getName());
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.IWizard#getStartingPage()
+     */
+    public IWizardPage getStartingPage() {
+    	
+    	// Checking if user has especially asked to open
+    	// SDK selection page
+    	if(openSDKSelectionPage){
+    		return sdkPage;
+    	}
+    	
+    	// Otherwise selection depends on the current settings.
+    	// Checking if currently used SDK/Target Platform 
+    	// has been already configured...
+		SdkInformation sdkInfo = settings.getCurrentlyUsedSdk();
+		ITargetPlatform[] targets =	settings.getCurrentlyUsedTargetPlatforms();
+		if(sdkInfo == null  || targets.length == 0){
+			// Not configured => using default start page (Firstly added page)
+			return super.getStartingPage();
+		}			
+    	// SDK/Target Platform has been configured, and
+    	// therefore going directly to component selection 
+		// and forcing the update of page contents before...
+		compSelPage.refresh();
+		//...setting initial focus for the page
+		compSelPage.setInitialFocus();
+    	// ...returning the page as result
+    	return compSelPage;
+    }
+	        
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
+	 */
+	public IWizardPage getNextPage(IWizardPage page) {
+		
+		//If we are handling SIS adding, and we are at SIS page, we go forward to SDK selection
+		if(page.equals(sdkPage)){
+			return buildTargetPage;
+		}
+		else if(page.equals(buildTargetPage)){
+			if(this.exitStatus == ISelectSDKWizard.FINISH_CACHE_CREATION){
+				return cacheGenerOptPage;
+			}
+			else{
+				return compSelPage;
+			}
+		}
+		
+		// Otherwise we are already in last page
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
+	 */
+	public IWizardPage getPreviousPage(IWizardPage page) {
+		
+		if(
+		   page.equals(compSelPage)
+			||
+		   page.equals(cacheGenerOptPage)
+		   ){
+			return buildTargetPage;
+		}
+		else if(page.equals(buildTargetPage)){
+			return sdkPage;
+		}
+		
+		
+		// Otherwise we are already in first page
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
+	 */
+	public boolean performFinish() {
+		backgroundJobManager.removeListener(buildTargetPage);
+		cacheIndexMgr.removeListener(buildTargetPage);
+		
+		// Storing cache generation options, if needed
+		IWizardPage page = getContainer().getCurrentPage();
+		if(page != null){			
+			if(page.equals(buildTargetPage) || page.equals(cacheGenerOptPage)){
+				CacheGenerationOptions cacheGenerOpts;
+				try {
+					
+					cacheGenerOpts = new CacheGenerationOptions(cacheGenerOptPage.getCacheGenerationToolchain(),
+							                                    cacheGenerOptPage.getCacheGenerationLibType());
+					settings.setCacheGenerOptions(cacheGenerOpts);					
+					
+				} catch (InvalidCmdLineToolSettingException e) {
+					e.printStackTrace();
+					String msg = Messages.getString("SelectSDKWizard.Failed_To_Set_Gener_Options") //$NON-NLS-1$
+									+ e.getMessage();
+					AppDepMessageBox msgBox = new AppDepMessageBox(this.getShell(), msg, 
+							                                       SWT.ICON_ERROR | SWT.OK);	
+					msgBox.open();
+				}
+			}
+		}
+		ListView.clear();
+		
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#performCancel()
+	 */
+	public boolean performCancel() {
+		backgroundJobManager.removeListener(buildTargetPage);		
+		cacheIndexMgr.removeListener(buildTargetPage);
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
+	 */
+	public boolean canFinish() {
+		return canFinish;
+	}
+	
+	/**
+	 * Stores the user selection made in SDK selection page.
+	 * @param selectedSdkNode The selectedSdk node.
+	 */
+	public void setUserSelection(SdkTreeViewNode selectedSdkNode) {
+		SdkInformation sdkInfo = selectedSdkNode.getSdkInfo();
+		SdkInformation currentlyUsedSdk = settings.getCurrentlyUsedSdk();
+		if(currentlyUsedSdk != null && !sdkInfo.getSdkId().equals(currentlyUsedSdk.getSdkId())){
+			// New SDK selected resettings old target platform settings
+			settings.clearCurrentlyUsedTargetPlatforms();				
+		}
+		buildTargetPage.getContentProvider().clearBuildTargetsList();
+		// Storing SDK selection setting
+		settings.setCurrentlyUsedSdk(sdkInfo);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.ISelectSDKWizard#setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget()
+	 */
+	public void setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget() {
+		try{
+			cacheGenerOptPage.setDefaultCacheGenerationOptionsBasedOnTheSelectedTarget();
+		}
+		 catch (Exception e) {
+				AppDepConsole.getInstance().println(Messages.getString("SelectSDKWizard.Failed_To_Set_Default_Gener_Options"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+				e.printStackTrace();
+				throw new RuntimeException(e.getMessage());
+			}		
+	}
+
+	/**
+	 * Sets canFinish flag to <code>true</code> and updates exit status.
+	 * @param exitStatus New exist status.
+	 */
+	public void enableCanFinish(int exitStatus) {
+		this.canFinish = true;
+		this.exitStatus = exitStatus;
+		IWizardContainer container = getContainer();
+		container.updateButtons();
+	}
+
+	/**
+	 * Sets canFinish flag <code>false</code> and updates exit status
+	 * by default to <code>IAppDepWizard.CANCEL</code>.
+	 */
+	public void disableCanFinish() {
+		this.canFinish = false;
+		this.exitStatus = ISelectSDKWizard.CANCEL;
+		getContainer().updateButtons();
+	}	
+	
+	/**
+	 * Updates currently selected component name.
+	 * @param componentName Name of the component to be set as selected one.
+	 * @param targetPlatform Target platform of the component to be set as selected one. 
+	 */
+	public void updateAnalyzedComponentSelection(String componentName, ITargetPlatform targetPlatform){
+		settings.setCurrentlyAnalyzedComponentName(componentName);
+		settings.setCurrentlyAnalyzedComponentTargetPlatform(targetPlatform);
+	}
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.IWizard#getWindowTitle()
+     */
+    public String getWindowTitle() {
+    	//
+    	// Overriding default implementation and getting the
+    	// window title from the current page instead.
+    	//
+    	IWizardContainer container = getContainer();
+    	if(container != null){
+    		IWizardPage currPage = container.getCurrentPage();
+    		if(currPage != null){
+    			return currPage.getName();
+    		}
+        	else{
+        		return super.getWindowTitle();
+        	}
+    	}
+    	else{
+    		return super.getWindowTitle();
+    	}
+    }
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.IAppDepWizard#getExitStatus()
+	 */
+	public int getExitStatus() {
+		return exitStatus;
+	}
+
+	/**
+	 * Gets component iterator for the currently configured/selected.
+	 * SDK/Target Platform.
+	 * @param duplicateItemsList Out parameter that contains the list of duplicate
+	 *                           components found from the selected targets.
+	 * @return Component Iterator, or <code>null</code> if component 
+	 *         iterator cannot be built.
+	 */
+	public Iterator<ComponentListNode> getComponentIterator(List<String> duplicateItemsList) {
+		// Delegating request further
+		try {
+			return CacheIndex.getComponentIteratorForGivenSettings(settings, duplicateItemsList).iterator();			
+		} catch (CacheFileDoesNotExistException e) {
+			// Cache is just not yet created for some SDK/Target platform
+			// that is currently selected in the selection wizard.
+			return null;
+		} catch (IOException e) {
+			// This denotes some error that should not happen, and needs stack trace
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(e.getMessage(), AppDepConsole.MSG_ERROR);
+			return null;
+		}
+	}
+
+	/**
+	 * @return Settings object used by this wizard instance.
+	 */
+	public AppDepSettings getSettings() {
+		return settings;
+	}
+
+	/**
+	 * Saves current user selection to currently used settings.
+	 * @param sdkInfo selected SDK
+	 * @param selectedBuildTargetEntries selected build target entries.
+	 */
+	public void setUserSelection(SdkInformation sdkInfo, BuildTargetEntry[] selectedBuildTargetEntries) {
+		try {
+			// Making target platform name arrays list
+			ArrayList<String> buildTargetNames = new ArrayList<String>();			
+			for (int i = 0; i < selectedBuildTargetEntries.length; i++) {
+				buildTargetNames.add(selectedBuildTargetEntries[i].getTargetName());				
+			}
+
+			//Making sure that SIS target is included in selection in case in SIS mode
+			addSISTargetIfNeeded(buildTargetNames);
+			
+			settings.updateCurrentlyUsedSDKAndTargetPlatforms(
+														sdkInfo,
+					                                    buildTargetNames.toArray(new String[0]),
+					                                    // Both targets have the same build type
+					                                    selectedBuildTargetEntries[0].getBuildType()
+					                                        );
+		} catch (InvalidCmdLineToolSettingException e) {
+			e.printStackTrace();
+			AppDepConsole.getInstance().println(Messages.getString("GeneralMessages.Failed_To_Update_Current_Settings"), IConsolePrintUtility.MSG_ERROR); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Adding SIS target to given target platform array if we are on SIS mode.
+	 * @param targetPlatformNames ArrayList to add SIS target.
+	 */
+	public void addSISTargetIfNeeded(ArrayList<String> targetPlatformNames) {
+		// In SIS mode we need to add an extra target
+		if(settings.isInSISFileAnalysisMode()){
+			if(! targetPlatformNames.contains(AppDepSettings.TARGET_TYPE_ID_SIS)){
+				targetPlatformNames.add(AppDepSettings.TARGET_TYPE_ID_SIS);				
+			}
+		}
+	}
+
+	/**
+	 * Stores value for given key into dialog settings.
+	 * @param key key for the setting
+	 * @param value value for the setting
+	 */
+	public void updateDialogSettings(String key, String value) {
+		IDialogSettings dialogSettings = getDialogSettings();
+		dialogSettings.put(key, value);			
+	}
+
+	/**
+	 * Gets value for given key from dialog settings.
+	 * @param key key for the setting
+	 */
+	public String getDialogSetting(String key) {
+		IDialogSettings dialogSettings = getDialogSettings();
+		String value = dialogSettings.get(key);
+		if(value == null){
+			// Returning empty string if settings not yet available
+			return "";  //$NON-NLS-1$
+		}
+		return value;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPage.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,245 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+
+
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+import com.nokia.s60tools.appdep.AppDepHelpContextIDs;
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.plugin.AppDepPlugin;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.util.LogUtils;
+import com.nokia.s60tools.ui.ProgrammaticSelection;
+
+
+/**
+ * Wizard page showing the available SDKs. 
+ */
+public class SelectSDKWizardPage extends AbstractSelectSDKWizardPage implements FocusListener{	
+	
+	/**
+	 * Wizard page's title.
+	 */
+	private Text sdkViewerTitle;
+	
+	/**
+	 * Viewer component for showing available targets.
+	 */
+	private TableViewer sdkViewer;
+	
+	/**
+	 * Content provider for the viewer component.
+	 */
+	private SelectSDKWizardPageContentProvider contentProvider;
+	
+	 /**
+	 * Constructor.
+	 */
+	public SelectSDKWizardPage(){		
+		super(Messages.getString("SelectSDKWizardPage.WizardPageName")); //$NON-NLS-1$
+		
+		setTitle(Messages.getString("SelectSDKWizardPage.WizardPageTitle"));			 //$NON-NLS-1$
+		setDescription(Messages.getString("SelectSDKWizardPage.WizardPageDescription"));  //$NON-NLS-1$
+		
+		// User cannot finish the page before some valid 
+		// selection is made.
+		setPageComplete(false);
+	 }
+	 
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		
+	  Composite c = new Composite(parent, SWT.NONE);
+	  
+	  final int cols = 1;	  
+	  GridLayout gdl = new GridLayout(cols, false);
+	  GridData gd = new GridData(GridData.FILL_BOTH);
+	  c.setLayout(gdl);
+	  c.setLayoutData(gd);
+	  
+	  //
+	  // Creating controls
+	  //
+	  final int readOnlyLabelFieldStyleBits = SWT.READ_ONLY | SWT.NO_FOCUS;
+	  
+	  sdkViewerTitle = new Text(c, readOnlyLabelFieldStyleBits); 
+
+	  sdkViewerTitle.setText(Messages.getString("SelectSDKWizardPage.SDKListViewerComponentTitle")); //$NON-NLS-1$
+	  sdkViewerTitle.addFocusListener(this);
+	  
+	  sdkViewer = new TableViewer(c, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+	  sdkViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+	  
+	  // Providers cannot be created before all the controls have been created
+	  // Content provider uses the information provided by the checkbox control
+	  contentProvider = new SelectSDKWizardPageContentProvider();
+	  sdkViewer.setContentProvider(contentProvider); 
+	  sdkViewer.setLabelProvider(new SelectSDKWizardPageLabelProvider2());
+	  sdkViewer.setInput(contentProvider);
+	  
+	  // Adding selection change listener
+	  sdkViewer.addSelectionChangedListener(new ISelectionChangedListener(){
+				/* (non-Javadoc)
+				 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+				 */
+				public void selectionChanged(SelectionChangedEvent event) {
+					recalculateButtonStates();			
+				}		  
+		  });
+	  
+	  // Enabling flipping to next page with double-click
+	  sdkViewer.addDoubleClickListener(new IDoubleClickListener(){
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+		 */
+		public void doubleClick(DoubleClickEvent event) {
+			recalculateButtonStates();
+			// If allowed to flip next page...
+			if(isPageComplete()){
+				IWizardPage nextPage = getNextPage();
+				// And refreshing contents
+				((IRefreshable)nextPage).refresh();				
+				// Showing next page
+				getContainer().showPage(nextPage);
+			}			
+		}});
+
+	  // By default collapsing the tree
+	  setInitialFocus();
+	  
+	  // Setting control for this page
+	  setControl(c);
+	
+	  // Setting context help IDs		
+      AppDepPlugin.setContextSensitiveHelpID(getControl(), AppDepHelpContextIDs.APPDEP_WIZARD_PAGE_SDK_SELECT);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#setInitialFocus()
+	 */
+	public void setInitialFocus() {
+		sdkViewer.getTable().setFocus();			
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.appdep.ui.wizards.S60ToolsWizardPage#recalculateButtonStates()
+	 */
+	public void recalculateButtonStates() {
+
+		try {
+			SelectSDKWizard wiz = (SelectSDKWizard) getWizard();
+			AppDepSettings settings = wiz.getSettings();
+			IStructuredSelection selection = (IStructuredSelection )sdkViewer.getSelection();
+			Object obj = selection.getFirstElement();
+			
+			// There is no selection made (e.g. coming with Back from previous page)
+			if(obj == null){
+				// ...checking if we can create a selection based on the currently used SDK
+				obj = contentProvider.find(settings.getCurrentlyUsedSdk().getSdkId());
+				if(obj  != null){
+					// Match was found
+					ProgrammaticSelection newSelection = null;
+					newSelection = new ProgrammaticSelection(new Object[]{obj});
+					sdkViewer.setSelection(newSelection, true);
+					selection = (IStructuredSelection )sdkViewer.getSelection();
+					if(selection == null){
+						// Trying to avoid internal errors, but this is something that should be trapped during 
+						// development time. Internal error messages are not localized.
+						String errMsg = "Programmatic selection failed unexpectedly in class '" //$NON-NLS-1$
+										+ SelectSDKWizardPage.class.getSimpleName()
+										+ "'."; //$NON-NLS-1$
+						LogUtils.logInternalErrorAndThrowException(errMsg);						
+						return;
+					}
+				}
+				else{
+					// No match was found
+					return;
+				}				
+			}
+			
+			// Otherwise SDK is selected
+			SdkTreeViewNode sdkNode = (SdkTreeViewNode) selection.toArray()[0]; // Getting all selected SDK node
+
+			if(! sdkNode.getSdkInfo().epocRootExists()){
+				// Non-existing SDK node selected
+				this.setMessage(null);
+				this.setErrorMessage(Messages.getString("SelectSDKWizardPage.EPOCROOT_NotFound_ErrMsg")); //$NON-NLS-1$
+				// Flipping to next page and finishing is forbidden
+				setPageComplete(false);				
+				wiz.disableCanFinish();										
+			}
+			else{
+				// Existing SDK node selected
+				this.setMessage(Messages.getString("SelectSDKWizardPage.Press_Next_To_Continue")); //$NON-NLS-1$
+				this.setErrorMessage(null);
+				// Flipping to next page is possible
+				setPageComplete(true);
+				// Finishing is forbidden
+				wiz.disableCanFinish();		
+				// Storing user selection and ...
+				wiz.setUserSelection(sdkNode);
+			}
+									
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+				
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusGained(FocusEvent e) {
+		Widget w = e.widget;
+		if(w.equals(sdkViewerTitle)){
+			setInitialFocus();			
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
+	 */
+	public void focusLost(FocusEvent e) {
+		// No need to do anything		
+	}
+
+} 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPageContentProvider.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,99 @@
+/*
+* 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.appdep.ui.wizards;
+
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.sdk.SdkEnvInfomationResolveFailureException;
+import com.nokia.s60tools.sdk.SdkInformation;
+import com.nokia.s60tools.sdk.SdkManager;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * The content provider class is responsible for
+ * providing objects to the SDK Selection Wizard. 
+ */
+class SelectSDKWizardPageContentProvider implements IStructuredContentProvider{
+	/**
+	 * Invisible root object.
+	 */
+	private InvisibleRootNode invisibleRoot;
+	
+	/**
+	 * Empty object array returned whenever there is no content.
+	 */
+	static Object[] EMPTY_ARRAY = new Object[0];
+
+	/**
+	 * Content provider's constructor
+	 */
+	public SelectSDKWizardPageContentProvider(){
+	}
+	
+	/* (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) {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object parent) {
+		if (parent.equals(this)) {
+			if (invisibleRoot==null){
+				invisibleRoot = new InvisibleRootNode();
+	    		SdkInformation[] sdkInfoColl = null;
+				try {
+					sdkInfoColl = SdkManager.getSdkInformation();
+		    		for (int i = 0; i < sdkInfoColl.length; i++) {
+						SdkInformation info = sdkInfoColl[i];
+						invisibleRoot.addSdkNode(new SdkTreeViewNode(info, invisibleRoot));
+					}
+				} catch (SdkEnvInfomationResolveFailureException e) {
+					e.printStackTrace();
+					AppDepConsole.getInstance().println(e.getMessage(), 
+												IConsolePrintUtility.MSG_ERROR);
+				}	    		
+			}
+		}
+		return invisibleRoot.getChildren();
+	}
+	
+	/**
+	 * Tries to find tree viewer node that matches
+	 * with the given parameters.
+	 * @param sdkIdString Id string of the SDK.
+	 * @return Returns the matching object if it was found, 
+	 *         otherwise return <code>null</code>.
+	 */
+	public Object find(String sdkIdString){
+		return invisibleRoot.find(sdkIdString);
+	}
+		
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/SelectSDKWizardPageLabelProvider2.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.ui.wizards;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+
+/**
+ * Select SDK wizard page label provider.
+ */
+class SelectSDKWizardPageLabelProvider2 extends LabelProvider {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+	 */
+	public String getText(Object obj) {
+		String label = obj.toString();
+		return label;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object obj) {
+
+		// Default image
+		String imageKey = ImageKeys.FOLDER_OBJ;	
+		
+		if(obj instanceof SdkTreeViewNode){
+			SdkTreeViewNode sdkNode = (SdkTreeViewNode) obj;
+			if(! sdkNode.getSdkInfo().epocRootExists()){
+		        /*******************************************************************************
+		         * This piece of the graphic is taken/modified from a graphic that is made 
+		         * available under the terms of the Eclipse Public License v1.0.
+		         *
+		         * See 'com.nokia.s60tools.appdep.resources.ImageResourceManager' 
+		         * for detailed information about the original graphic.
+		         *  
+		         *******************************************************************************/        
+				imageKey = ImageKeys.FOLDER_OBJ_ERR;
+			}
+		}
+		
+		return ImageResourceManager.getImage(imageKey);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/TreeViewNode.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,68 @@
+/*
+* 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.appdep.ui.wizards;
+
+/**
+ * Tree view node object.
+ */
+abstract class TreeViewNode{
+	
+	/**
+	 * Parent reference.
+	 */
+	protected Object parent = null;
+	
+	/**
+	 * Constructor.
+	 */
+	public TreeViewNode(){			
+		this.parent = null;
+	}
+
+	/**
+	 * Constructor.
+	 * @param parent Parent node.
+	 */
+	public TreeViewNode(TreeViewNode parent){			
+		this.parent = parent;
+	}
+
+	/**
+	 * Gets parent node.
+	 * @return Returns the parent.
+	 */
+	public Object getParent() {
+		return parent;
+	}
+
+	/**
+	 * Gets children nodes.
+	 * @return children nodes
+	 */
+	public abstract Object[] getChildren();
+
+	/**
+	 * Checks if node has children.
+	 * @return <code>true</code> if has children.
+	 */
+	public abstract boolean hasChildren();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/ui/wizards/WizardUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,234 @@
+/*
+* 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.appdep.ui.wizards;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.s60tools.appdep.core.AppDepSettings;
+import com.nokia.s60tools.appdep.core.CacheDataLoadProcessManager;
+import com.nokia.s60tools.appdep.core.job.GenerateCacheJob;
+import com.nokia.s60tools.appdep.resources.Messages;
+import com.nokia.s60tools.appdep.ui.dialogs.AppDepMessageBox;
+import com.nokia.s60tools.appdep.util.AppDepConsole;
+import com.nokia.s60tools.ui.S60ToolsUIConstants;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+import com.nokia.s60tools.util.debug.DbgUtility;
+
+/**
+ * This class contains wizard related static
+ * utility methods.
+ */
+public class WizardUtils {
+	
+	/**
+	 * Only one instance of the wizard dialog can be active.
+	 * Using this static member to make it sure.
+	 */
+	static WizardDialog wizDialog = null;
+	
+	/**
+	 * Invokes wizard for selection of currently used 
+	 * SDK and target platform. Selection of the the wizard page to be
+	 * opened is made based on the settings that are currently in effect.
+	 * By default shows all the duplicate components are reported if encountered.
+	 * @param sh Parent shell for the wizard.
+	 * @return Returns <code>true</code> if current settings have changed
+	 *         and <code>false</code> if the settings are not changed.
+	 *         If settings are changed, it requires UI component refresh. 
+	 */
+	public static boolean invokeSDKAndTargetPlatformSelectionWizard(Shell sh) {
+		return invokeSDKAndTargetPlatformSelectionWizard(sh, false, null, true);
+	}
+
+	/**
+	 * Invokes wizard for selection of currently used 
+	 * SDK and target platform. 
+	 * By default shows all the duplicate components are reported if encountered.
+	 * @param sh Parent shell for the wizard.
+	 * @param openSDKSelectionPage Set to <code>true</code> if the one wants forcibly
+	 *                             open the SDK selection page instead of starting the default page.
+	 * @return Returns <code>true</code> if current settings have changed
+	 *         and <code>false</code> if the settings are not changed.
+	 *         If settings are changed, it requires UI component refresh. 
+	 */
+	public static boolean invokeSDKAndTargetPlatformSelectionWizard(Shell sh,  
+			                                                        boolean openSDKSelectionPage) {
+		return invokeSDKAndTargetPlatformSelectionWizard(sh, openSDKSelectionPage, null, true);
+	}
+
+	/**
+	 * Invokes wizard for selection of currently used 
+	 * SDK and target platform. 
+	 * @param sh Parent shell for the wizard.
+	 * @param selectNewSDK Set to <code>true</code> if the one wants forcibly
+	 *                             open the SDK selection page for setting new SDK selection.
+	 * @param newSettings If this value is set to <code>null</code> the current settings are cloned as
+	 *                    base for the new settings, the value is not <code>null</code> the given settings
+	 *                    are added into active settings and used when wizard is opened.
+	 * @param showDuplicateComponentInfo if set <code>true</code> all duplicate components are reported.
+	 * @return Returns <code>true</code> if current settings have changed
+	 *         and <code>false</code> if the settings are not changed.
+	 *         If settings are changed, it requires UI component refresh. 
+	 */
+	public static boolean invokeSDKAndTargetPlatformSelectionWizard(Shell sh,  
+			                                                        boolean selectNewSDK, 
+			                                                        AppDepSettings newSettings,
+			                                                        boolean showDuplicateComponentInfo) {
+
+		// Closing possibly existing wizard dialog
+		// forcibly before invoking another one.
+		if(wizDialog != null){
+			wizDialog.close();
+		}
+		
+		Set<String> previousTargetPlatformsSet = AppDepSettings.getActiveSettings().getBuildDirsAsSet();
+		AppDepSettings currentSettings = null;
+		
+		if(newSettings != null){
+			// Given settings act as a base for new user selections.
+			AppDepSettings.setAsNewActiveInstance(newSettings);
+			currentSettings = newSettings;		
+		}
+		else{
+			// The clone of current settings acts as a base for new user selections.
+			currentSettings = AppDepSettings.cloneAndAddAsNewActiveInstance();
+		}
+		if(selectNewSDK){
+			//Set explicitly mode to not be SIS mode because user wants to select new SDK.
+			AppDepSettings.getActiveSettings().setIsInSISFileAnalysisMode(false);
+		}
+
+		// Creating wizard
+		SelectSDKWizard wiz = new SelectSDKWizard(currentSettings,  
+                selectNewSDK, 
+                showDuplicateComponentInfo);		
+		wizDialog = new AppDepWizardDialog(sh, wiz);
+		
+		wizDialog.create();		
+		wizDialog.getShell().setSize(S60ToolsUIConstants.WIZARD_DEFAULT_WIDTH,
+				              S60ToolsUIConstants.WIZARD_DEFAULT_HEIGHT);		
+		wizDialog.addPageChangedListener(wiz);
+		
+		// Showing wizard to user
+		int userResponse = wizDialog.open();
+		
+		// Making sure that static instance is null for next users
+		wizDialog = null;
+
+		return handleUserResponse(previousTargetPlatformsSet, userResponse);
+	}
+
+	/**
+	 * Checks the user response and triggers actions based on the response.
+	 * @param previousTargetPlatformsSet Previously selected target platform set.
+	 * @param userResponse User response to check.
+	 * @return Returns <code>true</code> if current settings have changed
+	 *         and <code>false</code> if the settings are not changed.
+	 *         If settings are changed, it requires UI component refresh. 
+	 */
+	private static boolean handleUserResponse(
+			Set<String> previousTargetPlatformsSet, int userResponse) {
+		// Handling user response
+		if(userResponse == ISelectSDKWizard.FINISH_COMPONENT_SELECTED){
+			// Wizard was finished normally and user accepted the new settings.
+			// There are no more reasons to preserve old settings.
+			AppDepSettings.removePreviousInstances();
+			// Comparing previous settings against latest settings
+			AppDepSettings latestSettings = AppDepSettings.getActiveSettings();
+			Set<String> currentTargetPlatformsSet = latestSettings.getBuildDirsAsSet();
+			
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "User selection after wizard closes:"); //$NON-NLS-1$
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "\t currentTargetPlatformsSet: " + currentTargetPlatformsSet.toString()); //$NON-NLS-1$
+			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "\t currentlyAnalyzedComponentName: " + latestSettings.getCurrentlyAnalyzedComponentName()); //$NON-NLS-1$
+			
+			boolean isCacheUpdated = latestSettings.isCacheUpdated();
+			if(
+				!currentTargetPlatformsSet.equals(previousTargetPlatformsSet)
+				||
+				isCacheUpdated
+					){
+			     // Reloading cache and refreshing existing view with new information
+				try {
+					CacheDataLoadProcessManager.runCacheLoadProcess(latestSettings, isCacheUpdated);
+				} catch (Exception e) {
+					e.printStackTrace();
+					// Cache reload failed
+					String targetPlatformStr = latestSettings.getCurrentlyUsedTargetsAsString();
+					String msg = Messages.getString("GeneralMessages.CacheDataReload_Failed_For_Msg") //$NON-NLS-1$
+					      + " '" + targetPlatformStr  + "'. " //$NON-NLS-1$ //$NON-NLS-2$
+						  + Messages.getString("GenerateCacheJob.See_Console_Log_Msg"); //$NON-NLS-1$
+					
+					AppDepMessageBox msgBox = new AppDepMessageBox(msg, SWT.ICON_ERROR | SWT.OK);
+					msgBox.open();			
+				}
+			}
+			return true;
+		}
+		else if(userResponse == ISelectSDKWizard.FINISH_CACHE_CREATION){			
+			triggerCacheGenerationJobAndRestoreSettings();
+			return false;
+		}
+		else if(userResponse == ISelectSDKWizard.CANCEL){
+			restorePreviousActiveSettings();
+			return false;
+		}
+		else{
+			AppDepConsole.getInstance().println(Messages.getString("WizardUtils.Unexpected_Wizard_Exit_Status"),  //$NON-NLS-1$
+											IConsolePrintUtility.MSG_ERROR);
+			restorePreviousActiveSettings();
+			return false;
+		}
+	}	
+	
+	/**
+	 * Triggers cache generation job and restores previous settings.
+	 */
+	private static void triggerCacheGenerationJobAndRestoreSettings() {
+		// Cache generation uses the settings set by the user.			
+		// Getting a local copy of currently active settings...
+		AppDepSettings localSettings 
+				= (AppDepSettings) AppDepSettings.getActiveSettings().clone();
+		//... and passing it to cache generate job object
+		Job jb = new GenerateCacheJob(Messages.getString("GeneralMessages.CacheGeneration_Job_Title_Text"), localSettings); //$NON-NLS-1$
+		
+		// We do not want cache generation to block other 
+		// jobs and therefore using the lowest priority
+		jb.setPriority(Job.DECORATE);
+		jb.schedule();
+		
+		// It is now safe to restore original settings, because cache generation uses
+		// its own copy of settings.
+		restorePreviousActiveSettings();
+	}
+
+	/**
+	 * Restores the previously active global application settings. 
+	 */
+	private static void restorePreviousActiveSettings() {
+		if(AppDepSettings.hasPreviousActiveInstance()){
+			AppDepSettings.restorePreviousActiveInstance();
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/AppDepConsole.java	Sat Jan 09 10:04:11 2010 +0530
@@ -0,0 +1,82 @@
+/*
+* 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.appdep.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+import com.nokia.s60tools.appdep.common.ProductInfoRegistry;
+import com.nokia.s60tools.appdep.resources.ImageKeys;
+import com.nokia.s60tools.appdep.resources.ImageResourceManager;
+import com.nokia.s60tools.util.console.AbstractProductSpecificConsole;
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Singleton class that offers console printing
+ * services for the extension.
+ */
+public class AppDepConsole extends AbstractProductSpecificConsole {
+	
+	/**
+	 * Singleton instance of the class.
+	 */
+	static private AppDepConsole instance = null;
+	
+	/**
+	 * Public accessor method.
+	 * @return Singleton instance of the class.
+	 */
+	static public AppDepConsole getInstance(){
+		if(instance == null ){
+			instance = new AppDepConsole();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Private constructor forcing Singleton usage of the class.
+	 */
+	private AppDepConsole(){		
+	}
+			
+	/* (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);
+	}
+
+	/**
+	 * Prints given stack trace element array contents to console as error message.
+	 * @param stackTrace stack trace to be printed into the console
+	 */
+	public void printStackTrace(StackTraceElement[] stackTrace) {
+		for (int i = 0; i < stackTrace.length; i++) {
+			StackTraceElement stackTraceElement = stackTrace[i];
+			String traceString = stackTraceElement.toString();
+			println(traceString, IConsolePrintUtility.MSG_ERROR);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/LogUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.util;
+
+import org.eclipse.swt.widgets.Display;
+
+import com.nokia.s60tools.util.console.IConsolePrintUtility;
+
+/**
+ * Miscellaneous logging utilities to be used as tracing aid in case of error 
+ * for which is otherwise hard to find information about the error in end-user environment
+ * unless properly logged also in production environment with exact error data.
+ */
+public class LogUtils {
+
+	/**
+	 * Logs error message and expection's stack trace to product console if we are running code 
+	 * in Eclipse workbench environment. If not (i.e running JUnit tests) 
+	 * catching the exceptions and ignoring them.
+	 * 
+	 * Logging done here because we loose important information because
+	 * cache data load is done inside job that looses stack trace. 
+	 * 
+	 * @param errorMsg Error message to log.
+	 * @param e Exception to log.
+	 */
+	public static void logStackTrace(final String errorMsg, final Exception e) {
+		try {
+			if(e != null) e.printStackTrace();
+			// Scheduling log task to UI thread.
+			Display.getDefault().asyncExec(new Runnable(){
+				public void run() {
+					AppDepConsole.getInstance().println(errorMsg, IConsolePrintUtility.MSG_ERROR);
+					if(e != null){
+						StackTraceElement[] stackTrace = e.getStackTrace();
+						AppDepConsole.getInstance().printStackTrace(stackTrace);															
+					}
+				}				
+			});
+		} catch (Exception e2) {
+			// Ignoring possible errors due to not having workbench environment running.
+		}
+	}
+
+	/**
+	 * Logs internal error message to tool's console and throws run-time exception.
+	 * @param errMsg Error message to log and pass as message to runtime exception. 
+	 * @throws RuntimeException
+	 */
+	static public void logInternalErrorAndThrowException(String errMsg) throws RuntimeException {
+		AppDepConsole.getInstance().println("INTERNAL ERROR: " + errMsg ); //$NON-NLS-1$
+		throw new RuntimeException(errMsg);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanaapps/depexplorer/com.nokia.s60tools.appdep/src/com/nokia/s60tools/appdep/util/SISFileUtils.java	Sat Jan 09 10:04:11 2010 +0530
@@ -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.appdep.util;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+/**
+ * SIS file handling utilities needed by SIS file analysis feature.
+ */
+public class SISFileUtils {
+
+	// 
+	// Constants
+	//
+	private static final int BYTES_TO_READ_OFFSET = 0;
+	private static final int BYTES_TO_READ = 4;
+	private static final String FILE_MODE_READ = "r"; //$NON-NLS-1$
+	/**
+	 * If the first four bytes of the file are 7A1A2010, it is a valid supported SIS file.
+	 */
+	private static final byte [] FIRST_BYTES = new byte[]{0x07A,0x01A, 0x020, 0x010};
+
+	/**
+	 * Checks if file is valid/supported SIS file.
+	 * If the first four bytes of the file are 7A1A2010, it is a valid 
+	 * and supported SIS file.
+	 * @param fileName Absolute path name pointing to SIS file.
+	 * @return <code>true</code> if it was valid 9.x SIS file, otherwise <code>false</code>.
+	 */
+	public static boolean isValid_9x_SISFile(String fileName) {
+		
+		File file = new File(fileName);
+		if(!file.exists()){
+			return false;
+		}
+		try {
+			RandomAccessFile randFile = new RandomAccessFile(file, FILE_MODE_READ);
+			byte [] b = new byte[BYTES_TO_READ];
+			int off = BYTES_TO_READ_OFFSET;
+			int len = BYTES_TO_READ;
+			int read = randFile.read(b, off, len);
+			
+			if(read != BYTES_TO_READ){
+				return false;
+			}
+			boolean match = true;
+			for (int i = 0; i < b.length; i++) {
+				if(b[i] != FIRST_BYTES[i]){
+					match = false;
+				}
+			}
+			return match;
+		} catch (FileNotFoundException e) {
+			//Should newer occur, because files was selected from file list
+			e.printStackTrace();
+			return false;
+		} catch (IOException e) {
+			//Should newer occur, because files was selected from file list			
+			e.printStackTrace();
+			return false;
+		}
+		
+	}
+
+}