blob: 24495a82bd2c35476d63c79fdcb5a017a8330cce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Roscoe Rush - Concept and prototype implementation
* IBM Corporation - current implementation
*******************************************************************************/
package org.eclipse.ant.internal.ui.views;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ant.internal.ui.model.AntUIPlugin;
import org.eclipse.ant.internal.ui.model.AntUtil;
import org.eclipse.ant.internal.ui.model.IAntUIHelpContextIds;
import org.eclipse.ant.internal.ui.views.actions.AddBuildFilesAction;
import org.eclipse.ant.internal.ui.views.actions.AntOpenWithMenu;
import org.eclipse.ant.internal.ui.views.actions.FilterInternalTargetsAction;
import org.eclipse.ant.internal.ui.views.actions.RefreshBuildFilesAction;
import org.eclipse.ant.internal.ui.views.actions.RemoveAllAction;
import org.eclipse.ant.internal.ui.views.actions.RemoveProjectAction;
import org.eclipse.ant.internal.ui.views.actions.RunTargetAction;
import org.eclipse.ant.internal.ui.views.actions.SearchForBuildFilesAction;
import org.eclipse.ant.internal.ui.views.elements.ProjectNode;
import org.eclipse.ant.internal.ui.views.elements.RootNode;
import org.eclipse.ant.internal.ui.views.elements.TargetNode;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.DoubleClickEvent;
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.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.IUpdate;
/**
* A view which displays a hierarchical view of ant build files and allows the
* user to run selected targets from those files.
*/
public class AntView extends ViewPart implements IResourceChangeListener, IShowInSource {
/**
* The root node of the project viewer as restored during initialization
*/
private RootNode restoredRoot = null;
private boolean restoredFilterInternalTargets= false;
/**
* This memento allows the Ant view to save and restore state
* when it is closed and opened within a session. A different
* memento is supplied by the platform for persistance at
* workbench shutdown.
*/
private static IMemento tempMemento = null;
/**
* XML tag used to identify an ant project in storage
*/
private static final String TAG_PROJECT = "project"; //$NON-NLS-1$
/**
* XML key used to store whether or not an ant project is an error node.
* Persisting this data saved a huge amount of processing at startup.
*/
private static final String KEY_ERROR = "error"; //$NON-NLS-1$
/**
* XML key used to store an ant project's path
*/
private static final String KEY_PATH = "path"; //$NON-NLS-1$
/**
* XML key used to store an ant node's name
*/
private static final String KEY_NAME = "name"; //$NON-NLS-1$
/**
* XML key used to store an ant project's default target name
*/
private static final String KEY_DEFAULT = "default"; //$NON-NLS-1$
/**
* XML tag used to identify the "filter internal targets" preference.
*/
private static final String TAG_FILTER_INTERNAL_TARGETS = "filterInternalTargets"; //$NON-NLS-1$
/**
* XML key used to store the value of the "filter internal targets" preference.
*/
private static final String KEY_VALUE = "value"; //$NON-NLS-1$
/**
* The tree viewer that displays the users ant projects
*/
private TreeViewer projectViewer;
private AntProjectContentProvider projectContentProvider;
/**
* Collection of <code>IUpdate</code> actions that need to update on
* selection changed in the project viewer.
*/
private List updateProjectActions;
// Ant View Actions
private AddBuildFilesAction addBuildFileAction;
private SearchForBuildFilesAction searchForBuildFilesAction;
private RefreshBuildFilesAction refreshBuildFilesAction;
private RunTargetAction runTargetAction;
private RemoveProjectAction removeProjectAction;
private RemoveAllAction removeAllAction;
private FilterInternalTargetsAction filterInternalTargetsAction;
// Context-menu-only actions
private AntOpenWithMenu openWithMenu;
private RunTargetAction editConfigAction;
/**
* The given build file has changed. Refresh the view to pick up any
* structural changes.
*/
private void handleBuildFileChanged(final ProjectNode project) {
project.parseBuildFile();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
//must do a full refresh to re-sort
projectViewer.refresh();
}
});
}
/**
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent) {
initializeActions();
createProjectViewer(parent);
initializeDragAndDrop();
fillMainToolBar();
if (getProjects().length > 0) {
// If any projects have been added to the view during startup,
// begin listening for resource changes
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
WorkbenchHelp.setHelp(parent, IAntUIHelpContextIds.ANT_VIEW);
updateProjectActions();
}
private void initializeDragAndDrop() {
int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_DEFAULT;
Transfer[] transfers = new Transfer[] { FileTransfer.getInstance() };
TreeViewer viewer = getProjectViewer();
AntViewDropAdapter adapter = new AntViewDropAdapter(this);
viewer.addDropSupport(ops, transfers, adapter);
}
/**
* Creates a pop-up menu on the given control
*
* @param menuControl the control with which the pop-up
* menu will be associated
*/
private void createContextMenu(final Viewer viewer) {
Control menuControl = viewer.getControl();
MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
fillContextMenu(viewer, mgr);
}
});
Menu menu = menuMgr.createContextMenu(menuControl);
menuControl.setMenu(menu);
// register the context menu such that other plugins may contribute to it
getSite().registerContextMenu(menuMgr, viewer);
}
/**
* Adds actions to the context menu
*
* @param viewer the viewer who's menu we're configuring
* @param menu The menu to contribute to
*/
private void fillContextMenu(Viewer viewer, IMenuManager menu) {
if (viewer == projectViewer) {
menu.add(runTargetAction);
menu.add(editConfigAction);
menu.add(new Separator());
addOpenWithMenu(menu);
menu.add(new Separator());
menu.add(addBuildFileAction);
menu.add(removeProjectAction);
menu.add(removeAllAction);
menu.add(refreshBuildFilesAction);
}
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void addOpenWithMenu(IMenuManager menu) {
IFile buildFile= getSelectionBuildFile();
if (buildFile != null && buildFile.exists()) {
menu.add(new Separator("group.open")); //$NON-NLS-1$
IMenuManager submenu= new MenuManager(AntViewMessages.getString("AntView.Open_With_3")); //$NON-NLS-1$
openWithMenu.setFile(buildFile);
submenu.add(openWithMenu);
menu.appendToGroup("group.open", submenu); //$NON-NLS-1$
}
}
/**
* Initialize the actions for this view
*/
private void initializeActions() {
updateProjectActions= new ArrayList(5);
addBuildFileAction = new AddBuildFilesAction(this);
removeProjectAction = new RemoveProjectAction(this);
updateProjectActions.add(removeProjectAction);
removeAllAction = new RemoveAllAction(this);
updateProjectActions.add(removeAllAction);
runTargetAction = new RunTargetAction(this, false);
updateProjectActions.add(runTargetAction);
searchForBuildFilesAction = new SearchForBuildFilesAction(this);
refreshBuildFilesAction = new RefreshBuildFilesAction(this);
updateProjectActions.add(refreshBuildFilesAction);
openWithMenu= new AntOpenWithMenu(this.getViewSite().getPage());
editConfigAction= new RunTargetAction(this, true);
updateProjectActions.add(editConfigAction);
filterInternalTargetsAction= new FilterInternalTargetsAction(this);
}
/**
* Updates the enabled state of all IUpdate actions associated
* with the project viewer.
*/
private void updateProjectActions() {
Iterator iter = updateProjectActions.iterator();
while (iter.hasNext()) {
((IUpdate) iter.next()).update();
}
}
/**
* Create the viewer which displays the ant projects
*/
private void createProjectViewer(Composite parent) {
projectViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
projectContentProvider = new AntProjectContentProvider();
projectViewer.setContentProvider(projectContentProvider);
projectContentProvider.setFilterInternalTargets(restoredFilterInternalTargets);
filterInternalTargetsAction.setChecked(restoredFilterInternalTargets);
projectViewer.setLabelProvider(new AntViewLabelProvider());
if (tempMemento != null) {
restoreRoot(tempMemento);
}
projectViewer.setInput(restoredRoot);
projectViewer.setSorter(new ViewerSorter() {
/**
* @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public int compare(Viewer viewer, Object e1, Object e2) {
return e1.toString().compareToIgnoreCase(e2.toString());
}
});
projectViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged(event);
}
});
projectViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if (!event.getSelection().isEmpty()) {
handleProjectViewerDoubleClick(event);
}
}
});
projectViewer.getControl().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
handleProjectViewerKeyPress(event);
}
});
createContextMenu(projectViewer);
}
private void handleProjectViewerKeyPress(KeyEvent event) {
if (event.character == SWT.DEL && event.stateMask == 0) {
if (removeProjectAction.isEnabled()) {
removeProjectAction.run();
}
} else if (event.keyCode == SWT.F5 && event.stateMask == 0) {
if (refreshBuildFilesAction.isEnabled()) {
refreshBuildFilesAction.run();
}
}
}
private void handleProjectViewerDoubleClick(DoubleClickEvent event) {
ISelection s= event.getSelection();
if (s.isEmpty() || !(s instanceof IStructuredSelection)) {
return;
}
Object selection= ((IStructuredSelection)s).getFirstElement();
if (selection instanceof ProjectNode) {
ProjectNode project = (ProjectNode) selection;
IEditorRegistry registry= PlatformUI.getWorkbench().getEditorRegistry();
IFile file= AntUtil.getFile(project.getBuildFileName());
IEditorDescriptor editor = IDE.getDefaultEditor(file);
if (editor == null) {
editor= registry.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
}
try {
if (editor == null) {
getViewSite().getPage().openEditor(new FileEditorInput(file), IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
} else {
getViewSite().getPage().openEditor(new FileEditorInput(file), editor.getId());
}
} catch (PartInitException e) {
AntUIPlugin.log(e);
}
} else if (selection instanceof TargetNode){
runTargetAction.run();
}
}
/**
* Updates the actions and status line for selection change in one of the
* viewers.
*/
private void handleSelectionChanged(SelectionChangedEvent event) {
updateProjectActions();
Iterator selectionIter = ((IStructuredSelection) event.getSelection()).iterator();
Object selection = null;
if (selectionIter.hasNext()) {
selection = selectionIter.next();
}
String messageString= null;
if (!selectionIter.hasNext()) {
messageString= getStatusLineText(selection);
}
getViewSite().getActionBars().getStatusLineManager().setMessage(messageString);
}
/**
* Returns text appropriate for display in the workbench status line for the
* given node.
*/
private static String getStatusLineText(Object node) {
if (node instanceof ProjectNode) {
ProjectNode project = (ProjectNode) node;
StringBuffer message= new StringBuffer(project.getBuildFileName());
String description= project.getDescription();
if (description != null) {
message.append(": "); //$NON-NLS-1$
message.append(description);
}
return message.toString();
} else if (node instanceof TargetNode) {
TargetNode target = (TargetNode) node;
StringBuffer message= new StringBuffer(AntViewMessages.getString("AntView.Name___1")); //$NON-NLS-1$
message.append(target.getName());
message.append('\"');
String[] depends= target.getDependencies();
if (depends.length > 0 ) {
message.append(AntViewMessages.getString("AntView._Depends___2")); //$NON-NLS-1$
message.append(depends[0]); // Unroll the loop to avoid trailing comma
for (int i = 1; i < depends.length; i++) {
message.append(',').append(depends[i]);
}
message.append('\"');
}
String description= target.getDescription();
if (description != null && description.length() != 0) {
message.append(AntViewMessages.getString("AntView._Description___4")); //$NON-NLS-1$
message.append(description);
message.append('\"');
}
return message.toString();
}
return null;
}
/**
* Returns the tree viewer that displays the projects in this view
*
* @return TreeViewer this view's project viewer
*/
public TreeViewer getProjectViewer() {
return projectViewer;
}
/**
* Returns the <code>ProjectNode</code>s currently displayed in this view.
*
* @return ProjectNode[] the <code>ProjectNode</code>s currently displayed
* in this view
*/
public ProjectNode[] getProjects() {
return projectContentProvider.getRootNode().getProjects();
}
/**
* Adds the given project project to the view
*
* @param project the project to add
*/
public void addProject(ProjectNode project) {
projectContentProvider.addProject(project);
projectViewer.refresh();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
updateProjectActions();
}
/**
* Removes the given project from the view
*
* @param project the project to remove
*/
private void removeProject(ProjectNode project) {
removeProjectFromContentProviders(project);
projectViewer.refresh();
if (getProjects().length == 0) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
setProjectViewerSelectionAfterDeletion();
}
private void setProjectViewerSelectionAfterDeletion() {
Object[] children= projectContentProvider.getChildren(projectContentProvider.getRootNode());
if (children.length > 0) {
ViewerSorter sorter= projectViewer.getSorter();
sorter.sort(projectViewer, children);
projectViewer.setSelection(new StructuredSelection(children[0]));
}
}
/**
* Removes the given list of <code>ProjectNode</code> objects from the view.
* This method should be called whenever multiple projects are to be removed
* because this method optimizes the viewer refresh associated with removing
* multiple items.
*
* @param projectNodes the list of <code>ProjectNode</code> objects to
* remove
*/
public void removeProjects(List projectNodes) {
Iterator iter = projectNodes.iterator();
while (iter.hasNext()) {
ProjectNode project = (ProjectNode) iter.next();
removeProjectFromContentProviders(project);
}
projectViewer.refresh();
setProjectViewerSelectionAfterDeletion();
}
/**
* Removes the given project node from the project content provider. Also
* removes any targets from the given project from the target content
* provider.
*
* @param project the project to remove
*/
private void removeProjectFromContentProviders(ProjectNode project) {
projectContentProvider.getRootNode().removeProject(project);
if (!projectContentProvider.getRootNode().hasProjects()) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
}
/**
* Removes all projects from the view
*/
public void removeAllProjects() {
// Remove all projects
projectContentProvider.getRootNode().removeAllProjects();
// Refresh the viewer
projectViewer.refresh();
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
updateProjectActions();
}
/**
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
public void setFocus() {
if (getProjectViewer() != null) {
getProjectViewer().getControl().setFocus();
}
}
/**
* Restore the projects and selected targets
*
* @see org.eclipse.ui.IViewPart#init(IViewSite, IMemento)
*/
public void init(IViewSite site, IMemento memento) throws PartInitException {
init(site);
restoreRoot(memento);
if (memento != null) {
IMemento child= memento.getChild(TAG_FILTER_INTERNAL_TARGETS);
if (child != null) {
restoredFilterInternalTargets= Boolean.valueOf(child.getString(KEY_VALUE)).booleanValue();
}
}
}
/**
* Initialize the root node by restoring the persisted projects
*
* @param memento the memento containing the persisted projects
*/
private void restoreRoot(IMemento memento) {
if (memento == null) {
restoredRoot = new RootNode();
return;
}
IMemento[] projects = memento.getChildren(TAG_PROJECT);
if (projects.length < 1) {
restoredRoot = new RootNode();
return;
}
List projectNodes = new ArrayList(projects.length);
for (int i = 0; i < projects.length; i++) {
IMemento projectMemento = projects[i];
String pathString = projectMemento.getString(KEY_PATH);
if (!ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(pathString)).exists()) {
// If the file no longer exists, don't add it.
continue;
}
String nameString = projectMemento.getString(KEY_NAME);
String defaultTarget= projectMemento.getString(KEY_DEFAULT);
String errorString = projectMemento.getString(KEY_ERROR);
ProjectNode project = null;
if (nameString == null) {
nameString = ""; //$NON-NLS-1$
}
project = new ProjectNode(nameString, pathString);
if (errorString != null && Boolean.valueOf(errorString).booleanValue()) {
project.setIsErrorNode(true);
}
if (defaultTarget != null) {
project.setDefaultTargetName(defaultTarget);
}
projectNodes.add(project);
}
restoredRoot = new RootNode((ProjectNode[]) projectNodes.toArray(new ProjectNode[projectNodes.size()]));
}
/**
* Save the contents of the project viewer and the target viewer
*
* @see org.eclipse.ui.IViewPart#saveState(IMemento)
*/
public void saveState(IMemento memento) {
// Save the projects
ProjectNode[] projects = projectContentProvider.getRootNode().getProjects();
ProjectNode project;
IMemento projectMemento;
for (int i = 0; i < projects.length; i++) {
project = projects[i];
projectMemento = memento.createChild(TAG_PROJECT);
projectMemento.putString(KEY_PATH, project.getBuildFileName());
projectMemento.putString(KEY_NAME, project.getName());
String defaultTarget= project.getDefaultTargetName();
if (project.isErrorNode()) {
projectMemento.putString(KEY_ERROR, String.valueOf(true));
} else {
if (defaultTarget != null) {
projectMemento.putString(KEY_DEFAULT, defaultTarget);
}
projectMemento.putString(KEY_ERROR, String.valueOf(false));
}
}
IMemento filterTargets= memento.createChild(TAG_FILTER_INTERNAL_TARGETS);
filterTargets.putString(KEY_VALUE, isFilterInternalTargets() ? String.valueOf(true) : String.valueOf(false));
}
/**
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
public void dispose() {
tempMemento= XMLMemento.createWriteRoot("AntViewMemento"); //$NON-NLS-1$
saveState(tempMemento);
super.dispose();
if (openWithMenu != null) {
openWithMenu.dispose();
}
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
if (delta != null) {
ProjectNode projects[]= projectContentProvider.getRootNode().getProjects();
IPath buildFilePath;
for (int i = 0; i < projects.length; i++) {
buildFilePath= new Path(projects[i].getBuildFileName());
IResourceDelta change= delta.findMember(buildFilePath);
if (change != null) {
handleChangeDelta(change, projects[i]);
}
}
}
}
/**
* Update the view for the given resource delta. The delta is a resource
* delta for the given build file in the view
*
* @param delta a delta for a build file in the view
* @param project the project node that has changed
*/
private void handleChangeDelta(IResourceDelta delta, final ProjectNode project) {
IResource resource= delta.getResource();
if (resource.getType() != IResource.FILE) {
return;
}
if (delta.getKind() == IResourceDelta.REMOVED) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
removeProject(project);
}
});
} else if (delta.getKind() == IResourceDelta.CHANGED && (delta.getFlags() & IResourceDelta.CONTENT) != 0) {
handleBuildFileChanged(project);
}
}
private void fillMainToolBar() {
IToolBarManager toolBarMgr= getViewSite().getActionBars().getToolBarManager();
toolBarMgr.removeAll();
toolBarMgr.add(addBuildFileAction);
toolBarMgr.add(searchForBuildFilesAction);
toolBarMgr.add(filterInternalTargetsAction);
toolBarMgr.add(runTargetAction);
toolBarMgr.add(removeProjectAction);
toolBarMgr.add(removeAllAction);
toolBarMgr.update(false);
}
private IFile getSelectionBuildFile() {
IStructuredSelection selection= (IStructuredSelection)getProjectViewer().getSelection();
if (selection.size() == 1) {
Object element= selection.getFirstElement();
ProjectNode projectNode= null;
if (element instanceof ProjectNode) {
projectNode= (ProjectNode)element;
} else if (element instanceof TargetNode) {
projectNode= ((TargetNode)element).getProject();
}
if (projectNode != null) {
return AntUtil.getFile(projectNode.getBuildFileName());
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IShowInSource#getShowInContext()
*/
public ShowInContext getShowInContext() {
IFile buildFile= getSelectionBuildFile();
if (buildFile != null && buildFile.exists()) {
ISelection selection= new StructuredSelection(buildFile);
return new ShowInContext(null, selection);
}
return null;
}
/**
* Returns whether internal targets are currently being filtered out of
* the view.
*
* @return whether or not internal targets are being filtered out
*/
public boolean isFilterInternalTargets() {
if (projectContentProvider != null) {
return projectContentProvider.isFilterInternalTargets();
}
return false;
}
/**
* Sets whether internal targets should be filtered out of the view.
*
* @param filter whether or not internal targets should be filtered out
*/
public void setFilterInternalTargets(boolean filter) {
if (projectContentProvider != null) {
projectContentProvider.setFilterInternalTargets(filter);
projectViewer.refresh();
}
}
}