/*
* Copyright (c) 2004-2011 Marco Maccaferri 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:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.navigator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
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.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.part.ViewPart;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.repositories.IRepository;
import org.eclipsetrader.core.repositories.IRepositoryRunnable;
import org.eclipsetrader.core.repositories.IRepositoryService;
import org.eclipsetrader.core.views.IView;
import org.eclipsetrader.core.views.IViewItem;
import org.eclipsetrader.core.views.IViewItemVisitor;
import org.eclipsetrader.core.views.IViewVisitor;
import org.eclipsetrader.core.views.IWatchList;
import org.eclipsetrader.ui.SelectionProvider;
import org.eclipsetrader.ui.UIConstants;
import org.eclipsetrader.ui.internal.UIActivator;
import org.eclipsetrader.ui.internal.repositories.Messages;
import org.eclipsetrader.ui.navigator.INavigatorContentGroup;
import org.eclipsetrader.ui.navigator.SecurityObjectTransfer;
@SuppressWarnings("restriction")
public class Navigator extends ViewPart {
private TreeViewer viewer;
private IMemento memento;
private Action collapseAllAction;
private Action expandAllAction;
private Action deleteAction;
public Navigator() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
*/
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
this.memento = memento;
ImageRegistry imageRegistry = UIActivator.getDefault().getImageRegistry();
site.setSelectionProvider(new SelectionProvider());
collapseAllAction = new Action("Collapse All", imageRegistry.getDescriptor(UIConstants.COLLAPSEALL_ICON)) {
@Override
public void run() {
viewer.collapseAll();
}
};
expandAllAction = new Action("Expand All", imageRegistry.getDescriptor(UIConstants.EXPANDALL_ICON)) {
@Override
public void run() {
viewer.expandAll();
}
};
deleteAction = new Action("Delete") {
@Override
public void run() {
final IAdaptable[] objects = getSelectedObject(viewer.getSelection());
if (objects.length != 0) {
if (!MessageDialog.openConfirm(getViewSite().getShell(), getPartName(), Messages.RepositoryExplorer_DeleteConfirmMessage)) {
return;
}
final IRepositoryService service = UIActivator.getDefault().getRepositoryService();
service.runInService(new IRepositoryRunnable() {
@Override
public IStatus run(IProgressMonitor monitor) throws Exception {
service.deleteAdaptable(objects);
return Status.OK_STATUS;
}
}, null);
}
}
};
deleteAction.setImageDescriptor(imageRegistry.getDescriptor(UIConstants.DELETE_EDIT_ICON));
deleteAction.setDisabledImageDescriptor(imageRegistry.getDescriptor(UIConstants.DELETE_EDIT_DISABLED_ICON));
deleteAction.setId(ActionFactory.DELETE.getId());
deleteAction.setActionDefinitionId("org.eclipse.ui.edit.delete"); //$NON-NLS-1$
deleteAction.setEnabled(false);
IToolBarManager toolBarManager = site.getActionBars().getToolBarManager();
toolBarManager.add(expandAllAction);
toolBarManager.add(collapseAllAction);
site.getActionBars().setGlobalActionHandler(deleteAction.getId(), deleteAction);
site.getActionBars().updateActionBars();
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
viewer.setUseHashlookup(true);
viewer.setLabelProvider(new DecoratingLabelProvider(new NavigatorLabelProvider(), WorkbenchPlugin.getDefault().getDecoratorManager().getLabelDecorator()));
viewer.setContentProvider(new NavigatorContentProvider());
viewer.setSorter(new ViewerSorter() {
@Override
public int category(Object element) {
if (element instanceof IAdaptable) {
if (((IAdaptable) element).getAdapter(ISecurity.class) != null) {
return 1;
}
if (((IAdaptable) element).getAdapter(IWatchList.class) != null) {
return 2;
}
if (((IAdaptable) element).getAdapter(IRepository.class) != null) {
return 3;
}
}
return 0;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (e1 instanceof IAdaptable && e2 instanceof IAdaptable) {
if (((IAdaptable) e1).getAdapter(String.class) != null && ((IAdaptable) e2).getAdapter(String.class) != null) {
return 0;
}
}
return super.compare(viewer, e1, e2);
}
});
DragSource dragSource = new DragSource(viewer.getControl(), DND.DROP_COPY | DND.DROP_MOVE);
dragSource.setTransfer(new Transfer[] {
SecurityObjectTransfer.getInstance()
});
dragSource.addDragListener(new DragSourceListener() {
@Override
public void dragStart(DragSourceEvent event) {
event.doit = getSelectedObject(viewer.getSelection()).length != 0;
}
@Override
public void dragSetData(DragSourceEvent event) {
if (SecurityObjectTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = getSelectedObject(viewer.getSelection());
}
}
@Override
public void dragFinished(DragSourceEvent event) {
}
});
MenuManager menuMgr = new MenuManager("#popupMenu", "popupMenu"); //$NON-NLS-1$ //$NON-NLS-2$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager menuManager) {
menuManager.add(new Separator("group.new"));
menuManager.add(new GroupMarker("group.goto"));
menuManager.add(new Separator("group.open"));
menuManager.add(new GroupMarker("group.openWith"));
menuManager.add(new Separator("group.trade"));
menuManager.add(new GroupMarker("group.tradeWith"));
menuManager.add(new Separator("group.show"));
menuManager.add(new Separator("group.edit"));
menuManager.add(new GroupMarker("group.reorganize"));
menuManager.add(new GroupMarker("group.port"));
menuManager.add(new Separator("group.generate"));
menuManager.add(new Separator("group.search"));
menuManager.add(new Separator("group.build"));
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuManager.add(new Separator("group.properties"));
menuManager.appendToGroup("group.show", new Action("Expand All") {
@Override
public void run() {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
viewer.expandToLevel(iter.next(), AbstractTreeViewer.ALL_LEVELS);
}
}
});
menuManager.appendToGroup("group.reorganize", deleteAction);
}
});
viewer.getControl().setMenu(menuMgr.createContextMenu(viewer.getControl()));
getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider());
viewer.addOpenListener(new IOpenListener() {
@Override
public void open(OpenEvent event) {
try {
IHandlerService service = (IHandlerService) getSite().getService(IHandlerService.class);
service.executeCommand("org.eclipse.ui.file.open", null);
} catch (Exception e) {
e.printStackTrace();
}
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IAdaptable[] objects = getSelectedObject(event.getSelection());
deleteAction.setEnabled(objects.length != 0);
getViewSite().getSelectionProvider().setSelection(event.getSelection());
}
});
NavigatorView view = new NavigatorView();
view.setContentProviders(new IStructuredContentProvider[] {
new SecuritiesContentProvider(),
new WatchListsContentProvider(),
});
view.setGroups(new INavigatorContentGroup[] {
new InstrumentTypeGroup(), new MarketGroup(),
});
view.update();
viewer.setInput(view);
if (memento != null) {
String s = memento.getString("expanded");
if (s != null) {
String[] sr = s.split(";");
final Set<Integer> itemHash = new HashSet<Integer>();
for (int i = 0; i < sr.length; i++) {
try {
itemHash.add(Integer.parseInt(sr[i]));
} catch (Exception e) {
// Do nothing
}
}
view.accept(new IViewVisitor() {
@Override
public boolean visit(IView view) {
return true;
}
@Override
public boolean visit(IViewItem viewItem) {
if (itemHash.contains(viewItem.hashCode())) {
viewer.setExpandedState(viewItem, true);
}
return true;
}
});
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
if (!viewer.getControl().isDisposed()) {
viewer.getControl().setFocus();
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
*/
@Override
public void saveState(IMemento memento) {
Object[] o = viewer.getExpandedElements();
if (o != null && o.length != 0) {
StringBuffer s = new StringBuffer();
for (int i = 0; i < o.length; i++) {
if (i != 0) {
s.append(";");
}
s.append(o[i].hashCode());
}
memento.putString("expanded", s.toString());
}
super.saveState(memento);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
NavigatorView view = (NavigatorView) viewer.getInput();
if (view != null) {
view.dispose();
}
super.dispose();
}
protected IAdaptable[] getSelectedObject(ISelection selection) {
final Set<IAdaptable> list = new HashSet<IAdaptable>();
if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
for (Object o : ((IStructuredSelection) selection).toArray()) {
if (o instanceof NavigatorViewItem) {
((NavigatorViewItem) o).accept(new IViewItemVisitor() {
@Override
public boolean visit(IViewItem viewItem) {
ISecurity security = (ISecurity) viewItem.getAdapter(ISecurity.class);
if (security != null) {
list.add(security);
}
IWatchList watchlist = (IWatchList) viewItem.getAdapter(IWatchList.class);
if (watchlist != null) {
list.add(watchlist);
}
return true;
}
});
}
}
}
return list.toArray(new IAdaptable[list.size()]);
}
}