blob: 14ed816770ee9706f551a5b73cb6490ff8d3c992 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Mia-Software.
* 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:
* Nicolas Bros (Mia-Software)
*******************************************************************************/
package org.eclipse.gmt.modisco.infra.query.ui.dialogs;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.gmt.modisco.infra.common.ui.internal.util.ImageProvider;
import org.eclipse.gmt.modisco.infra.query.ModelQuery;
import org.eclipse.gmt.modisco.infra.query.ModelQuerySet;
import org.eclipse.gmt.modisco.infra.query.core.ModelQuerySetCatalog;
import org.eclipse.gmt.modisco.infra.query.ui.Activator;
import org.eclipse.gmt.modisco.infra.query.ui.Messages;
import org.eclipse.gmt.modisco.infra.query.ui.controls.QueryFilteredTree;
import org.eclipse.gmt.modisco.infra.query.ui.wizards.CreateQueryWizard;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
/**
* A dialog to select a {@link ModelQuery}
* @deprecated replaced by EMF Facet, cf. https://bugs.eclipse.org/bugs/show_bug.cgi?id=470578
*/
@Deprecated
public class QuerySelectionDialog extends Dialog {
private static final int INITIAL_WIDTH = 400;
private static final int INITIAL_HEIGHT = 400;
private Collection<ModelQuerySet> fQuerySets;
private final List<ViewerFilter> viewerFilters;
private QueryFilteredTree filteredTree;
private final boolean multiSelection;
private List<ModelQuery> selectedQueries;
/**
* @param parentShell
* the parent shell
* @param querySets
* the query sets from which queries will be selectable. If
* <code>null</code>, all query sets will be displayed.
* @param viewerFilters
* optional filters for selectable queries (can be
* <code>null</code> if no filtering is required)
*/
public QuerySelectionDialog(final Shell parentShell, final boolean multiSelection,
final Collection<ModelQuerySet> querySets, final List<ViewerFilter> viewerFilters) {
super(parentShell);
this.multiSelection = multiSelection;
if (querySets == null) {
this.fQuerySets = ModelQuerySetCatalog.getSingleton().getAllModelQuerySets();
} else {
this.fQuerySets = querySets;
}
this.viewerFilters = viewerFilters;
}
@Override
protected Control createDialogArea(final Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
// composite.setLayout(new GridLayout());
this.filteredTree = new QueryFilteredTree(composite, this.fQuerySets, this.viewerFilters,
this.multiSelection);
createContextMenu(this.filteredTree.getViewer());
// double-click or enter to choose the selected query
this.filteredTree.getViewer().addOpenListener(new IOpenListener() {
public void open(final OpenEvent event) {
QuerySelectionDialog.this.okPressed();
}
});
return composite;
}
private class OpenCreateQueryWizardAction extends Action {
private final ModelQuerySet modelQuerySet;
public OpenCreateQueryWizardAction(final ModelQuerySet modelQuerySet) {
this.modelQuerySet = modelQuerySet;
setText(Messages.QuerySelectionDialog_createQuery);
}
@SuppressWarnings("synthetic-access")
@Override
public void run() {
final CreateQueryWizard createQueryWizard = new CreateQueryWizard(this.modelQuerySet,
null, null, null);
WizardDialog wizardDialog = new WizardDialog(null, createQueryWizard);
if (wizardDialog.open() == Window.OK) {
Job refreshJob = new Job(Messages.QuerySelectionDialog_refreshQuerySetsJob) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
try {
// rebuild the query catalog
ResourcesPlugin.getWorkspace().build(
IncrementalProjectBuilder.FULL_BUILD, monitor);
} catch (CoreException e) {
MoDiscoLogger.logError(e, Activator.getDefault());
}
// the query sets have been re-created => find by name
Collection<ModelQuerySet> oldQuerySets = new ArrayList<ModelQuerySet>(
QuerySelectionDialog.this.fQuerySets);
final Collection<ModelQuerySet> newQuerySets = new ArrayList<ModelQuerySet>();
for (ModelQuerySet oldQuerySet : oldQuerySets) {
ModelQuerySet querySet = ModelQuerySetCatalog.getSingleton()
.getModelQuerySet(oldQuerySet.getName());
if (querySet != null) {
newQuerySets.add(querySet);
}
}
QuerySelectionDialog.this.fQuerySets = newQuerySets;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
QuerySelectionDialog.this.filteredTree.setInput(newQuerySets);
// select the created query
ModelQuery createdModelQuery = createQueryWizard
.getCreatedModelQuery();
ModelQuerySet querySet = ModelQuerySetCatalog.getSingleton()
.getModelQuerySet(
createdModelQuery.getModelQuerySet().getName());
ModelQuery query = querySet.getQuery(createdModelQuery.getName());
QuerySelectionDialog.this.filteredTree.getViewer().setSelection(
new StructuredSelection(query), true);
}
});
return Status.OK_STATUS;
}
};
refreshJob.setPriority(Job.DECORATE);
refreshJob.schedule();
}
}
}
private void createContextMenu(final TreeViewer viewer) {
final MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new IMenuListener() {
public void menuAboutToShow(final IMenuManager manager) {
ISelection selection = viewer.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.size() == 1) {
Object firstElement = structuredSelection.getFirstElement();
if (firstElement instanceof ModelQuerySet) {
final ModelQuerySet modelQuerySet = (ModelQuerySet) firstElement;
manager.add(new OpenCreateQueryWizardAction(modelQuerySet));
return;
}
}
}
manager.add(new OpenCreateQueryWizardAction(null));
}
});
final Menu menu = contextMenu.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
}
@Override
protected void configureShell(final Shell shell) {
super.configureShell(shell);
shell.setText(Messages.QuerySelectionDialog_selectQuery);
shell.setImage(ImageProvider.getInstance().getModiscoLogo());
IDialogSettings dialogBoundsSettings = getDialogBoundsSettings();
// initialize size if not yet saved (see Dialog#DIALOG_WIDTH)
if (dialogBoundsSettings.get("DIALOG_WIDTH") == null) { //$NON-NLS-1$
Rectangle parent = getParentShell().getBounds();
// Rectangle desktop = Display.getCurrent().getClientArea();
// center
shell.setBounds(parent.x + parent.width / 2 - QuerySelectionDialog.INITIAL_WIDTH / 2,
parent.y + parent.height / 2 - QuerySelectionDialog.INITIAL_HEIGHT / 2,
QuerySelectionDialog.INITIAL_WIDTH, QuerySelectionDialog.INITIAL_HEIGHT);
}
}
@Override
protected boolean isResizable() {
return true;
}
@Override
protected IDialogSettings getDialogBoundsSettings() {
final String sectionName = this.getClass().getName() + ".settings"; //$NON-NLS-1$
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(sectionName);
if (section == null) {
section = settings.addNewSection(sectionName);
}
return section;
}
@Override
protected void okPressed() {
this.selectedQueries = new ArrayList<ModelQuery>();
ISelection selection = this.filteredTree.getViewer().getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Iterator<?> iterator = structuredSelection.iterator();
while (iterator.hasNext()) {
Object selectedElement = iterator.next();
if (selectedElement instanceof ModelQuery) {
this.selectedQueries.add((ModelQuery) selectedElement);
}
}
}
super.okPressed();
}
public List<ModelQuery> getSelectedQueries() {
return Collections.unmodifiableList(this.selectedQueries);
}
}