| /******************************************************************************* |
| * Copyright (c) 2010 Frank Becker and others. |
| * 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: |
| * Frank Becker - initial API and implementation |
| * Tasktop Technologies - improvements |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.bugzilla.ui.wizard; |
| |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.text.MessageFormat; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.layout.GridLayoutFactory; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute; |
| import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttribute; |
| import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; |
| import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.forms.events.ExpansionAdapter; |
| import org.eclipse.ui.forms.events.ExpansionEvent; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| |
| /** |
| * @author Frank Becker |
| * @author Steffen Pingel |
| */ |
| public class BugzillaAttachmentWizardPage extends WizardPage { |
| |
| private static final String PAGE_NAME = "AttachmentDetailPage"; //$NON-NLS-1$ |
| |
| private static final String DIALOG_SETTING_RUN_IN_BACKGROUND = "run-in-background"; //$NON-NLS-1$ |
| |
| private static final String DIALOG_SETTING_ADVANCED_EXPANDED = "advanced-expanded"; //$NON-NLS-1$ |
| |
| private final AttributeEditorFactory factory; |
| |
| private final TaskAttribute attachmentAttribute; |
| |
| private FormToolkit toolkit; |
| |
| private static final int LABEL_WIDTH = 120; |
| |
| private static final int COLUMN_GAP = 5; |
| |
| private static final int MULTI_ROW_HEIGHT = 55; |
| |
| private static final int COLUMN_WIDTH = 100; |
| |
| private static final int MULTI_COLUMN_WIDTH = COLUMN_WIDTH + 5 + COLUMN_GAP + LABEL_WIDTH + 5 + COLUMN_WIDTH; |
| |
| private AbstractAttributeEditor commentEditor; |
| |
| private ExpandableComposite advancedExpandComposite; |
| |
| private Button runInBackgroundButton; |
| |
| private int currentColumn = 1; |
| |
| private final int columnCount = 4; |
| |
| private final String repositoryLabel; |
| |
| private boolean advancesExpanded; |
| |
| public BugzillaAttachmentWizardPage(Shell parentShell, AttributeEditorFactory factory, String taskID, |
| TaskAttribute attachmentAttribute, String repositoryLabel) { |
| super(PAGE_NAME); |
| setTitle(Messages.BugzillaAttachmentWizardPage_Titel); |
| this.repositoryLabel = repositoryLabel; |
| this.attachmentAttribute = attachmentAttribute; |
| setDescription(MessageFormat.format(Messages.BugzillaAttachmentWizardPage_Description, |
| attachmentAttribute.getValue(), taskID, repositoryLabel)); |
| setImageDescriptor(createImageDescriptor()); |
| this.factory = factory; |
| } |
| |
| private static ImageDescriptor createImageDescriptor() { |
| return ImageDescriptor.createFromURL(makeIconFileURL()); |
| } |
| |
| private static URL makeIconFileURL() { |
| URL baseURL = BugzillaUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$ |
| if (baseURL == null) { |
| return null; |
| } |
| try { |
| return new URL(baseURL, "wizban/banner-attachment-update.gif"); //$NON-NLS-1$ |
| } catch (MalformedURLException e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public void createControl(Composite parent) { |
| toolkit = new FormToolkit(parent.getDisplay()); |
| final Composite pageArea = new Composite(parent, SWT.NONE); |
| pageArea.setBackground(parent.getBackground()); |
| pageArea.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND)); |
| pageArea.setLayout(new GridLayout(columnCount, false)); |
| |
| createAttributeEditors(pageArea); |
| createAdvancedSection(pageArea); |
| |
| createCommentEditor(pageArea); |
| |
| // border for comment area |
| toolkit.paintBordersFor(pageArea); |
| |
| runInBackgroundButton = new Button(pageArea, SWT.CHECK); |
| GridDataFactory.fillDefaults().indent(0, 10).span(4, 1).applyTo(runInBackgroundButton); |
| runInBackgroundButton.setText(Messages.BugzillaAttachmentWizardPage_RunInBackground); |
| |
| setControl(pageArea); |
| Dialog.applyDialogFont(pageArea); |
| IDialogSettings settings = BugzillaUiPlugin.getDefault().getDialogSettings(); |
| IDialogSettings attachmentsSettings = settings.getSection(BugzillaUiPlugin.ATTACHMENT_WIZARD_SETTINGS_SECTION |
| + repositoryLabel); |
| advancesExpanded = false; |
| if (attachmentsSettings != null) { |
| runInBackgroundButton.setSelection(attachmentsSettings.getBoolean(DIALOG_SETTING_RUN_IN_BACKGROUND)); |
| try { |
| advancesExpanded = attachmentsSettings.getBoolean(DIALOG_SETTING_ADVANCED_EXPANDED); |
| } catch (Exception e) { |
| // ignore |
| } |
| |
| } |
| if (advancedExpandComposite != null) { |
| advancedExpandComposite.setExpanded(advancesExpanded); |
| } |
| } |
| |
| private void createAttributeEditor(TaskAttribute attribute, Composite attributeArea) { |
| String type = attribute.getMetaData().getType(); |
| if (type != null) { |
| AbstractAttributeEditor editor = factory.createEditor(type, attribute); |
| if (attribute.getId().equals(BugzillaAttribute.TOKEN.getKey()) |
| || attribute.getId().equals("size") || attribute.getId().equals(TaskAttribute.ATTACHMENT_URL)) { //$NON-NLS-1$ |
| editor.setReadOnly(true); |
| } else { |
| editor.setReadOnly(false); |
| } |
| if (editor.hasLabel() |
| && (!TaskAttribute.ATTACHMENT_IS_PATCH.equals(attribute.getId()) && !TaskAttribute.ATTACHMENT_IS_DEPRECATED.equals(attribute.getId()))) { |
| editor.createLabelControl(attributeArea, toolkit); |
| Label label = editor.getLabelControl(); |
| label.setBackground(attributeArea.getBackground()); |
| label.setForeground(attributeArea.getForeground()); |
| |
| String labelString = editor.getLabel(); |
| if (labelString != null && !labelString.equals("")) { //$NON-NLS-1$ |
| GridData gd = GridDataFactory.fillDefaults() |
| .align(SWT.RIGHT, SWT.CENTER) |
| .hint(LABEL_WIDTH, SWT.DEFAULT) |
| .create(); |
| if (currentColumn > 1) { |
| gd.horizontalIndent = COLUMN_GAP; |
| gd.widthHint = LABEL_WIDTH + COLUMN_GAP; |
| } |
| label.setLayoutData(gd); |
| currentColumn++; |
| } |
| } |
| editor.createControl(attributeArea, toolkit); |
| |
| // avoid borders for read-only fields |
| editor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE); |
| |
| GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false); |
| if (BugzillaAttribute.CTYPE.getKey().equals(attribute.getId())) { |
| gd.horizontalSpan = 1; |
| gd.widthHint = LABEL_WIDTH; |
| gd.grabExcessHorizontalSpace = true; |
| } else if (TaskAttribute.ATTACHMENT_IS_PATCH.equals(attribute.getId()) |
| || TaskAttribute.ATTACHMENT_IS_DEPRECATED.equals(attribute.getId())) { |
| gd.horizontalSpan = 1; |
| } else if (TaskAttribute.ATTACHMENT_CONTENT_TYPE.equals(attribute.getId())) { |
| gd.horizontalSpan = 2; |
| } else if (type.equals(TaskAttribute.TYPE_BOOLEAN) || type.equals(TaskAttribute.TYPE_SHORT_TEXT)) { |
| gd.horizontalSpan = 3; |
| } else if (type.equals(TaskAttribute.TYPE_URL)) { |
| gd.horizontalSpan = 3; |
| gd.grabExcessHorizontalSpace = true; |
| } else { |
| gd.horizontalSpan = 1; |
| } |
| editor.getControl().setLayoutData(gd); |
| editor.getControl().setBackground(attributeArea.getBackground()); |
| editor.getControl().setForeground(attributeArea.getForeground()); |
| currentColumn += gd.horizontalSpan; |
| currentColumn %= columnCount; |
| } |
| } |
| |
| private void createAttributeEditors(Composite attributeArea) { |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_DESCRIPTION), |
| attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_FILENAME), attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_SIZE), attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_CONTENT_TYPE), |
| attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_PATCH), attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED), |
| attributeArea); |
| createAttributeEditor(attachmentAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_URL), attributeArea); |
| } |
| |
| private void createCommentEditor(Composite attributeArea) { |
| TaskAttribute commentAttribute = attachmentAttribute.getAttribute("comment"); //$NON-NLS-1$ |
| if (commentAttribute == null) { |
| return; |
| } |
| String type = commentAttribute.getMetaData().getType(); |
| if (type != null) { |
| commentEditor = factory.createEditor(type, commentAttribute); |
| String labelString = commentEditor.getLabel(); |
| if (commentEditor.hasLabel()) { |
| commentEditor.createLabelControl(attributeArea, toolkit); |
| if (commentEditor.getLabelControl() != null) { |
| Label label = commentEditor.getLabelControl(); |
| label.setBackground(attributeArea.getBackground()); |
| label.setForeground(attributeArea.getForeground()); |
| GridDataFactory.fillDefaults() |
| .indent(0, 10) |
| .align(SWT.RIGHT, SWT.TOP) |
| .hint(LABEL_WIDTH, SWT.DEFAULT) |
| .applyTo(label); |
| } |
| } |
| commentEditor.createControl(attributeArea, toolkit); |
| commentEditor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); |
| GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); |
| gd.heightHint = MULTI_ROW_HEIGHT; |
| gd.widthHint = MULTI_COLUMN_WIDTH; |
| gd.horizontalSpan = (commentEditor.getLabelControl() != null) ? 3 : 4; |
| gd.verticalIndent = 10; |
| commentEditor.getControl().setLayoutData(gd); |
| commentEditor.getControl().setForeground(attributeArea.getForeground()); |
| } |
| } |
| |
| private void createAdvancedSection(final Composite container) { |
| boolean flagFound = false; |
| for (TaskAttribute attribute : attachmentAttribute.getAttributes().values()) { |
| if (!attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$ |
| continue; |
| } |
| flagFound = true; |
| break; |
| } |
| if (!flagFound) { |
| return; |
| } |
| advancedExpandComposite = toolkit.createExpandableComposite(container, ExpandableComposite.COMPACT |
| | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| advancedExpandComposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT)); |
| advancedExpandComposite.setBackground(container.getBackground()); |
| advancedExpandComposite.setText(Messages.BugzillaAttachmentWizardPage_Advanced); |
| advancedExpandComposite.setLayout(new GridLayout(4, false)); |
| GridDataFactory.fillDefaults() |
| .indent(-6, 0) |
| .grab(true, false) |
| .span(4, SWT.DEFAULT) |
| .applyTo(advancedExpandComposite); |
| |
| advancedExpandComposite.addExpansionListener(new ExpansionAdapter() { |
| @Override |
| public void expansionStateChanged(ExpansionEvent e) { |
| container.layout(); |
| container.redraw(); |
| } |
| }); |
| Composite advancedBodyComposite = new Composite(advancedExpandComposite, SWT.NONE); |
| GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(2).applyTo(advancedBodyComposite); |
| advancedBodyComposite.setBackground(container.getBackground()); |
| createFlagEditors(2, advancedBodyComposite); |
| advancedExpandComposite.setClient(advancedBodyComposite); |
| } |
| |
| private void createFlagEditors(int columnCount, Composite flagBodyComposite) { |
| int currentFlagColumn = 1; |
| |
| for (TaskAttribute attribute : attachmentAttribute.getAttributes().values()) { |
| if (!attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$ |
| continue; |
| } |
| String type = attribute.getMetaData().getType(); |
| if (type != null) { |
| AbstractAttributeEditor editor = factory.createEditor(type, attribute); |
| |
| if (editor.hasLabel()) { |
| editor.createLabelControl(flagBodyComposite, toolkit); |
| Label label = editor.getLabelControl(); |
| label.setBackground(flagBodyComposite.getBackground()); |
| label.setForeground(flagBodyComposite.getForeground()); |
| |
| GridData gd = GridDataFactory.fillDefaults() |
| .align(SWT.RIGHT, SWT.CENTER) |
| .hint(LABEL_WIDTH - (4 * COLUMN_GAP), SWT.DEFAULT) |
| .create(); |
| if (currentFlagColumn > 1) { |
| gd.horizontalIndent = COLUMN_GAP; |
| gd.widthHint = LABEL_WIDTH + COLUMN_GAP; |
| } else { |
| gd.horizontalIndent = COLUMN_GAP * 3; |
| } |
| label.setLayoutData(gd); |
| currentFlagColumn++; |
| } |
| editor.createControl(flagBodyComposite, toolkit); |
| GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false); |
| gd.widthHint = MULTI_COLUMN_WIDTH;//COLUMN_WIDTH; |
| editor.getControl().setLayoutData(gd); |
| currentFlagColumn += gd.horizontalSpan; |
| currentFlagColumn %= columnCount; |
| editor.getControl().setBackground(flagBodyComposite.getBackground()); |
| editor.getControl().setForeground(flagBodyComposite.getForeground()); |
| } |
| } |
| } |
| |
| @Override |
| public void dispose() { |
| IDialogSettings settings = BugzillaUiPlugin.getDefault().getDialogSettings(); |
| IDialogSettings attachmentsSettings = settings.getSection(BugzillaUiPlugin.ATTACHMENT_WIZARD_SETTINGS_SECTION |
| + repositoryLabel); |
| if (attachmentsSettings == null) { |
| attachmentsSettings = settings.addNewSection(BugzillaUiPlugin.ATTACHMENT_WIZARD_SETTINGS_SECTION |
| + repositoryLabel); |
| } |
| attachmentsSettings.put(DIALOG_SETTING_RUN_IN_BACKGROUND, runInBackgroundButton.getSelection()); |
| if (advancedExpandComposite != null) { |
| attachmentsSettings.put(DIALOG_SETTING_ADVANCED_EXPANDED, advancedExpandComposite.isExpanded()); |
| } else { |
| attachmentsSettings.put(DIALOG_SETTING_ADVANCED_EXPANDED, advancesExpanded); |
| } |
| super.dispose(); |
| } |
| |
| public boolean runInBackground() { |
| return runInBackgroundButton.getSelection(); |
| } |
| |
| } |