| /******************************************************************************* |
| * Copyright (c) 2011 GitHub Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Kevin Sawicki (GitHub Inc.) - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.mylyn.internal.github.ui; |
| |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.layout.GridLayoutFactory; |
| import org.eclipse.mylyn.internal.github.ui.AvatarStore.IAvatarCallback; |
| import org.eclipse.mylyn.tasks.core.IRepositoryPerson; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttribute; |
| 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.Label; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.forms.IFormColors; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| |
| /** |
| * Avatar label displaying an image and label for a avatar url. |
| */ |
| public class AvatarLabel implements IAvatarCallback { |
| |
| /** |
| * AVATAR_SIZE |
| */ |
| public static final int AVATAR_SIZE = 42; |
| |
| private Composite displayArea; |
| private Composite avatarImage; |
| private AvatarStore store; |
| private IRepositoryPerson person; |
| private TaskAttribute attribute; |
| |
| /** |
| * Create avatar label |
| * |
| * @param store |
| * @param person |
| * @param attribute |
| */ |
| public AvatarLabel(AvatarStore store, IRepositoryPerson person, |
| TaskAttribute attribute) { |
| this.store = store; |
| this.person = person; |
| this.attribute = attribute; |
| } |
| |
| /** |
| * Set visible |
| * |
| * @param visible |
| * @return this label |
| */ |
| public AvatarLabel setVisible(boolean visible) { |
| if (!displayArea.isDisposed()) |
| displayArea.setVisible(visible); |
| return this; |
| } |
| |
| /** |
| * Layout label |
| * |
| * @return this label |
| */ |
| public AvatarLabel layout() { |
| if (!displayArea.isDisposed()) |
| displayArea.getParent().getParent().layout(true, true); |
| return this; |
| } |
| |
| /** |
| * Get main composite |
| * |
| * @return composite |
| */ |
| public Composite getControl() { |
| return this.displayArea; |
| } |
| |
| /** |
| * Create label |
| * |
| * @param parent |
| * @param toolkit |
| * @return this label |
| */ |
| public AvatarLabel create(Composite parent, FormToolkit toolkit) { |
| displayArea = new Composite(parent, SWT.NONE); |
| GridLayoutFactory.fillDefaults().margins(2, 2).spacing(1, 1) |
| .applyTo(displayArea); |
| GridDataFactory.fillDefaults().span(1, 2).grab(false, false) |
| .applyTo(displayArea); |
| toolkit.adapt(displayArea, false, false); |
| |
| avatarImage = new Composite(displayArea, SWT.NONE); |
| if (person != null) |
| avatarImage.setToolTipText(person.getPersonId()); |
| |
| GridDataFactory.swtDefaults().grab(false, false) |
| .align(SWT.CENTER, SWT.CENTER).hint(AVATAR_SIZE, AVATAR_SIZE) |
| .applyTo(avatarImage); |
| |
| Label label = toolkit.createLabel(displayArea, attribute.getMetaData() |
| .getLabel()); |
| label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); |
| label.setToolTipText(avatarImage.getToolTipText()); |
| |
| ImageData data = store.getAvatar(attribute.getValue()); |
| if (data != null) |
| setImage(store.getScaledImage(AVATAR_SIZE, data)); |
| else { |
| store.loadAvatar(attribute.getValue(), this); |
| setVisible(false); |
| } |
| |
| return this; |
| } |
| |
| private AvatarLabel setImage(final Image image) { |
| if (!avatarImage.isDisposed()) { |
| avatarImage.setBackgroundImage(image); |
| avatarImage.addDisposeListener(new DisposeListener() { |
| |
| public void widgetDisposed(DisposeEvent e) { |
| image.dispose(); |
| } |
| }); |
| } |
| return this; |
| } |
| |
| /** |
| * @see org.eclipse.mylyn.internal.github.ui.AvatarStore.IAvatarCallback#loaded(org.eclipse.swt.graphics.ImageData, |
| * org.eclipse.mylyn.internal.github.ui.AvatarStore) |
| */ |
| public void loaded(final ImageData data, final AvatarStore store) { |
| PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { |
| |
| public void run() { |
| Image image = store.getScaledImage(AVATAR_SIZE, data); |
| setImage(image).setVisible(true).layout(); |
| } |
| }); |
| } |
| |
| } |