/*******************************************************************************
* Copyright (c) 2011, 2015 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.filesystem.ui.internal.wizards;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IBasicPropertyConstants;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.tcf.te.tcf.filesystem.ui.nls.Messages;
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.interfaces.services.IPeerModelQueryService;
import org.eclipse.tcf.te.tcf.locator.model.ModelManager;
import org.eclipse.tcf.te.tcf.ui.navigator.ContentProvider;
import org.eclipse.tcf.te.ui.activator.UIPlugin;
import org.eclipse.tcf.te.ui.interfaces.IUIConstants;
import org.eclipse.tcf.te.ui.views.navigator.DelegatingLabelProvider;
import org.eclipse.tcf.te.ui.wizards.pages.AbstractValidatingWizardPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
/**
* The New Target creation wizard selection page implementation.
* <p>
* This class is copied and adapted from <code>org.eclipse.tcf.te.ui.wizards.newWizard.NewWizardSelectionPage</code>.
*
* @since 3.8
*/
public class TargetSelectionPage extends AbstractValidatingWizardPage {
// References to the page subcontrol's
private FilteredTree filteredTree;
private PatternFilter filteredTreeFilter;
// The tree viewer to display the targets.
private TreeViewer treeViewer;
/**
* Internal class. The wizard viewer comparator is responsible for the sorting in the tree.
* Current implementation is not prioritizing categories.
*/
/* default */static class TargetViewerComparator extends ViewerComparator {
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#isSorterProperty(java.lang.Object,
* java.lang.String)
*/
@Override
public boolean isSorterProperty(Object element, String property) {
// The comparator is affected if the label of the elements should change.
return property.equals(IBasicPropertyConstants.P_TEXT);
}
}
public TargetSelectionPage() {
super(TargetSelectionPage.class.getSimpleName());
setTitle(getDefaultTitle());
setDescription(getDefaultDescription());
initialize();
}
/**
* Refresh the remote services in target peers.
*/
private void initialize() {
// Refresh the information of remote services.
IPeerModel model = ModelManager.getPeerModel();
Assert.isNotNull(model);
IPeerNode[] peers = model.getPeerNodes();
if (peers != null) {
IPeerModelQueryService service = model.getService(IPeerModelQueryService.class);
for (IPeerNode peer : peers) {
service.queryRemoteServices(peer);
}
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#getWizard()
*/
@Override
public NewNodeWizard getWizard() {
return (NewNodeWizard) super.getWizard();
}
/**
* Returns the default page title.
*
* @return The default page title. Must be never <code>null</code>.
*/
protected String getDefaultTitle() {
return Messages.TargetSelectionPage_Title;
}
/**
* Returns the default page description.
*
* @return The default page description. Must be never <code>null</code>.
*/
protected String getDefaultDescription() {
return Messages.TargetSelectionPage_Description;
}
/**
* A styled label provider for the target selection list.
*/
static class TargetStyledLabelProvider extends DelegatingLabelProvider implements IStyledLabelProvider {
@Override
public StyledString getStyledText(Object element) {
return new StyledString(getText(element));
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
label.setText(Messages.TargetSelectionPage_Targets);
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
filteredTreeFilter = new TargetPatternFilter();
filteredTree = new FilteredTree(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, filteredTreeFilter, true);
filteredTree.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.heightHint = 250;
layoutData.widthHint = 450;
filteredTree.setLayoutData(layoutData);
treeViewer = filteredTree.getViewer();
treeViewer.setContentProvider(new ContentProvider());
IBaseLabelProvider labelProvider = new DecoratingStyledCellLabelProvider(new TargetStyledLabelProvider(), new DelegatingLabelProvider(), null);
treeViewer.setLabelProvider(labelProvider);
treeViewer.setComparator(new TargetViewerComparator());
ViewerFilter fsPeerFilter = new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IPeerNode) {
IPeerNode peer = (IPeerNode) element;
NewNodeWizard wizard = getWizard();
return wizard.hasFileSystem(peer);
}
return false;
}
};
treeViewer.addFilter(fsPeerFilter);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
onSelectionChanged();
}
});
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
// Double-click on a connection type is triggering the sub wizard
if (event.getSelection() instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
// The tree is single selection, so look for the first element only.
Object element = selection.getFirstElement();
if (element instanceof IPeerNode) {
// Double-click on a connection type is triggering the sub wizard
getWizard().getContainer().showPage(getNextPage());
}
else if (event.getViewer() instanceof TreeViewer) {
TreeViewer viewer = (TreeViewer) event.getViewer();
if (viewer.isExpandable(element)) {
viewer.setExpandedState(element, !viewer.getExpandedState(element));
}
}
}
}
});
treeViewer.setInput(ModelManager.getPeerModel());
NewNodeWizard wizard = getWizard();
IPeerNode peer = wizard.getPeer();
if (wizard.getPeer() != null) {
treeViewer.setSelection(new StructuredSelection(peer), true);
}
// apply the standard dialog font
Dialog.applyDialogFont(composite);
setControl(composite);
// Restore the tree state
restoreWidgetValues();
// Initialize the context help id
PlatformUI.getWorkbench().getHelpSystem()
.setHelp(getControl(), IUIConstants.HELP_NEW_WIZARD_SELECTION_PAGE);
setPageComplete(peer != null);
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.wizards.pages.AbstractValidatingWizardPage#doValidate()
*/
@Override
protected ValidationResult doValidate() {
ValidationResult result = new ValidationResult();
boolean valid = true;
ISelection selection = treeViewer.getSelection();
if (selection.isEmpty()) {
result.setResult(getDefaultDescription(), IMessageProvider.ERROR);
result.setValid(valid);
}
return result;
}
/**
* Called from the selection listener to propagate the current system type selection to the
* underlying wizard.
*/
protected void onSelectionChanged() {
if (filteredTree.getViewer().getSelection() instanceof IStructuredSelection) {
IStructuredSelection filteredTreeSelection = (IStructuredSelection) filteredTree
.getViewer().getSelection();
NewNodeWizard wizard = getWizard();
if (filteredTreeSelection.getFirstElement() instanceof IPeerNode) {
wizard.setPeer((IPeerNode) filteredTreeSelection.getFirstElement());
}
else {
wizard.setPeer(null);
}
}
// Update the wizard container UI elements
IWizardContainer container = getContainer();
if (container != null && container.getCurrentPage() != null) {
container.updateWindowTitle();
container.updateTitleBar();
container.updateButtons();
}
validate();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#getDialogSettings()
*/
@Override
protected IDialogSettings getDialogSettings() {
// If the wizard is set and returns dialog settings, we re-use them here
IDialogSettings settings = super.getDialogSettings();
// If the dialog settings could not set from the wizard, fallback to the plugin's
// dialog settings store.
if (settings == null) settings = UIPlugin.getDefault().getDialogSettings();
String sectionName = this.getClass().getName();
if (settings.getSection(sectionName) == null) settings.addNewSection(sectionName);
settings = settings.getSection(sectionName);
return settings;
}
}