/*******************************************************************************
* Copyright (c) 2006, 2015 Wind River Systems 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.cdt.examples.dsf.filebrowser;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* File Browser example dialog. It hold a tree viewer that displays
* file system contents and a text box for entering a file path to be
* shown in the tree.
*/
@SuppressWarnings("restriction")
public class FileBrowserDialog extends Dialog {
/**
* Tree viewer for showing the filesystem contents.
*/
private TreeModelViewer fViewer;
/**
* The model adapter for the tree viewer.
*/
private FileBrowserModelAdapter fModelAdapter;
/**
* Flag used to disable text-box changed events, when the text
* box is updated due to selection change in tree.
*/
private boolean fDisableTextChangeNotifications = false;
public FileBrowserDialog(Shell parent) {
super(parent);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
IPresentationContext presentationContext = new PresentationContext("org.eclipse.cdt.examples.dsf.filebrowser"); //$NON-NLS-1$
fViewer = new TreeModelViewer(area, SWT.VIRTUAL, presentationContext);
fViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
fModelAdapter = new FileBrowserModelAdapter(presentationContext);
fViewer.setInput(fModelAdapter.getVMProvider().getViewerInputObject());
final Text text = new Text(area, SWT.SINGLE | SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
/*
* Update the file name in the text control, to match the
* selection in the tree. Do this only if the user is not
* actively typing in the text field (test if text has focus).
*/
if (!text.isFocusControl() &&
event.getSelection() instanceof IStructuredSelection &&
((IStructuredSelection)event.getSelection()).getFirstElement() instanceof FileVMContext)
{
FileVMContext fileVmc = (FileVMContext)((IStructuredSelection)event.getSelection()).getFirstElement();
fDisableTextChangeNotifications = true;
text.setText(fileVmc.getFile().getAbsolutePath());
fDisableTextChangeNotifications = false;
}
}
});
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fDisableTextChangeNotifications) {
fModelAdapter.getVMProvider().selectionTextChanged(text.getText());
}
}
});
return area;
}
@Override
public boolean close() {
if (super.close()) {
fModelAdapter.dispose();
fModelAdapter = null;
return true;
}
return false;
}
}