\r
import java.util.ArrayList;\r
import java.util.Collections;\r
+import java.util.HashMap;\r
import java.util.List;\r
+import java.util.Map;\r
\r
import org.apache.log4j.Logger;\r
import org.eclipse.jface.viewers.ISelection;\r
import org.eclipse.swt.widgets.Combo;\r
import org.eclipse.swt.widgets.Composite;\r
import org.eclipse.ui.forms.IFormPart;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
\r
import eu.etaxonomy.cdm.api.service.ILocationService;\r
import eu.etaxonomy.cdm.api.service.ILocationService.NamedAreaVocabularyType;\r
import eu.etaxonomy.cdm.model.description.Distribution;\r
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
import eu.etaxonomy.taxeditor.editor.reference.ReferenceSelectComposite;\r
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
*\r
*/\r
public class DistributionDetailsPage extends AbstractDescriptionDetailsPage {\r
- private static final Logger logger = Logger.getLogger(DistributionDetailsPage.class);\r
+ private static final Logger logger = Logger.getLogger(DescriptionMasterDetailsBlock.class);\r
+\r
+\r
+ /**\r
+ * Location service for retrieving \r
+ */\r
+ private ILocationService locationService;\r
+ /**\r
+ * Number of area menus to show\r
+ */\r
+ private static final int NUM_AREA_MENUS = 4; \r
+ /**\r
+ * UI elements\r
+ */\r
+ private Combo vocabTypeCombo;\r
+ private Combo[] areaCombos = new Combo[NUM_AREA_MENUS];\r
+ private Combo statusCombo;\r
+ private ReferenceSelectComposite referenceComposite;\r
+ /**\r
+ * Distribution fields\r
+ */\r
+ private NamedArea selectedArea;\r
+ private PresenceAbsenceTermBase<?> selectedStatus;\r
+ private NamedAreaVocabularyType selectedVocabType;\r
+ private ReferenceBase<?> selectedReference;\r
+ /**\r
+ * Lists to populate drop downs\r
+ */\r
+ private ArrayList<NamedAreaVocabularyType> vocabularyTypes; \r
+ private List<PresenceAbsenceTermBase<?>> presenceAbsenceTerms;\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 NamedAreaVocabularyType lastVocabType;\r
+ private static NamedArea lastNamedArea;\r
+ /**\r
+ * Maps for associating top level NamedAreas with their vocabulary types.\r
+ */\r
+ Map<NamedArea, NamedAreaVocabularyType> topLevelAreasByArea = \r
+ new HashMap<NamedArea, NamedAreaVocabularyType>();\r
+ Map<NamedAreaVocabularyType, List<NamedArea>> topLevelAreasByType = \r
+ new HashMap<NamedAreaVocabularyType, List<NamedArea>>();\r
+ /**\r
+ * Used to disable listeners while input values are programmatically set\r
+ */\r
+ private boolean selectionListenersEnabled;\r
+\r
+ public DistributionDetailsPage() {\r
+ \r
+ locationService = CdmStore.getLocationService();\r
+ \r
+ initTopLevelVocabularies();\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
@Override\r
public void selectionChanged(IFormPart part, ISelection selection) {\r
super.selectionChanged(part, selection);\r
-// selectedArea = HibernateProxyHelper.deproxy(((Distribution) input).getArea(), NamedArea.class);\r
-// populateAreas();\r
-// text.addModifyListener(this);\r
+ \r
+ setSelectionListenersEnabled(false);\r
+ \r
+ selectedArea = HibernateProxyHelper.deproxy(((Distribution) input).getArea(), NamedArea.class);\r
+ populateAreas();\r
+ \r
+ populateVocabTypes();\r
+ \r
+ selectedStatus = HibernateProxyHelper.deproxy(((Distribution) input).getStatus(), PresenceAbsenceTermBase.class);\r
+ populateStatus();\r
+ \r
+ setSelectionListenersEnabled(true);\r
}\r
\r
+ /**\r
+ * @param b\r
+ */\r
+ private void setSelectionListenersEnabled(boolean enabled) {\r
+ this.selectionListenersEnabled = enabled;\r
+ }\r
+\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.taxeditor.editor.descriptionnew.AbstractDescriptionDetailsPage#createContents(org.eclipse.swt.widgets.Composite)\r
*/\r
public void createContents(Composite parent) {\r
super.createContents(parent);\r
\r
- FormToolkit toolkit = mform.getToolkit();\r
+// FormToolkit toolkit = mform.getToolkit();\r
\r
section.setText("Distribution Details"); //$NON-NLS-1$\r
\r
- \r
- locationService = CdmStore.getLocationService();\r
- \r
- if (message != null) {\r
- createLabel(message, section, parent);\r
- }\r
- createLabel("Select an area vocabulary:", client, parent);\r
// create vocab type\r
+ createLabel("Select an area vocabulary:", client, parent);\r
vocabTypeCombo = createCombo(client);\r
vocabTypeCombo.addSelectionListener(new SelectionAdapter() {\r
@Override\r
public void widgetSelected(SelectionEvent e) {\r
- selectVocabType();\r
+ if (selectionListenersEnabled) {\r
+ selectVocabType();\r
+ }\r
}\r
});\r
+ \r
// create areas\r
createLabel("Select an area:", client, parent);\r
for (int i = 0; i < NUM_AREA_MENUS; i++) {\r
areaCombos[i].addSelectionListener(new AreaComboListener(i));\r
areaCombos[i].setEnabled(false);\r
}\r
+ \r
// create presence / absence\r
createLabel("Select status:", client, parent);\r
statusCombo = new Combo(client, SWT.BORDER);\r
statusCombo.addSelectionListener(new SelectionAdapter() {\r
@Override\r
public void widgetSelected(SelectionEvent e) {\r
- selectStatusTerm();\r
+ if (selectionListenersEnabled) {\r
+ selectStatusTerm();\r
+ }\r
}\r
});\r
// create reference\r
- referenceComposite = new ReferenceSelectComposite(client);\r
+// referenceComposite = new ReferenceSelectComposite(client);\r
\r
populateVocabTypes();\r
- populateAreas();\r
- \r
- populatePresenceAbsenceTerms();\r
- populateReference();\r
- \r
-// applyDialogFont(section);\r
-// \r
-// return composite;\r
+ populateAreas(); \r
+ populateStatus();\r
+// populateReference();\r
}\r
\r
- private ILocationService locationService;\r
\r
- private String title;\r
- private String message;\r
\r
/**\r
- * Number of area menus to show\r
- */\r
- private static final int NUM_AREA_MENUS = 4; \r
- /**\r
- * UI elements\r
- */\r
- private Combo vocabTypeCombo;\r
- private Combo[] areaCombos = new Combo[NUM_AREA_MENUS];\r
- private Combo statusCombo;\r
- private ReferenceSelectComposite referenceComposite;\r
- /**\r
- * Distribution fields\r
- */\r
- private NamedArea selectedArea;\r
- private PresenceAbsenceTermBase<?> selectedStatus;\r
- private Distribution distribution;\r
- private NamedAreaVocabularyType selectedVocabType;\r
- private ReferenceBase<?> selectedReference;\r
- /**\r
- * Lists to populate drop downs\r
- */\r
- private ArrayList<NamedAreaVocabularyType> vocabularyTypes; \r
- private List<PresenceAbsenceTermBase<?>> presenceAbsenceTerms;\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 NamedAreaVocabularyType lastVocabType;\r
- private static NamedArea lastNamedArea;\r
-\r
- /**\r
- * @param shell\r
- * @param dialogTitle\r
- * @param dialogMessage\r
- */\r
-// public DistributionDialog(Shell shell, String dialogTitle,\r
-// String dialogMessage) {\r
-// super(shell);\r
-// \r
-// title = dialogTitle;\r
-// message = dialogMessage;\r
-//\r
-// locationService = CdmStore.getLocationService();\r
-// \r
-// recallPreviousSelections();\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
}\r
}\r
\r
- /**\r
- * @param dialogTitle \r
- * @param dialogMessage \r
- * @return\r
- */\r
-// public static Distribution getDistribution(String dialogTitle,\r
-// String dialogMessage) {\r
-// DistributionDialog dialog = new DistributionDialog(EditorUtil.getShell(), \r
-// dialogTitle, \r
-// dialogMessage);\r
-// if (dialog.open() == Window.CANCEL) {\r
-// return null;\r
-// }\r
-// return dialog.getDistribution();\r
-// }\r
-\r
- /**\r
- * @return\r
- */\r
- private Distribution getDistribution() {\r
- return distribution;\r
- }\r
- \r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)\r
- */\r
-// protected void configureShell(Shell shell) {\r
-// super.configureShell(shell);\r
-// if (title != null) {\r
-// shell.setText(title);\r
-// }\r
-// }\r
- \r
-// protected Control createDialogArea(Composite parent) {\r
-// // create composite\r
-// Composite composite = (Composite) super.createDialogArea(parent);\r
-// // create message\r
-// if (message != null) {\r
-// createLabel(message, composite, parent);\r
-// }\r
-// createLabel("Select an area vocabulary:", composite, parent);\r
-// // create vocab type\r
-// vocabTypeCombo = createCombo(composite);\r
-// vocabTypeCombo.addSelectionListener(new SelectionAdapter() {\r
-// @Override\r
-// public void widgetSelected(SelectionEvent e) {\r
-// selectVocabType();\r
-// }\r
-// });\r
-// // create areas\r
-// createLabel("Select an area:", composite, parent);\r
-// for (int i = 0; i < NUM_AREA_MENUS; i++) {\r
-// areaCombos[i] = createCombo(composite); \r
-// areaCombos[i].addSelectionListener(new AreaComboListener(i));\r
-// areaCombos[i].setEnabled(false);\r
-// }\r
-// // create presence / absence\r
-// createLabel("Select status:", composite, parent);\r
-// statusCombo = new Combo(composite, SWT.BORDER);\r
-// statusCombo.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL\r
-// | GridData.HORIZONTAL_ALIGN_FILL));\r
-// statusCombo.addSelectionListener(new SelectionAdapter() {\r
-// @Override\r
-// public void widgetSelected(SelectionEvent e) {\r
-// selectStatusTerm();\r
-// }\r
-// });\r
-// // create reference\r
-// referenceComposite = new ReferenceSelectComposite(composite);\r
-//\r
-// populateVocabTypes();\r
-// populateAreas();\r
-// \r
-// populatePresenceAbsenceTerms();\r
-// populateReference();\r
-// \r
-// applyDialogFont(composite);\r
-// \r
-// return composite;\r
-// }\r
-\r
class AreaComboListener extends SelectionAdapter {\r
private int i;\r
AreaComboListener(int i) {\r
}\r
@Override\r
public void widgetSelected(SelectionEvent e) {\r
- selectArea(i);\r
+ if (selectionListenersEnabled) {\r
+ selectArea(i); \r
+ }\r
}\r
}\r
\r
// Set<NamedArea> terms = namedArea.getIncludes();\r
terms.addAll(namedArea.getIncludes());\r
\r
-// // FIXME fixme how?!\r
-// List<NamedArea> termList = new ArrayList<NamedArea>();\r
-// for (NamedArea area : terms){\r
-// termList.add(area);\r
-// }\r
\r
areas.add(depth, terms);\r
\r
* @param selectedVocabType\r
* @return\r
*/\r
- private List<NamedArea> getNamedAreas(NamedAreaVocabularyType vocabularyType) { \r
- List<NamedArea> topLevelTerms = locationService.getTopLevelNamedAreasByVocabularyType(vocabularyType);\r
- \r
-// OrderedTermVocabulary<NamedArea> vocabulary = locationService.getNamedAreaVocabulary(vocabularyType);\r
-//\r
-// List<NamedArea> topLevelTerms = new ArrayList<NamedArea>();\r
-// Iterator<NamedArea> it = vocabulary.iterator();\r
-// while(it.hasNext()){\r
-// \r
-// NamedArea area = HibernateProxyHelper.deproxy(it.next(), NamedArea.class);\r
-//// try{\r
-//// area3 =\r
-//// }catch(Exception e){\r
-//// logger.warn("Nope");\r
-//// }\r
-//// NamedArea area2 = area3.getPartOf();\r
-//// \r
-//// if(!(area2 instanceof NamedArea)){\r
-//// area2 = CdmBase.deproxy(area2, NamedArea.class);\r
-//// }\r
-// \r
-// if(area.getPartOf() == null){\r
-// topLevelTerms.add(area);\r
-// }\r
-//\r
-// }\r
- // TODO is this the right order?\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
-// for(NamedArea area : vocabulary){ \r
-// NamedArea area2 = area.getPartOf();\r
-// \r
-// if(!(area.getPartOf() instanceof NamedArea)){\r
-// area2 = CdmBase.deproxy(area.getPartOf(), NamedArea.class);\r
-// }\r
-// \r
-// if(area2 == null){\r
-// topLevelTerms.add(area);\r
-// }\r
-\r
\r
/**\r
* \r
*/\r
- private void populatePresenceAbsenceTerms() {\r
+ private void populateStatus() {\r
+// logger.info("Updating status menu with " + selectedStatus.getDescription());\r
int selectedIndex = -1;\r
int i = 0;\r
for (PresenceAbsenceTermBase<?> term : getPresenceAbsenceTerms()) {\r
if (term == null) {\r
} else {\r
- statusCombo.add(term.getLabel(CdmStore.getDefaultLanguage())); \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
return PreferencesUtil.getPreferredPresenceAbsenceTerms();\r
}\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
+ \r
/**\r
* @param i\r
*/\r
\r
clearArea(depth + 1);\r
populateAreas(depth + 1);\r
- \r
-// updateButtons();\r
+ }\r
+ \r
+ /**\r
+ * \r
+ */\r
+ protected void selectStatusTerm() {\r
+ int i = statusCombo.getSelectionIndex();\r
+ selectedStatus = presenceAbsenceTerms.get(i);\r
}\r
\r
/**\r
return areas.get(depth).get(index);\r
}\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
\r
/**\r
* \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 = HibernateProxyHelper.deproxy(namedAreaTmp.getPartOf(), NamedArea.class);\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
}\r
}\r
\r
+ /**\r
+ * @param namedAreaTmp\r
+ * @return\r
+ */\r
+ private NamedAreaVocabularyType getVocabularyTypeForTopLevelArea(NamedArea namedAreaTmp) {\r
+ return topLevelAreasByArea.get(namedAreaTmp);\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
+ }\r
+ return null;\r
+ }\r
+\r
/**\r
* @param i\r
*/\r
}\r
}\r
\r
- /**\r
- * \r
- */\r
- protected void selectStatusTerm() {\r
- int i = statusCombo.getSelectionIndex();\r
- selectedStatus = presenceAbsenceTerms.get(i);\r
- \r
-// updateButtons();\r
- }\r
-\r
+ \r
/**\r
* @param i\r
*/\r
private void clearAreas() {\r
clearArea(0);\r
}\r
- \r
-// protected void createButtonsForButtonBar(Composite parent) {\r
-// createButton(parent, IDialogConstants.OK_ID,\r
-// IDialogConstants.OK_LABEL, true);\r
-// createButton(parent, IDialogConstants.CANCEL_ID,\r
-// IDialogConstants.CANCEL_LABEL, false);\r
-// \r
-// updateButtons(); \r
-// }\r
- \r
-// protected void buttonPressed(int buttonId) {\r
-// if (IDialogConstants.OK_ID == buttonId) {\r
-// okPressed();\r
-// } else if (IDialogConstants.CANCEL_ID == buttonId) {\r
-// cancelPressed();\r
-// }\r
-// }\r
-\r
-// protected void okPressed() {\r
-// createDistribution();\r
-// setStaticFields();\r
-// super.okPressed();\r
-// }\r
- \r
+ \r
/**\r
* \r
*/\r
return presenceAbsenceTerms.get(i);\r
}\r
\r
- /**\r
- * \r
- */\r
- private void createDistribution() {\r
- distribution = Distribution.NewInstance(selectedArea, selectedStatus);\r
- if (referenceComposite.getReference() != null) {\r
- selectedReference = getReference();\r
- distribution.setCitation(selectedReference);\r
- }\r
- if (referenceComposite.getMicroReference() != "") {\r
- distribution.setCitationMicroReference(\r
- getMicroReference());\r
- }\r
- }\r
-\r
-// private void updateButtons() {\r
-// setOkEnabled(isDialogComplete());\r
-// }\r
-// \r
- private boolean isDialogComplete() {\r
- return\r
- (selectedArea != null && selectedStatus != null);\r
- }\r
- \r
-// private void setOkEnabled(boolean enabled) {\r
-// getButton(IDialogConstants.OK_ID).setEnabled(enabled);\r
-// }\r
}\r