/* * 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); } } } }