package com.netifera.platform.host.filesystem.ui;
import org.eclipse.jface.action.Action;
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.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import com.netifera.platform.host.filesystem.File;
import com.netifera.platform.host.filesystem.IFileSystem;
import com.netifera.platform.host.filesystem.LocalFileSystem;
import com.netifera.platform.host.filesystem.ui.actions.DeleteAction;
import com.netifera.platform.host.filesystem.ui.actions.RenameAction;
import com.netifera.platform.ui.util.TreeAction;
import com.netifera.platform.ui.util.ViewerRefreshAction;
public class FileSystemView extends ViewPart {
public final static String ID = "com.netifera.platform.ui.views.FileSystem";
private TreeViewer viewer;
private FileSystemContentProvider contentProvider;
private ViewerRefreshAction refreshAllAction;
private ViewerRefreshAction refreshAction;
private DeleteAction deleteAction;
private RenameAction renameAction;
/**
* Initialize the view.
*/
@Override
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent);
viewer.getTree().setHeaderVisible(true);
viewer.getTree().setLinesVisible(true);
ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);
TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Name");
column.getColumn().setWidth(250);
column.getColumn().setAlignment(SWT.RIGHT);
column.setLabelProvider(new FileSystemLabelProvider(0));
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Size");
column.getColumn().setWidth(70);
column.getColumn().setAlignment(SWT.RIGHT);
column.setLabelProvider(new FileSystemLabelProvider(1));
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Last Modified");
column.getColumn().setWidth(100);
column.setLabelProvider(new FileSystemLabelProvider(2));
contentProvider = new FileSystemContentProvider();
contentProvider.setView(this);
viewer.setContentProvider(contentProvider);
// viewer.setCellEditors(new CellEditor[] { new TextCellEditor(viewer.getTree()) });
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
File file = (File) ((IStructuredSelection)event.getSelection()).getFirstElement();
if (file.isDirectory()) {
if (viewer.getExpandedState(file)) {
viewer.collapseToLevel(file, 1);
} else {
viewer.expandToLevel(file, 1);
}
}
}
});
setupDND();
createActions();
createContextMenu();
initializeToolBar();
// setInput(new LocalFileSystem());
}
public void setInput(IFileSystem input) {
setPartName(input.toString());
viewer.setInput(input);
}
public void setName(String name) {
setPartName(name);
}
private void setupDND() {
/*// viewer.addDragSupport(ops, transfers, new FileDragListener(viewer));
viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, new Transfer[] { FileTransfer.getInstance() }, new ViewerDropAdapter(viewer) {
@Override
public boolean performDrop(Object data) {
for (String fileName: (String[])data) {
// System.out.println("file system drop "+fileName);
}
// TODO Auto-generated method stub
return false;
}
@Override
public boolean validateDrop(Object target, int operation, TransferData transferData) {
if (target instanceof File)
return ((File)target).isDirectory();
return false;
}
});
*/ }
private void createActions() {
refreshAllAction = new ViewerRefreshAction(viewer) {
public void run() {
contentProvider.clear();
super.run();
}
};
refreshAllAction.setText("Refresh All");
refreshAction = new ViewerRefreshAction(viewer) {
public void run() {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
if (selection.getFirstElement() instanceof File) {
File dir = (File) selection.getFirstElement();
if (dir.isDirectory()) {
contentProvider.clear(dir);
super.run();
return;
}
}
contentProvider.clear();
super.run();
}
};
deleteAction = new DeleteAction(viewer);
renameAction = new RenameAction(viewer);
}
/**
* Initialise right-click menu, but does not display it.
*/
private void createContextMenu() {
MenuManager menuManager = new MenuManager("#PopupMenu");
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuManager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
/*
* Register so that other plugins can contribute to the menu
*/
getSite().registerContextMenu(menuManager, viewer);
}
/**
* Called just before right-click context menu is displayed.
* This is where the menu is dynamically built depending on
* the current selection and other state information.
*
* @param menuManager menu for adding actions to.
*/
private void fillContextMenu(IMenuManager menuManager) {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
if (selection.size() != 1)
return;
Object obj = selection.getFirstElement();
if(obj instanceof File) {
if (((File) obj).isDirectory())
menuManager.add(refreshAction);
menuManager.add(renameAction);
menuManager.add(deleteAction);
}
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* Set GUI focus on correct widget when view is selected.
*/
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
private void initializeToolBar() {
IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
Action collapseAll = TreeAction.collapseAll(viewer);
toolBarManager.add(collapseAll);
toolBarManager.add(refreshAllAction);
}
public void showMessage(String message) {
setContentDescription(message);
}
}