/*******************************************************************************
* Copyright 2005-2007, CHISEL Group, University of Victoria, Victoria, BC, Canada
* and IBM Corporation. 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:
* The Chisel Group, University of Victoria
*******************************************************************************/
package net.sourceforge.tagsea.resources.synchronize.ui;
import java.util.HashSet;
import net.sourceforge.tagsea.TagSEAPlugin;
import net.sourceforge.tagsea.core.IWaypointChangeEvent;
import net.sourceforge.tagsea.core.IWaypointChangeListener;
import net.sourceforge.tagsea.core.WaypointDelta;
import net.sourceforge.tagsea.resources.ResourceWaypointPlugin;
import net.sourceforge.tagsea.resources.ResourceWaypointUtils;
import net.sourceforge.tagsea.resources.synchronize.IWaypointSynchronizeListener;
import net.sourceforge.tagsea.resources.synchronize.WaypointSynchronizeObject;
import net.sourceforge.tagsea.resources.synchronize.WaypointSynchronizerHelp;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.Page;
/**
* A page that displays the
* @author Del Myers
*
*/
public class WaypointSynchronizePage extends Page implements IWaypointChangeListener, IWaypointSynchronizeListener {
private Composite control;
private TreeViewer viewer;
/* (non-Javadoc)
* @see org.eclipse.ui.part.Page#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite page = new Composite(parent, SWT.NONE);
page.setLayout(new GridLayout());
page.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TreeViewer viewer = new TreeViewer(page, SWT.SINGLE);
viewer.setContentProvider(new ProjectWaypointContentProvider());
viewer.setLabelProvider(new WaypointSynchronizeLabelProvider());
viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
viewer.getTree().addMouseListener(new MouseAdapter(){
@Override
public void mouseDoubleClick(MouseEvent e) {
openEditor();
}
});
viewer.getTree().addSelectionListener(new SelectionAdapter(){
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
refreshEditor();
}
});
this.control = page;
this.viewer = viewer;
TagSEAPlugin.addWaypointChangeListener(this);
WaypointSynchronizerHelp.INSTANCE.addSynchronizeListener(this);
}
protected void refreshEditor() {
IStructuredSelection ss = (IStructuredSelection) viewer.getSelection();
if (!ss.isEmpty()) {
Object o = ss.getFirstElement();
if (o instanceof WaypointSynchronizeObject) {
IEditorInput input = new WaypointSynchronizeEditorInput((WaypointSynchronizeObject) o);
IEditorReference[] editors =
getSite().
getPage().
findEditors(
input,
WaypointCompareEditor.ID,
IWorkbenchPage.MATCH_ID
);
for (IEditorReference e : editors) {
IEditorPart editor = e.getEditor(false);
if (editor instanceof IReusableEditor) {
((IReusableEditor)editor).setInput(input);
break;
}
}
}
}
}
/**
*
*/
protected void openEditor() {
IStructuredSelection ss = (IStructuredSelection) viewer.getSelection();
if (!ss.isEmpty()) {
Object o = ss.getFirstElement();
if (o instanceof WaypointSynchronizeObject) {
try {
IEditorInput input = new WaypointSynchronizeEditorInput((WaypointSynchronizeObject) o);
IEditorPart editor =
getSite().
getPage().
openEditor(
input,
WaypointCompareEditor.ID, true,
IWorkbenchPage.MATCH_ID
);
if (editor instanceof IReusableEditor) {
((IReusableEditor)editor).setInput(input);
}
} catch (PartInitException e) {
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.Page#dispose()
*/
@Override
public void dispose() {
super.dispose();
TagSEAPlugin.removeWaypointChangeListener(this);
WaypointSynchronizerHelp.INSTANCE.removeSynchronizeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.Page#getControl()
*/
@Override
public Control getControl() {
return control;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.Page#setFocus()
*/
@Override
public void setFocus() {
}
/* (non-Javadoc)
* @see net.sourceforge.tagsea.core.IWaypointChangeListener#waypointsChanged(net.sourceforge.tagsea.core.WaypointDelta)
*/
public void waypointsChanged(WaypointDelta delta) {
HashSet<IProject> projectsToRefresh = new HashSet<IProject>();
for (IWaypointChangeEvent e :delta.getChanges()) {
if (e.getWaypoint().getType().equals(ResourceWaypointPlugin.WAYPOINT_ID)) {
IResource resource = ResourceWaypointUtils.getResource(e.getWaypoint());
if (resource != null && resource.isAccessible()) {
projectsToRefresh.add(resource.getProject());
}
}
}
for (IProject project : projectsToRefresh) {
final IProject p = project;
getSite().getShell().getDisplay().asyncExec(new Runnable(){
public void run() {
viewer.refresh(p, true);
}
});
}
}
/* (non-Javadoc)
* @see net.sourceforge.tagsea.resources.synchronize.IWaypointSynchronizeListener#synchronizationChanged(org.eclipse.core.resources.IProject)
*/
public void synchronizationChanged(IProject project) {
viewer.refresh(project);
}
}