blob: a16a51cd9c41abdbcc429c3c05a07a1ce9947f24 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.ByteArrayInputStream;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.eclipse.mylyn.commons.identity.core.Account;
import org.eclipse.mylyn.commons.identity.core.IIdentity;
import org.eclipse.mylyn.commons.identity.core.IIdentityService;
import org.eclipse.mylyn.commons.identity.core.IProfileImage;
import org.eclipse.mylyn.commons.identity.core.spi.ProfileImage;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Steffen Pingel
*/
public class UserAttributeEditor extends AbstractAttributeEditor {
private int imageSize = 48;
private Label label;
private IIdentity identity;
private final PropertyChangeListener imageListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals("image")) { //$NON-NLS-1$
final ProfileImage profileImage = (ProfileImage) event.getNewValue();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (!label.isDisposed()) {
updateImage(profileImage);
}
}
});
}
}
};
private Image image;
public UserAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
super(manager, taskAttribute);
setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
}
public UserAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute, int imageSize) {
this(manager, taskAttribute);
this.imageSize = imageSize;
}
protected Image updateImage(IProfileImage profileImage) {
if (image != null) {
image.dispose();
}
ImageData data;
if (profileImage != null) {
data = new ImageData(new ByteArrayInputStream(profileImage.getData()));
} else {
data = CommonImages.PERSON_LARGE.getImageData();
}
if (data.width != imageSize || data.height != imageSize) {
data = data.scaledTo(imageSize, imageSize);
}
image = new Image(label.getDisplay(), data);
label.setImage(image);
return image;
}
@Override
public void createControl(Composite parent, FormToolkit toolkit) {
label = new Label(parent, SWT.NONE);
label.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
label.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (image != null) {
image.dispose();
}
if (identity != null) {
identity.removePropertyChangeListener(imageListener);
}
}
});
refresh();
toolkit.adapt(label, false, false);
setControl(label);
}
public Image getValue() {
return image;
}
@Override
protected boolean shouldAutoRefresh() {
// do not auto refresh to avoid picking up partially entered accounts
return false;
}
@Override
public void refresh() {
if (label.isDisposed()) {
return;
}
if (identity != null) {
identity.removePropertyChangeListener(imageListener);
}
if (TaskAttribute.TYPE_PERSON.equals(getTaskAttribute().getMetaData().getType())) {
IRepositoryPerson person = getTaskAttribute().getTaskData()
.getAttributeMapper()
.getRepositoryPerson(getTaskAttribute());
label.setToolTipText(getLabel() + " " + person.toString()); //$NON-NLS-1$
} else {
label.setToolTipText(getDescription());
}
Account account = TasksUiInternal.getAccount(getTaskAttribute());
IIdentityService identityService = TasksUiPlugin.getDefault().getIdentityService();
if (identityService != null) {
identity = identityService.getIdentity(account);
identity.addPropertyChangeListener(imageListener);
Future<IProfileImage> result = identity.requestImage(imageSize, imageSize);
if (result.isDone()) {
try {
updateImage(result.get(0, TimeUnit.SECONDS));
} catch (Exception e) {
// the event listener will eventually update the image
updateImage(null);
}
} else {
updateImage(null);
}
}
}
}