KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > person > edit > fieldbased > FieldBasedPersonEditor


1 /*
2  * Created on Jan 9, 2005
3  * by alex
4  *
5  */

6 package com.nightlabs.ipanema.person.edit.fieldbased;
7
8 import java.util.HashMap JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.Map JavaDoc;
11
12 import org.apache.log4j.Logger;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.events.MouseAdapter;
15 import org.eclipse.swt.events.MouseEvent;
16 import org.eclipse.swt.events.MouseListener;
17 import org.eclipse.swt.graphics.Color;
18 import org.eclipse.swt.layout.GridData;
19 import org.eclipse.swt.layout.GridLayout;
20 import org.eclipse.swt.widgets.Composite;
21 import org.eclipse.swt.widgets.Control;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.swt.widgets.Label;
24
25 import com.nightlabs.ipanema.person.AbstractPersonDataField;
26 import com.nightlabs.ipanema.person.Person;
27 import com.nightlabs.ipanema.person.PersonDataNotFoundException;
28 import com.nightlabs.ipanema.person.PersonStructCache;
29 import com.nightlabs.ipanema.person.edit.PersonDataFieldEditor;
30 import com.nightlabs.ipanema.person.edit.PersonDataFieldEditorFactoryRegistry;
31 import com.nightlabs.ipanema.person.edit.PersonDataFieldEditorNotFoundException;
32 import com.nightlabs.ipanema.person.edit.PersonEditor;
33 import com.nightlabs.ipanema.person.edit.blockbased.PersonDataBlockEditorChangedListener;
34 import com.nightlabs.ipanema.person.id.PersonStructFieldID;
35 import com.nightlabs.rcp.composite.CompositeSelectionEvent;
36 import com.nightlabs.rcp.composite.SelectableComposite;
37 import com.nightlabs.rcp.composite.SelectableCompositeListener;
38
39 /**
40  * A field based PersonEditor that will set its look depending
41  * on the editorType and the PersonDataFieldEditors registered
42  * by the personDataField-extension-point.
43  *
44  * @author Alexander Bieber <alex[AT]nightlabs[DOT]de>
45  *
46  */

47 public class FieldBasedPersonEditor implements PersonEditor {
48
49     public static final Logger LOGGER = Logger.getLogger(FieldBasedPersonEditor.class);
50     
51     public static final String JavaDoc EDITORTYPE_FIELD_BASED = "field-based";
52
53     /**
54      *
55      */

56     public FieldBasedPersonEditor() {
57         super();
58     }
59     
60     
61     private String JavaDoc editorType;
62     /**
63      * Get the editorType.
64      * @return
65      */

66     public String JavaDoc getEditorType() {
67         return editorType;
68     }
69     /**
70      * Set the editorType.
71      * Use the static finals.
72      * @param editorType
73      */

74     public void setEditorType(String JavaDoc editorType) {
75         this.editorType = editorType;
76     }
77
78     protected Object JavaDoc selectionObject;
79     private Person person;
80     /**
81      * @see com.nightlabs.ipanema.person.edit.PersonEditor#setPerson(com.nightlabs.ipanema.person.Person)
82      */

83     public void setPerson(Person person) {
84         this.person = person;
85         this.selectionObject = person;
86     }
87
88     /**
89      * @see com.nightlabs.ipanema.person.edit.PersonEditor#setPerson(com.nightlabs.ipanema.person.Person, boolean)
90      */

91     public void setPerson(Person person, boolean refresh) {
92         setPerson(person);
93         if (refresh)
94             refreshControl();
95     }
96     
97     private boolean showEmptyFields = true;
98     /**
99      *
100      * @return Wheather empty fields of the associated person should be displayed.
101      */

102     public boolean isShowEmptyFields() {
103         return showEmptyFields;
104     }
105     /**
106      * Defines weather empty fields of the associated person should be displayed.
107      * @param showEmptyFields
108      */

109     public void setShowEmptyFields(boolean showEmptyFields) {
110         this.showEmptyFields = showEmptyFields;
111     }
112     
113     private Label personTitleLabel;
114     
115     public Label getPersonTitleLabel() {
116         return personTitleLabel;
117     }
118     
119
120     private SelectableComposite editorWrapper;
121     private Color wrapperSelectedColor = new Color(Display.getDefault(), 155, 155, 155);
122     private Color wrapperNormalColor;
123     
124     private SelectableComposite editorComposite;
125     private SelectableComposite titleComposite;
126     
127     private boolean selectionCallback = false;
128     
129     /**
130      * Delegates selections to the underlying Composite
131      */

132     private SelectableCompositeListener editorCompositeListener = new SelectableCompositeListener() {
133         public void selectionStateChanged(CompositeSelectionEvent evt) {
134             if (evt.getSource() == editorComposite) {
135                 selectionCallback = true;
136                 try {
137                     editorWrapper.setSelected(evt.isSelected());
138                 }
139                 finally {
140                     selectionCallback = false;
141                 }
142             }
143         }
144     };
145     
146     private MouseListener titleMouseAdapter = new MouseAdapter() {
147         public void mouseUp(MouseEvent evt) {
148                 selectionCallback = true;
149                 if (evt.button != 1)
150                     return;
151                 try {
152                     editorWrapper.setSelected(true,evt.stateMask);
153                 }
154                 finally {
155                     selectionCallback = false;
156                 }
157         }
158     };
159     
160     /**
161      * Changes the background of the editor Wrapper for a dynamic Border
162      */

163     private SelectableCompositeListener editorWrapperListener = new SelectableCompositeListener() {
164         public void selectionStateChanged(CompositeSelectionEvent evt) {
165             if (!selectionCallback)
166                 editorComposite.setSelected(evt.isSelected());
167             if (evt.isSelected())
168                 evt.getSource().setBackground(wrapperSelectedColor);
169             else
170                 evt.getSource().setBackground(wrapperNormalColor);
171         }
172     };
173     
174     
175     private GridLayout gridLayout;
176     
177     public GridLayout getGridLayout() {
178         return gridLayout;
179     }
180     
181     /**
182      * Creates a new GridLayout wich will be applied to the Editor.
183      * Intended to be overridden to apply a custom layout (more columns etc.)
184      * @return
185      */

186     protected GridLayout createGridLayout() {
187         GridLayout wrapperLayout = new GridLayout();
188         wrapperLayout.marginHeight = 1;
189         wrapperLayout.marginWidth = 1;
190         wrapperLayout.verticalSpacing = 0;
191         return wrapperLayout;
192     }
193     
194     /**
195      * Returns null. Can be overridden to return a custom GridData
196      * for the given field, or null to use the LayoutData provided
197      * by the field-editor itself.
198      *
199      * @param field
200      * @return A new GridData or null.
201      */

202     protected GridData getGridDataForField(AbstractPersonDataField field) {
203         return null;
204     }
205     
206     protected GridData wrapperGridData;
207     
208     /**
209      * Determines weather a LayoutData in form of
210      * a new GridData(GridData.FILL_BOTH) should
211      * be set to the editorWrapper
212      *
213      * @return Weather to setLayoutData on editorWrapper
214      */

215     protected boolean setLayoutDataForWrapper() {
216         return false;
217     }
218     /**
219      *
220      * @return The editorWrapper's GridData or null;
221      */

222     protected GridData getWrapperGridData() {
223         return wrapperGridData;
224     }
225     
226     public void disposeControl() {
227         for (Iterator JavaDoc iter = fieldEditors.values().iterator(); iter.hasNext();) {
228             PersonDataFieldEditor editor = (PersonDataFieldEditor) iter.next();
229             editor.getControl().dispose();
230             iter.remove();
231         }
232         if (titleComposite != null) {
233             titleComposite.dispose();
234             titleComposite = null;
235             personTitleLabel = null;
236         }
237         if (editorComposite != null) {
238             editorComposite.removeSelectionChangeListener(editorCompositeListener);
239             editorComposite = null;
240         }
241         if (editorWrapper != null) {
242             editorWrapper.dispose();
243             editorWrapper = null;
244         }
245     }
246     
247     /**
248      * @see com.nightlabs.ipanema.person.edit.PersonEditor#createControl(org.eclipse.swt.widgets.Composite, boolean)
249      */

250     public Control createControl(Composite parent, boolean refresh) {
251         if (editorWrapper == null) {
252             
253             editorWrapper = new SelectableComposite(parent,SWT.NONE);
254             editorWrapper.setSelectionObject(selectionObject);
255             wrapperNormalColor = editorWrapper.getBackground();
256             
257             if (setLayoutDataForWrapper()) {
258                 wrapperGridData = new GridData();
259                 wrapperGridData.horizontalAlignment = GridData.FILL;
260                 wrapperGridData.grabExcessHorizontalSpace = true;
261                 wrapperGridData.verticalAlignment = GridData.BEGINNING;
262                 
263                 editorWrapper.setLayoutData(wrapperGridData);
264             }
265             
266             gridLayout = createGridLayout();
267             
268             if (gridLayout == null)
269                 throw new IllegalStateException JavaDoc("createGridLayout() returned null!!");
270             
271             editorWrapper.setLayout(gridLayout);
272             editorWrapper.addSelectionChangeListener(editorWrapperListener);
273             
274             titleComposite = new SelectableComposite(editorWrapper,SWT.NONE);
275             titleComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
276             GridLayout titleLayout = new GridLayout();
277             titleLayout.verticalSpacing = 0;
278             titleLayout.marginHeight = 0;
279             titleLayout.marginWidth = 0;
280             titleLayout.horizontalSpacing = 0;
281             titleComposite.setLayout(titleLayout);
282             
283             editorComposite = new SelectableComposite(editorWrapper,SWT.NONE);
284             editorComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
285             GridLayout layout = new GridLayout();
286 // layout.horizontalSpacing = 0;
287
layout.verticalSpacing = 0;
288             layout.marginHeight = 0;
289             layout.marginWidth = 0;
290             layout.horizontalSpacing = 3;
291 // layout.marginWidth = 0;
292
layout.numColumns = 3;
293             editorComposite.setLayout(layout);
294             editorComposite.addSelectionChangeListener(editorCompositeListener);
295         }
296         if (refresh)
297             refreshControl();
298         
299         return editorWrapper;
300     }
301     
302     /**
303      * Calls createControl but returns as SelectableComposite.
304      *
305      * @param parent
306      * @param changeListener
307      * @param refresh
308      * @return
309      */

310     public SelectableComposite getComposite(Composite parent, PersonDataBlockEditorChangedListener changeListener, boolean refresh) {
311         return (SelectableComposite)createControl(parent,refresh);
312     }
313     
314     /**
315      * Map holding all fieldEditors.<br/>
316      * key: PersonStructFieldID structFieldID<br/>
317      * value: PersonDataFieldEditor fieldEditor
318      */

319     private Map JavaDoc fieldEditors = new HashMap JavaDoc();
320     
321     
322     private void createTitleLabel() {
323         if (personTitleLabel == null) {
324             personTitleLabel = new Label(titleComposite,SWT.NONE);
325             GridData gd = new GridData();
326             gd.horizontalAlignment = GridData.FILL;
327             gd.grabExcessHorizontalSpace = true;
328             personTitleLabel.setLayoutData(gd);
329             personTitleLabel.addMouseListener(titleMouseAdapter);
330         }
331     }
332     
333     /**
334      * @see com.nightlabs.ipanema.person.edit.PersonEditor#refreshControl()
335      */

336     public void refreshControl() {
337         Display.getDefault().syncExec(
338             new Runnable JavaDoc() {
339                 public void run() {
340                     if (person == null)
341                         return;
342                     
343                     createTitleLabel();
344                     
345                     if (person.getPersonDisplayName() != null)
346                         personTitleLabel.setText(person.getPersonDisplayName());
347                     else
348                         personTitleLabel.setText("");
349                     
350                     personTitleLabel.setBackground(new Color(Display.getDefault(), 155, 155, 155));
351                     
352                     PersonStructCache.getPersonStructure().explodePerson(person);
353                     
354                     for (Iterator JavaDoc iter = PersonEditorStructFieldRegistry.getSharedInstance().getStructFieldList(getEditorType()).iterator(); iter.hasNext();) {
355                         PersonStructFieldID structFieldID = (PersonStructFieldID) iter.next();
356                         AbstractPersonDataField field = null;
357                         try {
358                             field = person.getPersonDataField(structFieldID);
359                         } catch (PersonDataNotFoundException e) {
360                             LOGGER.error("Could not find PersonDataField for "+structFieldID,e);
361                             continue;
362                         }
363                         if (field.isEmpty()) {
364                             if (!showEmptyFields) {
365                                 if (fieldEditors.containsKey(structFieldID)) {
366                                     ((PersonDataFieldEditor)fieldEditors.get(structFieldID)).getControl().dispose();
367                                     fieldEditors.remove(structFieldID);
368                                 }
369                                 continue;
370                             }
371                         }
372                         PersonDataFieldEditor editor = null;
373                         if (!fieldEditors.containsKey(structFieldID)) {
374                             try {
375                                 editor = PersonDataFieldEditorFactoryRegistry.getSharedInstance().getNewEditorInstance(field, getEditorType(), false);
376                             } catch (PersonDataFieldEditorNotFoundException e) {
377                                 LOGGER.error("Could not find PersonDataFieldEditor for "+field.getClass().getName(),e);
378                                 continue;
379                             }
380                             editor.setData(field);
381                             Control editorControl = editor.createControl(editorComposite);
382                             GridData editorGD = FieldBasedPersonEditor.this.getGridDataForField(field);
383                             if (editorGD != null)
384                                 editorControl.setLayoutData(editorGD);
385                             fieldEditors.put(structFieldID,editor);
386                         } else {
387                             editor = (PersonDataFieldEditor)fieldEditors.get(structFieldID);
388                         }
389                         editor.setData(field);
390                         editor.refresh();
391                     }
392 // editorWrapper.setSize(editorComposite.computeSize(SWT.DEFAULT,fieldEditors.size()*35+35));
393
editorWrapper.pack();
394                 }
395             }
396         );
397     }
398     
399     
400
401     /**
402      * @see com.nightlabs.ipanema.person.edit.PersonEditor#updatePerson()
403      */

404     public void updatePerson() {
405         for (Iterator JavaDoc iter = fieldEditors.values().iterator(); iter.hasNext();) {
406             PersonDataFieldEditor editor = (PersonDataFieldEditor) iter.next();
407             editor.updatePerson();
408         }
409     }
410 }
411
Popular Tags