-/**\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.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.SortedSet;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.eclipse.core.commands.operations.IOperationHistory;\r
-import org.eclipse.core.commands.operations.IUndoContext;\r
-import org.eclipse.core.commands.operations.OperationHistoryFactory;\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.Status;\r
-import org.eclipse.jface.action.IStatusLineManager;\r
-import org.eclipse.swt.graphics.Color;\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
-import org.eclipse.ui.IPageLayout;\r
-import org.eclipse.ui.IViewPart;\r
-import org.eclipse.ui.IViewReference;\r
-import org.eclipse.ui.IWorkbench;\r
-import org.eclipse.ui.IWorkbenchPage;\r
-import org.eclipse.ui.PartInitException;\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.description.Feature;\r
-import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.actions.cdm.SaveTaxonAction;\r
-import eu.etaxonomy.taxeditor.datasource.CdmTransactionController;\r
-import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;\r
-import eu.etaxonomy.taxeditor.editor.name.CdmParserController;\r
-import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;\r
-import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;\r
-import eu.etaxonomy.taxeditor.model.NameEditorInput;\r
-import eu.etaxonomy.taxeditor.navigation.SearchResult;\r
-import eu.etaxonomy.taxeditor.navigation.SearchResultView;\r
-import eu.etaxonomy.taxeditor.navigation.RecentNamesView;\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
- * \r
- * @author p.ciardelli\r
- * @created 27.05.2008\r
- * @version 1.0\r
- */\r
-public class UiUtil {\r
- private static final Logger logger = Logger.getLogger(UiUtil.class);\r
-\r
- public static Set<Feature> preferredFeatureSet;\r
- public static Set<Rank> preferredRankSet;\r
- private static IViewPart treeView;\r
-\r
- private static IOperationHistory operationHistory;\r
- \r
- public static IViewPart getPropertySheet() {\r
- for (IViewReference reference : getActivePage().getViewReferences()) {\r
- if (reference.getId().equals(IPageLayout.ID_PROP_SHEET)) {\r
- logger.warn(reference.getView(false).getSite().getPart().getTitle());\r
- return reference.getView(false);\r
- }\r
- }\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
- */\r
- public static void addPropertySheetInputListener() {\r
- IViewPart propertySheet = getPropertySheet();\r
-// propertySheet.get\r
- PropertySheet ps = (PropertySheet) propertySheet;\r
-// ps.addPartPropertyListener(listener)\r
-// ps.addPropertyListener(l)\r
- }\r
- \r
- public static void saveAll(){\r
- setIsSaving(true);\r
- \r
- // Get all open windows\r
- for (IEditorPart taxonEditor : getOpenTaxonEditors()) {\r
-\r
- // Save the dirty ones\r
- if (taxonEditor.isDirty()) {\r
- \r
- \r
- IEditorInput input = taxonEditor.getEditorInput();\r
- if (input.getAdapter(Taxon.class) != null) {\r
- Taxon taxon = (Taxon) input.getAdapter(Taxon.class);\r
- CdmSessionDataRepository.getDefault().saveTaxon(taxon);\r
- if (taxonEditor instanceof MultiPageTaxonEditor) {\r
- ((MultiPageTaxonEditor) taxonEditor).setDirtyExtern(false);\r
- }\r
- }\r
- }\r
- }\r
-\r
- // Commit the transaction \r
- CdmTransactionController.commitTransaction();\r
- \r
- // Force library objects to be associated with new transaction\r
- CdmSessionDataRepository.getDefault().clearNonTaxonData();\r
- \r
- // Start a new transaction\r
- CdmTransactionController.startTransaction();\r
- \r
- // Put all open taxa in the new transaction\r
- CdmTransactionController.addSessionTaxaToTransaction();\r
- \r
- setIsSaving(false);\r
- // TODO: delete undoHistory\r
- }\r
- \r
- //public void deleteTaxon()\r
- \r
- /**\r
- * @param input\r
- * @return\r
- * @throws PartInitException\r
- */\r
- public static IEditorPart getEditorByInput(IEditorInput input)\r
- throws PartInitException {\r
- for (IEditorReference reference : getActivePage().getEditorReferences()) {\r
- if (reference.getEditorInput().equals(input)) {\r
- IEditorPart editor = reference.getEditor(false);\r
- return editor;\r
- }\r
- }\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 boolean closeOpenTaxonEditors() {\r
- for (IEditorPart editor : getOpenTaxonEditors()) {\r
- if (!getActivePage().closeEditor(editor, true)) {\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- \r
- public static IEditorPart getEditorByTaxon(Taxon taxon)\r
- throws PartInitException {\r
- IEditorInput input = new NameEditorInput(taxon);\r
- return getEditorByInput(input);\r
- }\r
- \r
- /**\r
- * @return\r
- */\r
- public static IWorkbenchPage getActivePage() {\r
- return TaxEditorPlugin.getDefault().getWorkbench()\r
- .getActiveWorkbenchWindow().getActivePage();\r
- }\r
-\r
- /**\r
- * @return\r
- */\r
- public static Shell getShell() {\r
- return TaxEditorPlugin.getDefault().getWorkbench()\r
- .getActiveWorkbenchWindow().getShell();\r
- }\r
-\r
- /**\r
- * @param input\r
- * @param editorId\r
- * @return \r
- * @throws PartInitException\r
- */\r
- public static IEditorPart openEditor(IEditorInput input, String editorId)\r
- throws PartInitException {\r
- return getActivePage().openEditor(input, editorId);\r
- }\r
- \r
- /**\r
- * Open an emtpy taxon editor\r
- * \r
- * @return\r
- * @throws PartInitException\r
- */\r
- public static IEditorPart openTaxonEditor() \r
- throws PartInitException{\r
- return openTaxonEditor(null);\r
- }\r
- \r
- /** \r
- * Open a taxon editor for the given taxon\r
- * \r
- * @param taxon\r
- * @return\r
- * @throws PartInitException\r
- */\r
- public static IEditorPart openTaxonEditor(Taxon taxon)\r
- throws PartInitException{\r
- if(taxon == null){\r
- TaxonNameBase name = CdmParserController.parseFullReference("", null, null);\r
- name.setFullTitleCache("", false);\r
- name.setTitleCache("", false);\r
- taxon = Taxon.NewInstance(name, \r
- CdmSessionDataRepository.getDefault().getDefaultSec());\r
- }else{\r
- // If this taxon is not visible in the tree, open node\r
- TaxonomicTreeViewer treeViewer = getTreeViewer(); \r
- if (treeViewer != null) {\r
- treeViewer.revealTaxon(taxon);\r
- }\r
- \r
- // Add to recent names list\r
- RecentNamesView.addRecentName(taxon);\r
- }\r
- \r
- IEditorInput input = new NameEditorInput(taxon);\r
- return openEditor(input, MultiPageTaxonEditor.ID);\r
- }\r
-\r
- /**\r
- * Redraws an open editor if it exists for the given taxon\r
- * \r
- * @param taxon\r
- * @return\r
- */\r
- public static boolean redrawEditor(Taxon taxon){\r
- \r
- TaxonNameEditor editor = UiUtil.getTaxonNameEditor(taxon);\r
- \r
- if(editor == null || editor.redraw()){\r
- \r
- // Mark editor as changed and unsaved\r
- editor.setDirty();\r
- \r
- return true; \r
- } \r
- return false;\r
- }\r
- \r
- /**\r
- * @param taxon\r
- * @param save\r
- * @throws PartInitException\r
- */\r
- public static void closeEditor(Taxon taxon, boolean save)\r
- throws PartInitException {\r
- IEditorPart editor = getEditorByTaxon(taxon);\r
- closeEditor(editor, save);\r
- }\r
- \r
- /**\r
- * @param input\r
- * @param save\r
- * @throws PartInitException\r
- */\r
- public static void closeEditor(IEditorInput input, boolean save)\r
- throws PartInitException {\r
- IEditorPart editor = getEditorByInput(input);\r
- closeEditor(editor, save);\r
- }\r
-\r
- /**\r
- * @param editor\r
- * @param save\r
- * @throws PartInitException\r
- */\r
- public static void closeEditor(IEditorPart editor, boolean save)\r
- throws PartInitException {\r
- if (editor != null) {\r
- getActivePage().closeEditor(editor, save);\r
- }\r
- }\r
-\r
- public static IViewPart getViewById(String id) {\r
- return TaxEditorPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().\r
- getActivePage().findView(id);\r
- }\r
- \r
-\r
- /**\r
- * Returns the <code>TaxonomicTreeViewer</code> used for navigation. Not to \r
- * be confused with the window that contains it, <code>TaxonomicTreeView</code>. \r
- * \r
- * @return\r
- */\r
- public static TaxonomicTreeViewer getTreeViewer() {\r
- TaxonomicTreeView view = getTreeView();\r
- if (view == null) {\r
- return null;\r
- }\r
- return view.getTreeViewer();\r
- }\r
-\r
- /**\r
- * @see eu.etaxonomy.taxeditor.navigation.TaxonomicTreeView#createTreeViewer()\r
- * \r
- * @return\r
- */\r
- public static TaxonomicTreeViewer createTreeViewer() {\r
- TaxonomicTreeView view = getTreeView();\r
- if (view == null) {\r
- return null;\r
- }\r
- return view.createTreeViewer();\r
- }\r
- \r
- /**\r
- * Returns the <code>TaxonomicTreeView</code> containing the \r
- * <code>TaxonomicTreeViewer</code> used for navigation. \r
- * \r
- * @return\r
- */ \r
- public static TaxonomicTreeView getTreeView() {\r
- if (treeView == null) {\r
- treeView = getViewById(TaxonomicTreeView.ID);\r
- if (!(treeView instanceof TaxonomicTreeView)) {\r
- treeView = null;\r
- }\r
- }\r
- return (TaxonomicTreeView) treeView;\r
- }\r
- \r
-\r
- public static IWorkbenchOperationSupport getOperationSupport() {\r
- IWorkbench workbench = TaxEditorPlugin.getDefault().getWorkbench();\r
- return workbench.getOperationSupport();\r
- }\r
- \r
- public static IOperationHistory getOperationHistory() {\r
-// if (operationHistory == null) {\r
-//// operationHistory = getOperationSupport().getOperationHistory();\r
-// operationHistory = OperationHistoryFactory.getOperationHistory();\r
-// }\r
-// return operationHistory;\r
- return getOperationSupport().getOperationHistory();\r
- }\r
-\r
- public static IUndoContext getWorkbenchUndoContext() {\r
- // TODO make this more specific than GLOBAL_UNDO_CONTEXT\r
-// return getOperationSupport().getUndoContext();\r
- return IOperationHistory.GLOBAL_UNDO_CONTEXT;\r
- }\r
-\r
- public static void doEditorSave(Taxon taxon, boolean confirm) {\r
- IEditorPart editor = null;\r
- try {\r
- editor = getEditorByTaxon(taxon);\r
- } catch (PartInitException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- if (editor != null) {\r
- getActivePage().saveEditor(editor, confirm);\r
- }\r
- }\r
- \r
-\r
-// public static EditorGroupComposite getMisappliedNameGroupComposite(\r
-// IManagedForm managedForm) {\r
-//\r
-// // Iterate through parent's children until we find a composite which has a data field\r
-// // for MISAPPLIED_NAME\r
-// Composite parent = managedForm.getForm().getBody();\r
-// for (Control groupComposite : parent.getChildren()) {\r
-// if (groupComposite instanceof EditorGroupComposite) {\r
-// if (groupComposite.getData(ITaxEditorConstants.MISAPPLIED_NAME) != null) {\r
-// return (EditorGroupComposite) groupComposite;\r
-// }\r
-// }\r
-// }\r
-// return null;\r
-// }\r
-\r
-// public static EditorGroupComposite createMisappliedNameGroupComposite(\r
-// IManagedForm managedForm) {\r
-// \r
-// Composite parent = managedForm.getForm().getBody();\r
-// \r
-// EditorGroupComposite composite = new EditorGroupComposite(parent, managedForm);\r
-// composite.setData(ITaxEditorConstants.MISAPPLIED_NAME,"");\r
-// new CompositeBorderDecorator(composite, managedForm);\r
-// return composite;\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
-\r
- /**\r
- * Get the name out of the session's name relations vocabulary, not directly\r
- * from the object. \r
- * \r
- * @param type\r
- * @return\r
- */\r
- public static String getNameRelationLabelType(NameRelationshipType type) {\r
- SortedSet<NameRelationshipType> vocab = \r
- CdmSessionDataRepository.getDefault().getNameRelationshipTypes();\r
- for (NameRelationshipType type1 : vocab) {\r
- if (type1.equals(type)) {\r
- return type1.getLabel();\r
- }\r
- }\r
- return "";\r
- }\r
-\r
- static boolean isSaving = false;\r
-\r
- private static IStatusLineManager statusLineManager;\r
-\r
- private static Map<Taxon, TaxonNameEditor> taxonNameEditors;\r
-\r
- public static void setIsSaving(boolean isSavin) {\r
- isSaving = isSavin;\r
- }\r
- \r
- public static boolean getIsSaving() {\r
- return isSaving;\r
- }\r
-\r
- public static void setStatusLineManager(IStatusLineManager manager) {\r
- statusLineManager = manager;\r
- }\r
-\r
- public static void setStatusLine(String message) {\r
- statusLineManager.setMessage(message);\r
- }\r
- \r
- public static IProgressMonitor getStatusLineProgressMonitor() {\r
- statusLineManager.setCancelEnabled(false);\r
- return statusLineManager.getProgressMonitor();\r
- }\r
-\r
- public static void addTaxonNameEditor(\r
- Taxon taxon, TaxonNameEditor taxonNameEditor) {\r
- if (taxonNameEditors == null) {\r
- taxonNameEditors = new HashMap<Taxon, TaxonNameEditor>();\r
- }\r
- taxonNameEditors.put(taxon, taxonNameEditor);\r
- }\r
-\r
- public static TaxonNameEditor getTaxonNameEditor(Taxon taxon) {\r
- if (taxonNameEditors == null) {\r
- return null;\r
- }\r
- return taxonNameEditors.get(taxon);\r
- }\r
-\r
- public static IUndoContext getTaxonNameEditorUndoContext(Taxon taxon) {\r
- // TODO make this taxon name editor specific\r
-// return getTaxonNameEditor(taxon).getUndoContext();\r
- return IOperationHistory.GLOBAL_UNDO_CONTEXT;\r
- }\r
- \r
- static String srv = "";\r
- \r
- public static void openSearchResultsView(SearchResult searchResult) {\r
- srv += "1";\r
- logger.warn("opening search results window " + srv);\r
- try {\r
- IViewPart resultsView = getActivePage().showView(SearchResultView.ID, \r
- srv, IWorkbenchPage.VIEW_VISIBLE);\r
- ((SearchResultView) resultsView).setResult(searchResult);\r
- } catch (PartInitException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
-}
\ No newline at end of file