package tool.search;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.widgets.FormToolkit;
import tool.model.ToolAttribute;
import tool.model.ToolClass;
import tool.model.ToolComponent;
import tool.model.ToolVirtualAttribute;
import tool.navigator.common.LabelProvider;
public class FindTypeDialog extends Dialog {
private DataBindingContext m_bindingContext;
private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
private Text typeText;
private ISelection selection;
private String typeName;
private IProject project;
protected PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
this);
private TreeViewer treeViewer;
private ToolComponent selectedClass;
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
public static ToolComponent show(IProject project, ISelection selection){
ToolComponent cls = null;
Shell shell = Display.getDefault().getActiveShell();
FindTypeDialog dialog = new FindTypeDialog(shell, project, selection);
int option = dialog.open();
cls = dialog.selectedClass;
return cls;
}
/**
* @param project
* @wbp.parser.constructor
*/
private FindTypeDialog(Shell parentShell, IProject project, ISelection selection) {
super(parentShell);
this.selection = selection;
this.project = project;
if (this.selection != null && this.selection instanceof TextSelection){
TextSelection ts = (TextSelection)this.selection;
this.setTypeName(ts.getText());
} else if (this.selection != null && this.selection instanceof TreeSelection){
TreeSelection ts = (TreeSelection)this.selection;
Object element = ts.getFirstElement();
if (element instanceof ToolAttribute){
this.setTypeName(((ToolAttribute)element).getType());
} else if (element instanceof ToolVirtualAttribute){
this.setTypeName(((ToolAttribute)element).getType());
} else {
this.setTypeName(ts.getFirstElement().toString());
}
}
}
/**
* Create the dialog.
* @param parentShell
*/
public FindTypeDialog(Shell parentShell) {
super(parentShell);
setShellStyle(SWT.RESIZE);
}
/**
* Create contents of the dialog.
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
Label lblType = new Label(container, SWT.NONE);
lblType.setText("Type");
typeText = new Text(container, SWT.BORDER);
typeText.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
List<ToolClass> results = ToolClass.find(project, typeName);
treeViewer.setInput(results);
}
});
typeText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
typeName = typeText.getText();
}
});
typeText.setText(this.typeName);
typeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblResults = new Label(container, SWT.NONE);
lblResults.setText("Results");
treeViewer = new TreeViewer(container, SWT.BORDER);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
selectedClass = (ToolComponent) ((TreeSelection)event.getSelection()).getFirstElement();
}
});
treeViewer.setSorter(new ViewerSorter());
Tree resultsTree = treeViewer.getTree();
resultsTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
treeViewer.setContentProvider(new ITreeContentProvider() {
@Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
@Override
public void dispose() {
}
@Override
public boolean hasChildren(Object object) {
return false;
}
@Override
public Object getParent(Object object) {
return null;
}
@Override
public Object[] getElements(Object parent) {
if (parent instanceof List){
return ((List<ToolClass>)parent).toArray();
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public Object[] getChildren(Object parent) {
if (parent instanceof List){
return ((List<ToolClass>)parent).toArray();
}
return null;
}
});
treeViewer.setLabelProvider(new LabelProvider(LabelProvider.FULL_PATH)) ;
treeViewer.setAutoExpandLevel(1);
return container;
}
/**
* Create contents of the button bar.
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
m_bindingContext = initDataBindings();
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(450, 300);
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
propertyChangeSupport.firePropertyChange("typeName", this.typeName,
this.typeName = typeName);
if (typeText!=null){
typeText.setText(typeName);
}
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
return bindingContext;
}
}