blob: 53312eb2a4f836dc5737af3d32351403b3a4f094 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2018 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.lttng2.control.ui.views.preferences;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.tracecompass.internal.lttng2.control.core.LttngProfileManager;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
import org.eclipse.tracecompass.tmf.ui.dialog.DirectoryDialogFactory;
import org.eclipse.tracecompass.tmf.ui.dialog.TmfFileDialogFactory;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
/**
* LTTng control remote profile preferences page.
*
* @author Bernd Hufmann
*/
public class ControlRemoteProfilesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
/** Preference page ID */
public static final String ID = "org.eclipse.tracecompass.internal.lttng2.control.ui.views.preferences.ControlRemoteProfilesPreferencePage"; //$NON-NLS-1$
private CheckboxTreeViewer fFolderViewer;
private Button fDeleteButton = null;
private Button fImportButton = null;
private Button fExportButton = null;
@Override
public void init(IWorkbench workbench) {
// Do nothing
}
@Override
protected Control createContents(Composite parent) {
Composite composite;
composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite.setLayout(new GridLayout(2, false));
final FilteredTree filteredTree = new FilteredTree(composite,
SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) {
@Override
protected TreeViewer doCreateTreeViewer(Composite aParent, int style) {
fFolderViewer = LTTngProfileViewer.createLTTngProfileViewer(aParent, style);
return fFolderViewer;
}
};
filteredTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Composite buttonComposite = createVerticalButtonBar(composite);
buttonComposite.setLayout(new GridLayout());
buttonComposite.setLayoutData(new GridData(GridData.CENTER, GridData.BEGINNING, false, false));
fFolderViewer.addCheckStateListener(event -> enableButtons());
return composite;
}
private Composite createVerticalButtonBar(Composite composite) {
Composite buttonComposite = new Composite(composite, SWT.NONE);
fDeleteButton = createVerticalButton(buttonComposite, Messages.TraceControl_DeleteButtonText);
fDeleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object[] checkedElements = fFolderViewer.getCheckedElements();
StringBuffer files = new StringBuffer();
for (Object element : checkedElements) {
if (element instanceof File) {
files.append(((File) element).toString()).append("\n"); //$NON-NLS-1$
}
}
boolean delete = MessageDialog.openConfirm(getShell(),
Messages.TraceControl_DeleteProfileTitle,
Messages.TraceControl_DeleteQuery+ "\n" + files.toString()); //$NON-NLS-1$
if (!delete) {
return;
}
for (Object element : checkedElements) {
if (element instanceof File) {
File sourceFile = (File) element;
Path source = FileSystems.getDefault().getPath(sourceFile.getAbsolutePath());
try {
Files.delete(source);
} catch (IOException e1) {
MessageDialog.openError(getShell(),
Messages.TraceControl_DeleteProfileTitle,
"Error deleting profile:\n" + e1.toString()); //$NON-NLS-1$
}
}
}
fFolderViewer.setInput(LTTngProfileViewer.getViewerInput());
enableButtons();
}
});
fImportButton = createVerticalButton(buttonComposite, Messages.TraceControl_ImportButtonText);
fExportButton = createVerticalButton(buttonComposite, Messages.TraceControl_ExportButtonText);
fImportButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Do nothing
}
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = TmfFileDialogFactory.create(Display.getCurrent().getActiveShell(), SWT.OPEN);
dialog.setText(Messages.TraceControl_ImportProfileTitle);
dialog.setFilterExtensions(new String[] { "*.lttng", "*" }); //$NON-NLS-1$ //$NON-NLS-2$
String sourceFile = dialog.open();
if (sourceFile != null) {
Path source = FileSystems.getDefault().getPath(sourceFile);
Path destPath = FileSystems.getDefault().getPath(LttngProfileManager.getProfilePath().toFile().toString());
copyProfileFile(source, destPath, Messages.TraceControl_ImportProfileTitle);
fFolderViewer.setInput(LTTngProfileViewer.getViewerInput());
}
}
});
fExportButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = DirectoryDialogFactory.create(Display.getCurrent().getActiveShell());
dialog.setText(Messages.TraceControl_ExportProfileTitle);
String path = dialog.open();
if (path != null) {
Object[] checkedElements = fFolderViewer.getCheckedElements();
for (Object element : checkedElements) {
if (element instanceof File) {
File sourceFile = (File) element;
Path source = FileSystems.getDefault().getPath(sourceFile.getAbsolutePath());
Path destPath = FileSystems.getDefault().getPath(path);
copyProfileFile(source, destPath, Messages.TraceControl_ExportProfileTitle);
}
}
}
}
});
enableButtons();
return buttonComposite;
}
private static Button createVerticalButton(Composite parent, String text) {
Button button = new Button(parent, SWT.PUSH);
button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
button.setText(text);
return button;
}
private void enableButtons() {
Object[] checked = fFolderViewer.getCheckedElements();
boolean enabled = (checked != null) && (checked.length > 0);
fDeleteButton.setEnabled(enabled);
fExportButton.setEnabled(enabled);
fImportButton.setEnabled(true);
}
private void copyProfileFile(Path source, Path destPath, String errorTitle) {
Path destFile = destPath.resolve(source.getFileName());
if (destFile.toFile().exists()) {
boolean overwrite = MessageDialog.openConfirm(getShell(),
Messages.TraceControl_ProfileAlreadyExists,
NLS.bind(Messages.TraceControl_OverwriteQuery, destFile.getFileName()));
if (!overwrite) {
return;
}
}
try {
Files.copy(source, destFile, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e1) {
MessageDialog.openError(getShell(),
errorTitle,
"Error copying profile:\n" + e1.toString()); //$NON-NLS-1$
}
}
}