3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.taxeditor
.editor
.description
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Collections
;
15 import java
.util
.List
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.eclipse
.jface
.dialogs
.Dialog
;
19 import org
.eclipse
.jface
.dialogs
.IDialogConstants
;
20 import org
.eclipse
.jface
.window
.Window
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.events
.SelectionAdapter
;
23 import org
.eclipse
.swt
.events
.SelectionEvent
;
24 import org
.eclipse
.swt
.layout
.GridData
;
25 import org
.eclipse
.swt
.widgets
.Combo
;
26 import org
.eclipse
.swt
.widgets
.Composite
;
27 import org
.eclipse
.swt
.widgets
.Control
;
28 import org
.eclipse
.swt
.widgets
.Label
;
29 import org
.eclipse
.swt
.widgets
.Shell
;
31 import eu
.etaxonomy
.cdm
.api
.service
.ILocationService
;
32 import eu
.etaxonomy
.cdm
.api
.service
.ILocationService
.NamedAreaVocabularyType
;
33 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
34 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTermBase
;
35 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
36 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
37 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
38 import eu
.etaxonomy
.taxeditor
.editor
.reference
.ReferenceSelectComposite
;
39 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
46 public class DistributionDialog
extends Dialog
{
47 private static final Logger logger
= Logger
48 .getLogger(DistributionDialog
.class);
50 private ILocationService locationService
;
53 private String message
;
56 * Number of area menus to show
58 private static final int NUM_AREA_MENUS
= 4;
62 private Combo vocabTypeCombo
;
63 private Combo
[] areaCombos
= new Combo
[NUM_AREA_MENUS
];
64 private Combo statusCombo
;
65 private ReferenceSelectComposite referenceComposite
;
69 private NamedArea selectedArea
;
70 private PresenceAbsenceTermBase
<?
> selectedStatus
;
71 private Distribution distribution
;
72 private NamedAreaVocabularyType selectedVocabType
;
73 private ReferenceBase selectedReference
;
75 * Lists to populate drop downs
77 private ArrayList
<NamedAreaVocabularyType
> vocabularyTypes
;
78 private List
<PresenceAbsenceTermBase
<?
>> presenceAbsenceTerms
;
79 private List
<List
<NamedArea
>> areas
= new ArrayList
<List
<NamedArea
>>();
80 private NamedArea
[] selectedAreas
= new NamedArea
[NUM_AREA_MENUS
];
82 * Static fields to persist default values
84 private static ReferenceBase lastReference
;
85 private static PresenceAbsenceTermBase
<?
> lastPresenceAbsence
;
86 private static NamedAreaVocabularyType lastVocabType
;
87 private static NamedArea lastNamedArea
;
92 * @param dialogMessage
94 public DistributionDialog(Shell shell
, String dialogTitle
,
95 String dialogMessage
) {
99 message
= dialogMessage
;
101 locationService
= CdmStore
.getLocationService();
103 recallPreviousSelections();
107 * Set inputs to selections from last time dialog was used.
109 private void recallPreviousSelections() {
110 if (lastVocabType
!= null) {
111 selectedVocabType
= lastVocabType
;
113 // Last named area don't make much sense w/out a vocab type
114 if (lastNamedArea
!= null) {
115 selectedArea
= lastNamedArea
;
118 if (lastPresenceAbsence
!= null) {
119 selectedStatus
= lastPresenceAbsence
;
121 if (lastReference
!= null) {
122 selectedReference
= lastReference
;
128 * @param dialogMessage
131 public static Distribution
getDistribution(String dialogTitle
,
132 String dialogMessage
) {
133 DistributionDialog dialog
= new DistributionDialog(EditorUtil
.getShell(),
136 if (dialog
.open() == Window
.CANCEL
) {
139 return dialog
.getDistribution();
145 private Distribution
getDistribution() {
152 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
154 protected void configureShell(Shell shell
) {
155 super.configureShell(shell
);
157 shell
.setText(title
);
161 protected Control
createDialogArea(Composite parent
) {
163 Composite composite
= (Composite
) super.createDialogArea(parent
);
165 if (message
!= null) {
166 createLabel(message
, composite
, parent
);
168 createLabel("Select an area vocabulary:", composite
, parent
);
170 vocabTypeCombo
= createCombo(composite
);
171 vocabTypeCombo
.addSelectionListener(new SelectionAdapter() {
173 public void widgetSelected(SelectionEvent e
) {
178 createLabel("Select an area:", composite
, parent
);
179 for (int i
= 0; i
< NUM_AREA_MENUS
; i
++) {
180 areaCombos
[i
] = createCombo(composite
);
181 areaCombos
[i
].addSelectionListener(new AreaComboListener(i
));
182 areaCombos
[i
].setEnabled(false);
184 // create presence / absence
185 createLabel("Select status:", composite
, parent
);
186 statusCombo
= new Combo(composite
, SWT
.BORDER
);
187 statusCombo
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
188 | GridData
.HORIZONTAL_ALIGN_FILL
));
189 statusCombo
.addSelectionListener(new SelectionAdapter() {
191 public void widgetSelected(SelectionEvent e
) {
196 referenceComposite
= new ReferenceSelectComposite(composite
);
198 populateVocabTypes();
201 populatePresenceAbsenceTerms();
204 applyDialogFont(composite
);
209 class AreaComboListener
extends SelectionAdapter
{
211 AreaComboListener(int i
) {
215 public void widgetSelected(SelectionEvent e
) {
223 private Combo
createCombo(Composite composite
) {
224 Combo combo
= new Combo(composite
, SWT
.BORDER
);
225 combo
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
226 | GridData
.HORIZONTAL_ALIGN_FILL
));
233 private void populateVocabTypes() {
236 for (NamedAreaVocabularyType vocabularyType
: getVocabularyTypes()) {
237 String vocabularyTypeLabel
= vocabularyType
== null ?
238 "" : vocabularyType
.toString();
239 vocabTypeCombo
.add(vocabularyTypeLabel
);
241 if (vocabularyType
!= null && vocabularyType
== selectedVocabType
) {
247 vocabTypeCombo
.select(index
);
255 private List
<NamedArea
> getNamedAreas(NamedArea namedArea
, int depth
) {
256 List
<NamedArea
> terms
= new ArrayList
<NamedArea
>();
257 // Set<NamedArea> terms = namedArea.getIncludes();
258 terms
.addAll(namedArea
.getIncludes());
260 // // FIXME fixme how?!
261 // List<NamedArea> termList = new ArrayList<NamedArea>();
262 // for (NamedArea area : terms){
263 // termList.add(area);
266 areas
.add(depth
, terms
);
272 * @param selectedVocabType
275 private List
<NamedArea
> getNamedAreas(NamedAreaVocabularyType vocabularyType
) {
276 List
<NamedArea
> topLevelTerms
= locationService
.getTopLevelNamedAreasByVocabularyType(vocabularyType
);
278 // OrderedTermVocabulary<NamedArea> vocabulary = locationService.getNamedAreaVocabulary(vocabularyType);
280 // List<NamedArea> topLevelTerms = new ArrayList<NamedArea>();
281 // Iterator<NamedArea> it = vocabulary.iterator();
282 // while(it.hasNext()){
284 // NamedArea area = HibernateProxyHelper.deproxy(it.next(), NamedArea.class);
287 //// }catch(Exception e){
288 //// logger.warn("Nope");
290 //// NamedArea area2 = area3.getPartOf();
292 //// if(!(area2 instanceof NamedArea)){
293 //// area2 = CdmBase.deproxy(area2, NamedArea.class);
296 // if(area.getPartOf() == null){
297 // topLevelTerms.add(area);
301 // TODO is this the right order?
302 Collections
.reverse(topLevelTerms
);
304 areas
.add(0, topLevelTerms
);
305 return topLevelTerms
;
307 // for(NamedArea area : vocabulary){
308 // NamedArea area2 = area.getPartOf();
310 // if(!(area.getPartOf() instanceof NamedArea)){
311 // area2 = CdmBase.deproxy(area.getPartOf(), NamedArea.class);
314 // if(area2 == null){
315 // topLevelTerms.add(area);
322 private void populatePresenceAbsenceTerms() {
323 int selectedIndex
= -1;
325 for (PresenceAbsenceTermBase
<?
> term
: getPresenceAbsenceTerms()) {
328 statusCombo
.add(term
.getLabel(CdmStore
.getDefaultLanguage()));
329 if (this.selectedStatus
!= null && this.selectedStatus
.equals(term
)) {
335 if (selectedIndex
!= -1) {
336 statusCombo
.select(selectedIndex
);
343 private void populateReference() {
344 if (selectedReference
!= null) {
345 referenceComposite
.setReference(selectedReference
);
352 private List
<NamedAreaVocabularyType
> getVocabularyTypes() {
353 if (vocabularyTypes
== null) {
354 vocabularyTypes
= new ArrayList
<NamedAreaVocabularyType
>();
355 vocabularyTypes
.addAll(locationService
.getNamedAreaVocabularyTypes());
357 return vocabularyTypes
;
363 private List
<PresenceAbsenceTermBase
<?
>> getPresenceAbsenceTerms() {
364 if (presenceAbsenceTerms
== null) {
365 presenceAbsenceTerms
= new ArrayList
<PresenceAbsenceTermBase
<?
>>();
367 for (PresenceAbsenceTermBase
<?
> term
: locationService
.getPresenceTermVocabulary().getTermsOrderedByLabels(CdmStore
.getDefaultLanguage())) {
368 presenceAbsenceTerms
.add(term
);
370 for (PresenceAbsenceTermBase
<?
> term
: locationService
.getAbsenceTermVocabulary().getTermsOrderedByLabels(CdmStore
.getDefaultLanguage())) {
371 presenceAbsenceTerms
.add(term
);
374 return presenceAbsenceTerms
;
380 protected void selectArea(int depth
) {
381 // This selection is made currently selected area
382 int i
= areaCombos
[depth
].getSelectionIndex();
384 selectedArea
= getSelectedArea(depth
, i
);
386 selectedAreas
[depth
] = selectedArea
;
388 clearArea(depth
+ 1);
389 populateAreas(depth
+ 1);
399 private NamedArea
getSelectedArea(int depth
, int index
) {
400 return areas
.get(depth
).get(index
);
406 protected void selectVocabType() {
407 int i
= vocabTypeCombo
.getSelectionIndex();
408 selectedVocabType
= getVocabularyTypes().get(i
);
418 private void populateAreas() {
419 if (selectedArea
== null) {
422 List
<NamedArea
> areasTmp
= new ArrayList
<NamedArea
>();
423 NamedArea namedAreaTmp
= selectedArea
;
424 NamedArea parentArea
= null;
426 areasTmp
.add(namedAreaTmp
);
427 parentArea
= namedAreaTmp
.getPartOf();
428 namedAreaTmp
= parentArea
;
429 } while (parentArea
!= null);
430 Collections
.reverse(areasTmp
);
432 for (NamedArea namedArea
: areasTmp
) {
433 selectedAreas
[depth
] = namedArea
;
434 populateAreas(depth
);
442 private void populateAreas(int depth
) {
443 List
<NamedArea
> areasTmp
;
445 areasTmp
= getNamedAreas(selectedVocabType
);
447 areasTmp
= getNamedAreas(selectedAreas
[depth
- 1], depth
);
452 if (areasTmp
.size() > 0) {
453 for(NamedArea areaTmp
: areasTmp
){
454 String areaLabel
= areaTmp
== null ?
"" : areaTmp
.getLabel();
455 areaCombos
[depth
].add(areaLabel
);
457 if (selectedAreas
[depth
] != null && selectedAreas
[depth
].equals(areaTmp
)) {
462 areaCombos
[depth
].setEnabled(true);
464 areaCombos
[depth
].select(index
);
472 protected void selectStatusTerm() {
473 int i
= statusCombo
.getSelectionIndex();
474 selectedStatus
= presenceAbsenceTerms
.get(i
);
485 private Label
createLabel(String string
, Composite composite
, Composite parent
) {
486 Label label
= new Label(composite
, SWT
.WRAP
);
487 label
.setText(string
);
488 GridData data
= new GridData(GridData
.GRAB_HORIZONTAL
489 | GridData
.GRAB_VERTICAL
| GridData
.HORIZONTAL_ALIGN_FILL
490 | GridData
.VERTICAL_ALIGN_CENTER
);
491 data
.widthHint
= convertHorizontalDLUsToPixels(IDialogConstants
.MINIMUM_MESSAGE_AREA_WIDTH
);
492 label
.setLayoutData(data
);
493 label
.setFont(parent
.getFont());
500 private void clearArea(int i
) {
501 for (int j
= i
; j
< NUM_AREA_MENUS
; j
++) {
502 // TODO add clear selectedArea
503 areaCombos
[j
].removeAll();
504 areaCombos
[j
].setEnabled(false);
511 private void clearAreas() {
515 protected void createButtonsForButtonBar(Composite parent
) {
516 createButton(parent
, IDialogConstants
.OK_ID
,
517 IDialogConstants
.OK_LABEL
, true);
518 createButton(parent
, IDialogConstants
.CANCEL_ID
,
519 IDialogConstants
.CANCEL_LABEL
, false);
524 protected void buttonPressed(int buttonId
) {
525 if (IDialogConstants
.OK_ID
== buttonId
) {
527 } else if (IDialogConstants
.CANCEL_ID
== buttonId
) {
532 protected void okPressed() {
533 createDistribution();
541 private void setStaticFields() {
542 lastPresenceAbsence
= getPresenceAbsenceTerm();
543 lastNamedArea
= selectedArea
;
544 lastReference
= getReference();
545 lastVocabType
= getVocabType();
551 private NamedAreaVocabularyType
getVocabType() {
552 int i
= vocabTypeCombo
.getSelectionIndex();
553 return vocabularyTypes
.get(i
);
559 private ReferenceBase
getReference() {
560 return referenceComposite
.getReference();
566 private String
getMicroReference() {
567 return referenceComposite
.getMicroReference();
573 private PresenceAbsenceTermBase
<?
> getPresenceAbsenceTerm() {
574 int i
= statusCombo
.getSelectionIndex();
575 return presenceAbsenceTerms
.get(i
);
581 private void createDistribution() {
582 distribution
= Distribution
.NewInstance(selectedArea
, selectedStatus
);
583 if (referenceComposite
.getReference() != null) {
584 selectedReference
= getReference();
585 distribution
.setCitation(selectedReference
);
587 if (referenceComposite
.getMicroReference() != "") {
588 distribution
.setCitationMicroReference(
589 getMicroReference());
593 private void updateButtons() {
594 setOkEnabled(isDialogComplete());
597 private boolean isDialogComplete() {
599 (selectedArea
!= null && selectedStatus
!= null);
602 private void setOkEnabled(boolean enabled
) {
603 getButton(IDialogConstants
.OK_ID
).setEnabled(enabled
);