/**************************************************************************** * Copyright (c) 2007 Composent, 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: * Composent, Inc. - initial API and implementation *****************************************************************************/ package org.eclipse.ecf.presence.collab.ui.console; import java.util.Hashtable; import java.util.Map; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.datashare.IChannelContainerAdapter; import org.eclipse.ecf.internal.presence.collab.ui.Messages; import org.eclipse.ecf.presence.collab.ui.AbstractCollabShare; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.*; import org.eclipse.ui.console.*; /** * Send/receive requests to share a specific view (identified by view ID). */ public class ConsoleShare extends AbstractCollabShare { private static final Map consoleSharechannels = new Hashtable(); static TextSelection selection = null; static boolean initialized = false; static final ISelectionListener selectionListener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection sel) { if (part instanceof IConsoleView && sel instanceof TextSelection) { TextSelection s = (TextSelection) sel; if (s == null || s.getLength() == 0) ConsoleShare.selection = null; else ConsoleShare.selection = (TextSelection) sel; } } }; public static ConsoleShare getStackShare(ID containerID) { return (ConsoleShare) consoleSharechannels.get(containerID); } public static ConsoleShare addStackShare(ID containerID, IChannelContainerAdapter channelAdapter) throws ECFException { initialize(); return (ConsoleShare) consoleSharechannels.put(containerID, new ConsoleShare(channelAdapter)); } private static void initialize() { Display.getDefault().asyncExec(new Runnable() { public void run() { if (!initialized) { final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); final IWorkbenchPage page = ww.getActivePage(); page.addSelectionListener(selectionListener); initialized = true; } } }); } public static TextSelection getSelection() { return selection; } public static ConsoleShare removeStackShare(ID containerID) { return (ConsoleShare) consoleSharechannels.remove(containerID); } public ConsoleShare(IChannelContainerAdapter adapter) throws ECFException { super(adapter); } private void handleShowConsoleSelection(final String user, final String consoleSelection) { Display.getDefault().asyncExec(new Runnable() { public void run() { try { final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (ww == null) throw new PartInitException(Messages.ConsoleShare_EXCEPTION_WW_NOT_AVAILABLE); final IWorkbenchPage wp = ww.getActivePage(); if (wp == null) throw new PartInitException(Messages.ConsoleShare_EXCEPTION_WP_NOT_AVAILABLE); wp.showView(IConsoleConstants.ID_CONSOLE_VIEW); final IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager(); final IConsole[] consoles = consoleManager.getConsoles(); if (consoles.length == 0) { MessageDialog.openInformation(null, NLS.bind(Messages.ConsoleShare_STACK_TRACE_FROM_TITLE, user), NLS.bind(Messages.ConsoleShare_STACK_TRACE_FROM_MESSAGE, user)); return; } for (int i = 0; i < consoles.length; i++) { final String consoleType = consoles[i].getType(); if (consoleType != null && consoleType.equals("javaStackTraceConsole")) { //$NON-NLS-1$ final TextConsole textConsole = (TextConsole) consoles[i]; textConsole.activate(); final IDocument document = textConsole.getDocument(); final String text = document.get() + getConsoleSelectionToShow(user, consoleSelection); document.set(text); } } } catch (final Exception e) { logError(Messages.ConsoleShare_STACKSHARE_ERROR_LOG_MESSAGE, e); } } }); } String getConsoleSelectionToShow(String user, String stackTrace) { return NLS.bind(Messages.ConsoleShare_STACK_TRACE_CONTENT, user, stackTrace); } public void sendShareConsoleSelection(final String senderuser, final ID toID, final String consoleSelection) { Display.getDefault().asyncExec(new Runnable() { public void run() { try { sendMessage(toID, serialize(new Object[] {senderuser, consoleSelection})); } catch (final ECFException e) { logError(e.getStatus()); } catch (final Exception e) { logError(Messages.Share_EXCEPTION_LOG_SEND, e); } } }); } /* * (non-Javadoc) * * @see org.eclipse.ecf.datashare.AbstractShare#handleChannelData(byte[]) */ protected void handleMessage(ID fromContainerID, byte[] data) { try { final Object[] msg = (Object[]) deserialize(data); handleShowConsoleSelection((String) msg[0], (String) msg[1]); } catch (final Exception e) { logError(Messages.Share_EXCEPTION_LOG_MESSAGE, e); } } }