4 package eu
.etaxonomy
.taxeditor
.ui
.selection
;
6 import java
.util
.EnumSet
;
7 import java
.util
.Observable
;
8 import java
.util
.Observer
;
10 import org
.eclipse
.core
.runtime
.IStatus
;
11 import org
.eclipse
.jface
.wizard
.WizardDialog
;
12 import org
.eclipse
.swt
.SWT
;
13 import org
.eclipse
.swt
.events
.SelectionAdapter
;
14 import org
.eclipse
.swt
.events
.SelectionEvent
;
15 import org
.eclipse
.swt
.events
.SelectionListener
;
16 import org
.eclipse
.swt
.graphics
.Color
;
17 import org
.eclipse
.swt
.widgets
.Button
;
18 import org
.eclipse
.swt
.widgets
.Composite
;
19 import org
.eclipse
.swt
.widgets
.Label
;
20 import org
.eclipse
.swt
.widgets
.Shell
;
21 import org
.eclipse
.swt
.widgets
.Text
;
22 import org
.springframework
.security
.core
.GrantedAuthority
;
24 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
25 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
26 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
27 import eu
.etaxonomy
.cdm
.model
.common
.Group
;
28 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.common
.IIdentifiableEntity
;
30 import eu
.etaxonomy
.cdm
.model
.common
.User
;
31 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
32 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
33 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
34 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
35 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
36 import eu
.etaxonomy
.taxeditor
.store
.LoginManager
;
37 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
38 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.SelectionDialogFactory
;
39 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
40 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
41 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
42 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
43 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
44 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEntityElement
;
45 import eu
.etaxonomy
.taxeditor
.ui
.element
.ILabeledElement
;
46 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectableElement
;
47 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
48 import eu
.etaxonomy
.taxeditor
.ui
.element
.SelectionArbitrator
;
49 import eu
.etaxonomy
.taxeditor
.ui
.section
.grantedAuthority
.GrantedAuthorityLabelTextProvider
;
53 * Abstract AbstractSelectionElement class.
57 * @created Nov 17, 2009
61 public class EntitySelectionElement
<T
extends ICdmBase
> extends
62 AbstractCdmFormElement
implements SelectionListener
, IEnableableFormElement
, ISelectableElement
, IEntityElement
<T
>, ILabeledElement
, IConversationEnabled
, Observer
{
64 private static final EnumSet
<CRUD
> UPDATE
= EnumSet
.of(CRUD
.UPDATE
);
65 private static final EnumSet
<CRUD
> DELETE
= EnumSet
.of(CRUD
.DELETE
);
66 private static final EnumSet
<CRUD
> CREATE
= EnumSet
.of(CRUD
.CREATE
);
69 * Bitmask for configuring functionality of selection element
71 public static final int NOTHING
= 0; // 000
72 public static final int EDITABLE
= 1 << 0; // 001
73 public static final int DELETABLE
= 1 << 1; // 010
74 public static final int SELECTABLE
= 1 << 2; // 100
75 public static final int ALL
= EDITABLE
| DELETABLE
| SELECTABLE
; // 111
79 protected Label label
;
81 protected Button button_selection
;
83 private SelectionArbitrator selectionArbitrator
;
85 protected Button button_edit
;
87 private final String labelString
;
89 private Composite selectableComposite
;
91 private Button button_remove
;
93 private final boolean isEditable
;
95 private final boolean isDeletable
;
97 private final ConversationHolder conversation
;
98 private Class
<T
> clazz
;
102 * Constructor for AbstractSelectionElement.
106 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
108 * @param conversation
110 * @param parentElement
111 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
114 * a {@link java.lang.String} object.
119 * @param isSelectable
128 public EntitySelectionElement(CdmFormFactory formFactory
,
129 ConversationHolder conversation
, ICdmFormElement parentElement
,
130 String labelString
, T entity
, int mode
, int style
) {
131 super(formFactory
, parentElement
);
133 this.isEditable
= (mode
& EDITABLE
) == EDITABLE
;
134 this.isDeletable
= (mode
& DELETABLE
) == DELETABLE
;
135 boolean isSelectable
= (mode
& SELECTABLE
) == SELECTABLE
;
137 this.labelString
= labelString
;
139 this.conversation
= conversation
;
141 if (isSelectable
&& formFactory
.getSelectionProvider() != null) {
142 selectionArbitrator
= formFactory
.createSelectionArbitrator(this);
145 createControls(getLayoutComposite(), SWT
.NULL
);
150 public EntitySelectionElement(CdmFormFactory formFactory
,
151 ConversationHolder conversation
, ICdmFormElement parentElement
, Class
<T
> clazz
,
152 String labelString
, T entity
, int mode
, int style
) {
153 this(formFactory
, conversation
, parentElement
, labelString
, entity
, mode
, style
);
157 private void createControls(Composite parent
, int style
) {
159 label
= formFactory
.createLabel(getLayoutComposite(), labelString
+ " : ",
164 selectableComposite
= formFactory
.createComposite(getLayoutComposite());
174 selectableComposite
.setLayout(LayoutConstants
.LAYOUT(columns
, false));
175 selectableComposite
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY());
177 addControl(selectableComposite
);
179 text
= formFactory
.createText(selectableComposite
, null, SWT
.WRAP
);
180 text
.setEditable(false);
183 text
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY());
184 text
.setBackground(StoreUtil
185 .getColor(Resources
.COLOR_TEXT_DISABLED_BACKGROUND
));
187 button_selection
= formFactory
.createButton(selectableComposite
, null,
189 button_selection
.setImage(ImageResources
190 .getImage(ImageResources
.BROWSE_ICON
));
191 button_selection
.setToolTipText("Browse existing");
193 addControl(button_selection
);
194 button_selection
.addSelectionListener(this);
197 button_edit
= formFactory
.createButton(selectableComposite
, null,
199 button_edit
.setImage(ImageResources
200 .getImage(ImageResources
.EDIT_ICON
));
201 button_edit
.setToolTipText("Edit");
202 addControl(button_edit
);
203 button_edit
.addSelectionListener(new EditListener(this));
207 button_remove
= formFactory
.createButton(selectableComposite
, null,
209 button_remove
.setImage(ImageResources
210 .getImage(ImageResources
.TRASH_ICON
));
211 button_remove
.setToolTipText("Remove");
212 addControl(button_remove
);
213 button_remove
.addSelectionListener(new DeleteListener(this));
218 public void widgetSelected(SelectionEvent e
) {
219 T selection
= SelectionDialogFactory
.getSelectionFromDialog(clazz
, getShell(), getConversationHolder(), getEntity());
220 setSelectionInternal(selection
);
224 * Return the selected object
226 * @return a T object.
228 public T
getSelection() {
236 * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
240 public void setEnabled(boolean enabled
) {
241 button_selection
.setEnabled(enabled
);
243 updateButtonStates();
249 * setSelectionInternal
255 protected void setSelectionInternal(T selection
) {
256 if (selection
!= null && !selection
.equals(this.entity
)) {
257 setEntity(selection
);
258 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
264 * Setter for the field <code>entity</code>.
270 public void setEntity(T selection
) {
271 this.entity
= selection
;
276 * Updates this elements view
278 protected void updateElement() {
279 String title
= CdmUtils
.Nz(getTitle());
280 // we have to duplicate ampersands otherwise they are treated as
281 // mnenomic (see Label.setText() documentation)
282 title
= title
.replace("&", "&&");
283 text
.setText(title
); // title can be null
285 updateButtonStates();
289 public void updateFromWizard() {
291 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
299 * @return a {@link java.lang.String} object.
301 protected String
getTitle() {
303 if(entity
instanceof IIdentifiableEntity
) {
304 return ((IIdentifiableEntity
) entity
).getTitleCache();
305 } else if(entity
instanceof Group
){
306 return ((Group
) entity
).getName();
307 } else if(entity
instanceof GrantedAuthority
){
308 return GrantedAuthorityLabelTextProvider
.getText(((GrantedAuthority
) entity
));
309 } else if(entity
instanceof User
){
310 return ((User
) entity
).getUsername();
319 public void setSelected(boolean selected
) {
320 setBackground(selected ? SELECTED
: getPersistentBackground());
326 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
330 * Getter for the field <code>entity</code>.
333 * @return a T object.
336 public T
getEntity() {
343 * @see eu.etaxonomy.taxeditor.forms.section.cdmdetail.ISelectableElement#
344 * getSelectionArbitrator()
348 * Getter for the field <code>selectionArbitrator</code>.
351 * @return a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
355 public SelectionArbitrator
getSelectionArbitrator() {
356 return selectionArbitrator
;
360 * Convenient access to current shell
362 * @return a {@link org.eclipse.swt.widgets.Shell} object.
364 public Shell
getShell() {
365 return getLayoutComposite().getShell();
370 public void setIrrelevant(boolean irrelevant
) {
371 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
372 : Resources
.COLOR_TEXT_DISABLED_BACKGROUND
;
374 Color color
= StoreUtil
.getColor(colorId
);
375 text
.setBackground(color
);
378 private class DeleteListener
extends SelectionAdapter
{
380 private final EntitySelectionElement
<T
> selectionElement
;
382 public DeleteListener(EntitySelectionElement
<T
> selectionElement
) {
383 this.selectionElement
= selectionElement
;
387 public void widgetSelected(SelectionEvent e
) {
389 firePropertyChangeEvent(new CdmPropertyChangeEvent(
390 selectionElement
, null));
394 private class EditListener
extends SelectionAdapter
{
396 private final EntitySelectionElement
<T
> selectionElement
;
398 public EditListener(EntitySelectionElement
<T
> selectionElement
) {
399 this.selectionElement
= selectionElement
;
404 public void widgetSelected(SelectionEvent e
) {
405 WizardDialog dialog
= new WizardDialog(selectionElement
.getShell(),
406 new EditFromSelectionWizard(selectionElement
));
407 if (dialog
.open() == IStatus
.OK
) {
408 selectionElement
.updateFromWizard();
416 public void widgetDefaultSelected(SelectionEvent e
) {
421 * getConversationHolder
424 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
428 public ConversationHolder
getConversationHolder() {
434 public void setBackground(Color color
) {
435 label
.setBackground(color
);
440 public void setLabel(String labelString
) {
442 label
.setText(labelString
);
448 * Getter for the field <code>label</code>.
451 * @return a {@link java.lang.String} object.
454 public String
getLabel() {
456 return label
.getText() + " : ";
463 public void update(CdmDataChangeMap changeEvents
) {
467 * @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements()
470 public void removeElements(){
471 super.removeElements();
472 LoginManager loginManager
= CdmStore
.getLoginManager();
473 loginManager
.addObserver(this);
477 public void update(Observable o
, Object arg
) {
478 if(o
instanceof LoginManager
){
479 updateButtonStates();
483 private void updateButtonStates() {
484 button_edit
.setEnabled(isEditable
&& button_selection
.isEnabled() && getEntity() != null && CdmStore
.currentAuthentiationHasPermission(StoreUtil
.getCdmEntity(getEntity()), UPDATE
));