/******************************************************************************* * Copyright (c) 2014 Fraunhofer IWU 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: * Fraunhofer IWU - initial API and implementation *******************************************************************************/ package net.enilink.komma.edit.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import net.enilink.komma.edit.domain.IEditingDomain; import net.enilink.komma.edit.refactor.Change; import net.enilink.komma.edit.refactor.RefactoringProcessor; import net.enilink.komma.model.IModel; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbench; public class RefactorMoveWizard extends Wizard { protected WizardPage selectModelPage; protected WizardPage showPreviewPage; protected IModel targetModel; protected boolean keepNamespace; protected Collection<Change> changes; protected Composite containerComposite; protected IWorkbench workbench; protected IEditingDomain domain; protected IStructuredSelection currentSelection; @Override public void createPageControls(Composite pageContainer) { super.createPageControls(pageContainer); containerComposite = pageContainer; } public RefactorMoveWizard(IEditingDomain domain, IWorkbench workbench, IStructuredSelection currentSelection) { this.domain = domain; this.workbench = workbench; this.currentSelection = currentSelection; this.keepNamespace = false; setWindowTitle("Refactor - Move content between models"); setNeedsProgressMonitor(true); createPages(); } protected void createPages() { selectModelPage = new WizardPage("Select Target Model") { @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); Label label = new Label(composite, SWT.NONE); label.setText("Select target model:"); final Combo combo = new Combo(composite, SWT.DROP_DOWN); final ComboViewer cViewer = new ComboViewer(combo); cViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { targetModel = (IModel) cViewer.getElementAt(combo .getSelectionIndex()); setPageComplete(true); } }); // get potential target models from list of active editors IEditorReference[] openEditors = workbench .getActiveWorkbenchWindow().getActivePage() .getEditorReferences(); for (IEditorReference ref : openEditors) { IEditorPart editor = ref.getEditor(true); if (editor != null && editor != workbench.getActiveWorkbenchWindow() .getActivePage().getActiveEditor()) { IModel model = (IModel) editor.getAdapter(IModel.class); if (model != null) { cViewer.add(model); } } } final Button keepNamespaceButton = new Button(composite, SWT.CHECK); keepNamespaceButton.setSelection(keepNamespace); keepNamespaceButton.setText("Keep namespaces"); keepNamespaceButton .addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { keepNamespace = keepNamespaceButton .getSelection(); } }); setDescription("Select the target model from the list of open editors."); setControl(composite); setPageComplete(false); } }; showPreviewPage = new RefactorPreviewPage("Preview") { @Override public Collection<Change> collectChanges() { changes = new RefactoringProcessor(domain).createMoveChanges( currentSelection.toList(), targetModel, keepNamespace); return changes; } }; } @Override public void addPages() { addPage(selectModelPage); addPage(showPreviewPage); } @Override public IWizardPage getPreviousPage(IWizardPage currentPage) { if (currentPage == showPreviewPage) { return selectModelPage; } return null; } @Override public IWizardPage getNextPage(IWizardPage currentPage) { if (currentPage == selectModelPage) { return showPreviewPage; } return null; } public boolean canFinish() { return showPreviewPage.isPageComplete() && getContainer().getCurrentPage() == showPreviewPage; } @Override public boolean performFinish() { // call RefactoringProcessor again to apply the confirmed changes try { getContainer().run(true, false, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IStatus result = new RefactoringProcessor(domain) .applyChanges(changes, monitor, null); if (!result.isOK()) { if (result.getException() != null) { result.getException().printStackTrace(); } } } }); return true; } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return false; } }