<CR> in name relation - select name now the same as clicking the "Search" button.
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / UiUtil.java
index dd13aa7dcac7032bbdba88b8c2f4fdae34c42ad0..8d9c5a0d8f9fd38e37d00fd1c67aacffd0caac95 100644 (file)
@@ -17,9 +17,14 @@ import org.eclipse.core.commands.operations.IOperationHistory;
 import org.eclipse.core.commands.operations.IUndoContext;\r
 import org.eclipse.core.commands.operations.OperationHistoryFactory;\r
 import org.eclipse.jface.preference.IPreferenceStore;\r
+import org.eclipse.swt.graphics.Color;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
 import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Tree;\r
+import org.eclipse.swt.widgets.TreeItem;\r
+import org.eclipse.ui.IActionBars;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorPart;\r
 import org.eclipse.ui.IEditorReference;\r
@@ -32,8 +37,8 @@ import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.forms.IManagedForm;\r
 import org.eclipse.ui.operations.IWorkbenchOperationSupport;\r
 import org.eclipse.ui.views.properties.PropertySheet;\r
+import org.eclipse.ui.views.properties.PropertySheetPage;\r
 \r
-import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
@@ -43,10 +48,13 @@ import eu.etaxonomy.cdm.model.name.ZoologicalName;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.editor.CompositeBorderDecorator;\r
 import eu.etaxonomy.taxeditor.editor.EditorGroupComposite;\r
+import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
+import eu.etaxonomy.taxeditor.editor.WarningAnnotation;\r
 import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 import eu.etaxonomy.taxeditor.model.NameEditorInput;\r
 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeView;\r
 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;\r
+import eu.etaxonomy.taxeditor.propertysheet.CustomSortPropertySheetEntry;\r
 \r
 /**\r
  * A collection of useful methods related to the UI.\r
@@ -60,6 +68,7 @@ public class UiUtil {
 \r
        private static Set<Feature> preferredFeatureSet;\r
        private static Set<Rank> preferredRankSet;\r
+       private static IViewPart treeView;\r
        \r
        public static IViewPart getPropertySheet() {\r
                for (IViewReference reference : getActivePage().getViewReferences()) {\r
@@ -67,10 +76,23 @@ public class UiUtil {
                                return reference.getView(false);\r
                        }\r
                }\r
-//             PropertySheet ps = new PropertySheet();\r
                return null;\r
        }\r
        \r
+       /**\r
+        * By default, property sheet has buttons in the toolbar for \r
+        * "Show advanced properties" and "Show categories".\r
+        * <p>\r
+        * This is confusing for the user, hence a method to remove them\r
+        * until such time as advanced properties or categories are implemented.\r
+        */\r
+       public static void hidePropertySheetToolbar() {\r
+               PropertySheet propertySheet = (PropertySheet) getPropertySheet();\r
+               IActionBars actionBars = propertySheet.getViewSite().getActionBars();\r
+               actionBars.getToolBarManager().removeAll();\r
+               actionBars.getMenuManager().removeAll();\r
+       }\r
+       \r
        /**\r
         * The property sheet listener ensures only property sheets\r
         *      with data cause the Property Sheet to be updated.\r
@@ -98,6 +120,25 @@ public class UiUtil {
                }\r
                return null;\r
        }\r
+       \r
+       /**\r
+        * Returns a set of all currently open \r
+        * <code>MultiPageTaxonEditor</code>s.\r
+        * \r
+        * @return\r
+        */\r
+       public static Set<IEditorPart> getOpenTaxonEditors() {\r
+               \r
+               Set<IEditorPart> taxonEditors = new HashSet<IEditorPart>();\r
+               \r
+               for (IEditorReference reference : getActivePage().getEditorReferences()) {\r
+                       IEditorPart editor = reference.getEditor(false);\r
+                       if (editor instanceof MultiPageTaxonEditor) {\r
+                               taxonEditors.add(editor);\r
+                       }\r
+               }\r
+               return taxonEditors;\r
+       }\r
 \r
        public static IEditorPart getEditorByTaxon(Taxon taxon)\r
                        throws PartInitException {\r
@@ -205,11 +246,13 @@ public class UiUtil {
         * @return\r
         */     \r
        public static TaxonomicTreeView getTreeView() {\r
-               IViewPart view = getViewById(TaxonomicTreeView.ID);\r
-               if (view == null || !(view instanceof TaxonomicTreeView)) {\r
-                       return null;\r
+               if (treeView == null) {\r
+                       treeView = getViewById(TaxonomicTreeView.ID);\r
+                       if (!(treeView instanceof TaxonomicTreeView)) {\r
+                               treeView = null;\r
+                       }\r
                }\r
-               return (TaxonomicTreeView) view;\r
+               return (TaxonomicTreeView) treeView;\r
        }\r
        \r
 \r
@@ -440,20 +483,25 @@ public class UiUtil {
                return NonViralName.NewInstance(null);\r
        }\r
        \r
-       /**\r
-        * @return\r
-        */\r
-       public static NomenclaturalCode getPreferredNomenclaturalCode() {\r
-\r
-               String nameCodePreference = TaxEditorPlugin.getDefault().getPreferenceStore().getString(ITaxEditorConstants.CODE_PREFERENCE);\r
+       public static String getNameCodePreference() {\r
+               String nameCodePreference = getPrefStore().getString(ITaxEditorConstants.CODE_PREFERENCE);\r
                \r
                // Check whether name code preference needs to be initialized\r
                if (nameCodePreference == null || nameCodePreference.equals("")) {\r
                        nameCodePreference = ITaxEditorConstants.DEFAULT_CODE_PREFERENCE;\r
-                       TaxEditorPlugin.getDefault().getPreferenceStore().setValue(ITaxEditorConstants.CODE_PREFERENCE, \r
-                                       nameCodePreference);\r
+                       getPrefStore().setValue(ITaxEditorConstants.CODE_PREFERENCE, nameCodePreference);\r
                }\r
                \r
+               return nameCodePreference;\r
+       }\r
+       \r
+       /**\r
+        * @return\r
+        */\r
+       public static NomenclaturalCode getPreferredNomenclaturalCode() {\r
+\r
+               String nameCodePreference = getNameCodePreference();\r
+                               \r
                if (nameCodePreference.equals(ITaxEditorConstants.CODE_PREFERENCE_ICBN)) {\r
                        return NomenclaturalCode.ICBN();\r
                } else if (nameCodePreference.equals(ITaxEditorConstants.CODE_PREFERENCE_ICZN)) {\r
@@ -461,4 +509,129 @@ public class UiUtil {
                }\r
                return null;\r
        }\r
+\r
+       /**\r
+        * Appends the code (i.e. ICBN or ICZN) specified in the user preferences\r
+        * to a string. The result is separated by a period: "<code>key.ICBN</code>".\r
+        * \r
+        * @param key\r
+        * @return\r
+        */\r
+       public static String concatCodeMessageSuffix(String key) {\r
+               String code = getNameCodePreference();\r
+               return key + "." + code;\r
+       }\r
+       \r
+       public static void setStatusMessage(String msg) {\r
+               getPropertySheet().getViewSite().getActionBars().getStatusLineManager().setMessage(msg); \r
+       }\r
+\r
+       public static void setPropertySheetTree(Tree tree) {\r
+               TaxEditorPlugin.getDefault().setPropertySheetTree(tree);                \r
+       }\r
+       \r
+       public static Tree getPropertySheetTree() {\r
+               return TaxEditorPlugin.getDefault().getPropertySheetTree();             \r
+       }\r
+\r
+       public static void setPropertySheetPage(PropertySheetPage page) {\r
+               TaxEditorPlugin.getDefault().setPropertySheetPage(page);\r
+       }\r
+       \r
+       public static PropertySheetPage getPropertySheetPage() {\r
+               return TaxEditorPlugin.getDefault().getPropertySheetPage();     \r
+       }\r
+       \r
+       /**\r
+        *              UiUtil.paintPropertySheetRow(P_DATEPUBLISHED, new Color(Display.getDefault(), WarningAnnotation.WARNING_RGB), true);\r
+        *              UiUtil.unpaintPropertySheetRow(P_DATEPUBLISHED);\r
+        * \r
+        * @param id\r
+        * @param color\r
+        * @param doPaintChildren\r
+        */\r
+       public static void paintPropertySheetRow(String id, Color color, boolean doPaintChildren) {\r
+               \r
+               // Catch null property sheet name\r
+               if (id == null) {\r
+                       return;\r
+               }\r
+               \r
+               // Catch uninit'ed property sheet tree\r
+               if (getPropertySheetTree() == null) {\r
+                       return;\r
+               }\r
+               \r
+               paintPropertySheetRow(id, color, doPaintChildren, getPropertySheetTree());\r
+       }\r
+       \r
+       private static void paintPropertySheetRow(String id, Color color, boolean doPaintChildren, Object treeOrItem) {\r
+               \r
+               // Init items w zero-length array\r
+               TreeItem[] items = new TreeItem[]{};\r
+               \r
+               // Get child items depending to class\r
+               if (treeOrItem instanceof Tree) {\r
+                       items = ((Tree) treeOrItem).getItems();\r
+               }\r
+               if (treeOrItem instanceof TreeItem) {\r
+                       items = ((TreeItem) treeOrItem).getItems();\r
+               }\r
+               \r
+               // If array hasn't been populated by the above, return\r
+               if (items.length == 0) {\r
+                       return;\r
+               }\r
+\r
+               // Prop. sheet id's take the form "01:xxxx" for sorting - truncate\r
+               id = CustomSortPropertySheetEntry.truncateDisplayName(id);\r
+               \r
+               // Iterate through child items\r
+               for (TreeItem item : items) {\r
+\r
+                       // Item found, paint it\r
+                       if (id.equals(item.getText())) {\r
+                               paintItem(item, color, doPaintChildren);\r
+                               return;\r
+                       }                       \r
+\r
+                       // Recursively search for item to paint in child items\r
+                       if (item.getItemCount() > 0) {\r
+                               paintPropertySheetRow(id, color, doPaintChildren, item);\r
+                       }\r
+               }       \r
+       }\r
+       \r
+       /**\r
+        * Note: children are only painted if submenu has already been created, i.e. opened once.\r
+        * \r
+        * @param item\r
+        * @param color\r
+        * @param doPaintChildren\r
+        */\r
+       private static void paintItem(TreeItem item, Color color, boolean doPaintChildren) {\r
+               \r
+               // Paint the item\r
+               item.setBackground(color);\r
+               \r
+               // Recursively paint child items if requested\r
+               if (doPaintChildren) {\r
+                       for (TreeItem childItem : item.getItems()) {\r
+                               paintItem(childItem, color, doPaintChildren);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       public static void unpaintPropertySheetRow(String id) {\r
+               \r
+               // Catch uninit'ed property sheet tree\r
+               if (getPropertySheetTree() == null) {\r
+                       return;\r
+               }\r
+               \r
+               // Get tree's background color to "unpaint"\r
+               Color color = getPropertySheetTree().getBackground();\r
+               \r
+               paintPropertySheetRow(id, color, true);\r
+       }\r
 }
\ No newline at end of file