/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software 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:
* QNX Software Systems - Initial API and implementation
* Andrew Gvozdev (Quoin Inc.)
* Gaetano Santoro (STMicroelectronics)
*******************************************************************************/
package org.eclipse.cdt.make.ui.views;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.dnd.AbstractContainerAreaDropAdapter;
import org.eclipse.cdt.make.internal.ui.dnd.AbstractSelectionDragAdapter;
import org.eclipse.cdt.make.internal.ui.dnd.FileTransferDropTargetListener;
import org.eclipse.cdt.make.internal.ui.dnd.LocalTransferDragSourceListener;
import org.eclipse.cdt.make.internal.ui.dnd.LocalTransferDropTargetListener;
import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransfer;
import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransferDragSourceListener;
import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransferDropTargetListener;
import org.eclipse.cdt.make.internal.ui.dnd.TextTransferDragSourceListener;
import org.eclipse.cdt.make.internal.ui.dnd.TextTransferDropTargetListener;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
import org.eclipse.cdt.make.ui.MakeContentProvider;
import org.eclipse.cdt.make.ui.MakeLabelProvider;
import org.eclipse.cdt.make.ui.TargetSourceContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
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.bindings.BindingManagerEvent;
import org.eclipse.jface.bindings.IBindingManagerListener;
import org.eclipse.jface.util.DelegatingDragAdapter;
import org.eclipse.jface.util.DelegatingDropAdapter;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.TextActionHandler;
import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
/**
* Implementation of Make Target View.
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class MakeView extends ViewPart {
private static final String TARGET_BUILD_LAST_COMMAND = "org.eclipse.cdt.make.ui.targetBuildLastCommand"; //$NON-NLS-1$
private Clipboard clipboard;
private BuildTargetAction buildTargetAction;
private RebuildLastTargetAction buildLastTargetAction;
private EditTargetAction editTargetAction;
private DeleteTargetAction deleteTargetAction;
private AddTargetAction newTargetAction;
private CopyTargetAction copyTargetAction;
private PasteTargetAction pasteTargetAction;
private TreeViewer fViewer;
private DrillDownAdapter drillDownAdapter;
private FilterEmtpyFoldersAction trimEmptyFolderAction;
private IBindingService bindingService;
public MakeView() {
super();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
fViewer.getTree().setFocus();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
MakeUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(parent, IMakeHelpContextIds.MAKE_VIEW);
fViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
fViewer.setUseHashlookup(true);
fViewer.setContentProvider(new MakeContentProvider());
fViewer.setLabelProvider(new MakeLabelProvider());
initDragAndDrop();
drillDownAdapter = new DrillDownAdapter(fViewer);
fViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleDoubleClick(event);
}
});
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged(event);
}
});
fViewer.setSorter(new ViewerSorter() {
@Override
public int category(Object element) {
if (element instanceof TargetSourceContainer) {
return 1;
} else if (element instanceof IResource) {
return 2;
}
return 3;
}
});
fViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
getSite().setSelectionProvider(fViewer);
makeActions();
hookContextMenu();
contributeToActionBars();
updateActions((IStructuredSelection)fViewer.getSelection());
bindingService = (IBindingService) PlatformUI.getWorkbench().getService(IBindingService.class);
if (bindingService != null) {
bindingService.addBindingManagerListener(bindingManagerListener);
}
}
/**
* Initialize drag and drop operations.
*/
private void initDragAndDrop() {
int opers= DND.DROP_COPY | DND.DROP_MOVE;
// LocalSelectionTransfer is used inside Make Target View
// TextTransfer is used to drag outside the View or eclipse
Transfer[] dragTransfers= {
LocalSelectionTransfer.getTransfer(),
MakeTargetTransfer.getInstance(),
TextTransfer.getInstance(),
};
AbstractSelectionDragAdapter[] dragListeners = {
new LocalTransferDragSourceListener(fViewer),
new MakeTargetTransferDragSourceListener(fViewer),
new TextTransferDragSourceListener(fViewer),
};
DelegatingDragAdapter delegatingDragAdapter = new DelegatingDragAdapter();
for (AbstractSelectionDragAdapter dragListener : dragListeners) {
delegatingDragAdapter.addDragSourceListener(dragListener);
}
fViewer.addDragSupport(opers, dragTransfers, delegatingDragAdapter);
Transfer[] dropTransfers= {
LocalSelectionTransfer.getTransfer(),
MakeTargetTransfer.getInstance(),
FileTransfer.getInstance(),
TextTransfer.getInstance(),
};
AbstractContainerAreaDropAdapter[] dropListeners = {
new LocalTransferDropTargetListener(fViewer),
new MakeTargetTransferDropTargetListener(fViewer),
new FileTransferDropTargetListener(fViewer),
new TextTransferDropTargetListener(fViewer),
};
DelegatingDropAdapter delegatingDropAdapter = new DelegatingDropAdapter();
for (AbstractContainerAreaDropAdapter dropListener : dropListeners) {
delegatingDropAdapter.addDropTargetListener(dropListener);
}
fViewer.addDropSupport(opers | DND.DROP_DEFAULT, dropTransfers, delegatingDropAdapter);
}
private void makeActions() {
Shell shell = fViewer.getControl().getShell();
clipboard = new Clipboard(shell.getDisplay());
buildTargetAction = new BuildTargetAction(shell);
buildLastTargetAction = new RebuildLastTargetAction();
newTargetAction = new AddTargetAction(shell);
copyTargetAction = new CopyTargetAction(shell, clipboard, pasteTargetAction);
pasteTargetAction = new PasteTargetAction(shell, clipboard);
deleteTargetAction = new DeleteTargetAction(shell);
editTargetAction = new EditTargetAction(shell);
trimEmptyFolderAction = new FilterEmtpyFoldersAction(fViewer);
}
private void contributeToActionBars() {
IActionBars actionBars = getViewSite().getActionBars();
fillLocalPullDown(actionBars.getMenuManager());
fillLocalToolBar(actionBars.getToolBarManager());
TextActionHandler textActionHandler = new TextActionHandler(actionBars); // hooks handlers
textActionHandler.setCopyAction(copyTargetAction);
textActionHandler.setPasteAction(pasteTargetAction);
textActionHandler.setDeleteAction(deleteTargetAction);
actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), editTargetAction);
}
private void fillLocalToolBar(IToolBarManager toolBar) {
toolBar.add(newTargetAction);
toolBar.add(editTargetAction);
toolBar.add(buildTargetAction);
toolBar.add(new Separator());
drillDownAdapter.addNavigationActions(toolBar);
toolBar.add(trimEmptyFolderAction);
}
private void fillLocalPullDown(IMenuManager manager) {
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
MakeView.this.fillContextMenu(manager);
updateActions((IStructuredSelection)fViewer.getSelection());
}
});
Menu menu = menuMgr.createContextMenu(fViewer.getControl());
fViewer.getControl().setMenu(menu);
// getSite().registerContextMenu(menuMgr, viewer);
}
protected void fillContextMenu(IMenuManager manager) {
manager.add(newTargetAction);
manager.add(editTargetAction);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
manager.add(new Separator());
manager.add(copyTargetAction);
manager.add(pasteTargetAction);
manager.add(deleteTargetAction);
manager.add(new Separator());
manager.add(buildTargetAction);
manager.add(buildLastTargetAction);
// Other plug-ins can contribute there actions here
// manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
protected void handleDoubleClick(DoubleClickEvent event) {
buildTargetAction.run();
}
void handleSelectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
updateActions(sel);
}
void updateActions(IStructuredSelection sel) {
newTargetAction.selectionChanged(sel);
buildTargetAction.selectionChanged(sel);
buildLastTargetAction.selectionChanged(sel);
deleteTargetAction.selectionChanged(sel);
editTargetAction.selectionChanged(sel);
copyTargetAction.selectionChanged(sel);
pasteTargetAction.selectionChanged(sel);
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
if (clipboard != null) {
clipboard.dispose();
clipboard = null;
}
if (bindingService != null) {
bindingService.removeBindingManagerListener(bindingManagerListener);
bindingService = null;
}
super.dispose();
}
private IBindingManagerListener bindingManagerListener = new IBindingManagerListener() {
public void bindingManagerChanged(BindingManagerEvent event) {
if (event.isActiveBindingsChanged()) {
String keyBinding = bindingService.getBestActiveBindingFormattedFor(IWorkbenchCommandConstants.FILE_RENAME);
if (keyBinding != null) editTargetAction.setText(
MakeUIPlugin.getResourceString("EditTargetAction.label")+"\t"+ keyBinding); //$NON-NLS-1$ //$NON-NLS-2$
keyBinding = bindingService.getBestActiveBindingFormattedFor(IWorkbenchCommandConstants.EDIT_COPY);
if (keyBinding != null) copyTargetAction.setText(
MakeUIPlugin.getResourceString("CopyTargetAction.label")+"\t"+ keyBinding); //$NON-NLS-1$ //$NON-NLS-2$
keyBinding = bindingService.getBestActiveBindingFormattedFor(IWorkbenchCommandConstants.EDIT_PASTE);
if (keyBinding != null) pasteTargetAction.setText(
MakeUIPlugin.getResourceString("PasteTargetAction.label")+"\t"+ keyBinding); //$NON-NLS-1$ //$NON-NLS-2$
keyBinding = bindingService.getBestActiveBindingFormattedFor(IWorkbenchCommandConstants.EDIT_DELETE);
if (keyBinding != null) deleteTargetAction.setText(
MakeUIPlugin.getResourceString("DeleteTargetAction.label")+"\t"+ keyBinding); //$NON-NLS-1$ //$NON-NLS-2$
keyBinding = bindingService.getBestActiveBindingFormattedFor(TARGET_BUILD_LAST_COMMAND);
if (keyBinding != null) buildLastTargetAction.setText(
MakeUIPlugin.getResourceString("BuildLastTargetAction.label")+"\t"+ keyBinding); //$NON-NLS-1$ //$NON-NLS-2$
}
}
};
}