/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.gallery;
import java.util.List;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
import org.xmind.gef.GraphicalViewer;
import org.xmind.gef.event.MouseEvent;
import org.xmind.gef.part.GraphicalEditPart;
import org.xmind.gef.part.GraphicalRootEditPart;
import org.xmind.gef.part.IGraphicalPart;
import org.xmind.gef.part.IPart;
import org.xmind.gef.part.IPartFactory;
import org.xmind.gef.part.IRootPart;
import org.xmind.gef.tool.SelectTool;
/**
* @author Frank Shaka
*
*/
public class NavigationViewer extends GraphicalViewer {
private static class NavigationSelectTool extends SelectTool {
@Override
protected boolean handleMouseDown(MouseEvent me) {
if (me.leftOrRight) {
if (me.target.hasRole(GEF.ROLE_SELECTABLE)) {
selectSingle(me.target);
return true;
}
return super.handleMouseDown(me);
} else {
return false;
}
}
/*
* (non-Javadoc)
*
* @see org.xmind.gef.tool.SelectTool#select(java.util.List,
* org.xmind.gef.part.IPart)
*/
@Override
protected void select(List<? extends IPart> toSelect, IPart toFocus) {
if (toSelect.isEmpty())
return;
super.select(toSelect, toFocus);
}
}
private class NavigationScrollHandler implements Listener {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets
* .Event)
*/
public void handleEvent(Event event) {
int offset = event.count;
offset = (int) (Math.sqrt(Math.abs(offset)) * offset);
((NavigationContentPart) getRootPart().getContents())
.addScrollOffset(offset);
}
}
public static final int PREF_HEIGHT = 60;
public static final int BIG_HEIGHT = 70;
public static final int SMALL_HEIGHT = 50;
public static final int BIG_ALPHA = 0;
public static final int SMALL_ALPHA = 40;
private static class EmptyPart extends GraphicalEditPart {
protected IFigure createFigure() {
return new Figure();
}
}
private static IPartFactory DEFAULT_PART_FACTORY = new IPartFactory() {
public IPart createPart(IPart context, Object model) {
if (context instanceof NavigationContentPart) {
return new NavigationItemPart(model);
} else if (context instanceof IRootPart) {
return new NavigationContentPart(model);
} else {
return new EmptyPart();
}
}
};
private class LabelProviderListener implements ILabelProviderListener {
public void labelProviderChanged(LabelProviderChangedEvent event) {
update(event.getElements());
}
}
private IStructuredContentProvider contentProvider = null;
private IBaseLabelProvider labelProvider = null;
private ILabelProviderListener labelProviderListener = null;
/**
*
*/
public NavigationViewer() {
setPartFactory(DEFAULT_PART_FACTORY);
setRootPart(new GraphicalRootEditPart());
EditDomain editDomain = new EditDomain();
editDomain.installTool(GEF.TOOL_SELECT, new NavigationSelectTool());
setEditDomain(editDomain);
NavigationAnimationService animationService = new NavigationAnimationService(
this);
installService(NavigationAnimationService.class, animationService);
animationService.setActive(true);
}
public <T> T getAdapter(Class<T> adapter) {
if (IContentProvider.class.equals(adapter)
|| IStructuredContentProvider.class.equals(adapter))
return adapter.cast(getContentProvider());
if (IBaseLabelProvider.class.equals(adapter))
return adapter.cast(getLabelProvider());
return super.getAdapter(adapter);
}
public IStructuredContentProvider getContentProvider() {
return contentProvider;
}
public void setContentProvider(IStructuredContentProvider contentProvider) {
if (contentProvider == null || contentProvider == this.contentProvider)
return;
IStructuredContentProvider oldContentProvider = this.contentProvider;
this.contentProvider = contentProvider;
if (oldContentProvider != null) {
oldContentProvider.dispose();
}
contentProvider.inputChanged(this, getInput(), getInput());
refresh();
}
/*
* (non-Javadoc)
*
* @see org.xmind.gef.GraphicalViewer#internalInputChanged(java.lang.Object,
* java.lang.Object)
*/
@Override
protected void internalInputChanged(Object input, Object oldInput) {
if (getContentProvider() != null) {
getContentProvider().inputChanged(this, oldInput, input);
}
super.internalInputChanged(input, oldInput);
}
public void update() {
update(null);
}
public void update(Object[] elements) {
if (elements == null) {
IPart contents = getRootPart().getContents();
if (contents.getStatus().isActive())
contents.refresh();
for (IPart p : contents.getChildren()) {
if (p.getStatus().isActive()) {
((IGraphicalPart) p).refresh();
}
}
} else {
for (Object element : elements) {
IPart p = findPart(element);
if (p != null && p.getStatus().isActive()) {
((IGraphicalPart) p).refresh();
}
}
}
}
public IBaseLabelProvider getLabelProvider() {
if (labelProvider == null) {
labelProvider = new LabelProvider();
}
return labelProvider;
}
public void setLabelProvider(IBaseLabelProvider labelProvider) {
if (labelProvider == null)
return;
IBaseLabelProvider oldLabelProvider = this.labelProvider;
if (labelProvider == oldLabelProvider)
return;
if (oldLabelProvider != null) {
if (labelProviderListener != null) {
oldLabelProvider.removeListener(labelProviderListener);
}
}
this.labelProvider = labelProvider;
if (labelProviderListener == null)
labelProviderListener = new LabelProviderListener();
labelProvider.addListener(labelProviderListener);
refresh();
if (oldLabelProvider != null) {
oldLabelProvider.dispose();
}
}
protected void handleDispose(DisposeEvent e) {
if (labelProvider != null) {
if (labelProviderListener != null)
labelProvider.removeListener(labelProviderListener);
labelProvider.dispose();
labelProvider = null;
}
if (contentProvider != null) {
contentProvider.dispose();
contentProvider = null;
}
super.handleDispose(e);
}
/*
* (non-Javadoc)
*
* @see org.xmind.gef.GraphicalViewer#internalCreateControl(org.eclipse.swt.
* widgets .Composite, int)
*/
@Override
protected Control internalCreateControl(Composite parent, int style) {
FigureCanvas canvas = (FigureCanvas) super.internalCreateControl(parent,
style);
canvas.setScrollBarVisibility(FigureCanvas.NEVER);
getViewport().setContentsTracksWidth(true);
getViewport().setContentsTracksHeight(true);
if (Util.isMac()) {
canvas.addListener(SWT.MouseHorizontalWheel,
new NavigationScrollHandler());
} else {
canvas.addListener(SWT.MouseVerticalWheel,
new NavigationScrollHandler());
}
return canvas;
}
}