1 6 package com.nightlabs.ipanema.person.edit.fieldbased; 7 8 import java.util.HashMap ; 9 import java.util.Iterator ; 10 import java.util.Map ; 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 47 public class FieldBasedPersonEditor implements PersonEditor { 48 49 public static final Logger LOGGER = Logger.getLogger(FieldBasedPersonEditor.class); 50 51 public static final String EDITORTYPE_FIELD_BASED = "field-based"; 52 53 56 public FieldBasedPersonEditor() { 57 super(); 58 } 59 60 61 private String editorType; 62 66 public String getEditorType() { 67 return editorType; 68 } 69 74 public void setEditorType(String editorType) { 75 this.editorType = editorType; 76 } 77 78 protected Object selectionObject; 79 private Person person; 80 83 public void setPerson(Person person) { 84 this.person = person; 85 this.selectionObject = person; 86 } 87 88 91 public void setPerson(Person person, boolean refresh) { 92 setPerson(person); 93 if (refresh) 94 refreshControl(); 95 } 96 97 private boolean showEmptyFields = true; 98 102 public boolean isShowEmptyFields() { 103 return showEmptyFields; 104 } 105 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 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 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 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 202 protected GridData getGridDataForField(AbstractPersonDataField field) { 203 return null; 204 } 205 206 protected GridData wrapperGridData; 207 208 215 protected boolean setLayoutDataForWrapper() { 216 return false; 217 } 218 222 protected GridData getWrapperGridData() { 223 return wrapperGridData; 224 } 225 226 public void disposeControl() { 227 for (Iterator 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 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 ("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.verticalSpacing = 0; 288 layout.marginHeight = 0; 289 layout.marginWidth = 0; 290 layout.horizontalSpacing = 3; 291 layout.numColumns = 3; 293 editorComposite.setLayout(layout); 294 editorComposite.addSelectionChangeListener(editorCompositeListener); 295 } 296 if (refresh) 297 refreshControl(); 298 299 return editorWrapper; 300 } 301 302 310 public SelectableComposite getComposite(Composite parent, PersonDataBlockEditorChangedListener changeListener, boolean refresh) { 311 return (SelectableComposite)createControl(parent,refresh); 312 } 313 314 319 private Map fieldEditors = new HashMap (); 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 336 public void refreshControl() { 337 Display.getDefault().syncExec( 338 new Runnable () { 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 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.pack(); 394 } 395 } 396 ); 397 } 398 399 400 401 404 public void updatePerson() { 405 for (Iterator iter = fieldEditors.values().iterator(); iter.hasNext();) { 406 PersonDataFieldEditor editor = (PersonDataFieldEditor) iter.next(); 407 editor.updatePerson(); 408 } 409 } 410 } 411 | Popular Tags |