p2izing the editor
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / TaxEditorPlugin.java
index 87e5c6a344013e0044df22d679e243c2283c663a..d68bfde517954f782ca638c7731b1cb748481810 100644 (file)
@@ -1,58 +1,67 @@
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
 \r
 package eu.etaxonomy.taxeditor;\r
 \r
 import java.net.URL;\r
-import java.util.List;\r
-import java.util.ResourceBundle;\r
+import java.util.HashMap;\r
+import java.util.Locale;\r
 import java.util.Set;\r
-import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.eclipse.core.databinding.observable.list.WritableList;\r
-import org.eclipse.core.databinding.observable.set.WritableSet;\r
+import org.eclipse.core.runtime.FileLocator;\r
 import org.eclipse.core.runtime.IPath;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.MultiStatus;\r
 import org.eclipse.core.runtime.Path;\r
-import org.eclipse.jface.preference.IPreferenceStore;\r
-import org.eclipse.jface.preference.PreferenceConverter;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.jface.dialogs.ErrorDialog;\r
+import org.eclipse.jface.resource.FontRegistry;\r
 import org.eclipse.jface.resource.ImageDescriptor;\r
 import org.eclipse.jface.resource.ImageRegistry;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.FontData;\r
 import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.ui.forms.FormColors;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Tree;\r
 import org.eclipse.ui.plugin.AbstractUIPlugin;\r
+import org.eclipse.ui.views.properties.PropertySheetPage;\r
 import org.osgi.framework.BundleContext;\r
 \r
 import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
 import eu.etaxonomy.cdm.database.DataSourceNotFoundException;\r
 import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
-import eu.etaxonomy.cdm.model.agent.Person;\r
-import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
+import eu.etaxonomy.cdm.database.ICdmDataSource;\r
 import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;\r
-import eu.etaxonomy.cdm.model.name.BotanicalName;\r
-import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-\r
+import eu.etaxonomy.taxeditor.controller.GlobalController;\r
+import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;\r
+import eu.etaxonomy.taxeditor.datasource.CdmTransactionController;\r
+import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
 /**\r
  * The class controlling the plug-in life cycle.\r
+ * </p>\r
+ * <ul>\r
+ *     <li>Initializes datastore as necessary.</li>\r
+ *     <li>Initializes CDM application controller.</li>\r
+ *     <li>Initializes default preferences.</li>\r
+ *     <li>Stores registries for colors, fonts, images.</li>\r
+ * </ul>\r
  * \r
  * @author p.ciardelli\r
  * @created 15.05.2008\r
  * @version 1.0\r
  */\r
 public class TaxEditorPlugin extends AbstractUIPlugin {\r
-       private static final Logger logger = Logger.getLogger(TaxEditorPlugin.class);\r
+       private static final Logger logger = Logger\r
+                       .getLogger(TaxEditorPlugin.class);\r
 \r
        /**\r
         * The plug-in ID\r
@@ -60,364 +69,339 @@ public class TaxEditorPlugin extends AbstractUIPlugin {
        public static final String PLUGIN_ID = "eu.etaxonomy.taxeditor.plugin";\r
        /**\r
         * The shared instance\r
-        */     \r
-       private static TaxEditorPlugin plugin;\r
-       /**\r
-        * The constructor\r
         */\r
-       public TaxEditorPlugin() {\r
-               logger.fatal("Fatal");\r
-               logger.error("Error");\r
-               logger.debug("Debug");\r
-               logger.info("Info");\r
-               logger.warn("Warn");\r
-               logger.trace("Trace");\r
-               \r
-               boolean initDatastore = false;\r
-//             initDatastore = true;\r
-               if (initDatastore)\r
-                       initDatastore();\r
-               else {\r
-                       DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;\r
-                       try {\r
-                               cdmApp = CdmApplicationController.NewInstance(dbSchemaValidation);\r
-                       } catch (DataSourceNotFoundException e) {\r
-                               // TODO Auto-generated catch block\r
-                               e.printStackTrace();\r
-                       } catch (TermNotFoundException e) {\r
-                               // TODO Auto-generated catch block\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-               \r
-       }\r
+       private static TaxEditorPlugin plugin;\r
+\r
+//     private DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;\r
+       private DbSchemaValidation dbSchemaValidation = DbSchemaValidation.UPDATE;\r
 \r
-       void initDatastore() {\r
-               DbSchemaValidation dbSchemaValidation = DbSchemaValidation.CREATE;\r
-               try {\r
-                       cdmApp = CdmApplicationController.NewInstance(dbSchemaValidation);\r
-               } catch (DataSourceNotFoundException e) {\r
-                       e.printStackTrace();\r
-               } catch (TermNotFoundException e) {\r
-                       e.printStackTrace();\r
-               }\r
-               \r
-               boolean useSoraya = true;\r
-//             useSoraya = false;\r
-               Taxon genusTaxon;\r
-               if (useSoraya) {\r
-                       genusTaxon = getSorayasGenusTaxon();\r
-               } else {\r
-               \r
-                       BotanicalName botanicalName = BotanicalName.NewInstance(Rank.GENUS());\r
-                       botanicalName.setTitleCache("Hieracium L.");\r
-                       botanicalName.setGenusOrUninomial("Hieracium");\r
-                       botanicalName.setCombinationAuthorTeam(Person.NewInstance());\r
-                       botanicalName.getCombinationAuthorTeam().setNomenclaturalTitle("L.");\r
-                       genusTaxon = new Taxon();\r
-                       genusTaxon.setName(botanicalName);\r
-                       genusTaxon.setSec(null);\r
-                                       \r
-                       BotanicalName botSpecies = BotanicalName.NewInstance(Rank.SPECIES());\r
-                       botSpecies.setTitleCache("Hieracium asturianum Pau");\r
-                       botSpecies.setGenusOrUninomial("Hieracium");\r
-                       botSpecies.setSpecificEpithet("asturianum");\r
-                       botSpecies.setCombinationAuthorTeam(Person.NewInstance());\r
-                       botSpecies.getCombinationAuthorTeam().setNomenclaturalTitle("Pau");\r
-                       Taxon childTaxon = new Taxon();\r
-                       childTaxon.setName(botSpecies);\r
-                       childTaxon.setSec(null);\r
-                       childTaxon.setTaxonomicParent(genusTaxon, null, null);\r
-       \r
-                       BotanicalName botSpecies2= BotanicalName.NewInstance(Rank.SPECIES());\r
-                       botSpecies2.setTitleCache("Hieracium wolffii Zahn");\r
-                       botSpecies2.setGenusOrUninomial("Hieracium");\r
-                       botSpecies2.setSpecificEpithet("wolffii");\r
-                       botSpecies2.setCombinationAuthorTeam(Person.NewInstance());\r
-                       botSpecies2.getCombinationAuthorTeam().setNomenclaturalTitle("Zahn");\r
-                       Taxon childTaxon2 = new Taxon();\r
-                       childTaxon2.setName(botSpecies2);\r
-                       childTaxon2.setSec(null);\r
-                       childTaxon2.setTaxonomicParent(genusTaxon, null, null);\r
-                       \r
-                       // Add some name relations to botSpecies2\r
-                       botSpecies2.addRelationshipFromName(botSpecies, NameRelationshipType.BASIONYM(), null);\r
-                       botSpecies2.addRelationshipToName(botSpecies, NameRelationshipType.REPLACED_SYNONYM(), null);\r
-                       logger.warn("Name relations created");\r
-                       \r
-                       // Add name status to botSpecies2\r
-                       botSpecies2.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.NOVUM()));\r
-                       logger.warn("Nom. status created");\r
-               }\r
-               \r
-               cdmApp.getTaxonService().saveTaxon(genusTaxon);\r
-               \r
-//             System.exit(-1);                \r
-       }\r
-       \r
        /*\r
         * (non-Javadoc)\r
+        * \r
         * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
         */\r
        public void start(BundleContext context) throws Exception {\r
+               \r
                super.start(context);\r
                plugin = this;\r
+                               \r
+               // Check whether this is the first time the application has ever been run\r
+               checkInitialExecution();\r
+               \r
+               // Initialize application controller\r
+               initApplicationController();\r
+               \r
+               // Start a transaction\r
+               CdmTransactionController.startTransaction();\r
+               \r
+               // Forgot what this is ...\r
+               Locale locale = new Locale("en", "", "icbn");\r
+               Locale.setDefault(locale);\r
        }\r
 \r
+       \r
        /*\r
         * (non-Javadoc)\r
+        * \r
         * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
         */\r
        public void stop(BundleContext context) throws Exception {\r
+               CdmTransactionController.commitTransaction();\r
                plugin = null;\r
                super.stop(context);\r
+               \r
+               disposeColors();\r
        }\r
-\r
+       \r
        /**\r
         * Returns the shared instance\r
-        *\r
+        * \r
         * @return the shared instance\r
         */\r
        public static TaxEditorPlugin getDefault() {\r
                return plugin;\r
        }\r
 \r
-       /* ***************************************************************************************\r
-                       CDM SERVICES\r
-       ************************************************************************************** */\r
-       /**\r
-        * All CDM services are called via the application controller\r
-        */\r
-       private CdmApplicationController cdmApp;\r
+       private void checkInitialExecution() {\r
+               \r
+               // Check in the prefs store whether the application (i.e. its default\r
+               //      data source) has been initialized\r
+               boolean initialized = false;\r
+               if (getPreferenceStore().contains(ITaxEditorConstants.INITIALIZED)) {\r
+                       initialized = getPreferenceStore().getBoolean(\r
+                                       ITaxEditorConstants.INITIALIZED);\r
+               }\r
        \r
-       public CdmApplicationController getCdmApp() {\r
-               return cdmApp;\r
+               // If not ...\r
+               if (!initialized) {\r
+                       \r
+                       // ... set validation to CREATE\r
+                       logger.warn("Initializing datastore");\r
+                       dbSchemaValidation = DbSchemaValidation.CREATE;\r
+                       \r
+                       // ... and note in prefs that application has been initialized\r
+                       getPreferenceStore().setValue(ITaxEditorConstants.INITIALIZED, true);\r
+               }\r
        }\r
+       \r
+       /***************************************************************************\r
+        * CDM SERVICES\r
+        **************************************************************************/\r
 \r
-       /* ***************************************************************************************\r
-                       OBSERVABLE LISTS\r
-        ************************************************************************************** */\r
-       /**\r
-        * The dataset of taxa for this session\r
-        */\r
-       private WritableList observableTaxonTreeList = null;\r
        /**\r
-        * Keeps track of which taxa have been opened for editing\r
+        * All CDM services are called via the application controller\r
         */\r
-       private WritableList observableRecentNamesList = null;\r
-       public WritableSet observableSynonymSet = null;\r
-       private WritableList observableFavoritesList = null;    \r
-       public WritableList getObservableTaxonTreeList() {\r
-               if (observableTaxonTreeList == null) {\r
-                       observableTaxonTreeList = new WritableList();\r
-                       ReferenceBase sec = cdmApp.getReferenceService().getReferenceByUuid(UUID.fromString("f3593c18-a8d2-4e51-bdad-0befbf8fb2d1"));\r
-                       observableTaxonTreeList.addAll(cdmApp.getTaxonService().getRootTaxa(sec));\r
+       private CdmApplicationController applicationController;\r
+\r
+       private CdmApplicationController initApplicationController() {\r
+               \r
+               // Get the "current" - i.e. most recently used - data source\r
+               ICdmDataSource cdmDatasource = CdmDataSourceRepository.getDefault().\r
+                               getCurrentDataSource();\r
+               \r
+               // Initialize the controller with the data source\r
+               try {\r
+                       applicationController = CdmApplicationController.NewInstance(cdmDatasource, dbSchemaValidation);\r
+               } catch (DataSourceNotFoundException e) {\r
+                       // TODO user-friendly failure here\r
+                       e.printStackTrace();\r
+               } catch (TermNotFoundException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
                }\r
-               return observableTaxonTreeList;\r
+               \r
+               // Set application controller for objects that use it \r
+               CdmTransactionController.setApplicationController(applicationController);\r
+               CdmDataSourceRepository.getDefault().setCdmApplicationController(applicationController);\r
+               CdmSessionDataRepository.getDefault().setApplicationController(applicationController);\r
+               \r
+//             // Terms have to be initialized explicitly as of now\r
+//             logger.warn("MAC Workaround enabled!!");\r
+//             DefaultTermInitializer vocabularyStore = new DefaultTermInitializer();\r
+//             vocabularyStore.initialize();\r
+               \r
+               return applicationController;\r
        }\r
        \r
-       public WritableList getObservableRecentNamesList() {\r
-               if (observableRecentNamesList == null) {\r
-                       observableRecentNamesList = new WritableList();\r
+       public CdmApplicationController getApplicationController() {\r
+               if (applicationController == null) {\r
+                       throw new IllegalStateException("CdmApplicationController not yet set.");\r
                }\r
-               return observableRecentNamesList;\r
+               return applicationController;\r
        }\r
 \r
+       /***************************************************************************\r
+        * IMAGE REGISTRY\r
+        **************************************************************************/\r
+       public ImageDescriptor getImageDescriptor(String key) {\r
+               return getImageRegistry().getDescriptor(key);\r
+       }\r
 \r
-       public WritableList getObservableFavoritesList() {\r
-               if (observableFavoritesList  == null) {\r
-                       observableFavoritesList = new WritableList();\r
-               }\r
-               return observableFavoritesList;\r
-       }               \r
-       \r
-       public WritableSet getObservableSynonymSet() {\r
-               if (observableSynonymSet == null) {\r
-                       observableSynonymSet = new WritableSet();\r
-               }               \r
-               return observableSynonymSet;            \r
+       public Image getImage(String key) {\r
+               return getImageRegistry().get(key);\r
        }\r
-       \r
-       /* ***************************************************************************************\r
-                       IMAGE REGISTRY\r
-        ************************************************************************************** */\r
+\r
        /**\r
-        * Returns an image descriptor for the image file at the given\r
-        * plug-in relative path\r
-        *\r
-        * @param path the path\r
-        * @return the image descriptor\r
+        * Gets an image for the given URL. Adds the image to the registry as needed.\r
+        * \r
+        * @param url\r
+        * @return\r
         */\r
-       public static ImageDescriptor getImageDescriptor(String path) {\r
-               return imageDescriptorFromPlugin(PLUGIN_ID, path);\r
+       public Image getImage(URL url) {                \r
+               \r
+               String key = url.toString();\r
+               ImageRegistry registry = getImageRegistry();\r
+\r
+               Image image = registry.get(key);\r
+               \r
+               if (image == null) {\r
+                       ImageDescriptor desc = ImageDescriptor.createFromURL(url);\r
+                       \r
+//                     logger.warn(ImageDescriptor.getMissingImageDescriptor().getClass());\r
+//                     logger.warn(desc.getClass());\r
+//                     \r
+//                     if (ImageDescriptor.getMissingImageDescriptor().equals(desc)) {\r
+//                             logger.warn("img not found");\r
+//                     }\r
+                       \r
+                       registry.put(key, desc);\r
+                       try {\r
+                               image = registry.get(key);\r
+                       } catch (Exception e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+               \r
+               return image;\r
        }\r
        \r
-       public Image getImage(String key) {\r
-               return getImageRegistry().get(key);\r
-       }\r
-       // Resource bundle.\r
-       private ResourceBundle resourceBundle;\r
-       private FormColors formColors;\r
        protected void initializeImageRegistry(ImageRegistry registry) {\r
-               registerImage(registry, ITaxEditorConstants.ACCEPTED_TAXON_ICON, "accepted_small.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.HOMOTYPIC_SYN_ICON, "homosyn_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.HOMOTYPIC_SYN_ORIGINAL_ICON, "homosyn_original_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.HETEROTYPIC_SYN_ICON, "heterosyn_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.HETEROTYPIC_SYN_ORIGINAL_ICON, "heterosyn_original_no_bg.gif"); //$NON-NLS-1$               \r
-               registerImage(registry, ITaxEditorConstants.MISAPPLIED_NAME_ICON, "misapplied_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.AUTONYM_ICON, "autonym_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.BASIONYM_ICON, "basionym_no_bg.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.DB_ICON, "db.gif"); //$NON-NLS-1$\r
-               registerImage(registry, ITaxEditorConstants.MOVE_ICON, "move_no_bg.gif"); //$NON-NLS-1$\r
+               registerImage(registry, ITaxEditorConstants.EDIT_ICON, "edit_16x16.ico");\r
+               registerImage(registry, ITaxEditorConstants.WARNING_ICON,\r
+                               "warn_tsk.gif");\r
+               registerImage(registry, ITaxEditorConstants.BLACK_SQUARE_ICON,\r
+                               "accepted_small.gif");\r
+               registerImage(registry, ITaxEditorConstants.HOMOTYPIC_SYN_ICON,\r
+                               "homosyn_no_bg.gif");\r
+               registerImage(registry,\r
+                               ITaxEditorConstants.HOMOTYPIC_SYN_ORIGINAL_ICON,\r
+                               "homosyn_original_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.HETEROTYPIC_SYN_ICON,\r
+                               "heterosyn_no_bg.gif");\r
+               registerImage(registry,\r
+                               ITaxEditorConstants.HETEROTYPIC_SYN_ORIGINAL_ICON,\r
+                               "heterosyn_original_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.MISAPPLIED_NAME_ICON,\r
+                               "misapplied_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.CONCEPT_ICON,\r
+                               "concept_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.AUTONYM_ICON,\r
+                               "autonym_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.BASIONYM_ICON,\r
+                               "basionym_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.ORTHOGRAPHIC_VARIANT_ICON,\r
+                               "orthovariant_no_bg.gif");\r
+               registerImage(registry, ITaxEditorConstants.DB_ICON, "db.gif");\r
+               registerImage(registry, ITaxEditorConstants.MOVE_ICON,\r
+                               "correction_change.gif");\r
+               registerImage(registry, ITaxEditorConstants.ACTIVE_DELETE_ICON,\r
+                               "delete_edit.gif");\r
+               registerImage(registry, ITaxEditorConstants.SYNONYM_TO_TAXON_ICON,\r
+                               "change.gif");\r
+               registerImage(registry, ITaxEditorConstants.OPEN_TAXON_ICON, "open.gif");\r
+               registerImage(registry, ITaxEditorConstants.ADD_CHILD_TAXON_ICON,\r
+                               "new_child.gif");\r
+               registerImage(registry,\r
+                               ITaxEditorConstants.SWAP_SYNONYM_AND_TAXON_ICON, "swap2.gif");\r
+               registerImage(registry, ITaxEditorConstants.QUICK_ADD_ICON,\r
+                               "quick_add.gif");\r
+               registerImage(registry, ITaxEditorConstants.TAXON_TO_SYNONYM_ICON,\r
+                               "tax_to_syn.gif");\r
+               registerImage(registry, ITaxEditorConstants.ERROR_ANNOTATION_ICON,\r
+                               "error_co.gif");\r
+               registerImage(registry, ITaxEditorConstants.EDIT_BITMAP_ICON,\r
+                               "256color_16x16.bmp");\r
        }\r
+\r
        private void registerImage(ImageRegistry registry, String key,\r
                        String fileName) {\r
                try {\r
                        IPath path = new Path("icons/" + fileName); //$NON-NLS-1$\r
-                       URL url = find(path);\r
-                       if (url!=null) {\r
+                       URL url = FileLocator.find(getBundle(), path, null);\r
+                       if (url != null) {\r
                                ImageDescriptor desc = ImageDescriptor.createFromURL(url);\r
                                registry.put(key, desc);\r
                        }\r
                } catch (Exception e) {\r
                }\r
        }\r
+       \r
+\r
+       /***************************************************************************\r
+        * FONT REGISTRY\r
+        **************************************************************************/\r
+       private FontRegistry fontRegistry;\r
+\r
+       private FontRegistry getFontRegistry() {\r
+               if (fontRegistry == null) {\r
+                       fontRegistry = new FontRegistry(Display.getCurrent());\r
+\r
+                       fontRegistry.put(ITaxEditorConstants.DATASOURCE_FONT,\r
+                                       new FontData[] { new FontData("Arial", 8, SWT.NONE) });\r
+                       fontRegistry.put(ITaxEditorConstants.MENU_ITEM_ITALICS_FONT,\r
+                                       new FontData[] { new FontData("Arial", 9, SWT.ITALIC) });\r
+                       fontRegistry.put(ITaxEditorConstants.ACCEPTED_TAXON_FONT,\r
+                                       new FontData[] { new FontData("Georgia", 12, SWT.NONE) });\r
+                       fontRegistry.put(ITaxEditorConstants.SYNONYM_FONT,\r
+                                       new FontData[] { new FontData("Georgia", 10, SWT.NONE) });\r
+                       fontRegistry.put(ITaxEditorConstants.MISAPPLIEDNAME_FONT,\r
+                                       new FontData[] { new FontData("Georgia", 10, SWT.NONE) });\r
+                       fontRegistry.put(ITaxEditorConstants.CONCEPT_FONT,\r
+                                       new FontData[] { new FontData("Georgia", 10, SWT.NONE) });\r
+                       fontRegistry.put(ITaxEditorConstants.CHOOSE_NAME_TEXT_FONT,\r
+                                       new FontData[] { new FontData("Arial", 12, SWT.BOLD) });\r
+                       fontRegistry.put(ITaxEditorConstants.DEFAULT_PROMPT_FONT,\r
+                                       new FontData[] { new FontData("Georgia", 10, SWT.ITALIC) });                    \r
+               }\r
+               return fontRegistry;\r
+       }\r
 \r
-       /* ***************************************************************************************\r
-                       PREFERENCES\r
-       ************************************************************************************** */\r
-       protected void initializeDefaultPreferences(IPreferenceStore store) {\r
-               logger.warn("setting default");\r
-               store.setDefault(ITaxEditorConstants.CODE_PREFERENCE, ITaxEditorConstants.DEFAULT_CODE_PREFERENCE);\r
+       public Font getFont(String key) {\r
+               return getFontRegistry().get(key);\r
        }\r
-       \r
-       /* ***************************************************************************************\r
-                       TAXONOMIC CHILDREN\r
-        ************************************************************************************** */\r
-       public Set<Taxon> getTaxonomicChildren(Taxon taxon) {\r
-//             return cdmApp.getTaxonService().getTaxonomicChildren(taxon);\r
-               return null;\r
+\r
+       /**\r
+        * @param font\r
+        */\r
+       public Font italicizeFont(Font font) {\r
+               FontData fontData = font.getFontData()[0];\r
+               fontData.setStyle(fontData.getStyle() | SWT.ITALIC);\r
+               Font italFont = new Font(Display.getDefault(), fontData);\r
+               \r
+               int i = 0;\r
+               String fontName = "italic";\r
+               Set keySet = fontRegistry.getKeySet();\r
+               while (keySet.contains(fontName + i)) {\r
+                       i++;\r
+               }\r
+               fontRegistry.put(fontName + i, italFont.getFontData());\r
+               \r
+               return italFont;\r
        }\r
+\r
+       /***************************************************************************\r
+        * COLOR MAP\r
+        **************************************************************************/\r
+       private static HashMap<String, Color> colorRegistry;\r
        \r
-       /* ***************************************************************************************\r
-                       RANKS\r
-        ************************************************************************************** */      \r
-       OrderedTermVocabulary<Rank> rankVocabulary = null;\r
+       public Color getColor(String key) {\r
+               return getColorRegistry().get(key);\r
+       }\r
        \r
-       public OrderedTermVocabulary<Rank> getRankVocabulary() {\r
-               if (rankVocabulary == null) {\r
-                       rankVocabulary = cdmApp.getNameService().getRankVocabulary();\r
+       private HashMap<String, Color> getColorRegistry() {\r
+               if (colorRegistry == null) {\r
+                        colorRegistry = new HashMap<String, Color>();\r
+                        \r
+                        colorRegistry.put(ITaxEditorConstants.GROUP_GRAY_BKG_COLOR,\r
+                                        new Color(null, 240, 240, 240));\r
+                        colorRegistry.put(ITaxEditorConstants.PROP_SHEET_RED,\r
+                                        new Color(null, 255, 0, 0));                    \r
                }\r
-               return rankVocabulary;\r
+               return colorRegistry;\r
        }\r
        \r
-       /* ***************************************************************************************\r
-                       NOMENCLATURAL STATUS\r
-       ************************************************************************************** */       \r
-       OrderedTermVocabulary<NomenclaturalStatusType> nomStatusVocabulary = null;\r
-       \r
-       public OrderedTermVocabulary<NomenclaturalStatusType> getNomStatusVocabulary() {\r
-               if (nomStatusVocabulary == null) {\r
-                       nomStatusVocabulary = cdmApp.getNameService().getStatusTypeVocabulary();\r
+       private void disposeColors() {\r
+               if (colorRegistry == null) {\r
+                       return;\r
                }\r
-               return nomStatusVocabulary;\r
+        for (Color color : colorRegistry.values()) {\r
+               color.dispose();\r
+        }\r
+        colorRegistry.clear();\r
        }\r
+\r
+       /***************************************************************************\r
+        * PROPERTY SHEET\r
+        **************************************************************************/\r
        \r
-       /* ***************************************************************************************\r
-                       NAME RELATIONS\r
-       ************************************************************************************** */       \r
-       OrderedTermVocabulary<NameRelationshipType> nameRelationshipTypeVocabulary = null;\r
+       private Tree propertySheetTree;\r
        \r
-       public OrderedTermVocabulary<NameRelationshipType> getNameRelationshipTypeVocabulary() {\r
-       if (nameRelationshipTypeVocabulary == null) {\r
-               nameRelationshipTypeVocabulary = cdmApp.getNameService().getNameRelationshipTypeVocabulary();\r
-       }\r
-       return nameRelationshipTypeVocabulary;\r
+       public void setPropertySheetTree(Tree tree) {\r
+               this.propertySheetTree = tree;\r
        }\r
        \r
-       \r
-       /* ***************************************************************************************\r
-                       SORAYA DATA\r
-       ************************************************************************************** */\r
-       private Taxon getSorayasGenusTaxon() {\r
-               \r
-               String [] children = new String[] {"Heterospathe annectens H.E.Moore",\r
-                "Heterospathe arfakiana (Becc.) H.E.Moore",\r
-                "Heterospathe brevicaulis Fernando",\r
-                "Heterospathe cagayanensis Becc.",\r
-                "Heterospathe califrons Fernando, Palms 45: 118 (2001).", \r
-                "Heterospathe clemensiae (Burret) H.E.Moore",\r
-                "Heterospathe delicatula H.E.Moore",\r
-                "Heterospathe dransfieldii Fernando",\r
-                "Heterospathe elata Scheff.",\r
-                "Heterospathe elata var. elata.", \r
-                "Heterospathe elata var. guamensis Becc.",\r
-                "Heterospathe elata var. palauensis (Becc.) Becc.",\r
-                "Heterospathe elegans (Becc.) Becc.",\r
-                "Heterospathe elmeri Becc.",\r
-                "Heterospathe glabra (Burret) H.E.Moore",\r
-                "Heterospathe glauca (Scheff.) H.E.Moore",\r
-                "Heterospathe humilis Becc.",\r
-                "Heterospathe intermedia (Becc.) Fernando",\r
-                "Heterospathe kajewskii Burret",\r
-                "Heterospathe ledermanniana Becc.",\r
-                "Heterospathe lepidota H.E.Moore",\r
-                "Heterospathe longipes (H.E.Moore) Norup",\r
-                "Heterospathe macgregorii (Becc.) H.E.Moore",\r
-                "Heterospathe micrantha (Becc.) H.E.Moore", \r
-                "Heterospathe minor Burret",\r
-                "Heterospathe muelleriana (Becc.) Becc.",\r
-                "Heterospathe negrosensis Becc.",\r
-                "Heterospathe obriensis (Becc.) H.E.Moore",\r
-                "Heterospathe palauensis Becc.",\r
-                "Heterospathe parviflora Essig",\r
-                "Heterospathe philippinensis (Becc.) Becc.",\r
-//                "Heterospathe phillipsii D.Fuller & Dowe", // <--------------\r
-                "Heterospathe pilosa (Burret) Burret",\r
-                "Heterospathe pisifera (Gaertn.) Burret",\r
-                "Heterospathe pulchra H.E.Moore",\r
-                "Heterospathe ramulosa Burret",\r
-                "Heterospathe salomonensis Becc.",\r
-                "Heterospathe scitula Fernando",\r
-                "Heterospathe sensisi Becc.",\r
-                "Heterospathe sibuyanensis Becc.",\r
-                "Heterospathe sphaerocarpa Burret",\r
-                "Heterospathe trispatha Fernando",\r
-                "Heterospathe uniformis Dowe",\r
-                "Heterospathe versteegiana Becc.",\r
-                "Heterospathe woodfordiana Becc."};\r
-\r
-               BotanicalName genusName = BotanicalName.PARSED_NAME("Heterospathe Scheff.");\r
-               \r
-               Taxon genusTaxon = new Taxon();\r
-               genusTaxon.setName(genusName);\r
-               genusTaxon.setSec(null);\r
-                               \r
-               for (String child : children) {\r
-                       BotanicalName speciesName = BotanicalName.PARSED_NAME(child);\r
-                       \r
-                       Taxon childTaxon = new Taxon();\r
-                       childTaxon.setName(speciesName);\r
-                       childTaxon.setSec(null);\r
-                       childTaxon.setTaxonomicParent(genusTaxon, null, null);\r
-                       \r
-                       if (child.equals("Heterospathe elegans (Becc.) Becc.")) {\r
-                               BotanicalName basionym = BotanicalName.PARSED_NAME("Barkerwebbia elegans Becc."); \r
-                               speciesName.addRelationshipFromName(basionym, NameRelationshipType.BASIONYM(), null);\r
-                               childTaxon.addHomotypicSynonymName(basionym);\r
-                       }\r
-                       \r
-                       if (child.equals("Heterospathe humilis Becc.")) {\r
-                               BotanicalName synonymName = BotanicalName.PARSED_NAME("Barkerwebbia humilis (Becc.) Becc. ex Martelli");\r
-                               childTaxon.addHomotypicSynonymName(synonymName);\r
-                       }\r
-               }\r
-\r
-               return genusTaxon;\r
+       public Tree getPropertySheetTree() {\r
+               return propertySheetTree;\r
        }\r
 \r
-       public List<TaxonNameBase> getNameByName(String searchText) {\r
-               // TODO make sure last character is %\r
-               return cdmApp.getNameService().getNamesByName(searchText);\r
+       private PropertySheetPage propertySheetPage;\r
+       \r
+       public void setPropertySheetPage(PropertySheetPage page) {\r
+               this.propertySheetPage = page;\r
+       }\r
+       \r
+       public PropertySheetPage getPropertySheetPage() {\r
+               return propertySheetPage;\r
        }\r
-}
\ No newline at end of file
+}\r