/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* 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:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.ui.web.views;
import org.eclipse.jface.action.IToolBarManager;
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.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
import com.subgraph.vega.api.events.IEvent;
import com.subgraph.vega.api.events.IEventHandler;
import com.subgraph.vega.api.model.IModel;
import com.subgraph.vega.api.model.IWorkspace;
import com.subgraph.vega.api.model.WorkspaceCloseEvent;
import com.subgraph.vega.api.model.WorkspaceOpenEvent;
import com.subgraph.vega.api.model.WorkspaceResetEvent;
import com.subgraph.vega.api.model.web.IWebEntity;
import com.subgraph.vega.ui.web.Activator;
public class WebsiteView extends ViewPart implements IDoubleClickListener {
private static class UnvisitedFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if(element instanceof IWebEntity) {
final IWebEntity entity = (IWebEntity) element;
return entity.isVisited();
}
return false;
}
}
private TreeViewer viewer;
private DrillDownAdapter drillDown;
@Override
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent);
viewer.setContentProvider(new WebsiteContentProvider());
viewer.setLabelProvider(new WebsiteLabelProvider());
final IModel model = Activator.getDefault().getModel();
if(model != null) {
final IWorkspace currentWorkspace = model.addWorkspaceListener(new IEventHandler() {
@Override
public void handleEvent(IEvent event) {
if(event instanceof WorkspaceOpenEvent)
handleWorkspaceOpen((WorkspaceOpenEvent) event);
else if(event instanceof WorkspaceCloseEvent)
handleWorkspaceClose((WorkspaceCloseEvent) event);
else if(event instanceof WorkspaceResetEvent)
handleWorkspaceReset((WorkspaceResetEvent) event);
}
});
if(currentWorkspace != null)
viewer.setInput(currentWorkspace);
}
viewer.setSorter(new Sorter());
viewer.addDoubleClickListener(this);
getSite().setSelectionProvider(viewer);
drillDown = new DrillDownAdapter(viewer);
contributeToActionBars();
}
public void setHideUnvisitedSites(boolean value) {
if(value) {
viewer.setFilters(new ViewerFilter[] { new UnvisitedFilter() });
} else {
viewer.setFilters(new ViewerFilter[0]);
}
}
private void handleWorkspaceOpen(WorkspaceOpenEvent event) {
viewer.setInput(event.getWorkspace());
}
private void handleWorkspaceClose(WorkspaceCloseEvent event) {
viewer.setInput(null);
}
private void handleWorkspaceReset(WorkspaceResetEvent event) {
viewer.setInput(null);
viewer.setInput(event.getWorkspace());
}
@Override
public void setFocus() {
viewer.getTree().setFocus();
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillToolBar(bars.getToolBarManager());
}
private void fillToolBar(IToolBarManager manager) {
drillDown.addNavigationActions(manager);
}
@Override
public void doubleClick(DoubleClickEvent event) {
final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
final Object element = selection.getFirstElement();
if(viewer.isExpandable(element)) {
viewer.setExpandedState(element, !viewer.getExpandedState(element));
}
}
}