Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteffen Pingel2011-09-16 12:30:35 -0400
committerSteffen Pingel2011-09-16 12:30:35 -0400
commit6e184421ca62955dc533b039f58e824abb4786c6 (patch)
tree5cd676c5b41105305d9130b8e37f691a9945d9a6 /org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks
parent6d8a2fc7c721e548710f2b05e6b1ce818efac316 (diff)
downloadorg.eclipse.mylyn.tasks-6e184421ca62955dc533b039f58e824abb4786c6.tar.gz
org.eclipse.mylyn.tasks-6e184421ca62955dc533b039f58e824abb4786c6.tar.xz
org.eclipse.mylyn.tasks-6e184421ca62955dc533b039f58e824abb4786c6.zip
NEW - bug 245152: opening "Task Search" blocks UI when page is first
shown https://bugs.eclipse.org/bugs/show_bug.cgi?id=245152 Change-Id: I2ca9f5e0e7aac6f3cf1ee735f41e40c634867cfd
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks')
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java2
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage2.java426
2 files changed, 428 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java
index 0140e79ef..09d75c7d3 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java
@@ -32,6 +32,8 @@ import org.eclipse.swt.widgets.Control;
/**
* Extend to provide repository-specific query page to the Workbench search dialog.
+ * <p>
+ * It is recommended that clients extend {@link AbstractRepositoryQueryPage2} instead.
*
* @author Rob Elves
* @author Steffen Pingel
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage2.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage2.java
new file mode 100644
index 000000000..2b4204c8c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage2.java
@@ -0,0 +1,426 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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.tasks.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.ProgressMonitorPart;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ProgressContainer;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.QueryWizardDialog;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+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.layout.FillLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Steffen Pingel
+ * @author Frank Becker
+ * @since 3.7
+ */
+public abstract class AbstractRepositoryQueryPage2 extends AbstractRepositoryQueryPage {
+
+ private Button cancelButton;
+
+ private final AbstractRepositoryConnector connector;
+
+ private boolean firstTime = true;
+
+ private Composite innerComposite;
+
+ private boolean needsClear;
+
+ private boolean needsRefresh = true;
+
+ private ProgressContainer progressContainer;
+
+ private Button refreshButton;
+
+ private Text titleText;
+
+ private Composite buttonComposite;
+
+ public AbstractRepositoryQueryPage2(String pageName, TaskRepository repository, IRepositoryQuery query) {
+ super(pageName, repository, query);
+ this.connector = TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
+ setTitle(Messages.AbstractRepositoryQueryPage2_Enter_query_parameters);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(composite);
+ GridLayout layout = new GridLayout(2, false);
+ if (inSearchContainer()) {
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ }
+ composite.setLayout(layout);
+
+ createTitleGroup(composite);
+
+ innerComposite = new Composite(composite, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).span(2, 1).applyTo(innerComposite);
+ innerComposite.setLayout(new FillLayout());
+ createPageContent(innerComposite);
+
+ createButtonGroup(composite);
+
+ if (!needsRefresh) {
+ setDescription(Messages.AbstractRepositoryQueryPage2_Create_a_Query_Page_Description);
+ }
+
+ if (getQuery() != null) {
+ titleText.setText(getQuery().getSummary());
+ restoreState(getQuery());
+ }
+
+ Dialog.applyDialogFont(composite);
+ setControl(composite);
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return (titleText != null) ? titleText.getText() : null;
+ }
+
+ public boolean handleExtraButtonPressed(int buttonId) {
+ if (buttonId == QueryWizardDialog.REFRESH_BUTTON_ID) {
+ if (getTaskRepository() != null) {
+ updateAttributesFromRepository(true);
+ } else {
+ MessageDialog.openInformation(
+ Display.getCurrent().getActiveShell(),
+ Messages.AbstractRepositoryQueryPage2_Update_Attributes_Failed,
+ Messages.AbstractRepositoryQueryPage2_No_repository_available_please_add_one_using_the_Task_Repositories_view);
+ }
+ return true;
+ } else if (buttonId == QueryWizardDialog.CLEAR_BUTTON_ID) {
+ doClearFields();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (titleText != null && titleText.getText().length() > 0) {
+ return true;
+ }
+ setMessage(Messages.AbstractRepositoryQueryPage2_Enter_a_title);
+ return false;
+ }
+
+ public boolean needsClear() {
+ return needsClear;
+ }
+
+ public boolean needsRefresh() {
+ return needsRefresh;
+ }
+
+ @Override
+ public boolean performSearch() {
+ if (inSearchContainer()) {
+ saveState();
+ }
+ return super.performSearch();
+ }
+
+ @Override
+ public void saveState() {
+ if (inSearchContainer()) {
+ RepositoryQuery query = new RepositoryQuery(getTaskRepository().getConnectorKind(), "handle"); //$NON-NLS-1$
+ applyTo(query);
+
+ IDialogSettings settings = getDialogSettings();
+ settings.put(getSavedStateSettingKey(), query.getRepositoryUrl());
+ }
+ }
+
+ public void setExtraButtonState(Button button) {
+ Integer obj = (Integer) button.getData();
+ if (obj == QueryWizardDialog.REFRESH_BUTTON_ID) {
+ if (needsRefresh) {
+ if (!button.isVisible()) {
+ button.setVisible(true);
+ }
+ button.setEnabled(true);
+ } else {
+ if (button != null && button.isVisible()) {
+ button.setVisible(false);
+ }
+ }
+ } else if (obj == QueryWizardDialog.CLEAR_BUTTON_ID) {
+ if (!button.isVisible()) {
+ button.setVisible(true);
+ }
+ button.setEnabled(true);
+ }
+
+ }
+
+ public void setNeedsClear(boolean needsClearButton) {
+ this.needsClear = needsClearButton;
+ }
+
+ public void setNeedsRefresh(boolean needsRepositoryConfiguration) {
+ this.needsRefresh = needsRepositoryConfiguration;
+ }
+
+ public void setQueryTitle(String text) {
+ if (titleText != null) {
+ titleText.setText(text);
+ }
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+
+ if (getSearchContainer() != null) {
+ getSearchContainer().setPerformActionEnabled(true);
+ }
+
+ if (visible && firstTime) {
+ firstTime = false;
+ if (!hasRepositoryConfiguration() && needsRefresh) {
+ // delay the execution so the dialog's progress bar is visible
+ // when the attributes are updated
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (getControl() != null && !getControl().isDisposed()) {
+ initializePage();
+ }
+ }
+
+ });
+ } else {
+ // no remote connection is needed to get attributes therefore do
+ // not use delayed execution to avoid flickering
+ initializePage();
+ }
+ }
+ }
+
+ private void createButtonGroup(Composite parent) {
+ buttonComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ buttonComposite.setLayout(layout);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(buttonComposite);
+ createButtons(buttonComposite);
+ layout.numColumns = buttonComposite.getChildren().length;
+ }
+
+ private void createTitleGroup(Composite control) {
+ if (inSearchContainer()) {
+ return;
+ }
+
+ Label titleLabel = new Label(control, SWT.NONE);
+ titleLabel.setText(Messages.AbstractRepositoryQueryPage2__Title_);
+
+ titleText = new Text(control, SWT.BORDER);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(titleText);
+ titleText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ getContainer().updateButtons();
+ }
+ });
+ }
+
+ private void initializePage() {
+ if (needsRefresh) {
+ updateAttributesFromRepository(false);
+ }
+ boolean restored = (getQuery() != null);
+ if (inSearchContainer()) {
+ restored |= restoreSavedState();
+ }
+ if (!restored) {
+ // initialize with default values
+ }
+ }
+
+ private void updateAttributesFromRepository(final boolean force) {
+ if (!hasRepositoryConfiguration() || force) {
+ setErrorMessage(null);
+ try {
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ monitor = SubMonitor.convert(monitor);
+ monitor.beginTask(Messages.AbstractRepositoryQueryPage2_Refresh_Configuration_Button_Label,
+ IProgressMonitor.UNKNOWN);
+ try {
+ connector.updateRepositoryConfiguration(getTaskRepository(), monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+
+ if (getContainer() != null) {
+ getContainer().run(true, true, runnable);
+ } else if (progressContainer != null) {
+ progressContainer.run(true, true, runnable);
+ } else if (getSearchContainer() != null) {
+ getSearchContainer().getRunnableContext().run(true, true, runnable);
+ } else {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.busyCursorWhile(runnable);
+ }
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ setErrorMessage(((CoreException) e.getCause()).getStatus().getMessage());
+ } else {
+ setErrorMessage(e.getCause().getMessage());
+ }
+ return;
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+
+ doRefresh();
+ }
+
+ protected void createButtons(final Composite composite) {
+ if (getContainer() instanceof QueryWizardDialog) {
+ // refresh and clear buttons are provided by the dialog
+ return;
+ }
+ if (needsRefresh) {
+ refreshButton = new Button(composite, SWT.PUSH);
+ refreshButton.setText(Messages.AbstractRepositoryQueryPage2__Refresh_From_Repository);
+ refreshButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (getTaskRepository() != null) {
+ updateAttributesFromRepository(true);
+ } else {
+ MessageDialog.openInformation(
+ Display.getCurrent().getActiveShell(),
+ Messages.AbstractRepositoryQueryPage2_Update_Attributes_Failed,
+ Messages.AbstractRepositoryQueryPage2_No_repository_available_please_add_one_using_the_Task_Repositories_view);
+ }
+ }
+ });
+ }
+ if (needsClear) {
+ Button clearButton = new Button(composite, SWT.PUSH);
+ clearButton.setText(Messages.AbstractRepositoryQueryPage2_Clear_Fields);
+ clearButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ doClearFields();
+ }
+ });
+ }
+ final ProgressMonitorPart progressMonitorPart = new ProgressMonitorPart(composite, null);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, false).applyTo(progressMonitorPart);
+ progressMonitorPart.setVisible(false);
+ progressContainer = new ProgressContainer(composite.getShell(), progressMonitorPart) {
+ @Override
+ protected void restoreUiState(java.util.Map<Object, Object> state) {
+ cancelButton.setVisible(false);
+ CommonUiUtil.setEnabled(innerComposite, true);
+ for (Control control : buttonComposite.getChildren()) {
+ if (control instanceof ProgressMonitorPart) {
+ break;
+ }
+ control.setEnabled(true);
+ }
+ }
+
+ @Override
+ protected void saveUiState(java.util.Map<Object, Object> savedState) {
+ CommonUiUtil.setEnabled(innerComposite, false);
+ for (Control control : buttonComposite.getChildren()) {
+ if (control instanceof ProgressMonitorPart) {
+ break;
+ }
+ control.setEnabled(false);
+ }
+ cancelButton.setEnabled(true);
+ cancelButton.setVisible(true);
+ }
+ };
+
+ cancelButton = new Button(composite, SWT.PUSH);
+ cancelButton.setText(IDialogConstants.CANCEL_LABEL);
+ cancelButton.setVisible(false);
+ progressContainer.setCancelButton(cancelButton);
+ }
+
+ protected abstract void createPageContent(Composite parent);
+
+ protected void doClearFields() {
+ }
+
+ protected abstract void doRefresh();
+
+ protected AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ protected String getSavedStateSettingKey() {
+ return getName() + "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+ }
+
+ protected abstract boolean hasRepositoryConfiguration();
+
+ protected boolean restoreSavedState() {
+ IDialogSettings settings = getDialogSettings();
+ String queryUrl = settings.get(getSavedStateSettingKey());
+ if (queryUrl != null) {
+ RepositoryQuery query = new RepositoryQuery(getTaskRepository().getConnectorKind(), "handle"); //$NON-NLS-1$
+ query.setUrl(queryUrl);
+ return restoreState(query);
+ }
+ return false;
+ }
+
+ protected abstract boolean restoreState(IRepositoryQuery query);
+
+}

Back to the top