| /******************************************************************************* |
| * Copyright (c) 2004, 2012 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.bugs.wizards; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.ToolBarManager; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.resource.ImageRegistry; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.viewers.IOpenListener; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.OpenEvent; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerSorter; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jface.wizard.WizardDialog; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.mylyn.commons.ui.CommonImages; |
| import org.eclipse.mylyn.commons.ui.ControlListItem; |
| import org.eclipse.mylyn.commons.ui.ControlListViewer; |
| import org.eclipse.mylyn.commons.ui.GradientCanvas; |
| import org.eclipse.mylyn.commons.ui.compatibility.CommonThemes; |
| import org.eclipse.mylyn.commons.workbench.browser.BrowserUtil; |
| import org.eclipse.mylyn.internal.tasks.bugs.AbstractSupportElement; |
| import org.eclipse.mylyn.internal.tasks.bugs.SupportCategory; |
| import org.eclipse.mylyn.internal.tasks.bugs.SupportProduct; |
| import org.eclipse.mylyn.internal.tasks.bugs.SupportProvider; |
| import org.eclipse.mylyn.tasks.bugs.IProvider; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.layout.FormAttachment; |
| import org.eclipse.swt.layout.FormData; |
| import org.eclipse.swt.layout.FormLayout; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.ToolBar; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.browser.IWorkbenchBrowserSupport; |
| import org.eclipse.ui.themes.IThemeManager; |
| |
| /** |
| * @author Steffen Pingel |
| */ |
| public class SelectSupportElementPage extends WizardPage { |
| |
| private class SupportElementItem extends ControlListItem { |
| |
| private static final int ICON_GAP = 10; |
| |
| private ToolBar toolBar; |
| |
| private Label titleLabel; |
| |
| private Label iconLabel; |
| |
| private Label descriptionLabel; |
| |
| private ToolBarManager toolBarManager; |
| |
| private boolean gradientBackground; |
| |
| private GradientCanvas canvas; |
| |
| public SupportElementItem(Composite parent, int style, Object element) { |
| super(parent, style, element); |
| registerChild(titleLabel); |
| registerChild(iconLabel); |
| registerChild(descriptionLabel); |
| registerChild(toolBar); |
| } |
| |
| public void setGradientBackground(boolean gradientBackground) { |
| this.gradientBackground = gradientBackground; |
| |
| if (gradientBackground) { |
| IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager(); |
| Color colorCategoryGradientStart = themeManager.getCurrentTheme() |
| .getColorRegistry() |
| .get(CommonThemes.COLOR_CATEGORY_GRADIENT_START); |
| Color colorCategoryGradientEnd = themeManager.getCurrentTheme() |
| .getColorRegistry() |
| .get(CommonThemes.COLOR_CATEGORY_GRADIENT_END); |
| |
| canvas.setSeparatorVisible(true); |
| canvas.setSeparatorAlignment(SWT.TOP); |
| canvas.setBackgroundGradient(new Color[] { colorCategoryGradientStart, colorCategoryGradientEnd }, |
| new int[] { 100 }, true); |
| canvas.putColor(GradientCanvas.H_BOTTOM_KEYLINE1, colorCategoryGradientStart); |
| canvas.putColor(GradientCanvas.H_BOTTOM_KEYLINE2, colorCategoryGradientEnd); |
| |
| } |
| } |
| |
| public boolean isGradientBackground() { |
| return gradientBackground; |
| } |
| |
| @Override |
| protected void createContent() { |
| setLayout(new FillLayout()); |
| |
| canvas = new GradientCanvas(this, SWT.NONE); |
| |
| FormLayout layout = new FormLayout(); |
| layout.marginHeight = 3; |
| layout.marginWidth = 3; |
| canvas.setLayout(layout); |
| |
| iconLabel = new Label(canvas, SWT.NONE); |
| FormData fd = new FormData(); |
| fd.left = new FormAttachment(0); |
| iconLabel.setLayoutData(fd); |
| |
| titleLabel = new Label(canvas, SWT.NONE); |
| titleLabel.setFont(JFaceResources.getBannerFont()); |
| fd = new FormData(); |
| fd.left = new FormAttachment(iconLabel, ICON_GAP); |
| titleLabel.setLayoutData(fd); |
| |
| descriptionLabel = new Label(canvas, SWT.WRAP); |
| |
| toolBarManager = new ToolBarManager(SWT.FLAT); |
| toolBar = toolBarManager.createControl(canvas); |
| |
| fd = new FormData(); |
| fd.top = new FormAttachment(titleLabel, 5); |
| fd.left = new FormAttachment(iconLabel, 10); |
| fd.right = new FormAttachment(toolBar, -5); |
| descriptionLabel.setLayoutData(fd); |
| |
| fd = new FormData(); |
| fd.right = new FormAttachment(100); |
| toolBar.setLayoutData(fd); |
| |
| refresh(); |
| } |
| |
| @Override |
| public void dispose() { |
| super.dispose(); |
| toolBarManager.dispose(); |
| } |
| |
| @Override |
| public void setBackground(Color color) { |
| if (isGradientBackground()) { |
| return; |
| } |
| super.setBackground(color); |
| } |
| |
| @Override |
| public void setForeground(Color color) { |
| if (isGradientBackground()) { |
| // ignore |
| return; |
| } |
| super.setForeground(color); |
| if (isSelected()) { |
| titleLabel.setForeground(color); |
| descriptionLabel.setForeground(color); |
| } else { |
| titleLabel.setForeground(color); |
| descriptionLabel.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY)); |
| } |
| } |
| |
| @Override |
| protected void refresh() { |
| AbstractSupportElement data = (AbstractSupportElement) getData(); |
| Image image = getImage(data); |
| if (image == null) { |
| // left align with column |
| ((FormData) titleLabel.getLayoutData()).left = new FormAttachment(0); |
| ((FormData) descriptionLabel.getLayoutData()).left = new FormAttachment(0); |
| } else { |
| // leave space between icon and text |
| ((FormData) titleLabel.getLayoutData()).left = new FormAttachment(iconLabel, ICON_GAP); |
| ((FormData) descriptionLabel.getLayoutData()).left = new FormAttachment(iconLabel, ICON_GAP); |
| } |
| iconLabel.setImage(image); |
| titleLabel.setText(data.getName()); |
| descriptionLabel.setText((data.getDescription() != null) ? data.getDescription() : ""); //$NON-NLS-1$ |
| |
| toolBarManager.removeAll(); |
| final String url = data.getUrl(); |
| if (url != null) { |
| Action action = new Action() { |
| @Override |
| public void run() { |
| BrowserUtil.openUrl(url, IWorkbenchBrowserSupport.AS_EXTERNAL); |
| } |
| }; |
| action.setImageDescriptor(CommonImages.INFORMATION); |
| toolBarManager.add(action); |
| } |
| toolBarManager.update(false); |
| } |
| |
| @Override |
| public void setHot(boolean hot) { |
| super.setHot(hot); |
| updateToolBar(); |
| } |
| |
| @Override |
| public void setSelected(boolean select) { |
| super.setSelected(select); |
| updateToolBar(); |
| canvas.redraw(); |
| } |
| |
| private void updateToolBar() { |
| if (toolBar != null) { |
| toolBar.setVisible(isHot() || isSelected()); |
| } |
| } |
| |
| } |
| |
| public class SupportElementViewer extends ControlListViewer { |
| |
| public SupportElementViewer(Composite parent, int style) { |
| super(parent, style); |
| // ignore |
| } |
| |
| @Override |
| protected ControlListItem doCreateItem(Composite parent, Object element) { |
| if (element instanceof SupportCategory) { |
| SupportElementItem item = new SupportElementItem(parent, SWT.NONE, element); |
| item.setGradientBackground(true); |
| return item; |
| } |
| return new SupportElementItem(parent, SWT.NONE, element); |
| } |
| |
| @Override |
| protected void doCreateNoEntryArea(Composite parent) { |
| parent.setLayout(new FillLayout()); |
| |
| Label label = new Label(parent, SWT.WRAP); |
| label.setText(Messages.SelectSupportElementPage_No_support_providers_Error0); |
| } |
| |
| } |
| |
| private static final int TABLE_HEIGHT = 200; |
| |
| private AbstractSupportElement selectedElement; |
| |
| private ImageRegistry imageRegistry; |
| |
| private final IStructuredContentProvider contentProvider; |
| |
| private Object input; |
| |
| public SelectSupportElementPage(String pageName, IStructuredContentProvider contentProvider) { |
| super(pageName); |
| this.contentProvider = contentProvider; |
| } |
| |
| public Image getImage(AbstractSupportElement data) { |
| if (imageRegistry == null) { |
| imageRegistry = new ImageRegistry(getShell().getDisplay()); |
| } |
| Image image = imageRegistry.get(data.getId()); |
| if (image == null && data.getIcon() != null) { |
| imageRegistry.put(data.getId(), data.getIcon()); |
| image = imageRegistry.get(data.getId()); |
| } |
| return image; |
| } |
| |
| public void setInput(Object input) { |
| this.input = input; |
| |
| if (input instanceof IProvider) { |
| setTitle(Messages.SelectSupportElementPage_Supported_Product_Title); |
| setMessage(Messages.SelectSupportElementPage_Support_Product_Description); |
| } else { |
| setTitle(Messages.SelectSupportElementPage_Support_Provider_Title); |
| setMessage(Messages.SelectSupportElementPage_Support_Provider_Description); |
| } |
| } |
| |
| public void createControl(Composite parent) { |
| Composite container = new Composite(parent, SWT.NULL); |
| GridLayout layout = new GridLayout(1, true); |
| container.setLayout(layout); |
| |
| ControlListViewer viewer = new SupportElementViewer(container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL); |
| GridDataFactory.fillDefaults().grab(true, true).hint(500, TABLE_HEIGHT).applyTo(viewer.getControl()); |
| viewer.setContentProvider(contentProvider); |
| viewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); |
| Object object = selection.getFirstElement(); |
| if (object instanceof AbstractSupportElement) { |
| selectedElement = (AbstractSupportElement) object; |
| } else { |
| selectedElement = null; |
| } |
| updatePageStatus(); |
| } |
| }); |
| viewer.addOpenListener(new IOpenListener() { |
| public void open(OpenEvent event) { |
| if (getWizard().canFinish()) { |
| if (getWizard().performFinish()) { |
| ((WizardDialog) getContainer()).close(); |
| } |
| } else { |
| IWizardPage nextPage = getNextPage(); |
| if (nextPage != null) { |
| ((WizardDialog) getContainer()).showPage(nextPage); |
| } |
| } |
| } |
| }); |
| viewer.setSorter(new ViewerSorter() { |
| @SuppressWarnings("unchecked") |
| @Override |
| public int compare(Viewer viewer, Object o1, Object o2) { |
| int cat1 = category(o1); |
| int cat2 = category(o2); |
| if (cat1 != cat2) { |
| return cat1 - cat2; |
| } |
| if (o1 instanceof AbstractSupportElement && o2 instanceof AbstractSupportElement) { |
| return getComparator().compare(((AbstractSupportElement) o1).getName(), |
| ((AbstractSupportElement) o2).getName()); |
| } |
| return super.compare(viewer, o1, o2); |
| } |
| |
| @Override |
| public int category(Object element) { |
| if (element instanceof SupportCategory) { |
| return ((SupportCategory) element).getWeight() * 2; |
| } else if (element instanceof SupportProvider) { |
| if (((SupportProvider) element).getCategory() != null) { |
| return ((SupportProvider) element).getCategory().getWeight() * 2 + 1; |
| } |
| } |
| return super.category(element); |
| } |
| }); |
| viewer.setInput(input); |
| |
| Object[] elements = contentProvider.getElements(input); |
| if (elements.length == 1) { |
| viewer.setSelection(new StructuredSelection(elements[0])); |
| } else { |
| setPageComplete(false); |
| } |
| |
| setControl(container); |
| Dialog.applyDialogFont(container); |
| } |
| |
| @Override |
| public void dispose() { |
| if (imageRegistry != null) { |
| imageRegistry.dispose(); |
| } |
| super.dispose(); |
| } |
| |
| public AbstractSupportElement getSelectedElement() { |
| return selectedElement; |
| } |
| |
| private void updatePageStatus() { |
| if (selectedElement instanceof SupportProvider) { |
| if (contentProvider.getElements(selectedElement).length > 0) { |
| setErrorMessage(null); |
| setPageComplete(true); |
| } else { |
| setErrorMessage(Messages.SelectSupportElementPage_No_products_Message); |
| setPageComplete(false); |
| } |
| } else if (selectedElement instanceof SupportProduct) { |
| setErrorMessage(null); |
| setPageComplete(true); |
| } else { |
| setErrorMessage(null); |
| setPageComplete(false); |
| } |
| } |
| |
| @Override |
| public IWizardPage getNextPage() { |
| if (selectedElement instanceof SupportProvider) { |
| SelectSupportElementPage page = new SelectSupportElementPage(selectedElement.getId(), contentProvider); |
| page.setInput(selectedElement); |
| page.setWizard(getWizard()); |
| return page; |
| } |
| return super.getNextPage(); |
| } |
| } |