blob: f8914cac858b8d17580383907d7db68152f447f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
* Frank Becker - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.bugzilla.ui.search;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.commons.core.CoreUtil;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCustomField;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
import org.eclipse.mylyn.internal.commons.ui.SectionComposite;
import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.AbstractInPlaceDialog;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.IInPlaceDialogListener;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.InPlaceCheckBoxTreeDialog;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.InPlaceDialogEvent;
import org.eclipse.mylyn.internal.provisional.tasks.ui.wizards.AbstractRepositoryQueryPage2;
import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.progress.IProgressService;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
/**
* Bugzilla search page
*
* @author Mik Kersten (hardening of prototype)
* @author Frank Becker
*/
@SuppressWarnings("restriction")
public class BugzillaSearchPage extends AbstractRepositoryQueryPage2 implements Listener {
private static final int HEIGHT_ATTRIBUTE_COMBO = 30;
private static ArrayList<BugzillaSearchData> previousSummaryPatterns = new ArrayList<BugzillaSearchData>(20);
private static ArrayList<BugzillaSearchData> previousEmailPatterns = new ArrayList<BugzillaSearchData>(20);
private static ArrayList<BugzillaSearchData> previousEmailPatterns2 = new ArrayList<BugzillaSearchData>(20);
private static ArrayList<BugzillaSearchData> previousCommentPatterns = new ArrayList<BugzillaSearchData>(20);
private static ArrayList<BugzillaSearchData> previousKeywords = new ArrayList<BugzillaSearchData>(20);
private static ArrayList<BugzillaSearchData> previousWhiteboardPatterns = new ArrayList<BugzillaSearchData>(20);
private boolean firstTime = true;
private IDialogSettings fDialogSettings;
private static final String[] patternOperationText = { Messages.BugzillaSearchPage_OperationText_allwordssubstr,
Messages.BugzillaSearchPage_OperationText_anywordssubstr,
Messages.BugzillaSearchPage_OperationText_substring,
Messages.BugzillaSearchPage_OperationText_casesubstring,
Messages.BugzillaSearchPage_OperationText_allwords, Messages.BugzillaSearchPage_OperationText_anywords,
Messages.BugzillaSearchPage_OperationText_regexp, Messages.BugzillaSearchPage_OperationText_notregexp };
private static final String[] patternOperationValues = {
"allwordssubstr", "anywordssubstr", "substring", "casesubstring", "allwords", "anywords", "regexp", "notregexp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
private static final String[] emailOperationText = { Messages.BugzillaSearchPage_EmailOperation_substring,
Messages.BugzillaSearchPage_EmailOperation_exact, Messages.BugzillaSearchPage_EmailOperation_notequals,
Messages.BugzillaSearchPage_EmailOperation_regexp, Messages.BugzillaSearchPage_EmailOperation_notregexp };
private static final String[] emailOperationValues = { "substring", "exact", "notequals", "regexp", "notregexp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
private static final String[] keywordOperationText = { Messages.BugzillaSearchPage_all,
Messages.BugzillaSearchPage_any, Messages.BugzillaSearchPage_none };
private static final String[] keywordOperationValues = { "allwords", "anywords", "nowords" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
private static final String[] emailRoleValues = { "emailassigned_to1", "emailreporter1", "emailcc1", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
"emaillongdesc1", "emailqa_contact1" }; //$NON-NLS-1$ //$NON-NLS-2$
private static final String[] emailRoleValues2 = { "emailassigned_to2", "emailreporter2", "emailcc2", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
"emaillongdesc2", "emailqa_contact2" }; //$NON-NLS-1$ //$NON-NLS-2$
private static final ArrayList<String> chartFieldTextDefault = new ArrayList<String>() {
private static final long serialVersionUID = 1974092160992399001L;
{
add(Messages.BugzillaSearchPage_Field_Noop);
add(Messages.BugzillaSearchPage_Field_Alias);
add(Messages.BugzillaSearchPage_Field_AssignedTo);
add(Messages.BugzillaSearchPage_Field_Attachment_creator);
add(Messages.BugzillaSearchPage_Field_Attachment_data);
add(Messages.BugzillaSearchPage_Field_Attachment_description);
add(Messages.BugzillaSearchPage_Field_Attachment_filename);
add(Messages.BugzillaSearchPage_Field_Attachment_is_a_URL);
add(Messages.BugzillaSearchPage_Field_Attachment_is_obsolete);
add(Messages.BugzillaSearchPage_Field_Attachment_is_patch);
add(Messages.BugzillaSearchPage_Field_Attachment_is_private);
add(Messages.BugzillaSearchPage_Field_Attachment_mime_type);
add(Messages.BugzillaSearchPage_Field_Blocks);
add(Messages.BugzillaSearchPage_Field_Bug);
add(Messages.BugzillaSearchPage_Field_CC);
add(Messages.BugzillaSearchPage_Field_CC_Accessible);
add(Messages.BugzillaSearchPage_Field_Classification);
add(Messages.BugzillaSearchPage_Field_Comment);
add(Messages.BugzillaSearchPage_Field_Comment_is_private);
add(Messages.BugzillaSearchPage_Field_Commenter);
add(Messages.BugzillaSearchPage_Field_Component);
add(Messages.BugzillaSearchPage_Field_Content);
add(Messages.BugzillaSearchPage_Field_Creation_date);
add(Messages.BugzillaSearchPage_Field_Days_since_bug_changed);
add(Messages.BugzillaSearchPage_Field_Depends_on);
add(Messages.BugzillaSearchPage_Field_drop_down_custom_field);
add(Messages.BugzillaSearchPage_Field_Ever_Confirmed);
add(Messages.BugzillaSearchPage_Field_Flag);
add(Messages.BugzillaSearchPage_Field_Flag_Requestee);
add(Messages.BugzillaSearchPage_Field_Flag_Setter);
add(Messages.BugzillaSearchPage_Field_free_text_custom_field);
add(Messages.BugzillaSearchPage_Field_Group);
add(Messages.BugzillaSearchPage_Field_Keywords);
add(Messages.BugzillaSearchPage_Field_Last_changed_date);
add(Messages.BugzillaSearchPage_Field_OS_Version);
add(Messages.BugzillaSearchPage_Field_Platform);
add(Messages.BugzillaSearchPage_Field_Priority);
add(Messages.BugzillaSearchPage_Field_Product);
add(Messages.BugzillaSearchPage_Field_QAContact);
add(Messages.BugzillaSearchPage_Field_ReportedBy);
add(Messages.BugzillaSearchPage_Field_Reporter_Accessible);
add(Messages.BugzillaSearchPage_Field_Resolution);
add(Messages.BugzillaSearchPage_Field_Severity);
add(Messages.BugzillaSearchPage_Field_Status);
add(Messages.BugzillaSearchPage_Field_Status_Whiteboard);
add(Messages.BugzillaSearchPage_Field_Summary);
add(Messages.BugzillaSearchPage_Field_Target_Milestone);
add(Messages.BugzillaSearchPage_Field_Time_Since_Assignee_Touched);
add(Messages.BugzillaSearchPage_Field_URL);
add(Messages.BugzillaSearchPage_Field_Version);
add(Messages.BugzillaSearchPage_Field_Votes);
}
};
private static final ArrayList<String> chartFieldValuesDefault = new ArrayList<String>() {
private static final long serialVersionUID = 9135403539678279982L;
{
add("noop"); //$NON-NLS-1$
add("alias"); //$NON-NLS-1$
add("assigned_to"); //$NON-NLS-1$
add("attachments.submitter"); //$NON-NLS-1$
add("attach_data.thedata"); //$NON-NLS-1$
add("attachments.description"); //$NON-NLS-1$
add("attachments.filename"); //$NON-NLS-1$
add("attachments.isurl"); //$NON-NLS-1$
add("attachments.isobsolete"); //$NON-NLS-1$
add("attachments.ispatch"); //$NON-NLS-1$
add("attachments.isprivate"); //$NON-NLS-1$
add("attachments.mimetype"); //$NON-NLS-1$
add("blocked"); //$NON-NLS-1$
add("bug_id"); //$NON-NLS-1$
add("cc"); //$NON-NLS-1$
add("cclist_accessible"); //$NON-NLS-1$
add("classification"); //$NON-NLS-1$
add("longdesc"); //$NON-NLS-1$
add("longdescs.isprivate"); //$NON-NLS-1$
add("commenter"); //$NON-NLS-1$
add("component"); //$NON-NLS-1$
add("content"); //$NON-NLS-1$
add("creation_ts"); //$NON-NLS-1$
add("days_elapsed"); //$NON-NLS-1$
add("dependson"); //$NON-NLS-1$
add("cf_dropdown"); //$NON-NLS-1$
add("everconfirmed"); //$NON-NLS-1$
add("flagtypes.name"); //$NON-NLS-1$
add("requestees.login_name"); //$NON-NLS-1$
add("setters.login_name"); //$NON-NLS-1$
add("cf_freetext"); //$NON-NLS-1$
add("bug_group"); //$NON-NLS-1$
add("keywords"); //$NON-NLS-1$
add("delta_ts"); //$NON-NLS-1$
add("op_sys"); //$NON-NLS-1$
add("rep_platform"); //$NON-NLS-1$
add("priority"); //$NON-NLS-1$
add("product"); //$NON-NLS-1$
add("qa_contact"); //$NON-NLS-1$
add("reporter"); //$NON-NLS-1$
add("reporter_accessible"); //$NON-NLS-1$
add("resolution"); //$NON-NLS-1$
add("bug_severity"); //$NON-NLS-1$
add("bug_status"); //$NON-NLS-1$
add("status_whiteboard"); //$NON-NLS-1$
add("short_desc"); //$NON-NLS-1$
add("target_milestone"); //$NON-NLS-1$
add("owner_idle_time"); //$NON-NLS-1$
add("bug_file_loc"); //$NON-NLS-1$
add("version"); //$NON-NLS-1$
add("votes"); //$NON-NLS-1$
}
};
private static final String[] chartOperationText = { Messages.BugzillaSearchPage_Operation_Noop,
Messages.BugzillaSearchPage_Operation_is_equal_to, Messages.BugzillaSearchPage_Operation_is_not_equal_to,
Messages.BugzillaSearchPage_Operation_is_equal_to_any_of_the_strings,
Messages.BugzillaSearchPage_Operation_contains_the_string,
Messages.BugzillaSearchPage_Operation_contains_the_string_exact_case,
Messages.BugzillaSearchPage_Operation_does_not_contain_the_string,
Messages.BugzillaSearchPage_Operation_contains_any_of_the_strings,
Messages.BugzillaSearchPage_Operation_contains_all_of_the_strings,
Messages.BugzillaSearchPage_Operation_contains_none_of_the_strings,
Messages.BugzillaSearchPage_Operation_contains_regexp,
Messages.BugzillaSearchPage_Operation_does_not_contain_regexp,
Messages.BugzillaSearchPage_Operation_is_less_than, Messages.BugzillaSearchPage_Operation_is_greater_than,
Messages.BugzillaSearchPage_Operation_contains_any_of_he_words,
Messages.BugzillaSearchPage_Operation_contains_all_of_the_words,
Messages.BugzillaSearchPage_Operation_contains_none_of_the_words,
Messages.BugzillaSearchPage_Operation_changed_before, Messages.BugzillaSearchPage_Operation_changed_after,
Messages.BugzillaSearchPage_Operation_changed_from, Messages.BugzillaSearchPage_Operation_changed_to,
Messages.BugzillaSearchPage_Operation_changed_by, Messages.BugzillaSearchPage_Operation_matches };
private static final String[] chartOperationValues = { "noop", "equals", "notequals", "anyexact", "substring", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
"casesubstring", "notsubstring", "anywordssubstr", "allwordssubstr", "nowordssubstr", "regexp", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
"notregexp", "lessthan", "greaterthan", "anywords", "allwords", "nowords", "changedbefore", "changedafter", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
"changedfrom", "changedto", "changedby", "matches" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
private final static String REGEXP_CHART_EXPR = "(field|type|value)([0-9]+)-([0-9]+)-([0-9]+)"; //$NON-NLS-1$
private static final Pattern PATTERN_CHART_EXPR = Pattern.compile(REGEXP_CHART_EXPR, Pattern.CASE_INSENSITIVE);
private final static String REGEXP_CHART_NEGATE = "(negate)([0-9]+)"; //$NON-NLS-1$
private static final Pattern PATTERN_CHART_NEGATE = Pattern.compile(REGEXP_CHART_NEGATE, Pattern.CASE_INSENSITIVE);
private IRepositoryQuery originalQuery = null;
protected boolean restoring = false;
private boolean restoreQueryOptions = true;
protected Combo summaryPattern;
protected Combo summaryOperation;
protected List product;
protected List os;
protected List hardware;
protected List priority;
protected List severity;
protected List resolution;
protected List status;
protected Combo commentOperation;
protected Combo commentPattern;
protected List component;
protected List version;
protected List target;
protected Combo emailOperation;
protected Combo emailOperation2;
protected Combo emailPattern;
protected Combo emailPattern2;
protected Button[] emailButtons;
protected Button[] emailButtons2;
private Combo keywords;
private Combo keywordsOperation;
protected Combo whiteboardPattern;
private Combo whiteboardOperation;
protected Text daysText;
protected String[] chartFieldText;
protected String[] chartFieldValues;
// /** File containing saved queries */
// protected static SavedQueryFile input;
// /** "Remember query" button */
// protected Button saveButton;
// /** "Saved queries..." button */
// protected Button loadButton;
// /** Run a remembered query */
// protected boolean rememberedQuery = false;
/** Index of the saved query to run */
protected int selIndex;
// --------------- Configuration handling --------------
// Dialog store taskId constants
protected final static String PAGE_NAME = "BugzillaSearchPage"; //$NON-NLS-1$
private static final String STORE_PRODUCT_ID = PAGE_NAME + ".PRODUCT"; //$NON-NLS-1$
private static final String STORE_COMPONENT_ID = PAGE_NAME + ".COMPONENT"; //$NON-NLS-1$
private static final String STORE_VERSION_ID = PAGE_NAME + ".VERSION"; //$NON-NLS-1$
private static final String STORE_MSTONE_ID = PAGE_NAME + ".MILESTONE"; //$NON-NLS-1$
private static final String STORE_STATUS_ID = PAGE_NAME + ".STATUS"; //$NON-NLS-1$
private static final String STORE_RESOLUTION_ID = PAGE_NAME + ".RESOLUTION"; //$NON-NLS-1$
private static final String STORE_SEVERITY_ID = PAGE_NAME + ".SEVERITY"; //$NON-NLS-1$
private static final String STORE_PRIORITY_ID = PAGE_NAME + ".PRIORITY"; //$NON-NLS-1$
private static final String STORE_HARDWARE_ID = PAGE_NAME + ".HARDWARE"; //$NON-NLS-1$
private static final String STORE_OS_ID = PAGE_NAME + ".OS"; //$NON-NLS-1$
private static final String STORE_SUMMARYMATCH_ID = PAGE_NAME + ".SUMMARYMATCH"; //$NON-NLS-1$
private static final String STORE_COMMENTMATCH_ID = PAGE_NAME + ".COMMENTMATCH"; //$NON-NLS-1$
private static final String STORE_EMAILMATCH_ID = PAGE_NAME + ".EMAILMATCH"; //$NON-NLS-1$
private static final String STORE_EMAIL2MATCH_ID = PAGE_NAME + ".EMAIL2MATCH"; //$NON-NLS-1$
private static final String STORE_EMAILBUTTON_ID = PAGE_NAME + ".EMAILATTR"; //$NON-NLS-1$
private static final String STORE_EMAIL2BUTTON_ID = PAGE_NAME + ".EMAIL2ATTR"; //$NON-NLS-1$
private static final String STORE_SUMMARYTEXT_ID = PAGE_NAME + ".SUMMARYTEXT"; //$NON-NLS-1$
private static final String STORE_COMMENTTEXT_ID = PAGE_NAME + ".COMMENTTEXT"; //$NON-NLS-1$
private static final String STORE_EMAILADDRESS_ID = PAGE_NAME + ".EMAILADDRESS"; //$NON-NLS-1$
private static final String STORE_EMAIL2ADDRESS_ID = PAGE_NAME + ".EMAIL2ADDRESS"; //$NON-NLS-1$
private static final String STORE_KEYWORDS_ID = PAGE_NAME + ".KEYWORDS"; //$NON-NLS-1$
private static final String STORE_KEYWORDSMATCH_ID = PAGE_NAME + ".KEYWORDSMATCH"; //$NON-NLS-1$
private static final String STORE_WHITEBOARD_ID = PAGE_NAME + ".WHITEBOARD"; //$NON-NLS-1$
private static final String STORE_WHITEBOARDMATCH_ID = PAGE_NAME + ".WHITEBOARDMATCH"; //$NON-NLS-1$
private static final String STORE_CHARTS_ID = PAGE_NAME + ".CHARTS"; //$NON-NLS-1$
private RepositoryConfiguration repositoryConfiguration;
private final FormToolkit toolkit;
private ExpandableComposite moreOptionsSection;
private ExpandableComposite chartSection;
private SectionComposite scrolledComposite;
private ArrayList<Chart> charts = new ArrayList<Chart>(1);
private class ChartControls {
private final Combo field;
private final Combo operation;
private final Combo value;
public ChartControls(Combo field, Combo operation, Combo value) {
super();
this.field = field;
this.operation = operation;
this.value = value;
}
public Combo getField() {
return field;
}
public Combo getOperation() {
return operation;
}
public Combo getValue() {
return value;
}
}
private final ArrayList<ArrayList<ArrayList<ChartControls>>> chartControls = new ArrayList<ArrayList<ArrayList<ChartControls>>>();
private final ArrayList<Button> negateButtons = new ArrayList<Button>();
private final SelectionAdapter updateActionSelectionAdapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (isControlCreated()) {
setPageComplete(isPageComplete());
}
}
};
private final class ModifyListenerImplementation implements ModifyListener {
public void modifyText(ModifyEvent e) {
if (isControlCreated()) {
setPageComplete(isPageComplete());
}
}
}
@Override
public void setPageComplete(boolean complete) {
super.setPageComplete(complete);
if (getSearchContainer() != null) {
getSearchContainer().setPerformActionEnabled(complete);
}
}
private static class BugzillaSearchData {
/** Pattern to match on */
String pattern;
/** Pattern matching criterion */
int operation;
BugzillaSearchData(String pattern, int operation) {
this.pattern = pattern;
this.operation = operation;
}
}
@Override
protected void createButtons(Composite control) {
if (originalQuery != null) {
return;
}
super.createButtons(control);
}
@Override
public void clearFields() {
product.deselectAll();
component.deselectAll();
version.deselectAll();
target.deselectAll();
status.deselectAll();
resolution.deselectAll();
severity.deselectAll();
priority.deselectAll();
hardware.deselectAll();
os.deselectAll();
summaryOperation.select(0);
commentOperation.select(0);
emailOperation.select(0);
for (Button emailButton : emailButtons) {
emailButton.setSelection(false);
}
summaryPattern.setText(""); //$NON-NLS-1$
commentPattern.setText(""); //$NON-NLS-1$
emailPattern.setText(""); //$NON-NLS-1$
emailOperation2.select(0);
for (Button element : emailButtons2) {
element.setSelection(false);
}
emailPattern2.setText(""); //$NON-NLS-1$
keywords.setText(""); //$NON-NLS-1$
keywordsOperation.select(0);
whiteboardPattern.setText(""); //$NON-NLS-1$
whiteboardOperation.select(0);
daysText.setText(""); //$NON-NLS-1$
charts.clear();
charts.add(0, new Chart());
recreateChartControls();
}
private void createOptionsGroup(Composite control) {
scrolledComposite = new SectionComposite(control, SWT.NONE);
GridData g = new GridData(GridData.FILL, GridData.FILL, true, true);
scrolledComposite.setLayoutData(g);
Composite scrolledBodyComposite = scrolledComposite.getContent();
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
scrolledBodyComposite.setLayout(layout);
basicCompositeCreate(scrolledBodyComposite);
createMoreOptionsSection(scrolledBodyComposite);
createChartSection(scrolledBodyComposite);
Point p = scrolledBodyComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
scrolledComposite.setMinSize(p);
}
private void basicCompositeCreate(Composite parent) {
final Composite basicComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(4, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
//layout.marginRight = 5;
basicComposite.setLayout(layout);
GridData g = new GridData(GridData.FILL, GridData.FILL, true, true);
g.widthHint = 500;
basicComposite.setLayoutData(g);
Dialog.applyDialogFont(basicComposite);
// Info text
Label labelSummary = new Label(basicComposite, SWT.LEFT);
labelSummary.setText(Messages.BugzillaSearchPage_Summary);
// Pattern combo
summaryPattern = new Combo(basicComposite, SWT.SINGLE | SWT.BORDER);
summaryPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
summaryPattern.addModifyListener(new ModifyListenerImplementation());
summaryPattern.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(summaryPattern, summaryOperation, previousSummaryPatterns);
}
});
summaryOperation = new Combo(basicComposite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
summaryOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
summaryOperation.setItems(patternOperationText);
summaryOperation.setText(patternOperationText[0]);
summaryOperation.select(0);
Label labelEmail = new Label(basicComposite, SWT.LEFT);
labelEmail.setText(Messages.BugzillaSearchPage_Email);
// pattern combo
emailPattern = new Combo(basicComposite, SWT.SINGLE | SWT.BORDER);
emailPattern.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
emailPattern.addModifyListener(new ModifyListenerImplementation());
emailPattern.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(emailPattern, emailOperation, previousEmailPatterns);
}
});
IContentProposalProvider proposalProvider = TasksUi.getUiFactory().createPersonContentProposalProvider(
getTaskRepository());
ILabelProvider proposalLabelProvider = TasksUi.getUiFactory().createPersonContentProposalLabelProvider(
getTaskRepository());
ContentAssistCommandAdapter adapter = new ContentAssistCommandAdapter(emailPattern, new ComboContentAdapter(),
proposalProvider, ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
adapter.setLabelProvider(proposalLabelProvider);
adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
// operation combo
emailOperation = new Combo(basicComposite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
emailOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
emailOperation.setItems(emailOperationText);
emailOperation.setText(emailOperationText[0]);
emailOperation.select(0);
new Label(basicComposite, SWT.NONE);
Composite emailComposite = new Composite(basicComposite, SWT.NONE);
emailComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
GridLayout emailLayout = new GridLayout();
emailLayout.marginWidth = 0;
emailLayout.marginHeight = 0;
emailLayout.horizontalSpacing = 2;
emailLayout.numColumns = 5;
emailComposite.setLayout(emailLayout);
Button button0 = new Button(emailComposite, SWT.CHECK);
button0.setText(Messages.BugzillaSearchPage_owner);
Button button1 = new Button(emailComposite, SWT.CHECK);
button1.setText(Messages.BugzillaSearchPage_reporter);
Button button2 = new Button(emailComposite, SWT.CHECK);
button2.setText(Messages.BugzillaSearchPage_cc);
Button button3 = new Button(emailComposite, SWT.CHECK);
button3.setText(Messages.BugzillaSearchPage_commenter);
Button button4 = new Button(emailComposite, SWT.CHECK);
button4.setText(Messages.BugzillaSearchPage_qacontact);
emailButtons = new Button[] { button0, button1, button2, button3, button4 };
new Label(basicComposite, SWT.NONE);
GridLayout sashFormLayout = new GridLayout();
sashFormLayout.numColumns = 4;
sashFormLayout.marginHeight = 5;
sashFormLayout.marginWidth = 5;
sashFormLayout.horizontalSpacing = 5;
SashForm sashForm = new SashForm(basicComposite, SWT.VERTICAL);
sashForm.setLayout(sashFormLayout);
final GridData gd_sashForm = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1);
gd_sashForm.widthHint = 400;
gd_sashForm.heightHint = 80;
sashForm.setLayoutData(gd_sashForm);
GridLayout topLayout = new GridLayout();
topLayout.numColumns = 4;
SashForm topForm = new SashForm(sashForm, SWT.NONE);
GridData topLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
topLayoutData.widthHint = 00;
topLayoutData.heightHint = 60;
topForm.setLayoutData(topLayoutData);
topForm.setLayout(topLayout);
GridLayout productLayout = new GridLayout();
productLayout.marginWidth = 0;
productLayout.marginHeight = 0;
productLayout.horizontalSpacing = 0;
Composite productComposite = new Composite(topForm, SWT.NONE);
productComposite.setLayout(productLayout);
Label productLabel = new Label(productComposite, SWT.LEFT);
productLabel.setText(Messages.BugzillaSearchPage_Product);
productLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridData productLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
productLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
product = new List(productComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
product.setLayoutData(productLayoutData);
product.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (product.getSelectionIndex() != -1) {
String[] selectedProducts = product.getSelection();
updateAttributesFromConfiguration(selectedProducts);
} else {
updateAttributesFromConfiguration(null);
}
if (restoring) {
restoring = false;
restoreWidgetValues();
}
setPageComplete(isPageComplete());
}
});
GridLayout componentLayout = new GridLayout();
componentLayout.marginWidth = 0;
componentLayout.marginHeight = 0;
componentLayout.horizontalSpacing = 0;
Composite componentComposite = new Composite(topForm, SWT.NONE);
componentComposite.setLayout(componentLayout);
Label componentLabel = new Label(componentComposite, SWT.LEFT);
componentLabel.setText(Messages.BugzillaSearchPage_Component);
componentLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
component = new List(componentComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
GridData componentLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
componentLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
component.setLayoutData(componentLayoutData);
component.addSelectionListener(updateActionSelectionAdapter);
Composite statusComposite = new Composite(topForm, SWT.NONE);
GridLayout statusLayout = new GridLayout();
statusLayout.marginWidth = 0;
statusLayout.horizontalSpacing = 0;
statusLayout.marginHeight = 0;
statusComposite.setLayout(statusLayout);
Label statusLabel = new Label(statusComposite, SWT.LEFT);
statusLabel.setText(Messages.BugzillaSearchPage_Status);
statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
status = new List(statusComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_status = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_status.heightHint = HEIGHT_ATTRIBUTE_COMBO;
status.setLayoutData(gd_status);
status.addSelectionListener(updateActionSelectionAdapter);
Composite severityComposite = new Composite(topForm, SWT.NONE);
GridLayout severityLayout = new GridLayout();
severityLayout.marginWidth = 0;
severityLayout.marginHeight = 0;
severityLayout.horizontalSpacing = 0;
severityComposite.setLayout(severityLayout);
Label severityLabel = new Label(severityComposite, SWT.LEFT);
severityLabel.setText(Messages.BugzillaSearchPage_Severity);
severityLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
severity = new List(severityComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_severity = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_severity.heightHint = HEIGHT_ATTRIBUTE_COMBO;
severity.setLayoutData(gd_severity);
severity.addSelectionListener(updateActionSelectionAdapter);
}
private void createMoreOptionsSection(Composite parent) {
moreOptionsSection = scrolledComposite.createSection(Messages.BugzillaSearchPage_More_Options,
ExpandableComposite.COMPACT | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR, true);
GridData g = new GridData(GridData.FILL, GridData.CENTER, true, false);
g.horizontalSpan = 4;
moreOptionsSection.setLayoutData(g);
Composite moreOptionsComposite = new Composite(moreOptionsSection, SWT.NONE);
GridLayout optionsLayout = new GridLayout(4, false);
optionsLayout.marginHeight = 0;
optionsLayout.marginWidth = 0;
moreOptionsComposite.setLayout(optionsLayout);
moreOptionsSection.setClient(moreOptionsComposite);
createMoreOptionsContent(moreOptionsComposite);
createMoreOptionsChangedInFilter(moreOptionsComposite);
}
private void createChartSection(Composite parent) {
chartFieldText = chartFieldTextDefault.toArray(new String[chartFieldTextDefault.size()]);
chartFieldValues = chartFieldValuesDefault.toArray(new String[chartFieldValuesDefault.size()]);
chartSection = scrolledComposite.createSection(Messages.BugzillaSearchPage_BooleanChart,
ExpandableComposite.COMPACT | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR, false);
GridData g = new GridData(GridData.FILL, GridData.BEGINNING, true, false);
g.horizontalSpan = 4;
chartSection.setLayoutData(g);
charts.add(0, new Chart());
recreateChartControls();
}
private void createMoreOptionsContent(Composite advancedComposite) {
// Info text
Label labelComment = new Label(advancedComposite, SWT.LEFT);
labelComment.setText(Messages.BugzillaSearchPage_Comment);
// Comment pattern combo
commentPattern = new Combo(advancedComposite, SWT.SINGLE | SWT.BORDER);
commentPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
commentPattern.addModifyListener(new ModifyListenerImplementation());
commentPattern.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(commentPattern, commentOperation, previousCommentPatterns);
}
});
commentOperation = new Combo(advancedComposite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
commentOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
commentOperation.setItems(patternOperationText);
commentOperation.setText(patternOperationText[0]);
commentOperation.select(0);
Label labelEmail2 = new Label(advancedComposite, SWT.LEFT);
labelEmail2.setText(Messages.BugzillaSearchPage_Email_2);
// pattern combo
emailPattern2 = new Combo(advancedComposite, SWT.SINGLE | SWT.BORDER);
emailPattern2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
emailPattern2.addModifyListener(new ModifyListenerImplementation());
emailPattern2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(emailPattern2, emailOperation2, previousEmailPatterns2);
}
});
IContentProposalProvider proposalProvider = TasksUi.getUiFactory().createPersonContentProposalProvider(
getTaskRepository());
ILabelProvider proposalLabelProvider = TasksUi.getUiFactory().createPersonContentProposalLabelProvider(
getTaskRepository());
ContentAssistCommandAdapter adapter2 = new ContentAssistCommandAdapter(emailPattern2,
new ComboContentAdapter(), proposalProvider, ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS,
new char[0], true);
adapter2.setLabelProvider(proposalLabelProvider);
adapter2.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
// operation combo
emailOperation2 = new Combo(advancedComposite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
emailOperation2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
emailOperation2.setItems(emailOperationText);
emailOperation2.setText(emailOperationText[0]);
emailOperation2.select(0);
new Label(advancedComposite, SWT.NONE);
Composite emailComposite2 = new Composite(advancedComposite, SWT.NONE);
emailComposite2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
GridLayout emailLayout2 = new GridLayout();
emailLayout2.marginWidth = 0;
emailLayout2.marginHeight = 0;
emailLayout2.horizontalSpacing = 2;
emailLayout2.numColumns = 5;
emailComposite2.setLayout(emailLayout2);
Button e2button0 = new Button(emailComposite2, SWT.CHECK);
e2button0.setText(Messages.BugzillaSearchPage_owner);
Button e2button1 = new Button(emailComposite2, SWT.CHECK);
e2button1.setText(Messages.BugzillaSearchPage_reporter);
Button e2button2 = new Button(emailComposite2, SWT.CHECK);
e2button2.setText(Messages.BugzillaSearchPage_cc);
Button e2button3 = new Button(emailComposite2, SWT.CHECK);
e2button3.setText(Messages.BugzillaSearchPage_commenter);
Button e2button4 = new Button(emailComposite2, SWT.CHECK);
e2button4.setText(Messages.BugzillaSearchPage_qacontact);
emailButtons2 = new Button[] { e2button0, e2button1, e2button2, e2button3, e2button4 };
new Label(advancedComposite, SWT.NONE);
Label whiteboardLabel = new Label(advancedComposite, SWT.NONE);
whiteboardLabel.setText(Messages.BugzillaSearchPage_Whiteboard);
// whiteboard pattern combo
whiteboardPattern = new Combo(advancedComposite, SWT.SINGLE | SWT.BORDER);
whiteboardPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
whiteboardPattern.addModifyListener(new ModifyListenerImplementation());
whiteboardPattern.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(whiteboardPattern, whiteboardOperation, previousWhiteboardPatterns);
}
});
whiteboardOperation = new Combo(advancedComposite, SWT.READ_ONLY);
whiteboardOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
whiteboardOperation.setItems(patternOperationText);
whiteboardOperation.setText(patternOperationText[0]);
whiteboardOperation.select(0);
Label keywordsLabel = new Label(advancedComposite, SWT.NONE);
keywordsLabel.setText(Messages.BugzillaSearchPage_Keywords);
Composite keywordsComposite = new Composite(advancedComposite, SWT.NONE);
keywordsComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
GridLayout keywordsLayout = new GridLayout();
keywordsLayout.marginWidth = 0;
keywordsLayout.marginHeight = 0;
keywordsLayout.numColumns = 3;
keywordsComposite.setLayout(keywordsLayout);
keywordsOperation = new Combo(keywordsComposite, SWT.READ_ONLY);
keywordsOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
keywordsOperation.setItems(keywordOperationText);
keywordsOperation.setText(keywordOperationText[0]);
keywordsOperation.select(0);
keywords = new Combo(keywordsComposite, SWT.NONE);
keywords.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
keywords.addModifyListener(new ModifyListenerImplementation());
keywords.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected(keywords, keywordsOperation, previousKeywords);
}
});
final Button keywordsSelectButton = new Button(keywordsComposite, SWT.NONE);
keywordsSelectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
final java.util.List<String> values = new ArrayList<String>();
for (String string : keywords.getText().split(",")) { //$NON-NLS-1$
values.add(string.trim());
}
Map<String, String> validValues = new HashMap<String, String>();
for (String string : repositoryConfiguration.getKeywords()) {
validValues.put(string, string);
}
final InPlaceCheckBoxTreeDialog selectionDialog = new InPlaceCheckBoxTreeDialog(
WorkbenchUtil.getShell(), keywordsSelectButton, values, validValues, ""); //$NON-NLS-1$
selectionDialog.addEventListener(new IInPlaceDialogListener() {
public void buttonPressed(InPlaceDialogEvent event) {
if (event.getReturnCode() == Window.OK) {
Set<String> newValues = selectionDialog.getSelectedValues();
if (!new HashSet<String>(values).equals(newValues)) {
String erg = ""; //$NON-NLS-1$
for (String string : newValues) {
if (erg.equals("")) { //$NON-NLS-1$
erg = string;
} else {
erg += (", " + string); //$NON-NLS-1$
}
}
keywords.setText(erg);
}
} else if (event.getReturnCode() == AbstractInPlaceDialog.ID_CLEAR) {
keywords.setText(""); //$NON-NLS-1$
}
}
});
selectionDialog.open();
}
});
keywordsSelectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
keywordsSelectButton.setText(Messages.BugzillaSearchPage_Select_);
SashForm bottomForm = new SashForm(advancedComposite, SWT.NONE);
GridLayout bottomLayout = new GridLayout();
bottomLayout.numColumns = 6;
bottomForm.setLayout(bottomLayout);
GridData bottomLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1);
bottomLayoutData.heightHint = 80;
bottomLayoutData.widthHint = 400;
bottomForm.setLayoutData(bottomLayoutData);
Composite priorityComposite = new Composite(bottomForm, SWT.NONE);
GridLayout priorityLayout = new GridLayout();
priorityLayout.marginWidth = 0;
priorityLayout.marginHeight = 0;
priorityLayout.horizontalSpacing = 0;
priorityComposite.setLayout(priorityLayout);
Label priorityLabel = new Label(priorityComposite, SWT.LEFT);
priorityLabel.setText(Messages.BugzillaSearchPage_PROORITY);
priorityLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
priority = new List(priorityComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_priority = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_priority.heightHint = HEIGHT_ATTRIBUTE_COMBO;
priority.setLayoutData(gd_priority);
priority.addSelectionListener(updateActionSelectionAdapter);
Composite resolutionComposite = new Composite(bottomForm, SWT.NONE);
GridLayout resolutionLayout = new GridLayout();
resolutionLayout.marginWidth = 0;
resolutionLayout.marginHeight = 0;
resolutionLayout.horizontalSpacing = 0;
resolutionComposite.setLayout(resolutionLayout);
Label resolutionLabel = new Label(resolutionComposite, SWT.LEFT);
resolutionLabel.setText(Messages.BugzillaSearchPage_Resolution);
resolutionLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
resolution = new List(resolutionComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_resolution = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_resolution.heightHint = HEIGHT_ATTRIBUTE_COMBO;
resolution.setLayoutData(gd_resolution);
resolution.addSelectionListener(updateActionSelectionAdapter);
Composite versionComposite = new Composite(bottomForm, SWT.NONE);
GridLayout versionLayout = new GridLayout();
versionLayout.marginWidth = 0;
versionLayout.marginHeight = 0;
versionLayout.horizontalSpacing = 0;
versionComposite.setLayout(versionLayout);
Label versionLabel = new Label(versionComposite, SWT.LEFT);
versionLabel.setText(Messages.BugzillaSearchPage_Version);
versionLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
version = new List(versionComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
GridData versionLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
versionLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
version.setLayoutData(versionLayoutData);
version.addSelectionListener(updateActionSelectionAdapter);
Composite milestoneComposite = new Composite(bottomForm, SWT.NONE);
GridLayout milestoneLayout = new GridLayout();
milestoneLayout.marginWidth = 0;
milestoneLayout.marginHeight = 0;
milestoneLayout.horizontalSpacing = 0;
milestoneComposite.setLayout(milestoneLayout);
Label milestoneLabel = new Label(milestoneComposite, SWT.LEFT);
milestoneLabel.setText(Messages.BugzillaSearchPage_Milestone);
milestoneLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
target = new List(milestoneComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
GridData targetLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
targetLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
target.setLayoutData(targetLayoutData);
target.addSelectionListener(updateActionSelectionAdapter);
Composite hardwareComposite = new Composite(bottomForm, SWT.NONE);
GridLayout hardwareLayout = new GridLayout();
hardwareLayout.marginWidth = 0;
hardwareLayout.marginHeight = 0;
hardwareLayout.horizontalSpacing = 0;
hardwareComposite.setLayout(hardwareLayout);
Label hardwareLabel = new Label(hardwareComposite, SWT.LEFT);
hardwareLabel.setText(Messages.BugzillaSearchPage_Hardware);
hardwareLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
hardware = new List(hardwareComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_hardware = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_hardware.heightHint = HEIGHT_ATTRIBUTE_COMBO;
hardware.setLayoutData(gd_hardware);
hardware.addSelectionListener(updateActionSelectionAdapter);
Composite osComposite = new Composite(bottomForm, SWT.NONE);
GridLayout osLayout = new GridLayout();
osLayout.marginWidth = 0;
osLayout.marginHeight = 0;
osLayout.horizontalSpacing = 0;
osComposite.setLayout(osLayout);
Label osLabel = new Label(osComposite, SWT.LEFT);
osLabel.setText(Messages.BugzillaSearchPage_Operating_System);
osLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
os = new List(osComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
final GridData gd_os = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_os.heightHint = HEIGHT_ATTRIBUTE_COMBO;
os.setLayoutData(gd_os);
os.addSelectionListener(updateActionSelectionAdapter);
}
private void createMoreOptionsChangedInFilter(Composite control) {
Composite composite = new Composite(control, SWT.NONE);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd.horizontalSpan = 4;
composite.setLayoutData(gd);
GridLayout gridLayout = new GridLayout();
gridLayout.marginTop = 7;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.numColumns = 3;
composite.setLayout(gridLayout);
Label changedInTheLabel = new Label(composite, SWT.LEFT);
changedInTheLabel.setLayoutData(new GridData());
changedInTheLabel.setText(Messages.BugzillaSearchPage_Changed_in);
Composite updateComposite = new Composite(composite, SWT.NONE);
updateComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
GridLayout updateLayout = new GridLayout(2, false);
updateLayout.marginWidth = 0;
updateLayout.horizontalSpacing = 0;
updateLayout.marginHeight = 0;
updateComposite.setLayout(updateLayout);
daysText = new Text(updateComposite, SWT.BORDER);
daysText.setLayoutData(new GridData(40, SWT.DEFAULT));
daysText.setTextLimit(5);
daysText.addListener(SWT.Modify, this);
Label label = new Label(updateComposite, SWT.LEFT);
label.setText(Messages.BugzillaSearchPage_days);
}
/**
* Creates the buttons for remembering a query and accessing previously saved queries.
*/
protected Control createSaveQuery(Composite control) {
GridLayout layout;
GridData gd;
Group group = new Group(control, SWT.NONE);
layout = new GridLayout(3, false);
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
gd = new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
gd.horizontalSpan = 2;
group.setLayoutData(gd);
return group;
}
private void handleWidgetSelected(Combo widget, Combo operation, ArrayList<BugzillaSearchData> history) {
if (widget.getSelectionIndex() < 0) {
return;
}
int index = history.size() - 1 - widget.getSelectionIndex();
BugzillaSearchData patternData = history.get(index);
if (patternData == null || !widget.getText().equals(patternData.pattern)) {
return;
}
widget.setText(patternData.pattern);
operation.setText(operation.getItem(patternData.operation));
}
// TODO: avoid overriding?
@Override
public boolean performSearch() {
if (restoreQueryOptions) {
saveState();
}
getPatternData(summaryPattern, summaryOperation, previousSummaryPatterns);
getPatternData(commentPattern, commentOperation, previousCommentPatterns);
getPatternData(emailPattern, emailOperation, previousEmailPatterns);
getPatternData(emailPattern2, emailOperation2, previousEmailPatterns2);
getPatternData(keywords, keywordsOperation, previousKeywords);
getPatternData(whiteboardPattern, whiteboardOperation, previousWhiteboardPatterns);
String summaryText = summaryPattern.getText();
BugzillaUiPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.MOST_RECENT_QUERY, summaryText);
return super.performSearch();
}
@Override
public void setVisible(boolean visible) {
if (visible && summaryPattern != null) {
if (firstTime) {
firstTime = false;
// Set item and text here to prevent page from resizing
for (String searchPattern : getPreviousPatterns(previousSummaryPatterns)) {
summaryPattern.add(searchPattern);
}
// summaryPattern.setItems(getPreviousPatterns(previousSummaryPatterns));
for (String comment : getPreviousPatterns(previousCommentPatterns)) {
commentPattern.add(comment);
}
// commentPattern.setItems(getPreviousPatterns(previousCommentPatterns));
for (String email : getPreviousPatterns(previousEmailPatterns)) {
emailPattern.add(email);
}
for (String email : getPreviousPatterns(previousEmailPatterns2)) {
emailPattern2.add(email);
}
// emailPattern.setItems(getPreviousPatterns(previousEmailPatterns));
for (String keyword : getPreviousPatterns(previousKeywords)) {
keywords.add(keyword);
}
// TODO: update status, resolution, severity etc if possible...
if (getTaskRepository() != null) {
BugzillaRepositoryConnector connector = (BugzillaRepositoryConnector) TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
repositoryConfiguration = connector.getRepositoryConfiguration(getTaskRepository().getUrl());
updateAttributesFromConfiguration(null);
if (product.getItemCount() == 0) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (getControl() != null && !getControl().isDisposed()) {
updateConfiguration(true);
updateAttributesFromConfiguration(null);
}
}
});
}
}
if (originalQuery != null) {
try {
updateDefaults(originalQuery.getUrl());
refreshChartControls();
} catch (UnsupportedEncodingException e) {
// ignore
}
}
if ((commentPattern.getText() != null && !commentPattern.getText().equals("")) || // //$NON-NLS-1$
(emailPattern2.getText() != null && !emailPattern2.getText().equals("")) || // //$NON-NLS-1$
(keywords.getText() != null && !keywords.getText().equals("")) || // //$NON-NLS-1$
(whiteboardPattern.getText() != null && !whiteboardPattern.getText().equals("")) || // //$NON-NLS-1$
priority.getSelection().length > 0 || resolution.getSelection().length > 0
|| version.getSelection().length > 0 || target.getSelection().length > 0
|| hardware.getSelection().length > 0 || os.getSelection().length > 0) {
moreOptionsSection.setExpanded(true);
scrolledComposite.reflow(true);
refreshChartControls();
}
if (charts.size() > 0 && charts.get(0).getChartExpression(0, 0).getFieldName() > 0) {
chartSection.setExpanded(true);
scrolledComposite.reflow(true);
refreshChartControls();
}
}
/*
* hack: we have to select the correct product, then update the
* attributes so the component/version/milestone lists have the
* proper values, then we can restore all the widget selections.
*/
if (getTaskRepository() != null) {
IDialogSettings settings = getDialogSettings();
String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
if (getWizard() == null && restoreQueryOptions && settings.getArray(STORE_PRODUCT_ID + repoId) != null
&& product != null) {
product.setSelection(nonNullArray(settings, STORE_PRODUCT_ID + repoId));
if (product.getSelection().length > 0) {
updateAttributesFromConfiguration(product.getSelection());
}
restoreWidgetValues();
}
}
setPageComplete(isPageComplete());
}
if (visible) {
if (getWizard() == null && summaryPattern != null) {
// TODO: wierd check
summaryPattern.setFocus();
}
}
super.setVisible(visible);
}
/**
* Returns <code>true</code> if at least some parameter is given to query on.
*/
private boolean canQuery() {
if (isControlCreated()) {
return product.getSelectionCount() > 0 || component.getSelectionCount() > 0
|| version.getSelectionCount() > 0 || target.getSelectionCount() > 0
|| status.getSelectionCount() > 0 || resolution.getSelectionCount() > 0
|| severity.getSelectionCount() > 0 || priority.getSelectionCount() > 0
|| hardware.getSelectionCount() > 0 || os.getSelectionCount() > 0
|| summaryPattern.getText().length() > 0 || commentPattern.getText().length() > 0
|| emailPattern.getText().length() > 0 || emailPattern2.getText().length() > 0
|| keywords.getText().length() > 0;
} else {
return false;
}
}
@Override
public boolean isPageComplete() {
if (daysText != null) {
String days = daysText.getText();
if (days.length() > 0) {
try {
if (Integer.parseInt(days) < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException ex) {
setMessage(NLS.bind(Messages.BugzillaSearchPage_Number_of_days_must_be_a_positive_integer, days),
IMessageProvider.ERROR);
return false;
}
}
}
if (getWizard() == null) {
return canQuery();
} else {
if (super.isPageComplete()) {
if (canQuery()) {
return true;
}
}
return false;
}
}
/**
* Return search pattern data and update search history list. An existing entry will be updated or a new one
* created.
*/
private BugzillaSearchData getPatternData(Combo widget, Combo operation,
ArrayList<BugzillaSearchData> previousSearchQueryData) {
String pattern = widget.getText();
if (pattern == null || pattern.trim().equals("")) { //$NON-NLS-1$
return null;
}
BugzillaSearchData match = null;
int i = previousSearchQueryData.size() - 1;
while (i >= 0) {
match = previousSearchQueryData.get(i);
if (pattern.equals(match.pattern)) {
break;
}
i--;
}
if (i >= 0 && match != null) {
match.operation = operation.getSelectionIndex();
// remove - will be added last (see below)
previousSearchQueryData.remove(match);
} else {
match = new BugzillaSearchData(widget.getText(), operation.getSelectionIndex());
}
previousSearchQueryData.add(match);
return match;
}
/**
* Returns an array of previous summary patterns
*/
private String[] getPreviousPatterns(ArrayList<BugzillaSearchData> patternHistory) {
int size = patternHistory.size();
String[] patterns = new String[size];
for (int i = 0; i < size; i++) {
patterns[i] = (patternHistory.get(size - 1 - i)).pattern;
}
return patterns;
}
public String getSearchURL(TaskRepository repository) {
return getQueryURL(repository, getQueryParameters());
}
protected String getQueryURL(TaskRepository repository, StringBuilder params) {
StringBuilder url = new StringBuilder(getQueryURLStart(repository).toString());
url.append(params);
// HACK make sure that the searches come back sorted by priority. This
// should be a search option though
url.append("&order=Importance"); //$NON-NLS-1$
// url.append(BugzillaRepositoryUtil.contentTypeRDF);
return url.toString();
}
/**
* Creates the bugzilla query URL start. Example: https://bugs.eclipse.org/bugs/buglist.cgi?
*/
private StringBuilder getQueryURLStart(TaskRepository repository) {
StringBuilder sb = new StringBuilder(repository.getRepositoryUrl());
if (sb.charAt(sb.length() - 1) != '/') {
sb.append('/');
}
sb.append("buglist.cgi?"); //$NON-NLS-1$
return sb;
}
/**
* Goes through the query form and builds up the query parameters. Example:
* short_desc_type=substring&amp;short_desc=bla&amp; ... TODO: The encoding here should match
* TaskRepository.getCharacterEncoding()
*
* @throws UnsupportedEncodingException
*/
protected StringBuilder getQueryParameters() {
StringBuilder sb = new StringBuilder();
sb.append("short_desc_type="); //$NON-NLS-1$
sb.append(patternOperationValues[summaryOperation.getSelectionIndex()]);
appendToBuffer(sb, "&short_desc=", summaryPattern.getText()); //$NON-NLS-1$
int[] selected = product.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&product=", product.getItem(element)); //$NON-NLS-1$
}
selected = component.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&component=", component.getItem(element)); //$NON-NLS-1$
}
selected = version.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&version=", version.getItem(element)); //$NON-NLS-1$
}
selected = target.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&target_milestone=", target.getItem(element)); //$NON-NLS-1$
}
sb.append("&long_desc_type="); //$NON-NLS-1$
sb.append(patternOperationValues[commentOperation.getSelectionIndex()]);
appendToBuffer(sb, "&long_desc=", commentPattern.getText()); //$NON-NLS-1$
selected = status.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&bug_status=", status.getItem(element)); //$NON-NLS-1$
}
selected = resolution.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&resolution=", resolution.getItem(element)); //$NON-NLS-1$
}
selected = severity.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&bug_severity=", severity.getItem(element)); //$NON-NLS-1$
}
selected = priority.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&priority=", priority.getItem(element)); //$NON-NLS-1$
}
selected = hardware.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&rep_platform=", hardware.getItem(element)); //$NON-NLS-1$
}
selected = os.getSelectionIndices();
for (int element : selected) {
appendToBuffer(sb, "&op_sys=", os.getItem(element)); //$NON-NLS-1$
}
if (emailPattern.getText() != null && !emailPattern.getText().trim().equals("")) { //$NON-NLS-1$
boolean selectionMade = false;
for (Button button : emailButtons) {
if (button.getSelection()) {
selectionMade = true;
break;
}
}
if (selectionMade) {
for (int i = 0; i < emailButtons.length; i++) {
if (emailButtons[i].getSelection()) {
sb.append("&"); //$NON-NLS-1$
sb.append(emailRoleValues[i]);
sb.append("=1"); //$NON-NLS-1$
}
}
}
sb.append("&emailtype1="); //$NON-NLS-1$
sb.append(emailOperationValues[emailOperation.getSelectionIndex()]);
appendToBuffer(sb, "&email1=", emailPattern.getText()); //$NON-NLS-1$
}
if (emailPattern2.getText() != null && !emailPattern2.getText().trim().equals("")) { //$NON-NLS-1$
boolean selectionMade = false;
for (Button button : emailButtons2) {
if (button.getSelection()) {
selectionMade = true;
break;
}
}
if (selectionMade) {
for (int i = 0; i < emailButtons2.length; i++) {
if (emailButtons2[i].getSelection()) {
sb.append("&"); //$NON-NLS-1$
sb.append(emailRoleValues2[i]);
sb.append("=1"); //$NON-NLS-1$
}
}
}
sb.append("&emailtype2="); //$NON-NLS-1$
sb.append(emailOperationValues[emailOperation2.getSelectionIndex()]);
appendToBuffer(sb, "&email2=", emailPattern2.getText()); //$NON-NLS-1$
}
if (daysText.getText() != null && !daysText.getText().equals("")) { //$NON-NLS-1$
try {
Integer.parseInt(daysText.getText());
appendToBuffer(sb, "&changedin=", daysText.getText()); //$NON-NLS-1$
} catch (NumberFormatException ignored) {
// this means that the days is not a number, so don't worry
}
}
if (keywords.getText() != null && !keywords.getText().trim().equals("")) { //$NON-NLS-1$
sb.append("&keywords_type="); //$NON-NLS-1$
sb.append(keywordOperationValues[keywordsOperation.getSelectionIndex()]);
appendToBuffer(sb, "&keywords=", keywords.getText().replace(',', ' ')); //$NON-NLS-1$
}
sb.append("&status_whiteboard_type="); //$NON-NLS-1$
sb.append(patternOperationValues[whiteboardOperation.getSelectionIndex()]);
appendToBuffer(sb, "&status_whiteboard=", whiteboardPattern.getText()); //$NON-NLS-1$
int indexMax = charts.size();
for (int index = 0; index < indexMax; index++) {
Chart chart = charts.get(index);
if (chart.isNegate()) {
sb.append("&negate" + index + "=1"); //$NON-NLS-1$ //$NON-NLS-2$
}
int rowMax = chart.getRowSize();
for (int row = 0; row < rowMax; row++) {
int columnMax = chart.getColumnSize(row);
for (int column = 0; column < columnMax; column++) {
ChartExpression chartExpression = chart.getChartExpression(row, column);
if (chartExpression.getFieldName() == 0) {
continue;
}
sb.append("&field" + index + "-" + row + "-" + column + "=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ chartFieldValues[chartExpression.getFieldName()]);
sb.append("&type" + index + "-" + row + "-" + column + "=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ chartOperationValues[chartExpression.getOperation()]);
sb.append("&value" + index + "-" + row + "-" + column + "=" + chartExpression.getValue()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
}
}
return sb;
}
private void appendToBuffer(StringBuilder sb, String key, String value) {
sb.append(key);
try {
sb.append(URLEncoder.encode(value, getTaskRepository().getCharacterEncoding()));
} catch (UnsupportedEncodingException e) {
sb.append(value);
}
}
@Override
public IDialogSettings getDialogSettings() {
IDialogSettings settings = BugzillaUiPlugin.getDefault().getDialogSettings();
fDialogSettings = settings.getSection(PAGE_NAME);
if (fDialogSettings == null) {
fDialogSettings = settings.addNewSection(PAGE_NAME);
}
return fDialogSettings;
}
/**
* Initializes itself from the stored page settings.
*/
private void readConfiguration() {
getDialogSettings();
}
@SuppressWarnings("unchecked")
private void updateAttributesFromConfiguration(String[] selectedProducts) {
if (repositoryConfiguration != null) {
String[] saved_product = product.getSelection();
String[] saved_component = component.getSelection();
String[] saved_version = version.getSelection();
String[] saved_target = target.getSelection();
String[] saved_status = status.getSelection();
String[] saved_resolution = resolution.getSelection();
String[] saved_severity = severity.getSelection();
String[] saved_priority = priority.getSelection();
String[] saved_hardware = hardware.getSelection();
String[] saved_os = os.getSelection();
if (selectedProducts == null) {
java.util.List<String> products = repositoryConfiguration.getProducts();
String[] productsList = products.toArray(new String[products.size()]);
Arrays.sort(productsList, String.CASE_INSENSITIVE_ORDER);
product.setItems(productsList);
}
String[] componentsList = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_COMPONENT,
selectedProducts, repositoryConfiguration);
Arrays.sort(componentsList, String.CASE_INSENSITIVE_ORDER);
component.setItems(componentsList);
version.setItems(BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_VERSION, selectedProducts,
repositoryConfiguration));
target.setItems(BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_TARGET, selectedProducts,
repositoryConfiguration));
status.setItems(convertStringListToArray(repositoryConfiguration.getStatusValues()));
resolution.setItems(convertStringListToArray(repositoryConfiguration.getResolutions()));
severity.setItems(convertStringListToArray(repositoryConfiguration.getSeverities()));
priority.setItems(convertStringListToArray(repositoryConfiguration.getPriorities()));
hardware.setItems(convertStringListToArray(repositoryConfiguration.getPlatforms()));
os.setItems(convertStringListToArray(repositoryConfiguration.getOSs()));
setSelection(product, saved_product);
setSelection(component, saved_component);
setSelection(version, saved_version);
setSelection(target, saved_target);
setSelection(status, saved_status);
setSelection(resolution, saved_resolution);
setSelection(severity, saved_severity);
setSelection(priority, saved_priority);
setSelection(hardware, saved_hardware);
setSelection(os, saved_os);
if (repositoryConfiguration != null) {
ArrayList<String> fieldText = (ArrayList<String>) chartFieldTextDefault.clone();
ArrayList<String> fieldValue = (ArrayList<String>) chartFieldValuesDefault.clone();
for (BugzillaCustomField bugzillaCustomField : repositoryConfiguration.getCustomFields()) {
fieldValue.add(bugzillaCustomField.getName());
fieldText.add(bugzillaCustomField.getDescription());
}
chartFieldText = fieldText.toArray(new String[fieldText.size()]);
chartFieldValues = fieldValue.toArray(new String[fieldValue.size()]);
recreateChartControls();
}
}
}
@Override
public boolean canFlipToNextPage() {
return false;
}
public void handleEvent(Event event) {
if (getWizard() != null) {
getWizard().getContainer().updateButtons();
}
}
/**
* TODO: get rid of this?
*/
public void updateDefaults(String startingUrl) throws UnsupportedEncodingException {
boolean adjustChart = false;
startingUrl = startingUrl.substring(startingUrl.indexOf("?") + 1); //$NON-NLS-1$
String[] options = startingUrl.split("&"); //$NON-NLS-1$
for (String option : options) {
String key;
int endindex = option.indexOf("="); //$NON-NLS-1$
if (endindex == -1) {
key = null;
} else {
key = option.substring(0, option.indexOf("=")); //$NON-NLS-1$
}
if (key == null) {
continue;
}
String value = URLDecoder.decode(option.substring(option.indexOf("=") + 1), //$NON-NLS-1$
getTaskRepository().getCharacterEncoding());
if (key.equals("short_desc")) { //$NON-NLS-1$
summaryPattern.setText(value);
} else if (key.equals("short_desc_type")) { //$NON-NLS-1$
int index = 0;
for (String item : patternOperationValues) {
if (item.compareTo(value) == 0) {
break;
}
index++;
}
if (index < summaryOperation.getItemCount()) {
summaryOperation.select(index);
}
} else if (key.equals("product")) { //$NON-NLS-1$
String[] sel = product.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
product.setSelection(selList.toArray(sel));
updateAttributesFromConfiguration(selList.toArray(sel));
} else if (key.equals("component")) { //$NON-NLS-1$
String[] sel = component.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
component.setSelection(selList.toArray(sel));
} else if (key.equals("version")) { //$NON-NLS-1$
String[] sel = version.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
version.setSelection(selList.toArray(sel));
} else if (key.equals("target_milestone")) { // XXX //$NON-NLS-1$
String[] sel = target.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
target.setSelection(selList.toArray(sel));
} else if (key.equals("version")) { //$NON-NLS-1$
String[] sel = version.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
version.setSelection(selList.toArray(sel));
} else if (key.equals("long_desc_type")) { //$NON-NLS-1$
int index = 0;
for (String item : patternOperationValues) {
if (item.compareTo(value) == 0) {
break;
}
index++;
}
if (index < commentOperation.getItemCount()) {
commentOperation.select(index);
}
} else if (key.equals("long_desc")) { //$NON-NLS-1$
commentPattern.setText(value);
} else if (key.equals("bug_status")) { //$NON-NLS-1$
String[] sel = status.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
status.setSelection(selList.toArray(sel));
} else if (key.equals("resolution")) { //$NON-NLS-1$
String[] sel = resolution.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
resolution.setSelection(selList.toArray(sel));
} else if (key.equals("bug_severity")) { //$NON-NLS-1$
String[] sel = severity.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
severity.setSelection(selList.toArray(sel));
} else if (key.equals("priority")) { //$NON-NLS-1$
String[] sel = priority.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
priority.setSelection(selList.toArray(sel));
} else if (key.equals("rep_platform")) { //$NON-NLS-1$
String[] sel = hardware.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
hardware.setSelection(selList.toArray(sel));
} else if (key.equals("op_sys")) { //$NON-NLS-1$
String[] sel = os.getSelection();
java.util.List<String> selList = Arrays.asList(sel);
selList = new ArrayList<String>(selList);
selList.add(value);
sel = new String[selList.size()];
os.setSelection(selList.toArray(sel));
} else if (key.equals("emailassigned_to1")) { // HACK: email //$NON-NLS-1$
// buttons
// assumed to be
// in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons[0].setSelection(true);
} else {
emailButtons[0].setSelection(false);
}
} else if (key.equals("emailreporter1")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons[1].setSelection(true);
} else {
emailButtons[1].setSelection(false);
}
} else if (key.equals("emailcc1")) { // HACK: email buttons //$NON-NLS-1$
// assumed to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons[2].setSelection(true);
} else {
emailButtons[2].setSelection(false);
}
} else if (key.equals("emaillongdesc1")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons[3].setSelection(true);
} else {
emailButtons[3].setSelection(false);
}
} else if (key.equals("emailqa_contact1")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons[4].setSelection(true);
} else {
emailButtons[4].setSelection(false);
}
} else if (key.equals("emailtype1")) { //$NON-NLS-1$
int index = 0;
for (; index < emailOperationValues.length; index++) {
String item = emailOperationValues[index];
if (item.compareTo(value) == 0) {
break;
}
}
if (index < emailOperation.getItemCount()) {
emailOperation.select(index);
}
} else if (key.equals("email1")) { //$NON-NLS-1$
emailPattern.setText(value);
} else if (key.equals("emailassigned_to2")) { // HACK: email //$NON-NLS-1$
// buttons
// assumed to be
// in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons2[0].setSelection(true);
} else {
emailButtons2[0].setSelection(false);
}
} else if (key.equals("emailreporter2")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons2[1].setSelection(true);
} else {
emailButtons2[1].setSelection(false);
}
} else if (key.equals("emailcc2")) { // HACK: email buttons //$NON-NLS-1$
// assumed to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons2[2].setSelection(true);
} else {
emailButtons2[2].setSelection(false);
}
} else if (key.equals("emaillongdesc2")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons2[3].setSelection(true);
} else {
emailButtons2[3].setSelection(false);
}
} else if (key.equals("emailqa_contact2")) { // HACK: email //$NON-NLS-1$
// buttons assumed
// to be in same
// position
if (value.equals("1")) { //$NON-NLS-1$
emailButtons2[4].setSelection(true);
} else {
emailButtons2[4].setSelection(false);
}
} else if (key.equals("emailtype2")) { //$NON-NLS-1$
int index = 0;
for (; index < emailOperationValues.length; index++) {
String item = emailOperationValues[index];
if (item.compareTo(value) == 0) {
break;
}
}
if (index < emailOperation2.getItemCount()) {
emailOperation2.select(index);
}
} else if (key.equals("email2")) { //$NON-NLS-1$
emailPattern2.setText(value);
} else if (key.equals("changedin")) { //$NON-NLS-1$
daysText.setText(value);
} else if (key.equals("keywords")) { //$NON-NLS-1$
keywords.setText(value.replace(' ', ','));
} else if (key.equals("keywords_type")) { //$NON-NLS-1$
int index = 0;
for (String item : keywordOperationValues) {
if (item.equals(value)) {
keywordsOperation.select(index);
break;
}
index++;
}
} else if (key.equals("status_whiteboard_type")) { //$NON-NLS-1$
int index = 0;
for (String item : patternOperationValues) {
if (item.compareTo(value) == 0) {
break;
}
index++;
}
if (index < whiteboardOperation.getItemCount()) {
whiteboardOperation.select(index);
}
} else if (key.equals("status_whiteboard")) { //$NON-NLS-1$
whiteboardPattern.setText(value);
} else if (key.matches(REGEXP_CHART_EXPR)) {
Matcher mb = PATTERN_CHART_EXPR.matcher(key);
if (mb.find()) {
String g1 = mb.group(1);
String g2 = mb.group(2);
String g3 = mb.group(3);
String g4 = mb.group(4);
int chartNumber, row, column;
try {
chartNumber = Integer.parseInt(g2);
row = Integer.parseInt(g3);
column = Integer.parseInt(g4);
} catch (Exception E) {
chartNumber = -1;
row = -1;
column = -1;
}
for (int i = charts.size(); i <= chartNumber; i++) {
charts.add(new Chart());
adjustChart = true;
}
for (int i = charts.get(chartNumber).getRowSize(); i <= row; i++) {
charts.get(chartNumber).addExpression(i, 0);
adjustChart = true;
}
for (int i = charts.get(chartNumber).getColumnSize(row); i <= column; i++) {
charts.get(chartNumber).addExpression(row, i);
adjustChart = true;
}
ChartExpression ex = charts.get(chartNumber).getChartExpression(row, column);
if ("field".equals(g1)) { //$NON-NLS-1$
int index1 = 0;
for (String item : chartFieldValues) {
if (item.compareTo(value) == 0) {
break;
}
index1++;
}
if (index1 < chartFieldValues.length) {
ex.setFieldName(index1);
}
} else if ("type".equals(g1)) { //$NON-NLS-1$
int index1 = 0;
for (String item : chartOperationValues) {
if (item.compareTo(value) == 0) {
break;
}
index1++;
}
if (index1 < chartOperationValues.length) {
ex.setOperation(index1);
}
} else if ("value".equals(g1)) { //$NON-NLS-1$
ex.setValue(value);
}
}
} else if (key.matches(REGEXP_CHART_NEGATE)) {
Matcher mb = PATTERN_CHART_NEGATE.matcher(key);
if (mb.find()) {
String g2 = mb.group(2);
int index;
try {
index = Integer.parseInt(g2);
} catch (Exception E) {
index = -1;
}
Chart ch = charts.get(index);
ch.setNegate("1".equals(value)); //$NON-NLS-1$
}
}
}
if (adjustChart) {
recreateChartControls();
}
}
private String[] nonNullArray(IDialogSettings settings, String id) {
String[] value = settings.getArray(id);
if (value == null) {
return new String[] {};
}
return value;
}
@SuppressWarnings("unchecked")
private void restoreWidgetValues() {
try {
IDialogSettings settings = getDialogSettings();
String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
if (!restoreQueryOptions || settings.getArray(STORE_PRODUCT_ID + repoId) == null || product == null) {
return;
}
// set widgets to stored values
product.setSelection(nonNullArray(settings, STORE_PRODUCT_ID + repoId));
component.setSelection(nonNullArray(settings, STORE_COMPONENT_ID + repoId));
version.setSelection(nonNullArray(settings, STORE_VERSION_ID + repoId));
target.setSelection(nonNullArray(settings, STORE_MSTONE_ID + repoId));
status.setSelection(nonNullArray(settings, STORE_STATUS_ID + repoId));
resolution.setSelection(nonNullArray(settings, STORE_RESOLUTION_ID + repoId));
severity.setSelection(nonNullArray(settings, STORE_SEVERITY_ID + repoId));
priority.setSelection(nonNullArray(settings, STORE_PRIORITY_ID + repoId));
hardware.setSelection(nonNullArray(settings, STORE_HARDWARE_ID + repoId));
os.setSelection(nonNullArray(settings, STORE_OS_ID + repoId));
summaryOperation.select(settings.getInt(STORE_SUMMARYMATCH_ID + repoId));
commentOperation.select(settings.getInt(STORE_COMMENTMATCH_ID + repoId));
emailOperation.select(settings.getInt(STORE_EMAILMATCH_ID + repoId));
for (int i = 0; i < emailButtons.length; i++) {
emailButtons[i].setSelection(settings.getBoolean(STORE_EMAILBUTTON_ID + i + repoId));
}
summaryPattern.setText(settings.get(STORE_SUMMARYTEXT_ID + repoId));
commentPattern.setText(settings.get(STORE_COMMENTTEXT_ID + repoId));
emailPattern.setText(settings.get(STORE_EMAILADDRESS_ID + repoId));
try {
emailOperation2.select(settings.getInt(STORE_EMAIL2MATCH_ID + repoId));
} catch (Exception e) {
//ignore
}
for (int i = 0; i < emailButtons2.length; i++) {
emailButtons2[i].setSelection(settings.getBoolean(STORE_EMAIL2BUTTON_ID + i + repoId));
}
emailPattern2.setText(settings.get(STORE_EMAIL2ADDRESS_ID + repoId));
if (settings.get(STORE_KEYWORDS_ID + repoId) != null) {
keywords.setText(settings.get(STORE_KEYWORDS_ID + repoId));
keywordsOperation.select(settings.getInt(STORE_KEYWORDSMATCH_ID + repoId));
}
if (settings.get(STORE_WHITEBOARD_ID + repoId) != null) {
whiteboardPattern.setText(settings.get(STORE_WHITEBOARD_ID + repoId));
whiteboardOperation.select(settings.getInt(STORE_WHITEBOARDMATCH_ID + repoId));
}
if ((commentPattern.getText() != null && !commentPattern.getText().equals("")) || // //$NON-NLS-1$
(emailPattern2.getText() != null && !emailPattern2.getText().equals("")) || // //$NON-NLS-1$
(keywords.getText() != null && !keywords.getText().equals("")) || // //$NON-NLS-1$
(whiteboardPattern.getText() != null && !whiteboardPattern.getText().equals("")) || // //$NON-NLS-1$
priority.getSelection().length > 0 || resolution.getSelection().length > 0
|| version.getSelection().length > 0 || target.getSelection().length > 0
|| hardware.getSelection().length > 0 || os.getSelection().length > 0) {
moreOptionsSection.setExpanded(true);
scrolledComposite.reflow(true);
refreshChartControls();
}
String chartString = settings.get(STORE_CHARTS_ID + repoId);
if (chartString != null) {
ObjectInputStream inputStream = null;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(chartString.getBytes());
try {
try {
inputStream = new ObjectInputStream(byteArrayInputStream);
charts = (ArrayList<Chart>) inputStream.readObject();
} catch (IOException e) {
throw e;
} finally {
if (inputStream != null) {
inputStream.close();
}
}
} catch (Exception e) {
}
}
if (charts.size() > 0 && charts.get(0).getChartExpression(0, 0).getFieldName() > 0) {
chartSection.setExpanded(true);
scrolledComposite.reflow(true);
refreshChartControls();
}
} catch (IllegalArgumentException e) {
//ignore
}
}
@Override
public void saveState() {
String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
IDialogSettings settings = getDialogSettings();
settings.put(STORE_PRODUCT_ID + repoId, product.getSelection());
settings.put(STORE_COMPONENT_ID + repoId, component.getSelection());
settings.put(STORE_VERSION_ID + repoId, version.getSelection());
settings.put(STORE_MSTONE_ID + repoId, target.getSelection());
settings.put(STORE_STATUS_ID + repoId, status.getSelection());
settings.put(STORE_RESOLUTION_ID + repoId, resolution.getSelection());
settings.put(STORE_SEVERITY_ID + repoId, severity.getSelection());
settings.put(STORE_PRIORITY_ID + repoId, priority.getSelection());
settings.put(STORE_HARDWARE_ID + repoId, hardware.getSelection());
settings.put(STORE_OS_ID + repoId, os.getSelection());
settings.put(STORE_SUMMARYMATCH_ID + repoId, summaryOperation.getSelectionIndex());
settings.put(STORE_COMMENTMATCH_ID + repoId, commentOperation.getSelectionIndex());
settings.put(STORE_EMAILMATCH_ID + repoId, emailOperation.getSelectionIndex());
for (int i = 0; i < emailButtons.length; i++) {
settings.put(STORE_EMAILBUTTON_ID + i + repoId, emailButtons[i].getSelection());
}
settings.put(STORE_SUMMARYTEXT_ID + repoId, summaryPattern.getText());
settings.put(STORE_COMMENTTEXT_ID + repoId, commentPattern.getText());
settings.put(STORE_EMAILADDRESS_ID + repoId, emailPattern.getText());
settings.put(STORE_EMAIL2ADDRESS_ID + repoId, emailPattern2.getText());
settings.put(STORE_EMAIL2MATCH_ID + repoId, emailOperation2.getSelectionIndex());
for (int i = 0; i < emailButtons2.length; i++) {
settings.put(STORE_EMAIL2BUTTON_ID + i + repoId, emailButtons2[i].getSelection());
}
settings.put(STORE_KEYWORDS_ID + repoId, keywords.getText());
settings.put(STORE_KEYWORDSMATCH_ID + repoId, keywordsOperation.getSelectionIndex());
settings.put(STORE_WHITEBOARD_ID + repoId, whiteboardPattern.getText());
settings.put(STORE_WHITEBOARDMATCH_ID + repoId, whiteboardOperation.getSelectionIndex());
ObjectOutputStream outputStream = null;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
try {
outputStream = new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(charts);
outputStream.flush();
settings.put(STORE_CHARTS_ID + repoId, byteArrayOutputStream.toString());
} catch (IOException e) {
throw e;
} finally {
if (outputStream != null) {
outputStream.close();
}
}
} catch (Exception e) {
}
}
/* Testing hook to see if any products are present */
public int getProductCount() throws Exception {
return product.getItemCount();
}
public boolean isRestoreQueryOptions() {
return restoreQueryOptions;
}
public void setRestoreQueryOptions(boolean restoreQueryOptions) {
this.restoreQueryOptions = restoreQueryOptions;
}
private String[] convertStringListToArray(java.util.List<String> stringList) {
return stringList.toArray(new String[stringList.size()]);
}
private void updateConfiguration(final boolean force) {
String[] selectedProducts = product.getSelection();
if (selectedProducts != null && selectedProducts.length == 0) {
selectedProducts = null;
}
if (getTaskRepository() != null) {
IRunnableWithProgress updateRunnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
try {
monitor.beginTask(Messages.BugzillaSearchPage_Updating_search_options_,
IProgressMonitor.UNKNOWN);
BugzillaRepositoryConnector connector = (BugzillaRepositoryConnector) TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
repositoryConfiguration = connector.getRepositoryConfiguration(getTaskRepository(), force,
monitor);
} catch (final Exception e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
};
try {
if (getContainer() != null) {
getContainer().run(true, true, updateRunnable);
} else if (getSearchContainer() != null) {
getSearchContainer().getRunnableContext().run(true, true, updateRunnable);
} else {
IProgressService service = PlatformUI.getWorkbench().getProgressService();
service.busyCursorWhile(updateRunnable);
}
} catch (InvocationTargetException ex) {
Shell shell = null;
shell = getShell();
if (ex.getCause() instanceof CoreException) {
CoreException cause = ((CoreException) ex.getCause());
if (cause.getStatus() instanceof RepositoryStatus
&& ((RepositoryStatus) cause.getStatus()).isHtmlMessage()) {
if (shell != null) {
shell.setEnabled(false);
}
// TODO: eliminate use of internal api
WebBrowserDialog dialog = new WebBrowserDialog(shell,
Messages.BugzillaSearchPage_Error_updating_search_options, null, cause.getStatus()
.getMessage(), NONE, new String[] { IDialogConstants.OK_LABEL }, 0,
((RepositoryStatus) cause.getStatus()).getHtmlMessage());
dialog.setBlockOnOpen(true);
dialog.open();
if (shell != null) {
shell.setEnabled(true);
}
return;
} else {
StatusHandler.log(new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, cause.getMessage(),
cause));
}
}
if (ex.getCause() instanceof OperationCanceledException) {
return;
}
// FIXME improve error reporting
if (!CoreUtil.TEST_MODE) {
MessageDialog.openError(shell, Messages.BugzillaSearchPage_Error_updating_search_options,
MessageFormat.format(Messages.BugzillaSearchPage_Error_was_X, ex.getCause().getMessage()));
}
return;
} catch (InterruptedException ex) {
return;
}
updateAttributesFromConfiguration(selectedProducts);
}
}
@Override
public Shell getShell() {
Shell shell = null;
if (getWizard() != null && getWizard().getContainer() != null) {
shell = getWizard().getContainer().getShell();
}
if (shell == null && getControl() != null) {
shell = getControl().getShell();
}
return shell;
}
private void setSelection(List listControl, String[] selection) {
for (String item : selection) {
int index = listControl.indexOf(item);
if (index > -1) {
listControl.select(index);
}
}
if (listControl.getSelectionCount() > 0) {
listControl.showSelection();
} else {
listControl.select(0);
listControl.showSelection();
listControl.deselectAll();
}
}
@Override
public void dispose() {
if (toolkit != null) {
if (toolkit.getColors() != null) {
toolkit.dispose();
}
}
super.dispose();
}
private void refreshChartControls() {
int chartNumMax = chartControls.size();
for (int chartNum = 0; chartNum < chartNumMax; chartNum++) {
int chartRowMax = chartControls.get(chartNum).size();
for (int chartRow = 0; chartRow < chartRowMax; chartRow++) {
int chartColumnMax = chartControls.get(chartNum).get(chartRow).size();
for (int chartColumn = 0; chartColumn < chartColumnMax; chartColumn++) {
ChartExpression expression = charts.get(chartNum).getChartExpression(chartRow, chartColumn);
ChartControls controls = chartControls.get(chartNum).get(chartRow).get(chartColumn);
controls.getField().setText(chartFieldText[expression.getFieldName()]);
controls.getOperation().setText(chartOperationText[expression.getOperation()]);
controls.getValue().setText(expression.getValue());
}
}
}
int negButtonMax = negateButtons.size();
for (int chartNum = 0; chartNum < negButtonMax; chartNum++) {
Button b = negateButtons.get(chartNum);
Chart c = charts.get(chartNum);
b.setSelection(c.isNegate());
}
scrolledComposite.reflow(true);
}
private void recreateChartControls() {
GridLayout layout;
GridData gd;
if (chartSection.getClient() != null) {
chartSection.getClient().dispose();
}
chartControls.clear();
negateButtons.clear();
Composite chartGroup = new Composite(chartSection, SWT.NONE);
layout = new GridLayout(1, false);
layout.verticalSpacing = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
chartGroup.setLayout(layout);
chartSection.setClient(chartGroup);
int chartNumMax = charts.size();
for (int chartNumber = 0; chartNumber < chartNumMax; chartNumber++) {
final int chartNum = chartNumber;
final Composite chartGroup0 = new Composite(chartGroup, SWT.NONE);
if (chartNum > 0) {
// separator
Label sep = new Label(chartGroup0, SWT.NONE);
sep.setText(" "); //$NON-NLS-1$
gd = new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1);
sep.setLayoutData(gd);
}
layout = new GridLayout(3, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
chartGroup0.setLayout(layout);
gd = new GridData(GridData.FILL, GridData.FILL, true, true, 3, 1);
chartGroup0.setLayoutData(gd);
final int chartRowMax = charts.get(chartNum).getRowSize();
for (int chartRowNumber = 0; chartRowNumber < chartRowMax; chartRowNumber++) {
final int chartRow = chartRowNumber;
int chartColumnMax = charts.get(chartNum).getColumnSize(chartRow);
final Group chartGroup1 = new Group(chartGroup0, SWT.NONE);
layout = new GridLayout(4, false);
chartGroup1.setLayout(layout);
gd = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
chartGroup1.setLayoutData(gd);
for (int chartColumnNumber = 0; chartColumnNumber < chartColumnMax; chartColumnNumber++) {
final int chartColumn = chartColumnNumber;
final Combo comboField = new Combo(chartGroup1, SWT.SINGLE | SWT.BORDER);
comboField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
comboField.addModifyListener(new ModifyListenerImplementation());
comboField.setItems(chartFieldText);
comboField.setText(chartFieldText[0]);
comboField.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ChartExpression chartExpression = charts.get(chartNum).getChartExpression(chartRow,
chartColumn);
chartExpression.setFieldName(comboField.getSelectionIndex());
getShell().layout(true);
getShell().redraw();
}
});
comboField.setToolTipText(Messages.BugzillaSearchPage_Tooltip_Custom_fields_at_end);
final Combo comboOperation = new Combo(chartGroup1, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
comboOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
comboOperation.setItems(chartOperationText);
comboOperation.setText(chartOperationText[0]);
comboOperation.select(0);
comboOperation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ChartExpression chartExpression = charts.get(chartNum).getChartExpression(chartRow,
chartColumn);
chartExpression.setOperation(comboOperation.getSelectionIndex());
}
});
final Combo comboValue = new Combo(chartGroup1, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL, GridData.CENTER, true, false);
gd.widthHint = 150;
comboValue.setLayoutData(gd);
comboValue.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
ChartExpression chartExpression = charts.get(chartNum).getChartExpression(chartRow,
chartColumn);
chartExpression.setValue(comboValue.getText());
if (isControlCreated()) {
setPageComplete(isPageComplete());
}
}
});
Button orButton = new Button(chartGroup1, SWT.PUSH);
orButton.setText(Messages.BugzillaSearchPage_OR_Button);
gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
orButton.setLayoutData(gd);
orButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (e.stateMask == SWT.SHIFT) {
if (charts.size() == 1 && charts.get(0).getRowSize() == 1
&& charts.get(0).getColumnSize(0) == 1) {
return;
}
charts.get(chartNum).removeColumn(chartRow, chartColumn);
if (charts.get(chartNum).getRowSize() == 0) {
if (chartNum != 0) {
charts.remove(chartNum);
}
}
} else {
charts.get(chartNum).addExpression(chartRow, chartColumn + 1);
}
recreateChartControls();
}
});
orButton.setToolTipText(Messages.BugzillaSearchPage_Tooltip_remove_row);
ChartControls chartControl = new ChartControls(comboField, comboOperation, comboValue);
int chart1 = chartControls.size();
if (chart1 < chartNum + 1) {
chartControls.add(new ArrayList<ArrayList<ChartControls>>());
}
int chart2 = chartControls.get(chartNum).size();
if (chart2 < chartRow + 1) {
chartControls.get(chartNum).add(new ArrayList<BugzillaSearchPage.ChartControls>());
}
chartControls.get(chartNum).get(chartRow).add(chartControl);
}
if (chartRowNumber < chartRowMax - 1) {
Label lable = new Label(chartGroup0, SWT.NONE);
lable.setText(Messages.BugzillaSearchPage_AND_Button);
GridData g = new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1);
lable.setLayoutData(g);
} else {
final Button andButton = new Button(chartGroup0, SWT.PUSH);
andButton.setText(Messages.BugzillaSearchPage_AND_Button);
gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
andButton.setLayoutData(gd);
final Button newButton = new Button(chartGroup0, SWT.PUSH);
newButton.setText(Messages.BugzillaSearchPage_Add_Chart_Button);
gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
newButton.setLayoutData(gd);
final Button negateButton = new Button(chartGroup0, SWT.CHECK);
negateButton.setText(Messages.BugzillaSearchPage_Negate_Button);
negateButtons.add(negateButton);
gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
negateButton.setLayoutData(gd);
negateButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Chart chart = charts.get(chartNum);
chart.setNegate(negateButton.getSelection());
}
});
newButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
newButton.setVisible(false);
newButton.dispose();
charts.add(chartNum + 1, new Chart());
recreateChartControls();
}
});
andButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
charts.get(chartNum).addExpression(chartRow + 1, 0);
recreateChartControls();
}
});
}
}
}
chartSection.layout(true);
scrolledComposite.reflow(true);
refreshChartControls();
Dialog.applyDialogFont(chartSection);
}
public BugzillaSearchPage(TaskRepository repository) {
super(Messages.BugzillaSearchPage_Bugzilla_Query, repository, null);
toolkit = new FormToolkit(Display.getCurrent());
setNeedsClearButton(true);
setMessage(Messages.BugzillaSearchPage_Enter_search_option);
BugzillaRepositoryConnector connector = (BugzillaRepositoryConnector) TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
repositoryConfiguration = connector.getRepositoryConfiguration(getTaskRepository().getUrl());
}
public BugzillaSearchPage(TaskRepository repository, IRepositoryQuery origQuery) {
super(Messages.BugzillaSearchPage_Bugzilla_Query, repository, origQuery);
originalQuery = origQuery;
setNeedsClearButton(true);
setDescription(Messages.BugzillaSearchPage_Select_the_Bugzilla_query_parameters);
setMessage(Messages.BugzillaSearchPage_Enter_search_option);
toolkit = new FormToolkit(Display.getCurrent());
BugzillaRepositoryConnector connector = (BugzillaRepositoryConnector) TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
repositoryConfiguration = connector.getRepositoryConfiguration(getTaskRepository().getUrl());
}
@Override
protected void createPageContent(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout(layout);
createOptionsGroup(composite);
}
@Override
protected boolean hasRepositoryConfiguration() {
return repositoryConfiguration != null;
}
@Override
protected void doRefresh() {
// ignore
}
@Override
protected boolean restoreState(IRepositoryQuery query) {
if (originalQuery != null) {
try {
updateDefaults(originalQuery.getUrl());
refreshChartControls();
} catch (UnsupportedEncodingException e) {
// ignore
}
}
return false;
}
@Override
public void applyTo(IRepositoryQuery query) {
query.setUrl(getQueryURL(getTaskRepository(), getQueryParameters()));
query.setSummary(getQueryTitle());
saveState();
}
}