blob: e7c9322111c1ec330510fbbdd30c0e1454936acc [file] [log] [blame]
/*
* Copyright (c) 2007-2009, 2011, 2012 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.buddies.internal.ui.views;
import org.eclipse.net4j.buddies.IBuddyCollaboration;
import org.eclipse.net4j.buddies.IBuddySession;
import org.eclipse.net4j.buddies.common.ICollaboration;
import org.eclipse.net4j.buddies.common.IFacility;
import org.eclipse.net4j.buddies.common.IFacilityInstalledEvent;
import org.eclipse.net4j.buddies.common.IMembership;
import org.eclipse.net4j.buddies.internal.ui.messages.Messages;
import org.eclipse.net4j.buddies.ui.IFacilityPaneCreator;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.container.IContainerEvent;
import org.eclipse.net4j.util.container.IContainerEventVisitor;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.ui.actions.SafeAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Eike Stepper
*/
public class CollaborationsPane extends Composite implements IListener
{
private CollaborationsView collaborationsView;
private IBuddySession session;
private IBuddyCollaboration activeCollaboration;
private Map<IBuddyCollaboration, IFacility> activeFacilities = new HashMap<IBuddyCollaboration, IFacility>();
private Map<IFacility, FacilityPane> facilityPanes = new HashMap<IFacility, FacilityPane>();
private List<ActivateFacilityAction> activateFacilityActions = new ArrayList<ActivateFacilityAction>();
private StackLayout paneStack;
public CollaborationsPane(Composite parent, CollaborationsView collaborationsView)
{
super(parent, SWT.NONE);
setLayout(paneStack = new StackLayout());
this.collaborationsView = collaborationsView;
}
public CollaborationsView getCollaborationsView()
{
return collaborationsView;
}
public IBuddySession getSession()
{
return session;
}
public void setSession(IBuddySession session)
{
this.session = session;
if (session != null)
{
for (ICollaboration collaboration : session.getSelf().getCollaborations())
{
collaborationAdded((IBuddyCollaboration)collaboration);
}
}
updateState();
}
public IBuddyCollaboration getActiveCollaboration()
{
return activeCollaboration;
}
public void setActiveCollaboration(IBuddyCollaboration collaboration)
{
if (activeCollaboration != collaboration)
{
activeCollaboration = collaboration;
IFacility facility = activeFacilities.get(collaboration);
setActiveFacility(collaboration, facility);
updateState();
collaborationsView.refreshViewer(true);
}
}
public void setActiveFacility(IBuddyCollaboration collaboration, IFacility facility)
{
activeFacilities.put(collaboration, facility);
if (collaboration == activeCollaboration)
{
FacilityPane facilityPane = facilityPanes.get(facility);
setActiveFacilityPane(facilityPane);
updateState();
}
}
protected void setActiveFacilityPane(FacilityPane newPane)
{
if (paneStack.topControl != newPane)
{
FacilityPane oldPane = (FacilityPane)paneStack.topControl;
if (oldPane != null)
{
oldPane.hidden(newPane);
}
paneStack.topControl = newPane;
layout();
if (newPane != null)
{
newPane.showed(oldPane);
}
updateState();
}
}
public void fillActionBars(IActionBars bars)
{
IToolBarManager manager = bars.getToolBarManager();
for (IFacilityPaneCreator c : collaborationsView.getFacilityPaneCreators().values())
{
ActivateFacilityAction action = new ActivateFacilityAction(c.getType(), c.getImageDescriptor());
activateFacilityActions.add(action);
manager.add(action);
}
}
public void updateState()
{
for (ActivateFacilityAction action : activateFacilityActions)
{
if (activeCollaboration == null)
{
action.setEnabled(false);
}
else
{
String type = action.getType();
action.setEnabled(activeCollaboration.getFacility(type) != null);
IFacility activeFacility = activeFacilities.get(activeCollaboration);
action.setChecked(activeFacility != null && ObjectUtil.equals(activeFacility.getType(), type));
}
}
}
public void notifyEvent(IEvent event)
{
if (session == null)
{
return;
}
if (event.getSource() == session.getSelf() && event instanceof IContainerEvent<?>)
{
@SuppressWarnings("unchecked")
IContainerEvent<IMembership> e = (IContainerEvent<IMembership>)event;
e.accept(new IContainerEventVisitor<IMembership>()
{
public void added(IMembership membership)
{
collaborationAdded((IBuddyCollaboration)membership.getCollaboration());
}
public void removed(IMembership membership)
{
collaborationRemoved((IBuddyCollaboration)membership.getCollaboration());
}
});
}
else if (event instanceof IFacilityInstalledEvent)
{
IFacilityInstalledEvent e = (IFacilityInstalledEvent)event;
facilityInstalled(e.getFacility(), e.fromRemote());
}
}
protected void collaborationAdded(IBuddyCollaboration collaboration)
{
IFacility[] facilities = collaboration.getFacilities();
for (IFacility facility : facilities)
{
addFacilityPane(facility);
}
if (activeCollaboration == null)
{
setActiveCollaboration(collaboration);
}
if (facilities.length != 0)
{
setActiveFacility(collaboration, facilities[0]);
}
collaboration.addListener(this);
}
protected void collaborationRemoved(IBuddyCollaboration collaboration)
{
collaboration.removeListener(this);
if (activeCollaboration == collaboration)
{
setActiveCollaboration(activeFacilities.isEmpty() ? null : activeFacilities.keySet().iterator().next());
}
activeFacilities.remove(collaboration);
for (IFacility facility : collaboration.getFacilities())
{
FacilityPane pane = facilityPanes.remove(facility);
if (pane != null)
{
pane.dispose();
}
}
}
protected void facilityInstalled(final IFacility facility, boolean fromRemote)
{
final IBuddyCollaboration collaboration = (IBuddyCollaboration)facility.getCollaboration();
if (fromRemote)
{
Runnable runnable = new Runnable()
{
public void run()
{
try
{
addFacilityPane(facility);
IFacility activeFacility = activeFacilities.get(collaboration);
if (activeFacility == null)
{
setActiveFacility(collaboration, facility);
}
else
{
updateState();
}
}
catch (RuntimeException ignore)
{
}
}
};
try
{
Display display = getDisplay();
if (display.getThread() == Thread.currentThread())
{
runnable.run();
}
else
{
display.asyncExec(runnable);
}
}
catch (RuntimeException ignore)
{
}
}
else
{
addFacilityPane(facility);
setActiveCollaboration(collaboration);
setActiveFacility(collaboration, facility);
}
}
protected FacilityPane addFacilityPane(IFacility facility)
{
IFacilityPaneCreator creator = collaborationsView.getFacilityPaneCreators().get(facility.getType());
FacilityPane pane = creator.createPane(this, SWT.NONE);
pane.setFacility(facility);
facilityPanes.put(facility, pane);
return pane;
}
/**
* @author Eike Stepper
*/
private final class ActivateFacilityAction extends SafeAction
{
private final String type;
private ActivateFacilityAction(String type, ImageDescriptor descriptor)
{
super(StringUtil.cap(type), AS_RADIO_BUTTON);
setToolTipText(MessageFormat.format(Messages.getString("CollaborationsPane_0"), type)); //$NON-NLS-1$
setImageDescriptor(descriptor);
this.type = type;
}
public String getType()
{
return type;
}
@Override
protected void safeRun() throws Exception
{
if (activeCollaboration != null)
{
IFacility facility = activeCollaboration.getFacility(type);
setActiveFacility(activeCollaboration, facility);
}
}
}
}