taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptionMasterDetailsBlock.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DescriptiveInformationProvider.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionDetailsPage.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/DistributionMapDetailsPage.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/IDescriptiveInformationProvider.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/ImageDetailsPage.java -text
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiontree/TaxonDescriptionDetailsPage.java -text
*/\r
package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
\r
+import org.apache.log4j.Logger;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.IStructuredSelection;\r
import org.eclipse.swt.SWT;\r
* @author p.ciardelli\r
*\r
*/\r
-abstract public class AbstractDescriptionDetailsPage implements IDetailsPage {\r
+abstract public class AbstractDescriptionDetailsPage implements IDetailsPage { \r
+ private static final Logger logger = Logger.getLogger(AbstractDescriptionDetailsPage.class);\r
+\r
\r
protected IManagedForm mform;\r
protected Object input;\r
layout.rightMargin = 2;\r
layout.bottomMargin = 2;\r
parent.setLayout(layout);\r
- TableWrapData td2 = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);\r
+ TableWrapData td2 = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
td2.grabHorizontal = true;\r
- parent.setLayoutData(td2);\r
- \r
+ parent.setLayoutData(td2); \r
\r
FormToolkit toolkit = mform.getToolkit();\r
section = toolkit.createSection(parent, Section.DESCRIPTION|Section.TITLE_BAR);\r
section.marginWidth = 10;\r
- TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);\r
+ TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
td.grabHorizontal = true;\r
section.setLayoutData(td);\r
\r
client = toolkit.createComposite(section);\r
+// client = new Composite(section, SWT.BORDER);\r
GridLayout glayout = new GridLayout();\r
glayout.marginWidth = glayout.marginHeight = 0;\r
-// glayout.numColumns = 2;\r
client.setLayout(glayout);\r
+ TableWrapData tdclient = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL_GRAB);\r
+ client.setLayoutData(tdclient);\r
\r
section.setClient(client);\r
+ \r
+// section.addFocusListener(new FocusAdapter() {\r
+// /* (non-Javadoc)\r
+// * @see org.eclipse.swt.events.FocusAdapter#focusGained(org.eclipse.swt.events.FocusEvent)\r
+// */\r
+// @Override\r
+// public void focusGained(FocusEvent e) {\r
+// logger.warn("focus gained");\r
+// }\r
+// /* (non-Javadoc)\r
+// * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)\r
+// */\r
+// @Override\r
+// public void focusLost(FocusEvent e) {\r
+// logger.warn("focus lost");\r
+// }\r
+// });\r
\r
+ }\r
+ \r
+ private void createReferenceControls() {\r
+ \r
}\r
\r
+ /**\r
+ * Alerts editor that dirty state has changed.\r
+ */\r
+ protected void fireStateChanged() {\r
+ mform.dirtyStateChanged();\r
+ }\r
+ \r
/* (non-Javadoc)\r
* @see org.eclipse.ui.forms.IFormPart#commit(boolean)\r
*/\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.forms.IPartSelectionListener#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
*/\r
- public void selectionChanged(IFormPart part, ISelection selection) {\r
+ public void selectionChanged(IFormPart part, ISelection selection) { \r
IStructuredSelection ssel = (IStructuredSelection)selection;\r
if (ssel.size()==1) {\r
input = ssel.getFirstElement();\r
- }\r
- else\r
+ } else {\r
input = null;\r
+ }\r
}\r
\r
protected Label createLabel(String string, Composite composite, Composite parent) {\r
package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
\r
import java.util.ArrayList;\r
+import java.util.Collections;\r
import java.util.List;\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.swt.custom.CCombo;\r
import org.eclipse.swt.events.ModifyEvent;\r
import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
import org.eclipse.swt.events.SelectionEvent;\r
import org.eclipse.swt.events.SelectionListener;\r
import org.eclipse.swt.layout.GridData;\r
import org.eclipse.ui.forms.IFormPart;\r
\r
import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.TermLanguageComparator;\r
import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.taxeditor.model.DescriptionHelper;\r
-import eu.etaxonomy.taxeditor.store.VocabularyStore;\r
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
\r
/**\r
* If this is a common name whose language has not been chosen yet, the last explicitly\r
* @author p.ciardelli\r
*\r
*/\r
-public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implements ModifyListener {\r
+public class CommonNameDetailsPage extends AbstractDescriptionDetailsPage implements ModifyListener, SelectionListener {\r
+ \r
private static final Logger logger = Logger.getLogger(CommonNameDetailsPage.class);\r
\r
private Text text;\r
-\r
private CCombo combo;\r
\r
private static final int VISIBLE_ITEMS = 20;\r
\r
- private Language language;\r
- protected Language languageTemp;\r
- private List<Language> languages; \r
-\r
+ /**\r
+ * Language selected last time the dialog was used.\r
+ */\r
+ private static Language lastLanguage; \r
+ \r
+ private List<Language> languages;\r
+ \r
/* (non-Javadoc)\r
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)\r
*/\r
public void modifyText(ModifyEvent e) {\r
DescriptionHelper.setCache((DescriptionElementBase) input, text.getText());\r
- mform.dirtyStateChanged();\r
+ fireStateChanged();\r
} \r
\r
+ /**\r
+ * @param language\r
+ */\r
+ private void modifyLanguage(Language language) {\r
+ ((CommonTaxonName) input).setLanguage(language);\r
+ fireStateChanged(); \r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)\r
+ */\r
+ public void widgetDefaultSelected(SelectionEvent e) {}\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)\r
+ */\r
+ \r
+ public void widgetSelected(SelectionEvent e) {\r
+ Language language = languages.get(combo.getSelectionIndex());\r
+ \r
+ modifyLanguage(language); \r
+ setLastSelectedLanguage(language);\r
+ }\r
+ \r
/* (non-Javadoc)\r
* @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#createContents(org.eclipse.swt.widgets.Composite)\r
*/\r
\r
createLabel("Language:", client, parent);\r
\r
+// Hyperlink hyperlink = new Hyperlink(parent, SWT.NONE);\r
+// hyperlink.setText("Edit language menu");\r
+// hyperlink.setUnderlined(true);\r
+// hyperlink.setBackground(section.getBackground());\r
+// hyperlink.addMouseListener(new MouseAdapter() {\r
+// /* (non-Javadoc)\r
+// * @see org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events.MouseEvent)\r
+// */\r
+// @Override\r
+// public void mouseUp(MouseEvent e) {\r
+// org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(client.getShell(), \r
+// LanguageMenuPreferences.ID, null, null).open();\r
+// }\r
+// });\r
+ \r
// create combo\r
combo = new CCombo(client, SWT.BORDER);\r
combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
| GridData.HORIZONTAL_ALIGN_FILL));\r
combo.setVisibleItemCount(VISIBLE_ITEMS);\r
- combo.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- int i = combo.getSelectionIndex();\r
- languageTemp = languages.get(i);\r
- }\r
- });\r
\r
createLabel("Common name:", client, parent);\r
\r
text.setLayoutData(gd);\r
\r
populateLanguages();\r
-\r
-// applyDialogFont(composite);\r
- \r
-\r
}\r
\r
+ /**\r
+ * @param language\r
+ */\r
+ private void setLastSelectedLanguage(Language language) {\r
+ lastLanguage = language;\r
+ }\r
+\r
private void populateLanguages() {\r
languages = new ArrayList<Language>();\r
int i = 0; \r
int index = 0;\r
- for (Language language : VocabularyStore.getLanguages()) {\r
+ List<Language> languagesTemp = PreferencesUtil.getPreferredLanguages();\r
+ Collections.sort(languagesTemp, new TermLanguageComparator<Language>());\r
+ for (Language language : languagesTemp) {\r
\r
String description = language.getDescription(); \r
if (description == null) {\r
combo.add(description);\r
languages.add(language);\r
\r
- if (this.language != null && this.language.equals(language)) {\r
+ if (lastLanguage != null && lastLanguage.equals(language)) {\r
index = i; \r
}\r
i++;\r
@Override\r
public void selectionChanged(IFormPart part, ISelection selection) {\r
super.selectionChanged(part, selection);\r
- combo.removeModifyListener(this);\r
+ combo.removeSelectionListener(this);\r
text.removeModifyListener(this);\r
text.setText(((CommonTaxonName) input).getName());\r
- combo.addModifyListener(this);\r
+ setLanguage(((CommonTaxonName) input).getLanguage());\r
+ combo.addSelectionListener(this);\r
text.addModifyListener(this);\r
}\r
+\r
+ /**\r
+ * @param language\r
+ */\r
+ private void setLanguage(Language selectedLanguage) {\r
+ \r
+ if (selectedLanguage == null) {\r
+ if (lastLanguage != null) {\r
+ // Use last explicitly selected language\r
+ selectedLanguage = lastLanguage;\r
+ } else {\r
+ // Use first entry in language dropdown\r
+ selectedLanguage = languages.get(0);\r
+ combo.select(0);\r
+ return;\r
+ }\r
+ }\r
+ \r
+ int i = 0;\r
+ for (Language language : languages) {\r
+ if (language.equals(selectedLanguage)) {\r
+ combo.select(i);\r
+ return;\r
+ }\r
+ i++;\r
+ }\r
+ }\r
}
\ No newline at end of file
*/\r
package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
\r
-import java.util.SortedSet;\r
-\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.viewers.ITreeContentProvider;\r
import org.eclipse.jface.viewers.Viewer;\r
\r
-import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
.getLogger(DescriptionContentProvider.class);\r
\r
private static final Object[] NO_CHILDREN = new Object[0];\r
-\r
+ \r
private IDescriptiveInformationProvider infoProvider;\r
\r
public DescriptionContentProvider(IDescriptiveInformationProvider infoProvider) {\r
return infoProvider.getDescriptionElements(description, feature).toArray();\r
}\r
}\r
-// if (parentElement instanceof DescriptionElementBase) {\r
-// return infoProvider.getDescriptionFeatures((TaxonDescription) parentElement).toArray();\r
-// }\r
return NO_CHILDREN;\r
}\r
\r
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)\r
*/\r
public Object getParent(Object element) {\r
-// if (element instanceof DescriptionElementBase) {\r
-// ((DescriptionElementBase) element).get\r
-// }\r
return null;\r
}\r
\r
import eu.etaxonomy.cdm.model.common.Language;\r
import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Distribution;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
import eu.etaxonomy.cdm.model.media.ImageFile;\r
import eu.etaxonomy.taxeditor.model.DescriptionHelper;\r
\r
.getLogger(DescriptionLabelProvider.class);\r
\r
public String getText(Object element) {\r
+ // TODO move to DescriptiveInformationProvider?\r
if (element instanceof TaxonDescription) {\r
return getTaxonDescriptionText((TaxonDescription) element);\r
}\r
if (element instanceof CommonTaxonName) {\r
return getCommonNameText((CommonTaxonName) element); \r
}\r
+ if (element instanceof Distribution) {\r
+ return getDistributionText((Distribution) element); \r
+ } \r
if (element instanceof DescriptionElementBase) {\r
return getElementText((DescriptionElementBase) element);\r
}\r
return element.toString();\r
} \r
\r
+ /**\r
+ * @param element\r
+ * @return\r
+ */\r
+ private String getDistributionText(Distribution element) {\r
+ \r
+ String text = "No text provided";\r
+ \r
+ Distribution distribution = (Distribution) element;\r
+ \r
+ NamedArea area = distribution.getArea();\r
+ PresenceAbsenceTermBase<?> status = distribution.getStatus();\r
+ \r
+ if (status != null) {\r
+ text = area.getLabel() + ", " + status.getLabel();\r
+ }\r
+ return text;\r
+ }\r
+\r
/**\r
* @param element\r
* @return\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.jface.viewers.ISelectionChangedListener;\r
import org.eclipse.jface.viewers.SelectionChangedEvent;\r
import org.eclipse.jface.viewers.TreePath;\r
import org.eclipse.jface.viewers.TreeSelection;\r
import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.jface.viewers.ViewerComparator;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.layout.GridData;\r
import org.eclipse.swt.layout.GridLayout;\r
import org.eclipse.ui.forms.editor.FormPage;\r
import org.eclipse.ui.forms.widgets.FormToolkit;\r
import org.eclipse.ui.forms.widgets.Section;\r
-import org.eclipse.ui.navigator.CommonViewer;\r
\r
import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
import eu.etaxonomy.cdm.model.description.TextData;\r
import eu.etaxonomy.cdm.model.media.ImageFile;\r
+import eu.etaxonomy.taxeditor.model.ImagesHelper;\r
\r
/**\r
* @author p.ciardelli\r
private FormPage page;\r
\r
private TreeViewer descriptionViewer;\r
+\r
+ private IDescriptiveInformationProvider descriptiveInformationProvider = new DescriptiveInformationProvider();\r
\r
public DescriptionMasterDetailsBlock(FormPage page) {\r
- this.page = page;\r
+ this.page = page; \r
}\r
\r
/* (non-Javadoc)\r
descriptionViewer = new TreeViewer(tree);\r
\r
descriptionViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
+ private ISelection lastSelection;\r
+\r
public void selectionChanged(SelectionChangedEvent event) {\r
- managedForm.fireSelectionChanged(spart, event.getSelection());\r
+ if (lastSelection != null) {\r
+ // Update label of last selection\r
+ Object item;\r
+ TreePath[] paths = ((TreeSelection) lastSelection).getPaths();\r
+ if (paths.length > 0) {\r
+ item = ((TreeSelection) lastSelection).getPaths()[0].getLastSegment();\r
+ descriptionViewer.update(item, null);\r
+ }\r
+ }\r
+ managedForm.fireSelectionChanged(spart, event.getSelection());\r
+ lastSelection = event.getSelection();\r
}\r
});\r
\r
- descriptionViewer.setAutoExpandLevel(2);\r
- descriptionViewer.setContentProvider(new DescriptionContentProvider(new DescriptiveInformationProvider()));\r
+// descriptionViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);\r
+ descriptionViewer.setAutoExpandLevel(2); // Show descriptions and features\r
+ descriptionViewer.setContentProvider(new DescriptionContentProvider(descriptiveInformationProvider));\r
descriptionViewer.setLabelProvider(new DescriptionLabelProvider());\r
descriptionViewer.setInput(page.getEditor().getEditorInput());\r
- \r
+ descriptionViewer.setComparator(new ViewerComparator());\r
+ \r
// Set tree as page's selection provider\r
page.getSite().setSelectionProvider(descriptionViewer);\r
\r
detailsPart.registerPage(Distribution.class, new DistributionDetailsPage());\r
detailsPart.registerPage(TextData.class, new TextDataDetailsPage());\r
detailsPart.registerPage(ImageFile.class, new ImageDetailsPage());\r
-// detailsPart.setPageProvider(new PageProvider());\r
+ detailsPart.setPageProvider(new PageProvider());\r
}\r
\r
/**\r
- * @param objectAffectedByOperation \r
- * \r
+ * @param objectAffectedByOperation\r
*/\r
- public void refreshTree(Object revealObject) {\r
- // TODO replace all this crap w CNF\r
- descriptionViewer.setInput(page.getEditor().getEditorInput());\r
+ public synchronized void refreshTree(Object revealObject) { \r
+ descriptionViewer.refresh(true);\r
+ \r
if (revealObject instanceof DescriptionElementBase) {\r
DescriptionElementBase element = (DescriptionElementBase) revealObject;\r
Object[] segments = new Object[3];\r
segments[0] = element.getInDescription();\r
segments[1] = element.getFeature();\r
- segments[2] = element;\r
+ \r
+ TaxonDescriptionFeature tdf = descriptiveInformationProvider.getDescriptionFeature(element);\r
+ segments[1] = tdf;\r
+ \r
+ if (tdf.getFeature().equals(Feature.IMAGE())) {\r
+ segments[2] = ImagesHelper.getImage(element);\r
+ } else {\r
+ segments[2] = element;\r
+ } \r
TreePath treePath = new TreePath(segments);\r
descriptionViewer.setSelection(new TreeSelection(treePath), true);\r
}\r
+ \r
+ if (revealObject instanceof TaxonDescription) {\r
+ TaxonDescription description = (TaxonDescription) revealObject;\r
+ Object[] segments = new Object[] {(TaxonDescription) revealObject};\r
+ TreePath treePath = new TreePath(segments);\r
+ descriptionViewer.setSelection(new TreeSelection(treePath), true); \r
+ }\r
}\r
\r
+ /**\r
+ * @author p.ciardelli\r
+ */\r
class PageProvider implements IDetailsPageProvider {\r
\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.forms.IDetailsPageProvider#getPage(java.lang.Object)\r
*/\r
public IDetailsPage getPage(Object key) {\r
- if (key.equals(ImageFile.class)) {\r
- return new ImageDetailsPage();\r
- }\r
- if (key.equals(TextData.class)) {\r
- return new TextDataDetailsPage();\r
+ if (Feature.DISTRIBUTION().equals(key)) {\r
+ return new DistributionMapDetailsPage();\r
}\r
return null;\r
}\r
* @see org.eclipse.ui.forms.IDetailsPageProvider#getPageKey(java.lang.Object)\r
*/\r
public Object getPageKey(Object object) {\r
- if (object instanceof TextData) {\r
- TextData textData = (TextData) object;\r
- if (textData.getFeature().equals(Feature.IMAGE())) {\r
- return ImageFile.class;\r
- } else {\r
- return TextData.class;\r
- }\r
+ if (object instanceof TaxonDescriptionFeature) {\r
+ return ((TaxonDescriptionFeature) object).getFeature();\r
}\r
return null;\r
}\r
package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
\r
import java.util.ArrayList;\r
-import java.util.HashSet;\r
+import java.util.HashMap;\r
import java.util.List;\r
+import java.util.Map;\r
import java.util.Set;\r
\r
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
return featureElements;\r
}\r
\r
+ /**\r
+ * TaxonDescriptionFeature objects are cached so that they pass description tree viewer's equality test.\r
+ */\r
+ private Map<TaxonDescription, Map<Feature, TaxonDescriptionFeature>> descriptionFeatureCache = new HashMap<TaxonDescription, Map<Feature, TaxonDescriptionFeature>>();\r
+ \r
/* (non-Javadoc)\r
* @see eu.etaxonomy.taxeditor.editor.descriptionnew.IDescriptiveInformationProvider#getDescriptionFeatures(eu.etaxonomy.cdm.model.description.TaxonDescription)\r
*/\r
public List<TaxonDescriptionFeature> getDescriptionFeatures(TaxonDescription description) {\r
\r
- List<TaxonDescriptionFeature> features = new ArrayList<TaxonDescriptionFeature>();\r
- \r
+ Map<Feature, TaxonDescriptionFeature> featureCache = getFeatureCache(description);\r
+ \r
Set<DescriptionElementBase> elements = description.getElements();\r
if (elements != null) {\r
for (DescriptionElementBase element : elements) {\r
- TaxonDescriptionFeature taxonDescriptionFeature = new TaxonDescriptionFeature(description, element.getFeature());\r
-// Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
- if (!features.contains(taxonDescriptionFeature)) {\r
- features.add(taxonDescriptionFeature);\r
- }\r
+ Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
+ \r
+ // Is there already an entry in map for this Feature?\r
+ if (!(featureCache.containsKey(feature))) {\r
+ featureCache.put(feature, new TaxonDescriptionFeature(description, feature));\r
+ } \r
}\r
}\r
- return features;\r
+ return new ArrayList<TaxonDescriptionFeature>(featureCache.values());\r
+ }\r
+\r
+ private Map<Feature, TaxonDescriptionFeature> getFeatureCache(TaxonDescription description) {\r
+ Map<Feature, TaxonDescriptionFeature> featureCache = descriptionFeatureCache.get(description);\r
+ if (featureCache == null) {\r
+ featureCache = new HashMap<Feature, TaxonDescriptionFeature>();\r
+ descriptionFeatureCache.put(description, featureCache);\r
+ }\r
+ return featureCache;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.editor.descriptiontree.IDescriptiveInformationProvider#getDescriptionFeature(eu.etaxonomy.cdm.model.description.DescriptionElementBase)\r
+ */\r
+ public TaxonDescriptionFeature getDescriptionFeature(DescriptionElementBase element) {\r
+ \r
+ TaxonDescription description = (TaxonDescription) element.getInDescription();\r
+ Feature feature = HibernateProxyHelper.deproxy(element.getFeature(), Feature.class);\r
+ \r
+ Map<Feature, TaxonDescriptionFeature> featureCache = getFeatureCache(description);\r
+ TaxonDescriptionFeature tdf = featureCache.get(feature);\r
+ if (tdf == null) {\r
+ tdf = new TaxonDescriptionFeature(description, feature);\r
+ featureCache.put(feature, tdf);\r
+ }\r
+ return tdf;\r
}\r
}\r
* Lists to populate drop downs\r
*/\r
private ArrayList<NamedAreaVocabularyType> vocabularyTypes; \r
- private List<PresenceAbsenceTermBase<?>> presenceAbsenceTerms;\r
+ private List<PresenceAbsenceTermBase> statusTerms;\r
private List<List<NamedArea>> areas = new ArrayList<List<NamedArea>>();\r
private NamedArea[] selectedAreas = new NamedArea[NUM_AREA_MENUS];\r
/**\r
* Static fields to persist default values\r
*/\r
private static ReferenceBase<?> lastReference;\r
- private static PresenceAbsenceTermBase<?> lastPresenceAbsence;\r
+ private static PresenceAbsenceTermBase<?> lastStatusTerm;\r
private static NamedAreaVocabularyType lastVocabType;\r
private static NamedArea lastNamedArea;\r
/**\r
initTopLevelVocabularies();\r
}\r
\r
+ /**\r
+ * There is no mechanism to retrieve a NamedArea's vocabulary type. Therefore, we\r
+ * store all top-level NamedAreas with their vocabulary types. \r
+ */\r
+ private void initTopLevelVocabularies() {\r
+ for (NamedAreaVocabularyType vocabType : getVocabularyTypes()) {\r
+ List<NamedArea> list = new ArrayList<NamedArea>();\r
+ for (NamedArea topLevelArea : locationService.getTopLevelNamedAreasByVocabularyType(vocabType)) {\r
+ topLevelAreasByArea.put(topLevelArea, vocabType);\r
+ list.add(topLevelArea);\r
+ }\r
+ topLevelAreasByType.put(vocabType, list);\r
+ }\r
+ }\r
+ \r
+// /**\r
+// * Set inputs to selections from last time dialog was used.\r
+// */\r
+// private void recallPreviousSelections() {\r
+// if (lastVocabType != null) {\r
+// selectedVocabType = lastVocabType;\r
+//\r
+// // Last named area don't make much sense w/out a vocab type\r
+// if (lastNamedArea != null) {\r
+// selectedArea = lastNamedArea;\r
+// }\r
+// }\r
+// if (lastStatusTerm != null) {\r
+// selectedStatus = lastStatusTerm; \r
+// }\r
+// if (lastReference != null) {\r
+// selectedReference = lastReference;\r
+// }\r
+// }\r
+ \r
/* (non-Javadoc)\r
* @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
*/\r
}\r
\r
/**\r
- * @param b\r
+ * @param enabled\r
*/\r
private void setSelectionListenersEnabled(boolean enabled) {\r
this.selectionListenersEnabled = enabled;\r
*/\r
public void createContents(Composite parent) {\r
super.createContents(parent);\r
-\r
-// FormToolkit toolkit = mform.getToolkit();\r
\r
section.setText("Distribution Details"); //$NON-NLS-1$\r
\r
areaCombos[i] = createCombo(client); \r
areaCombos[i].addSelectionListener(new AreaComboListener(i));\r
areaCombos[i].setEnabled(false);\r
+ areaCombos[i].setVisibleItemCount(20);\r
}\r
\r
- // create presence / absence\r
+ // create status\r
createLabel("Select status:", client, parent);\r
statusCombo = new Combo(client, SWT.BORDER);\r
statusCombo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
// populateReference();\r
}\r
\r
-\r
- \r
/**\r
- * There is no mechanism to retrieve a NamedArea's vocabulary type. Therefore, we\r
- * store all top-level NamedAreas with their vocabulary types. \r
+ * @return\r
*/\r
- private void initTopLevelVocabularies() {\r
- for (NamedAreaVocabularyType vocabType : getVocabularyTypes()) {\r
- List<NamedArea> list = new ArrayList<NamedArea>();\r
- for (NamedArea topLevelArea : locationService.getTopLevelNamedAreasByVocabularyType(vocabType)) {\r
- topLevelAreasByArea.put(topLevelArea, vocabType);\r
- list.add(topLevelArea);\r
- }\r
- topLevelAreasByType.put(vocabType, list);\r
- }\r
+ private Combo createCombo(Composite composite) {\r
+ Combo combo = new Combo(composite, SWT.BORDER);\r
+ combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
+ | GridData.HORIZONTAL_ALIGN_FILL));\r
+ return combo;\r
}\r
\r
- /**\r
- * Set inputs to selections from last time dialog was used.\r
- */\r
- private void recallPreviousSelections() {\r
- if (lastVocabType != null) {\r
- selectedVocabType = lastVocabType;\r
-\r
- // Last named area don't make much sense w/out a vocab type\r
- if (lastNamedArea != null) {\r
- selectedArea = lastNamedArea;\r
- }\r
- }\r
- if (lastPresenceAbsence != null) {\r
- selectedStatus = lastPresenceAbsence; \r
- }\r
- if (lastReference != null) {\r
- selectedReference = lastReference;\r
- }\r
- }\r
-\r
class AreaComboListener extends SelectionAdapter {\r
private int i;\r
AreaComboListener(int i) {\r
}\r
\r
/**\r
+ * @param selectedVocabType\r
* @return\r
*/\r
- private Combo createCombo(Composite composite) {\r
- Combo combo = new Combo(composite, SWT.BORDER);\r
- combo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.HORIZONTAL_ALIGN_FILL));\r
- return combo;\r
+ private List<NamedArea> getNamedAreas(NamedAreaVocabularyType vocabularyType) {\r
+ List<NamedArea> topLevelTerms = topLevelAreasByType.get(vocabularyType);\r
+ \r
+ Collections.reverse(topLevelTerms);\r
+ \r
+ areas.add(0, topLevelTerms);\r
+ return topLevelTerms;\r
}\r
- \r
+ \r
/**\r
* \r
*/\r
private void populateVocabTypes() {\r
+ \r
+ vocabTypeCombo.removeAll();\r
+ \r
int i = 0; \r
int index = -1;\r
for (NamedAreaVocabularyType vocabularyType : getVocabularyTypes()) {\r
vocabTypeCombo.select(index);\r
}\r
}\r
- \r
- /**\r
- * @param namedArea\r
- * @return\r
+\r
+ /**\r
+ * \r
*/\r
- private List<NamedArea> getNamedAreas(NamedArea namedArea, int depth) {\r
- List<NamedArea> terms = new ArrayList<NamedArea>();\r
-// Set<NamedArea> terms = namedArea.getIncludes();\r
- terms.addAll(namedArea.getIncludes());\r
- \r
+ private void populateAreas() {\r
+ if (selectedArea == null) {\r
+ return;\r
+ }\r
\r
- areas.add(depth, terms);\r
+ for (int i = 0; i < NUM_AREA_MENUS; i++) {\r
+ areaCombos[i].removeAll();\r
+ areaCombos[i].setEnabled(false);\r
+ }\r
\r
- return terms;\r
+ List<NamedArea> areasTmp = new ArrayList<NamedArea>();\r
+ NamedArea namedAreaTmp = selectedArea;\r
+ NamedArea parentArea = null;\r
+ do {\r
+ areasTmp.add(namedAreaTmp);\r
+ parentArea = getPartOf(namedAreaTmp); //HibernateProxyHelper.deproxy(namedAreaTmp.getPartOf(), NamedArea.class);\r
+ if (parentArea == null) {\r
+ selectedVocabType = getVocabularyTypeForTopLevelArea(namedAreaTmp); \r
+ }\r
+ namedAreaTmp = parentArea;\r
+ } while (parentArea != null);\r
+ Collections.reverse(areasTmp);\r
+ int depth = 0;\r
+ for (NamedArea namedArea : areasTmp) {\r
+ selectedAreas[depth] = namedArea;\r
+ populateAreas(depth);\r
+ depth++;\r
+ }\r
}\r
-\r
+ \r
/**\r
- * @param selectedVocabType\r
- * @return\r
+ * @param depth\r
*/\r
- private List<NamedArea> getNamedAreas(NamedAreaVocabularyType vocabularyType) {\r
- List<NamedArea> topLevelTerms = topLevelAreasByType.get(vocabularyType);\r
- \r
- Collections.reverse(topLevelTerms);\r
+ private void populateAreas(int depth) {\r
+ \r
+ List<NamedArea> areasTmp;\r
+ if(depth == 0){\r
+ areasTmp = getNamedAreas(selectedVocabType);\r
+ }else{\r
+ areasTmp = getNamedAreas(selectedAreas[depth - 1], depth);\r
+ }\r
\r
- areas.add(0, topLevelTerms);\r
- return topLevelTerms;\r
+ int index = -1;\r
+ int i = 0;\r
+ if (areasTmp.size() > 0) {\r
+ for(NamedArea areaTmp : areasTmp){\r
+ String areaLabel = areaTmp == null ? "" : areaTmp.getLabel();\r
+ areaCombos[depth].add(areaLabel);\r
+ \r
+ if (selectedAreas[depth] != null && selectedAreas[depth].equals(areaTmp)) {\r
+ index = i;\r
+ }\r
+ i++;\r
+ }\r
+ areaCombos[depth].setEnabled(true);\r
+ if (index > -1) {\r
+ areaCombos[depth].select(index);\r
+ }\r
+ }\r
}\r
-\r
+ \r
/**\r
* \r
*/\r
private void populateStatus() {\r
-// logger.info("Updating status menu with " + selectedStatus.getDescription());\r
+\r
+ statusCombo.removeAll();\r
+ \r
int selectedIndex = -1;\r
int i = 0;\r
- for (PresenceAbsenceTermBase<?> term : getPresenceAbsenceTerms()) {\r
+ for (PresenceAbsenceTermBase<?> term : getStatusTerms()) {\r
if (term == null) {\r
} else {\r
statusCombo.add(term.getLabel(CdmStore.getDefaultLanguage())); \r
-// logger.info("Comparing " + term.getDescription() + " with " + selectedStatus.getDescription());\r
if (this.selectedStatus != null && this.selectedStatus.equals(term)) {\r
selectedIndex = i;\r
}\r
}\r
}\r
\r
- /**\r
- * @return\r
- */\r
- private List<NamedAreaVocabularyType> getVocabularyTypes() {\r
- if (vocabularyTypes == null) {\r
- vocabularyTypes = new ArrayList<NamedAreaVocabularyType>();\r
- vocabularyTypes.addAll(locationService.getNamedAreaVocabularyTypes());\r
- }\r
- return vocabularyTypes;\r
- }\r
- \r
- /**\r
- * @return\r
- */\r
- private List<PresenceAbsenceTermBase<PresenceAbsenceTermBase<?>>> getPresenceAbsenceTerms() {\r
- return PreferencesUtil.getPreferredPresenceAbsenceTerms();\r
- }\r
\r
/**\r
* \r
protected void selectVocabType() {\r
int i = vocabTypeCombo.getSelectionIndex();\r
selectedVocabType = getVocabularyTypes().get(i);\r
- \r
clearAreas();\r
\r
populateAreas(0);\r
+ \r
+// lastVocabType = selectedVocabType;\r
}\r
\r
/**\r
\r
clearArea(depth + 1);\r
populateAreas(depth + 1);\r
+ \r
+ setInputArea(selectedArea);\r
+ \r
+// lastVocabType = selectedVocabType;\r
+// lastNamedArea = selectedArea;\r
}\r
- \r
+\r
/**\r
* \r
*/\r
protected void selectStatusTerm() {\r
int i = statusCombo.getSelectionIndex();\r
- selectedStatus = presenceAbsenceTerms.get(i);\r
+ selectedStatus = statusTerms.get(i);\r
+ \r
+ setInputStatus(selectedStatus);\r
+ \r
+// lastStatusTerm = selectedStatus;\r
}\r
\r
/**\r
- * @param i\r
- * @param index\r
- * @return\r
+ * @param area\r
*/\r
- private NamedArea getSelectedArea(int depth, int index) {\r
- return areas.get(depth).get(index);\r
- }\r
-\r
-\r
- /**\r
- * \r
+ private void setInputArea(NamedArea area) {\r
+ ((Distribution) input).setArea(area);\r
+ } \r
+ \r
+ /**\r
+ * @param status\r
*/\r
- private void populateAreas() {\r
- if (selectedArea == null) {\r
- return;\r
- }\r
- logger.info("Updating area menu with " + selectedArea.getDescription());\r
- List<NamedArea> areasTmp = new ArrayList<NamedArea>();\r
- NamedArea namedAreaTmp = selectedArea;\r
- NamedArea parentArea = null;\r
- do {\r
- areasTmp.add(namedAreaTmp);\r
- parentArea = getPartOf(namedAreaTmp); //HibernateProxyHelper.deproxy(namedAreaTmp.getPartOf(), NamedArea.class);\r
- if (parentArea == null) {\r
- selectedVocabType = getVocabularyTypeForTopLevelArea(namedAreaTmp); \r
- }\r
- namedAreaTmp = parentArea;\r
- } while (parentArea != null);\r
- Collections.reverse(areasTmp);\r
- int depth = 0;\r
- for (NamedArea namedArea : areasTmp) {\r
- selectedAreas[depth] = namedArea;\r
- populateAreas(depth);\r
- depth++;\r
- }\r
+ private void setInputStatus(PresenceAbsenceTermBase<?> status) {\r
+ ((Distribution) input).setStatus(status);\r
}\r
\r
/**\r
}\r
\r
/**\r
- * @param namedArea\r
* @return\r
*/\r
- private NamedArea getPartOf(NamedArea namedArea) {\r
- if (namedArea instanceof TdwgArea) {\r
- return HibernateProxyHelper.deproxy(((NamedArea) namedArea).getPartOfWorkaround(), TdwgArea.class);\r
+ private List<NamedAreaVocabularyType> getVocabularyTypes() {\r
+ if (vocabularyTypes == null) {\r
+ vocabularyTypes = new ArrayList<NamedAreaVocabularyType>();\r
+ vocabularyTypes.addAll(locationService.getNamedAreaVocabularyTypes());\r
}\r
- return null;\r
+ return vocabularyTypes;\r
}\r
-\r
+ \r
/**\r
- * @param i\r
+ * @param namedArea\r
+ * @return\r
*/\r
- private void populateAreas(int depth) {\r
- List<NamedArea> areasTmp;\r
- if(depth == 0){\r
- areasTmp = getNamedAreas(selectedVocabType);\r
- }else{\r
- areasTmp = getNamedAreas(selectedAreas[depth - 1], depth);\r
- }\r
+ private List<NamedArea> getNamedAreas(NamedArea namedArea, int depth) {\r
+ List<NamedArea> terms = new ArrayList<NamedArea>();\r
+ terms.addAll(namedArea.getIncludes());\r
\r
- int index = -1;\r
- int i = 0;\r
- if (areasTmp.size() > 0) {\r
- for(NamedArea areaTmp : areasTmp){\r
- String areaLabel = areaTmp == null ? "" : areaTmp.getLabel();\r
- areaCombos[depth].add(areaLabel);\r
- \r
- if (selectedAreas[depth] != null && selectedAreas[depth].equals(areaTmp)) {\r
- index = i;\r
- }\r
- i++;\r
- }\r
- areaCombos[depth].setEnabled(true);\r
- if (index > -1) {\r
- areaCombos[depth].select(index);\r
+ areas.add(depth, terms);\r
+ \r
+ return terms;\r
+ }\r
+ \r
+ /**\r
+ * @return\r
+ */\r
+ private List<PresenceAbsenceTermBase> getStatusTerms() {\r
+ if (statusTerms == null) {\r
+ statusTerms = new ArrayList<PresenceAbsenceTermBase>();\r
+ for (PresenceAbsenceTermBase statusTerm : PreferencesUtil.getPreferredPresenceAbsenceTerms()) {\r
+ statusTerms.add(statusTerm);\r
}\r
}\r
+ return statusTerms;\r
}\r
-\r
\r
/**\r
- * @param i\r
+ * @return\r
*/\r
- private void clearArea(int i) {\r
- for (int j = i; j < NUM_AREA_MENUS; j++) {\r
- // TODO add clear selectedArea\r
- areaCombos[j].removeAll();\r
- areaCombos[j].setEnabled(false);\r
- }\r
+ private NamedAreaVocabularyType getVocabType() {\r
+ int i = vocabTypeCombo.getSelectionIndex();\r
+ return vocabularyTypes.get(i);\r
}\r
\r
/**\r
- * \r
+ * @param i\r
+ * @param index\r
+ * @return\r
*/\r
- private void clearAreas() {\r
- clearArea(0);\r
+ private NamedArea getSelectedArea(int depth, int index) {\r
+ return areas.get(depth).get(index);\r
}\r
- \r
+ \r
/**\r
- * \r
+ * @return\r
*/\r
- private void setStaticFields() {\r
- lastPresenceAbsence = getPresenceAbsenceTerm();\r
- lastNamedArea = selectedArea;\r
- lastReference = getReference(); \r
- lastVocabType = getVocabType();\r
+ private PresenceAbsenceTermBase<?> getStatusTerm() {\r
+ int i = statusCombo.getSelectionIndex();\r
+ return statusTerms.get(i);\r
}\r
-\r
+ \r
/**\r
+ * @param namedArea\r
* @return\r
*/\r
- private NamedAreaVocabularyType getVocabType() {\r
- int i = vocabTypeCombo.getSelectionIndex();\r
- return vocabularyTypes.get(i);\r
+ private NamedArea getPartOf(NamedArea namedArea) {\r
+ if (namedArea instanceof TdwgArea) {\r
+ return HibernateProxyHelper.deproxy(((NamedArea) namedArea).getPartOfWorkaround(), TdwgArea.class);\r
+ }\r
+ return null;\r
}\r
-\r
+ \r
/**\r
* @return\r
*/\r
*/\r
private String getMicroReference() {\r
return referenceComposite.getMicroReference();\r
- }\r
+ } \r
\r
/**\r
- * @return\r
+ * @param i\r
*/\r
- private PresenceAbsenceTermBase<?> getPresenceAbsenceTerm() {\r
- int i = statusCombo.getSelectionIndex();\r
- return presenceAbsenceTerms.get(i);\r
+ private void clearArea(int i) {\r
+ for (int j = i; j < NUM_AREA_MENUS; j++) {\r
+ // TODO add clear selectedArea\r
+ areaCombos[j].removeAll();\r
+ areaCombos[j].setEnabled(false);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * \r
+ */\r
+ private void clearAreas() {\r
+ clearArea(0);\r
}\r
- \r
}\r
--- /dev/null
+/**\r
+ * \r
+ */\r
+package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
+\r
+import java.awt.Color;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.browser.Browser;\r
+import org.eclipse.swt.browser.ProgressEvent;\r
+import org.eclipse.swt.browser.ProgressListener;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.ControlListener;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.ProgressBar;\r
+import org.eclipse.ui.forms.IFormPart;\r
+\r
+import eu.etaxonomy.cdm.ext.EditGeoService;\r
+import eu.etaxonomy.cdm.ext.IEditGeoService;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * @author p.ciardelli\r
+ *\r
+ */\r
+public class DistributionMapDetailsPage extends AbstractDescriptionDetailsPage {\r
+ private static final Logger logger = Logger\r
+ .getLogger(DistributionMapDetailsPage.class);\r
+ \r
+ private Browser browser;\r
+ private IEditGeoService geoService;\r
+\r
+ private Taxon taxon;\r
+ private Composite parent;\r
+ \r
+ public DistributionMapDetailsPage() {\r
+ geoService = new EditGeoService(); \r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.editor.descriptiontree.AbstractDescriptionDetailsPage#createContents(org.eclipse.swt.widgets.Composite)\r
+ */\r
+ @Override\r
+ public void createContents(Composite parent) {\r
+ super.createContents(parent);\r
+ \r
+ this.parent = parent;\r
+ \r
+ section.setText("Distribution Overview"); //$NON-NLS-1$\r
+ \r
+// GridLayout gridLayout = new GridLayout();\r
+// gridLayout.numColumns = 1;\r
+// shell.setLayout(gridLayout);\r
+ \r
+ browser = new Browser(parent, SWT.NONE);\r
+ \r
+ GridData data = new GridData();\r
+ data.horizontalAlignment = GridData.FILL;\r
+ data.verticalAlignment = GridData.FILL;\r
+ data.grabExcessHorizontalSpace = true;\r
+ data.grabExcessVerticalSpace = true;\r
+ \r
+ browser.setLayoutData(data);\r
+ \r
+ final ProgressBar progressBar = new ProgressBar(parent, SWT.NONE);\r
+ data = new GridData();\r
+ data.horizontalAlignment = GridData.END;\r
+ progressBar.setLayoutData(data);\r
+ \r
+\r
+ browser.addProgressListener(new ProgressListener() {\r
+ public void changed(ProgressEvent event) {\r
+ if (event.total == 0) return; \r
+ int ratio = event.current * 100 / event.total;\r
+ progressBar.setSelection(ratio);\r
+ }\r
+ public void completed(ProgressEvent event) {\r
+ progressBar.setSelection(0);\r
+ }\r
+ });\r
+ \r
+ parent.addControlListener(new ControlListener(){\r
+\r
+ public void controlMoved(ControlEvent e) {\r
+ // do nothing\r
+ }\r
+\r
+ public void controlResized(ControlEvent e) {\r
+ loadMap();\r
+ }\r
+ \r
+ });\r
+ }\r
+ \r
+ private void loadMap(){\r
+ if (taxon != null) {\r
+ browser.setUrl(getMapUrl());\r
+ }\r
+ }\r
+ \r
+ private String getMapUrl(){\r
+ // FIXME make these hardcoded parameters configurable via preferences\r
+ String url = "http://edit.csic.es/v1/areas.php";\r
+ Map<PresenceAbsenceTermBase<?>,Color> presenceAbsenceTermColors = null;\r
+ int width = calculateWidth();\r
+ int height = 0; \r
+ String bbox = "-180,-90,180,90"; \r
+ String backLayer = null;\r
+ \r
+ String parameter = geoService.getEditGeoServiceUrlParameterString(\r
+ taxon, \r
+ presenceAbsenceTermColors, \r
+ width, \r
+ height, \r
+ bbox, \r
+ backLayer);\r
+ \r
+ return url + "?" + parameter;\r
+ }\r
+\r
+ /**\r
+ * @return\r
+ */\r
+ private int calculateWidth(){\r
+ return parent.getSize().x - 10;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.taxeditor.editor.descriptiontree.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
+ */\r
+ @Override\r
+ public void selectionChanged(IFormPart part, ISelection selection) {\r
+ super.selectionChanged(part, selection);\r
+ taxon = ((TaxonDescriptionFeature) input).getDescription().getTaxon();\r
+ }\r
+}\r
List<TaxonDescriptionFeature> getDescriptionFeatures(TaxonDescription description);\r
\r
List<DescriptionElementBase> getDescriptionElements(TaxonDescription description, Feature feature);\r
- \r
+\r
+ TaxonDescriptionFeature getDescriptionFeature(DescriptionElementBase element);\r
}\r
import org.eclipse.swt.events.MouseEvent;\r
import org.eclipse.swt.events.PaintEvent;\r
import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.graphics.GC;\r
import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Rectangle;\r
import org.eclipse.swt.layout.GridData;\r
import org.eclipse.swt.layout.GridLayout;\r
import org.eclipse.swt.widgets.Button;\r
*/\r
public void modifyText(ModifyEvent e) {\r
((ImageFile) input).setUri(text.getText());\r
- mform.dirtyStateChanged();\r
+ fireStateChanged();\r
} \r
\r
/* (non-Javadoc)\r
});\r
\r
// Create composite for search text, search term input, and "Search" button\r
- final Composite imageComposite = new Composite(client, SWT.BORDER);\r
+ final Composite imageComposite = new Composite(client, SWT.NONE);\r
imageComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
imageComposite.setLayout(new GridLayout());\r
\r
-// canvas = new Canvas(this, SWT.NO_REDRAW_RESIZE);\r
- canvas = new Canvas(imageComposite, SWT.NONE);\r
- \r
+ canvas = new Canvas(imageComposite, SWT.NO_REDRAW_RESIZE);\r
+// canvas = new Canvas(imageComposite, SWT.BORDER);\r
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);\r
+ \r
+ // TODO this is a quick fix, couldnt figure out how to get the window to resize for new images\r
+ gd.heightHint = 1000;\r
+ canvas.setLayoutData(gd); \r
+ \r
canvas.addPaintListener (new PaintListener () {\r
public void paintControl (PaintEvent e) {\r
if (image != null) {\r
-// canvas.setBounds(image.getBounds());\r
-// e.gc.drawImage (image, canvas.getLocation().x, canvas.getLocation().y);\r
e.gc.drawImage (image, 0, 0);\r
}\r
}\r
String uriString = ((ImageFile) input).getUri();\r
if (uriString == null || uriString.length() == 0) {\r
// TODO draw empty image\r
+ showImageNotFound();\r
return;\r
}\r
try {\r
URI uri = new URI (uriString);\r
image = ImageResources.getImage(uri);\r
- canvas.setBounds(image.getBounds()); \r
+ mform.reflow(true);\r
} catch (URISyntaxException e) {\r
// TODO Auto-generated catch block\r
e.printStackTrace();\r
+ showImageNotFound();\r
}\r
}\r
+ \r
+ private void showImageNotFound() {\r
+ image = ImageResources.getImageNotFound();\r
+ image = ImageResources.getImage(ImageResources.IMG_NOT_FOUND);\r
+ canvas.setBounds(image.getBounds());\r
+ }\r
\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#selectionChanged(org.eclipse.ui.forms.IFormPart, org.eclipse.jface.viewers.ISelection)\r
text.removeModifyListener(this);\r
text.setText(\r
CdmUtils.Nz(((ImageFile) input).getUri()));\r
+ showImage();\r
text.addModifyListener(this);\r
\r
showImage();\r
*/\r
public void modifyText(ModifyEvent e) {\r
((TaxonDescription) input).setTitleCache(text.getText());\r
- mform.dirtyStateChanged();\r
+ fireStateChanged();\r
} \r
\r
/* (non-Javadoc)\r
*/\r
package eu.etaxonomy.taxeditor.editor.descriptiontree;\r
\r
+import org.apache.log4j.Logger;\r
+\r
import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
\r
*\r
*/\r
public class TaxonDescriptionFeature {\r
+ private static final Logger logger = Logger.getLogger(TaxonDescriptionFeature.class);\r
+ \r
private TaxonDescription description;\r
private Feature feature;\r
\r
public Feature getFeature() {\r
return feature;\r
}\r
- \r
- /* (non-Javadoc)\r
- * @see java.lang.Object#equals(java.lang.Object)\r
- */\r
- @Override\r
- public boolean equals(Object obj) {\r
- if (obj == null || !(obj instanceof TaxonDescriptionFeature)) {\r
- return false;\r
- }\r
- TaxonDescriptionFeature tdf = (TaxonDescriptionFeature) obj;\r
- if (feature.equals(tdf.getFeature()) && description.equals(tdf.getDescription())) {\r
- return true;\r
- }\r
- return super.equals(obj);\r
- }\r
}
\ No newline at end of file
* @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)\r
*/\r
public boolean postOperation(CdmBase objectAffectedByOperation) {\r
+ getManagedForm().dirtyStateChanged();\r
block.refreshTree(objectAffectedByOperation);\r
return true;\r
}\r
*/\r
public void modifyText(ModifyEvent e) {\r
DescriptionHelper.setCache((DescriptionElementBase) input, text.getText());\r
- mform.dirtyStateChanged();\r
+ fireStateChanged();\r
} \r
\r
/* (non-Javadoc)\r
import org.eclipse.core.commands.operations.IUndoableOperation;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.forms.editor.FormEditor;\r
import org.eclipse.ui.handlers.HandlerUtil;\r
\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
public Object execute(ExecutionEvent event) throws ExecutionException {\r
\r
IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
+ if (editor instanceof FormEditor) {\r
+ editor = ((FormEditor) editor).getActiveEditor();\r
+ }\r
IEditorInput input = editor.getEditorInput();\r
if (input instanceof TaxonEditorInput) {\r
Taxon taxon = ((TaxonEditorInput) input).getTaxon(); \r
import org.eclipse.swt.widgets.Event;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.forms.editor.FormEditor;\r
import org.eclipse.ui.handlers.HandlerUtil;\r
\r
import eu.etaxonomy.cdm.model.description.Feature;\r
*/\r
public Object execute(ExecutionEvent event) throws ExecutionException {\r
IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
+ if (editor instanceof FormEditor) {\r
+ editor = ((FormEditor) editor).getActiveEditor();\r
+ }\r
IEditorInput input = editor.getEditorInput();\r
if (input instanceof TaxonEditorInput) {\r
Taxon taxon = ((TaxonEditorInput) input).getTaxon();\r