/*******************************************************************************
* Copyright (c) 2012, 2014 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.ui.wizards.pages;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreePathContentProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
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.graphics.Font;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.te.runtime.persistence.interfaces.IURIPersistenceService;
import org.eclipse.tcf.te.runtime.services.ServiceManager;
import org.eclipse.tcf.te.tcf.core.interfaces.IExportPersistenceService;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.locator.model.ModelManager;
import org.eclipse.tcf.te.tcf.ui.nls.Messages;
import org.eclipse.tcf.te.ui.views.navigator.DelegatingLabelProvider;
import org.eclipse.ui.progress.UIJob;
/**
* PeerExportWizardPage
*/
public class PeerExportWizardPage extends WizardPage {
private static final int SIZING_TEXT_FIELD_WIDTH = 250;
private static final String OVERWRITE = "overwrite"; //$NON-NLS-1$
private static final String OLD_PATH = "oldpath"; //$NON-NLS-1$
CheckboxTableViewer fViewer;
Text fDestinationField;
private Button fDestinationButton;
private Button fOverwrite;
private IStructuredSelection fSelection;
/**
* Constructor
*/
public PeerExportWizardPage(IStructuredSelection selection) {
super(Messages.PeerExportWizard_title);
setTitle(Messages.PeerExportWizard_title);
setMessage(Messages.PeerExportWizard_message);
fSelection = selection;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
| GridData.HORIZONTAL_ALIGN_FILL));
composite.setFont(parent.getFont());
createPeersGroup(composite);
createDestinationGroup(composite);
List<IPeerNode> elements = new ArrayList<IPeerNode>();
Iterator<Object> it = fSelection.iterator();
while (it.hasNext()) {
Object element = it.next();
IPeerNode peerNode = (IPeerNode)Platform.getAdapterManager().getAdapter(element, IPeerNode.class);
if (peerNode != null) {
elements.add((IPeerNode)element);
}
}
fViewer.setCheckedElements(elements.toArray());
setPageComplete(isComplete());
setErrorMessage(null);
setControl(composite);
}
/**
* Creates the checkbox tree and list for selecting peers.
*
* @param parent the parent control
*/
private final void createPeersGroup(Composite parent) {
Composite resourcesGroup = new Composite(parent, SWT.NONE);
resourcesGroup.setLayout(new GridLayout());
resourcesGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
resourcesGroup.setFont(parent.getFont());
new Label(resourcesGroup, SWT.NONE).setText(Messages.PeerExportWizardPage_peers_label);
Table table= new Table(resourcesGroup, SWT.CHECK | SWT.BORDER);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
fViewer= new CheckboxTableViewer(table);
fViewer.setContentProvider(new ITreePathContentProvider() {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IPeerModel) {
IPeerNode[] nodes = ((IPeerModel)inputElement).getPeerNodes();
List<IPeerNode> filteredNodes = new ArrayList<IPeerNode>();
for (IPeerNode node : nodes) {
if (node.isVisible()) {
filteredNodes.add(node);
}
}
return filteredNodes.toArray();
}
return new Object[0];
}
@Override
public Object[] getChildren(TreePath parentPath) {
return null;
}
@Override
public boolean hasChildren(TreePath path) {
return false;
}
@Override
public TreePath[] getParents(Object element) {
return null;
}
});
fViewer.setLabelProvider(new DelegatingLabelProvider());
ICheckStateListener checkListener = new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
setPageComplete(isComplete());
}
};
fViewer.addCheckStateListener(checkListener);
fViewer.setInput(ModelManager.getPeerModel());
// top level group
Composite buttonComposite = new Composite(resourcesGroup, SWT.NONE);
buttonComposite.setFont(parent.getFont());
GridLayout layout = new GridLayout(2, true);
layout.marginHeight= layout.marginWidth= 0;
buttonComposite.setLayout(layout);
buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
Button selectButton = createButton(buttonComposite,
IDialogConstants.SELECT_ALL_ID, Messages.PeerExportWizardPage_selectAll, false);
selectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fViewer.setAllChecked(true);
setPageComplete(isComplete());
}
});
Button deselectButton = createButton(buttonComposite,
IDialogConstants.DESELECT_ALL_ID, Messages.PeerExportWizardPage_deselectAll, false);
deselectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fViewer.setAllChecked(false);
setPageComplete(isComplete());
}
});
}
private Button createButton(Composite parent, int id, String label,
boolean defaultButton) {
Button button = new Button(parent, SWT.PUSH);
GridData buttonData = new GridData(GridData.FILL_HORIZONTAL);
button.setLayoutData(buttonData);
button.setData(Integer.valueOf(id));
button.setText(label);
button.setFont(parent.getFont());
if (defaultButton) {
Shell shell = parent.getShell();
if (shell != null) {
shell.setDefaultButton(button);
}
button.setFocus();
}
button.setFont(parent.getFont());
setButtonLayoutData(button);
return button;
}
private void createDestinationGroup(Composite parent) {
Font font = parent.getFont();
// destination specification group
Composite destinationSelectionGroup = new Composite(parent, SWT.NONE);
destinationSelectionGroup.setLayout(new GridLayout(3, false));
destinationSelectionGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
destinationSelectionGroup.setFont(font);
Label destinationLabel = new Label(destinationSelectionGroup, SWT.NONE);
destinationLabel.setText(Messages.PeerExportWizardPage_destination_label);
destinationLabel.setFont(font);
// destination name entry field
fDestinationField = new Text(destinationSelectionGroup, SWT.BORDER);
fDestinationField.setFont(font);
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = GridData.FILL;
gd.widthHint = SIZING_TEXT_FIELD_WIDTH;
fDestinationField.setLayoutData(gd);
if (getDialogSettings().get(OLD_PATH) != null) {
fDestinationField.setText(getDialogSettings().get(OLD_PATH));
}
fDestinationField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
setPageComplete(isComplete());
}
});
fDestinationButton = createButton(destinationSelectionGroup, IDialogConstants.SELECT_ALL_ID, Messages.PeerExportWizardPage_destination_button, false);
fDestinationButton.addSelectionListener(new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@SuppressWarnings("synthetic-access")
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dd = new DirectoryDialog(getContainer().getShell());
dd.setText(Messages.PeerExportWizardPage_destination_label);
String file = dd.open();
if(file != null) {
IPath path = new Path(file);
fDestinationField.setText(path.toOSString());
setPageComplete(isComplete());
}
}
});
fOverwrite = new Button(destinationSelectionGroup, SWT.CHECK);
fOverwrite.setText(Messages.PeerExportWizardPage_overwrite_button);
gd = new GridData();
gd.horizontalSpan = 3;
fOverwrite.setLayoutData(gd);
fOverwrite.setSelection(getDialogSettings().getBoolean(OVERWRITE));
}
/**
* Returns if the page is complete
* @return true if the page is complete and can be 'finished', false otherwise
*/
protected boolean isComplete() {
Object[] elements = fViewer.getCheckedElements();
boolean selected = false;
for (Object element : elements) {
if(element instanceof IPeerNode) {
selected = true;
break;
}
}
if(elements.length < 1 || !selected) {
setErrorMessage(Messages.PeerExportWizardPage_peersMissing_error);
return false;
}
String path = fDestinationField.getText().trim();
if(path.length() == 0) {
setErrorMessage(Messages.PeerExportWizardPage_destinationMissing_error);
return false;
}
File dir = new File(path);
if (dir.isFile()) {
setErrorMessage(Messages.PeerExportWizardPage_destinationIsFile_error);
return false;
}
if (!dir.isAbsolute()) {
setErrorMessage(Messages.PeerExportWizardPage_destinationMissing_error);
return false;
}
setErrorMessage(null);
setMessage(Messages.PeerExportWizard_message);
return true;
}
public boolean finish() {
final Object[] configs = fViewer.getCheckedElements();
final boolean overwrite = fOverwrite.getSelection();
final String path = fDestinationField.getText().trim();
IDialogSettings settings = getDialogSettings();
settings.put(OVERWRITE, overwrite);
settings.put(OLD_PATH, path);
UIJob exportjob = new UIJob(getContainer().getShell().getDisplay(), Messages.PeerExportWizard_title) {
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if(monitor == null) {
monitor = new NullProgressMonitor();
}
IPath destpath = new Path(path);
File destfolder = destpath.toFile();
boolean exist = destfolder.exists();
if(!exist) {
exist = destfolder.mkdirs();
}
if (exist) {
monitor.beginTask(Messages.PeerExportWizard_title, configs.length);
boolean toggleState = false;
int toggleResult = -1;
for (Object config : configs) {
IURIPersistenceService service = ServiceManager.getInstance().getService(config, IExportPersistenceService.class);
if (service == null) {
service = ServiceManager.getInstance().getService(config, IURIPersistenceService.class);
}
if (service != null) {
try {
URI uri = service.getURI(config);
File defaultFile = new File(uri.normalize());
defaultFile = new Path(defaultFile.toString()).removeFileExtension().toFile();
File file = destpath.append(defaultFile.getName()).addFileExtension("peer").toFile(); //$NON-NLS-1$
if (file.exists() && !overwrite) {
if (!toggleState || toggleResult < 0) {
MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(
getShell(), null,
NLS.bind(Messages.PeerExportWizardPage_overwriteDialog_message, file.toString()),
Messages.PeerExportWizardPage_overwriteDialogToggle_message, toggleState, null, null);
toggleState = dialog.getToggleState();
toggleResult = dialog.getReturnCode();
}
if (toggleResult != IDialogConstants.YES_ID) {
continue;
}
}
service.write(config, file.toURI());
}
catch (Exception e) {
}
}
monitor.worked(1);
}
monitor.done();
}
return Status.OK_STATUS;
}
};
exportjob.schedule();
return true;
}
}