/******************************************************************************* * Copyright (c) 2011, 2016 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.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; 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.TreeViewer; import org.eclipse.jface.viewers.Viewer; 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.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IResultOperation; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IRuntimeModel; import org.eclipse.tcf.te.tcf.filesystem.core.model.ModelManager; import org.eclipse.tcf.te.tcf.filesystem.ui.controls.FSTreeContentProvider; import org.eclipse.tcf.te.tcf.filesystem.ui.controls.FSTreeViewerSorter; import org.eclipse.tcf.te.tcf.filesystem.ui.help.IContextHelpIds; import org.eclipse.tcf.te.tcf.filesystem.ui.interfaces.IFSConstants; import org.eclipse.tcf.te.tcf.filesystem.ui.internal.columns.FSTreeElementLabelProvider; import org.eclipse.tcf.te.tcf.filesystem.ui.nls.Messages; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; import org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl; import org.eclipse.tcf.te.ui.forms.FormLayoutFactory; import org.eclipse.tcf.te.ui.trees.FilterDescriptor; import org.eclipse.tcf.te.ui.trees.ViewerStateManager; import org.eclipse.tcf.te.ui.wizards.pages.AbstractValidatingWizardPage; import org.eclipse.ui.IDecoratorManager; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.FormToolkit; /** * The base wizard page class to create a new file/folder in the file system of Target Explorer. */ public abstract class NewNodeWizardPage extends AbstractValidatingWizardPage { // The form toolkit to create the content of the wizard page. private FormToolkit toolkit; // The control for the user to enter the new name. private BaseEditBrowseTextControl nameControl; // The control for the user to enter the parent directory private BaseEditBrowseTextControl folderControl; // The viewer of the file tree displaying the file system. private TreeViewer treeViewer; /** * Create an instance page with the specified page name. * * @param pageName The page name. */ public NewNodeWizardPage(String pageName) { super(pageName); } /** * Get the page's title. * * @return The page's title. */ protected abstract String getPageTitle(); /** * Get the page's description. * * @return The page's description. */ protected abstract String getPageDescription(); /** * Get the label of the text field to enter the new name. * * @return The label of the text field to enter the new name. */ protected abstract String getNameFieldLabel(); /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { // Setup title and description setTitle(getPageTitle()); setDescription(getPageDescription()); // Create the forms toolkit toolkit = new FormToolkit(parent.getDisplay()); // Create the main panel Composite mainPanel = toolkit.createComposite(parent); mainPanel.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); mainPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); mainPanel.setBackground(parent.getBackground()); setControl(mainPanel); // Setup the help PlatformUI.getWorkbench().getHelpSystem() .setHelp(mainPanel, IContextHelpIds.FS_NEW_FILE_WIZARD_PAGE); // Do not validate the page while creating the controls boolean changed = setValidationInProgress(true); // Create the main panel sub controls createMainPanelControls(mainPanel); // Reset the validation in progress state if (changed) setValidationInProgress(false); // Adjust the font Dialog.applyDialogFont(mainPanel); // Validate the page for the first time setPageComplete(false); } /** * Create the main panel of this wizard page. * * @param parent The parent composite in which the page is created. */ private void createMainPanelControls(Composite parent) { Assert.isNotNull(parent); // Create the client composite Composite client = toolkit != null ? toolkit.createComposite(parent) : new Composite(parent, SWT.NONE); client.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 2)); client.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); client.setBackground(parent.getBackground()); Label label = new Label(client, SWT.NONE); GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false); data.horizontalSpan = 2; label.setLayoutData(data); label.setText(Messages.NewNodeWizardPage_PromptFolderLabel); folderControl = new BaseEditBrowseTextControl(this); folderControl.setIsGroup(false); folderControl.setHasHistory(false); folderControl.setHideBrowseButton(true); folderControl.setHideLabelControl(true); folderControl.setHideEditFieldControlDecoration(true); folderControl.setFormToolkit(toolkit); folderControl.setParentControlIsInnerPanel(true); folderControl.setupPanel(client); folderControl.setEditFieldValidator(new FolderValidator(this)); NewNodeWizard wizard = getWizard(); IFSTreeNode folder = wizard.getFolder(); if (folder != null) folderControl.setEditFieldControlText(folder.getLocation()); treeViewer = new TreeViewer(client, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); data = new GridData(SWT.FILL, SWT.FILL, true, true); data.horizontalSpan = 2; data.heightHint = 193; data.widthHint = 450; treeViewer.getTree().setLayoutData(data); treeViewer.setContentProvider(new FSTreeContentProvider()); treeViewer.setLabelProvider(createDecoratingLabelProvider(new FSTreeElementLabelProvider())); treeViewer.setComparator(new FSTreeViewerSorter()); treeViewer.addFilter(new DirectoryFilter()); IPeerNode peer = wizard.getPeer(); if (peer != null) { setInput(peer); } treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { onSelectionChanged(); } }); if (folder != null) treeViewer.setSelection(new StructuredSelection(folder)); nameControl = new BaseEditBrowseTextControl(this); nameControl.setIsGroup(false); nameControl.setHasHistory(false); nameControl.setHideBrowseButton(true); nameControl.setEditFieldLabel(getNameFieldLabel()); nameControl.setFormToolkit(toolkit); nameControl.setParentControlIsInnerPanel(true); nameControl.setupPanel(client); nameControl.setEditFieldValidator(new NameValidator(this)); if (folder == null) folderControl.getEditFieldControl().setFocus(); else nameControl.getEditFieldControl().setFocus(); // restore the widget values from the history restoreWidgetValues(); } /** * The viewer filter to filter out files. */ static class DirectoryFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFSTreeNode) { IFSTreeNode node = (IFSTreeNode) element; if(node.isFile()) return false; } return true; } } /** * Set the input of the tree viewer and apply the appropriate filters. * * @param input The tree viewer's input. */ private void setInput(Object input) { treeViewer.setInput(input); FilterDescriptor[] filterDescriptors = ViewerStateManager.getInstance().getFilterDescriptors(IFSConstants.ID_TREE_VIEWER_FS, input); Assert.isNotNull(filterDescriptors); for (FilterDescriptor descriptor : filterDescriptors) { if (descriptor.isEnabled()) { treeViewer.addFilter(descriptor.getFilter()); } } } /** * Create a decorating label provider using the specified label provider. * * @param labelProvider The label provider that actually provides labels and images. * @return The decorating label provider. */ private static ILabelProvider createDecoratingLabelProvider(ILabelProvider labelProvider) { IWorkbench workbench = PlatformUI.getWorkbench(); IDecoratorManager manager = workbench.getDecoratorManager(); ILabelDecorator decorator = manager.getLabelDecorator(); return new DecoratingLabelProvider(labelProvider,decorator); } /** * Event process handling method when the user select a new folder in the file tree. */ protected void onSelectionChanged() { if (treeViewer.getSelection() instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (selection.getFirstElement() instanceof IFSTreeNode) { IFSTreeNode folder = (IFSTreeNode) selection.getFirstElement(); folderControl.setEditFieldControlText(folder.getLocation()); } else { folderControl.setEditFieldControlText(""); //$NON-NLS-1$ } } // Update the wizard container UI elements IWizardContainer container = getContainer(); if (container != null && container.getCurrentPage() != null) { container.updateWindowTitle(); container.updateTitleBar(); container.updateButtons(); } validate(); } /** * Set a new peer as the input of the file tree. Called * by the wizard to update the file tree when an alternative * target peer is selected in the target selection page. * * @param peer The new target peer. */ public void setPeer(IPeerNode peer) { if (peer != null) { setInput(peer); } } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.wizards.pages.AbstractValidatingWizardPage#doValidate() */ @Override protected ValidationResult doValidate() { ValidationResult result = new ValidationResult(); boolean valid = true; if (folderControl != null) { valid &= folderControl.isValid(); result.setResult(folderControl); } if (nameControl != null) { valid &= nameControl.isValid(); result.setResult(nameControl); } result.setValid(valid); return result; } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage#dispose() */ @Override public void dispose() { if (nameControl != null) { nameControl.dispose(); nameControl = null; } if (toolkit != null) { toolkit.dispose(); toolkit = null; } super.dispose(); } /** * Get the entered name of this node. * * @return The entered name of this node. */ public String getNodeName() { return nameControl.getEditFieldControlTextForValidation(); } /** * Get the parent wizard. Override the parent method to * cast the result to NewNodeWizard. */ @Override public NewNodeWizard getWizard() { return (NewNodeWizard) super.getWizard(); } /** * Get the currently input directory node. It parses * the currently entered path and tries to find the * corresponding directory node in the file system of * the target peer. * * @return The directory node if it exists or else null. */ public IFSTreeNode getInputDir() { NewNodeWizard wizard = getWizard(); IPeerNode peer = wizard.getPeer(); if (peer == null) return null; final String text = folderControl.getEditFieldControlText(); if (text != null) { String path = text.trim(); IRuntimeModel rtm = ModelManager.getRuntimeModel(peer); if (rtm != null) { IResultOperation<IFSTreeNode> operation = rtm.operationRestoreFromPath(path); operation.run(null); return operation.getResult(); } } return null; } }