blob: cb1e4403592c1819ab4bbf5ae13641658daf72ee [file] [log] [blame]
/*******************************************************************************
* 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
*******************************************************************************/
package org.eclipse.mylyn.internal.provisional.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.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.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
* @since 3.1
*/
public abstract class AbstractRepositoryQueryPage2 extends AbstractRepositoryQueryPage {
private Text titleText;
private Button updateButton;
private boolean firstTime = true;
private final AbstractRepositoryConnector connector;
private boolean needsRepositoryConfiguration = true;
private boolean needsClearButton = false;
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 setNeedsRepositoryConfiguration(boolean needsRepositoryConfiguration) {
this.needsRepositoryConfiguration = needsRepositoryConfiguration;
}
public void setNeedsClearButton(boolean needsClearButton) {
this.needsClearButton = needsClearButton;
}
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);
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 (!needsRepositoryConfiguration) {
setDescription(Messages.AbstractRepositoryQueryPage2_Create_a_Query_Page_Description);
}
if (getQuery() != null) {
titleText.setText(getQuery().getSummary());
restoreState(getQuery());
}
Dialog.applyDialogFont(composite);
setControl(composite);
}
protected abstract void createPageContent(Composite parent);
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.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
// ignore
}
public void keyReleased(KeyEvent e) {
getContainer().updateButtons();
}
});
}
private void createButtonGroup(Composite control) {
Composite composite = new Composite(control, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setLayout(layout);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(composite);
createButtons(composite);
}
protected void createButtons(final Composite control) {
if (getSearchContainer() == null) {
return;
}
if (needsClearButton) {
Button clearButton = new Button(control, SWT.PUSH);
clearButton.setText(Messages.AbstractRepositoryQueryPage2_Clear_Fields);
clearButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
clearButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
clearFields();
}
});
}
if (needsRepositoryConfiguration) {
updateButton = new Button(control, SWT.PUSH);
updateButton.setText(Messages.AbstractRepositoryQueryPage2__Refresh_From_Repository);
updateButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
// updateButton.setImage(TasksUiImages.REPOSITORY_UPDATE_CONFIGURATION.createImage());
updateButton.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);
}
}
});
}
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (getSearchContainer() != null) {
getSearchContainer().setPerformActionEnabled(true);
}
if (visible && firstTime) {
firstTime = false;
if (!hasRepositoryConfiguration() && needsRepositoryConfiguration) {
// 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 initializePage() {
if (needsRepositoryConfiguration) {
updateAttributesFromRepository(false);
}
boolean restored = (getQuery() != null);
if (inSearchContainer()) {
restored |= restoreState(null);
}
if (!restored) {
// initialize with default values
}
}
protected abstract boolean hasRepositoryConfiguration();
protected AbstractRepositoryConnector getConnector() {
return connector;
}
private void updateAttributesFromRepository(final boolean force) {
if (!hasRepositoryConfiguration() || force) {
setErrorMessage(null);
try {
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
connector.updateRepositoryConfiguration(getTaskRepository(), monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
} catch (OperationCanceledException e) {
throw new InterruptedException();
}
}
};
if (getContainer() != null) {
getContainer().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 abstract void doRefresh();
@Override
public boolean isPageComplete() {
if (titleText != null && titleText.getText().length() > 0) {
return true;
}
setMessage(Messages.AbstractRepositoryQueryPage2_Enter_a_title);
return false;
}
@Override
public boolean performSearch() {
if (inSearchContainer()) {
saveState();
}
return super.performSearch();
}
protected abstract boolean restoreState(IRepositoryQuery query);
@Override
public String getQueryTitle() {
return (titleText != null) ? titleText.getText() : null;
}
public void setQueryTitle(String text) {
if (titleText != null) {
titleText.setText(text);
}
}
public void setExtraButtonState(Button button) {
Integer obj = (Integer) button.getData();
if (obj == QueryWizardDialog.UPDATE_BUTTON_ID) {
if (needsRepositoryConfiguration) {
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 boolean handleExtraButtonPressed(int buttonId) {
if (buttonId == QueryWizardDialog.UPDATE_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) {
clearFields();
return true;
}
return false;
}
public void clearFields() {
}
}