/*******************************************************************************
* Copyright (c) 2011, 2013 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.ui.views.internal;
import java.util.EventObject;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.ui.views.events.ViewerContentChangeEvent;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.INavigatorContentService;
/**
* View common viewer implementation.
*/
public class ViewViewer extends CommonViewer {
// Flag to mark the viewer silent. In silent mode, no
// ViewerContentChangeEvents are send.
private boolean silent = false;
// Remember the last double click selection event state mask
private int lastDoubleClickSelectionEventStateMask = 0;
/**
* Constructor.
*
* @param view
* The common navigator based parent view. Must not be <code>null</code>.
* @param viewerId
* An id tied to the extensions that is used to focus specific
* content to a particular instance of the Common Navigator
* @param parent
* A Composite parent to contain the actual SWT widget
* @param style
* A style mask that will be used to create the TreeViewer
* Composite.
*/
public ViewViewer(String viewerId, Composite parent, int style) {
super(viewerId, parent, style);
}
/**
* Fire the given event if the viewer is not in silent mode.
*
* @param event The event or <code>null</code>.
*/
private void fireEvent(EventObject event) {
if (!silent && event != null) {
EventManager.getInstance().fireEvent(event);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#init()
*/
@Override
protected void init() {
setUseHashlookup(true);
INavigatorContentService contentService = getNavigatorContentService();
setContentProvider(contentService.createCommonContentProvider());
setLabelProvider(new ViewViewerDecoratingLabelProvider(this, contentService.createCommonLabelProvider()));
initDragAndDrop();
}
/**
* Sets the viewers event firing silent mode.
*
* @param silent <code>True</code> to stop firing change events, <code>false</code> otherwise.
* @return <code>True</code> if the silent mode changed.
*/
public boolean setSilentMode(boolean silent) {
boolean changed = this.silent != silent;
this.silent = silent;
return changed;
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#add(java.lang.Object, java.lang.Object[])
*/
@Override
public void add(Object parentElement, Object[] childElements) {
super.add(parentElement, childElements);
ViewerContentChangeEvent event = new ViewerContentChangeEvent(this, ViewerContentChangeEvent.ADD);
fireEvent(event);
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#remove(java.lang.Object[])
*/
@Override
public void remove(Object[] elements) {
super.remove(elements);
ViewerContentChangeEvent event = new ViewerContentChangeEvent(this, ViewerContentChangeEvent.REMOVE);
fireEvent(event);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.AbstractTreeViewer#remove(java.lang.Object, java.lang.Object[])
*/
@Override
public void remove(Object parent, Object[] elements) {
super.remove(parent, elements);
ViewerContentChangeEvent event = new ViewerContentChangeEvent(this, ViewerContentChangeEvent.REMOVE);
fireEvent(event);
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#refresh(java.lang.Object, boolean)
*/
@Override
public void refresh(Object element, boolean updateLabels) {
super.refresh(element, updateLabels);
ViewerContentChangeEvent event = new ViewerContentChangeEvent(this, ViewerContentChangeEvent.REFRESH);
fireEvent(event);
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#handleDoubleSelect(org.eclipse.swt.events.SelectionEvent)
*/
@Override
protected void handleDoubleSelect(SelectionEvent event) {
lastDoubleClickSelectionEventStateMask = event != null ? event.stateMask : 0;
super.handleDoubleSelect(event);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.StructuredViewer#fireDoubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
@Override
protected void fireDoubleClick(DoubleClickEvent event) {
boolean altPressed = (lastDoubleClickSelectionEventStateMask & SWT.ALT) != 0;
if (altPressed) {
event = new AltDoubleClickEvent((Viewer)event.getSource(), event.getSelection());
}
super.fireDoubleClick(event);
}
}