Package org.eclipse.ecf.example.collab.share

Source Code of org.eclipse.ecf.example.collab.share.EclipseCollabSharedObject

/****************************************************************************
* Copyright (c) 2004, 2008 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.example.collab.share;

import java.io.*;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.sharedobject.ReplicaSharedObjectDescription;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.example.collab.share.io.*;
import org.eclipse.ecf.internal.example.collab.ClientPlugin;
import org.eclipse.ecf.internal.example.collab.Messages;
import org.eclipse.ecf.internal.example.collab.presence.PresenceContainer;
import org.eclipse.ecf.internal.example.collab.ui.*;
import org.eclipse.ecf.internal.example.collab.ui.hyperlink.EclipseCollabHyperlinkDetector;
import org.eclipse.ecf.presence.*;
import org.eclipse.ecf.presence.im.*;
import org.eclipse.ecf.presence.roster.*;
import org.eclipse.ecf.presence.ui.MessagesView;
import org.eclipse.ecf.ui.screencapture.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.*;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;

public class EclipseCollabSharedObject extends GenericSharedObject {
  /**
   *
   */
  private static final int MAX_MESSAGE_SIZE = 8096;
  private static final String HANDLE_SHOW_VIEW_MSG = "handleShowView"; //$NON-NLS-1$
  private static final String HANDLE_SHOW_VIEW_WITH_ID_MSG = "handleShowViewWithID"; //$NON-NLS-1$
  private static final String HANDLE_LAUNCH_EDITOR_FOR_FILE_MSG = "handleLaunchEditorForFile"; //$NON-NLS-1$
  private static final String HANDLE_OPEN_AND_SELECT_FOR_FILE_MSG = "handleOpenAndSelectForFile"; //$NON-NLS-1$
  private static final String HANDLE_ADD_MARKER_FOR_FILE_MSG = "handleAddMarkerForFile"; //$NON-NLS-1$
  private static final String HANDLE_USER_UPDATE_MSG = "handleUserUpdate"; //$NON-NLS-1$
  private static final String HANDLE_UNREGISTER_PROXY_MSG = "handleUnregisterProxy"; //$NON-NLS-1$
  private static final String HANDLE_SHOW_TEXT_MSG = "handleShowTextMsg"; //$NON-NLS-1$
  private static final String HANDLE_USER_MSG = "handleUserMessage"; //$NON-NLS-1$
  private static final String HANDLE_REQUEST_USER_UPDATE_MSG = "handleRequestUserUpdate"; //$NON-NLS-1$
  private static final String HANDLE_REGISTER_PROXY_MSG = "handleRegisterProxy"; //$NON-NLS-1$
  private static final String HANDLE_SHOW_PRIVATE_TEXT_MSG = "handleShowPrivateTextMsg"; //$NON-NLS-1$
  private static final String HANDLE_NOTIFY_USER_ADDED_MSG = "handleNotifyUserAdded"; //$NON-NLS-1$
  private static final String HANDLE_STARTED_TYPING_MSG = "handleStartedTyping"; //$NON-NLS-1$

  public static final String SHARED_MARKER_TYPE = ClientPlugin.SHARED_MARKER_TYPE;
  public static final String ID = "chat"; //$NON-NLS-1$

  private static final String DEFAULT_WINDOW_TITLE = Messages.EclipseCollabSharedObject_WINDOW_TITLE;
  private static final String HANDLE_SHOW_IMAGE_START_MSG = "handleShowImageStart"; //$NON-NLS-1$
  private static final String HANDLE_SHOW_IMAGE_DATA_MSG = "handleShowImageData"; //$NON-NLS-1$

  private String windowTitle = DEFAULT_WINDOW_TITLE;
  private String downloadDirectory = ""; //$NON-NLS-1$
  private LineChatClientView localGUI = null;
  private IResource localResource = null;
  private IUser localUser = null;
  private String localVersion = ""; //$NON-NLS-1$
  private ID serverID = null;
  private ID containerID;
  private SharedObjectEventListener sharedObjectEventListener = null;

  private PresenceContainer presenceContainer;

  public EclipseCollabSharedObject() {
  }

  /**
   * @since 2.0
   */
  public EclipseCollabSharedObject(IContainer container, IResource proj, IUser user, String downloaddir) {
    this.localResource = proj;
    this.localUser = user;
    this.downloadDirectory = downloaddir;

    containerID = container.getID();
    presenceContainer = new PresenceContainer(this, container, localUser);
    presenceContainer.addMessageListener(new IIMMessageListener() {
      public void handleMessageEvent(IIMMessageEvent messageEvent) {
        if (messageEvent instanceof IChatMessageEvent) {
          handleChatMessageEvent((IChatMessageEvent) messageEvent);
        }
      }
    });

    createOutputView();
    Assert.isNotNull(localGUI, "Local GUI cannot be created...exiting"); //$NON-NLS-1$
  }

  /**
   * @since 2.0
   */
  public ID getContainerID() {
    return containerID;
  }

  void handleChatMessageEvent(final IChatMessageEvent event) {
    final IWorkbench workbench = PlatformUI.getWorkbench();
    workbench.getDisplay().asyncExec(new Runnable() {
      public void run() {
        appendMessage(presenceContainer.getChatMessageSender(), presenceContainer.getTypingMessageSender(), event.getChatMessage());
      }
    });
  }

  /**
   * @since 2.0
   */
  public MessagesView findMessagesView() {
    IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
    for (int i = 0; i < windows.length; i++) {
      IWorkbenchPage page = windows[i].getActivePage();
      if (page != null) {
        MessagesView view = (MessagesView) page.findView(MessagesView.VIEW_ID);
        if (view != null) {
          return view;
        }
      }
    }

    for (int i = 0; i < windows.length; i++) {
      IWorkbenchPage page = windows[i].getActivePage();
      if (page != null) {
        try {
          return (MessagesView) page.showView(MessagesView.VIEW_ID);
        } catch (PartInitException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }
    return null;
  }

  void appendMessage(IChatMessageSender chatMessageSender, ITypingMessageSender typingMessageSender, IChatMessage message) {
    IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
    for (int i = 0; i < windows.length; i++) {
      IWorkbenchPage page = windows[i].getActivePage();
      if (page != null) {
        MessagesView view = (MessagesView) page.findView(MessagesView.VIEW_ID);
        if (view != null) {
          view.openTab(chatMessageSender, typingMessageSender, containerID, message.getFromID());
          view.showMessage(message);

          if (!page.isPartVisible(view)) {
            IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) view.getSite().getService(IWorkbenchSiteProgressService.class);
            if (service != null) {
              service.warnOfContentChange();
            }
          }
          return;
        }
      }
    }

    for (int i = 0; i < windows.length; i++) {
      IWorkbenchPage page = windows[i].getActivePage();
      if (page != null) {
        try {
          MessagesView view = (MessagesView) page.showView(MessagesView.VIEW_ID);
          view.openTab(chatMessageSender, typingMessageSender, containerID, message.getFromID());
          view.showMessage(message);
        } catch (PartInitException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        break;
      }
    }
  }

  /**
   * @since 2.0
   */
  public IPresenceContainerAdapter getPresenceContainer() {
    return presenceContainer;
  }

  public void activated(ID[] others) {
    super.activated(others);
    if (localGUI == null && !getContext().isGroupManager())
      destroySelfLocal();
  }

  public void chatException(Exception e, String text) {
    log(text, e);
  }

  public void chatGUIDestroy() {
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener.windowClosing();
      sharedObjectEventListener = null;
    }
    destroySelf();
  }

  public void deactivated() {
    super.deactivated();
    synchronized (this) {
      if (localGUI != null) {
        localGUI.disposeClient();
        localGUI = null;
      }
    }
    shells.clear();
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener = null;
    }
    if (localResource != null) {
      localResource = null;
    }
  }

  public void destroySelf() {
    presenceContainer.unregister();
    // Make sure we disconnect
    try {
      if (isHost())
        disconnect();
    } catch (final Exception e) {
      log("Exception in destroySelf", e); //$NON-NLS-1$
    }
    // Destroy self
    super.destroySelfLocal();
  }

  public String getDownloadDirectory(String dir) {
    return downloadDirectory;
  }

  public SharedObjectEventListener getSharedObjectEventListener() {
    return sharedObjectEventListener;
  }

  public String getLocalFullProjectPath() {
    String eclipseDir = null;
    try {
      eclipseDir = Platform.getLocation().toOSString();
    } catch (final IllegalStateException e) {
      log("Exception getting local resource path", e); //$NON-NLS-1$
    }
    if (eclipseDir == null)
      eclipseDir = "."; //$NON-NLS-1$
    final String projectDir = (getResource() == null) ? downloadDirectory : getResource().getFullPath().toOSString();
    return new File(eclipseDir, projectDir).getAbsolutePath();
  }

  public String getLocalFullDownloadPath() {
    return new File(getLocalFullProjectPath(), downloadDirectory).getAbsolutePath();
  }

  protected void createOutputView() {
    final String projectName = (localResource == null || localResource.getName().trim().equals("")) ? Messages.EclipseCollabSharedObject_WORKSPACE_RESOURCE_NAME : localResource.getName(); //$NON-NLS-1$
    Display.getDefault().syncExec(new Runnable() {
      public void run() {
        try {
          final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
          final IWorkbenchPage wp = ww.getActivePage();
          wp.showView(LineChatView.VIEW_ID);
          windowTitle = NLS.bind(Messages.EclipseCollabSharedObject_TITLE_BAR, localUser.getNickname());
          LineChatView.setViewName(windowTitle);
          localGUI = LineChatView.createClientView(EclipseCollabSharedObject.this, projectName, NLS.bind(Messages.EclipseCollabSharedObject_PROJECT_NAME, projectName), getLocalFullDownloadPath());

          presenceContainer.getRosterManager().addRosterListener(new RosterListener(EclipseCollabSharedObject.this, localGUI));
        } catch (final Exception e) {
          log("Exception creating LineChatView", e); //$NON-NLS-1$
        }
      }
    });
  }

  public IResource getResource() {
    return localResource;
  }

  protected ReplicaSharedObjectDescription getReplicaDescription(ID remoteID) {
    return null;
  }

  public ID getServerID() {
    return serverID;
  }

  public String getTreeTopLabel() {
    return Messages.EclipseCollabSharedObject_TREE_TOP_LABEL;
  }

  /**
   * @since 2.0
   */
  public IUser getUser() {
    return localUser;
  }

  /**
   * @since 2.0
   */
  public IUser getUserForID(final ID user) {
    return (localGUI != null) ? localGUI.getUser(user) : null;
  }

  public String getUserName() {
    return localUser.getNickname();
  }

  public String getVersionString() {
    return localVersion;
  }

  public String getWindowTitle() {
    return windowTitle;
  }

  // SharedObjectMsg handlers
  protected void handleCreateObject(ReplicaSharedObjectDescription cons) {
    try {
      createObject(null, cons);
    } catch (final Exception e) {
      log("Exception creating local object", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void handleNotifyUserAdded(IUser user) {
    boolean add = false;
    try {
      final ID[] members = getContext().getGroupMemberIDs();
      for (int i = 0; i < members.length; i++) {
        if (members[i].equals(user.getID())) {
          add = true;
          break;
        }
      }
    } catch (final Exception e) {
      log("Exception checking for membership", e); //$NON-NLS-1$
    }
    if (add) {
      Roster roster = (Roster) presenceContainer.getRosterManager().getRoster();
      boolean contains = false;
      for (Iterator it = roster.getItems().iterator(); it.hasNext();) {
        IRosterEntry entry = (IRosterEntry) it.next();
        if (entry.getUser().getID().equals(user.getID())) {
          contains = true;
          break;
        }
      }

      if (!contains) {
        roster.addItem(new RosterEntry(roster, user, new Presence()));
      }
    }
  }

  protected void handleRequestUserUpdate(ID requestor) {
    sendUserUpdate(requestor);
  }

  /**
   * @since 2.0
   */
  protected void handleShowPrivateTextMsg(IUser remote, String aString) {
    ChatMessageEvent messageEvent = new ChatMessageEvent(remote.getID(), new ChatMessage(remote.getID(), aString));
    presenceContainer.fireMessageEvent(messageEvent);
  }

  protected void handleShowTextMsg(ID remote, String aString) {
    // Show line on local interface
    showLineOnGUI(remote, aString);
  }

  /**
   * @since 2.0
   */
  protected void handleUserUpdate(final IUser ud) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        try {
          if (localGUI != null)
            localGUI.changeUser(ud);
        } catch (final Exception e) {
          log("Exception in showLineOnGUI", e); //$NON-NLS-1$
        }
      }
    });
  }

  /**
   * @since 2.0
   */
  protected void handleUserMessage(final IUser sender, String msg) {
    // Show line on local interface
    final String message = msg;
    if (sender == null)
      return;
    if (localGUI != null) {
      Display.getDefault().asyncExec(new Runnable() {
        public void run() {
          Display.getDefault().beep();
          final Shell[] shells = Display.getDefault().getShells();
          if (shells != null && shells.length > 0) {
            shells[0].setActive();
          }
          MessageDialog.openInformation(null, NLS.bind(Messages.EclipseCollabSharedObject_PRIVATE_MESSAGE_TEXT, sender.getNickname()), message);
        }
      });
    }
  }

  /**
   * @since 2.0
   */
  protected synchronized void handleStartedTyping(IUser user) {
    if (localGUI != null)
      localGUI.startedTyping(user);
  }

  public void sendStartedTyping() {
    try {
      forwardMsgTo(null, SharedObjectMsg.createMsg(null, HANDLE_STARTED_TYPING_MSG, localUser));
    } catch (final Exception e) {
      log("Exception on sendStartedTyping to remote clients", e); //$NON-NLS-1$
    }
  }

  public void inputText(String aString) {
    sendShowTextMsg(aString);
  }

  public void disconnect() {
    getContext().disconnect();
  }

  public Object getObject(ID obj) {
    return getContext().getSharedObjectManager().getSharedObject(obj);
  }

  public void memberAdded(ID member) {
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener.memberAdded(member);
    }
    super.memberAdded(member);
    sendNotifyUserAdded();
  }

  public void memberRemoved(final ID member) {
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener.memberRemoved(member);
    }
    super.memberRemoved(member);

    Roster roster = (Roster) presenceContainer.getRosterManager().getRoster();
    IRosterItem itemToRemove = null;
    for (Iterator it = roster.getItems().iterator(); it.hasNext();) {
      IRosterEntry entry = (IRosterEntry) it.next();
      if (entry.getUser().getID().equals(member)) {
        itemToRemove = entry;
        break;
      }
    }

    if (itemToRemove != null) {
      roster.removeItem(itemToRemove);
    }
  }

  public void messageProxyObject(ID target, String classname, String meth, Object[] args) {
    final SharedObjectMsg m = SharedObjectMsg.createMsg(null, classname, meth, args);
    try {
      forwardMsgTo(target, m);
      if (target == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("Exception sending message to proxy object", e); //$NON-NLS-1$
    }
  }

  public void otherActivated(ID object) {
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener.otherActivated(object);
    }
    super.otherActivated(object);
  }

  public void otherDeactivated(ID object) {
    if (sharedObjectEventListener != null) {
      sharedObjectEventListener.otherDeactivated(object);
    }
    super.otherDeactivated(object);
  }

  public void refreshProject() {
    if (localResource != null) {
      try {
        localResource.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
      } catch (final Exception e) {
        log("Exception refreshing resource " + localResource.getName(), e); //$NON-NLS-1$
      }
    }
  }

  // SharedObjectMsg senders
  /**
   * @since 2.0
   */
  public void sendNotifyUserAdded() {
    try {
      forwardMsgTo(null, SharedObjectMsg.createMsg(null, HANDLE_NOTIFY_USER_ADDED_MSG, localUser));
    } catch (final Exception e) {
      log("Exception on sendNotifyUserAdded to remote clients", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendPrivateMessageToUser(ID toId, String msg) {
    try {
      forwardMsgTo(toId, SharedObjectMsg.createMsg(null, HANDLE_SHOW_PRIVATE_TEXT_MSG, localUser, msg));
    } catch (final Exception e) {
      log("Exception on sendShowPrivateTextMsg to remote clients", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendPrivateMessageToUser(IUser touser, String msg) {
    sendPrivateMessageToUser(touser.getID(), msg);
  }

  public void sendRegisterProxy(ID toID, String proxyClass, String name) {
    try {
      forwardMsgTo(toID, SharedObjectMsg.createMsg(null, HANDLE_REGISTER_PROXY_MSG, localUser, proxyClass, name));
    } catch (final IOException e) {
      log("Exception sendRegisterProxy", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendRequestUserUpdate(ID requestTarget) {
    try {
      forwardMsgTo(requestTarget, SharedObjectMsg.createMsg(null, HANDLE_REQUEST_USER_UPDATE_MSG, localContainerID));
    } catch (final Exception e) {
      log("Exception on sendRequestUserUpdate to remote clients", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendRingMessageToUser(IUser user, String msg) {
    ID receiver = null;
    if (user != null) {
      receiver = user.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_USER_MSG, this.localUser, msg);
      forwardMsgTo(receiver, m);
      if (receiver == null)
        sendSelf(m);
    } catch (final Exception e) {
      log("Exception on sendMessageToUser to " + user, e); //$NON-NLS-1$
    }
  }

  public void sendImage(ID toID, ImageData imageData) {
    try {
      forwardMsgTo(toID, SharedObjectMsg.createMsg(null, HANDLE_SHOW_IMAGE_START_MSG, localContainerID, localUser.getNickname(), new ImageWrapper(imageData)));
      final byte[] compressedData = ScreenCaptureUtil.compress(imageData.data);
      final ByteArrayOutputStream bos = new ByteArrayOutputStream(MAX_MESSAGE_SIZE);
      int startPos = 0;
      while (startPos <= compressedData.length) {
        bos.reset();
        final int length = Math.min(compressedData.length - startPos, MAX_MESSAGE_SIZE);
        bos.write(compressedData, startPos, length);
        startPos += MAX_MESSAGE_SIZE;
        bos.flush();
        final Boolean done = new Boolean((compressedData.length - startPos) < 0);
        forwardMsgTo(toID, SharedObjectMsg.createMsg(null, HANDLE_SHOW_IMAGE_DATA_MSG, localContainerID, bos.toByteArray(), done));
      }
    } catch (final Exception e) {
      log("Exception on sendImage", e); //$NON-NLS-1$
    }
  }

  Map shells = new HashMap();

  protected void handleShowImageStart(final ID id, final String fromUser, final ImageWrapper imageWrapper) {
    final Display display = localGUI.getTextControl().getDisplay();
    display.asyncExec(new Runnable() {
      public void run() {
        ShowImageShell showImageShell = (ShowImageShell) shells.get(id);
        if (showImageShell == null) {
          showImageShell = new ShowImageShell(display, id, new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
              shells.remove(id);
            }
          });
          shells.put(id, showImageShell);
        }
        showImageShell.initialize(NLS.bind(Messages.EclipseCollabSharedObject_SCREEN_CAPTURE_FROM, fromUser), imageWrapper);
        showImageShell.open();
      }
    });
  }

  protected void handleShowImageData(final ID id, final byte[] data, final Boolean done) {
    final ShowImageShell showImageShell = (ShowImageShell) shells.get(id);
    if (showImageShell != null) {
      final Display display = showImageShell.getDisplay();
      if (display != null) {
        display.asyncExec(new Runnable() {
          public void run() {
            showImageShell.addData(data);
            if (done.booleanValue())
              showImageShell.showImage();
          }
        });
      }
    }
  }

  public void sendShowTextMsg(String msg) {
    try {
      forwardMsgTo(null, SharedObjectMsg.createMsg(null, HANDLE_SHOW_TEXT_MSG, localContainerID, msg));
    } catch (final Exception e) {
      log("Exception on sendShowTextMsg to remote clients", e); //$NON-NLS-1$
    }
  }

  public void sendUnregisterProxy(ID toID, String proxyClass) {
    try {
      forwardMsgTo(toID, SharedObjectMsg.createMsg(null, HANDLE_UNREGISTER_PROXY_MSG, localUser, proxyClass));
    } catch (final IOException e) {
      log("Exception sendRegisterProxy", e); //$NON-NLS-1$
    }
  }

  public void sendUserUpdate(ID target) {
    try {
      forwardMsgTo(target, SharedObjectMsg.createMsg(null, HANDLE_USER_UPDATE_MSG, localUser));
    } catch (final Exception e) {
      log("Exception on sendUserUpdate to remote clients", e); //$NON-NLS-1$
    }
  }

  public void setListener(SharedObjectEventListener l) {
    sharedObjectEventListener = l;
  }

  public void setServerID(ID server) {
    serverID = server;
  }

  public void setVersionString(String ver) {
    localVersion = ver;
  }

  public void setWindowTitle(String title) {
    this.windowTitle = title;
    synchronized (this) {
      if (localGUI != null) {
        localGUI.setTitle(windowTitle);
      }
    }
  }

  protected void activateView() {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        if (localGUI != null) {
          final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
          final IWorkbenchPage wp = ww.getActivePage();
          wp.activate(localGUI.getView());
        }
      }
    });
  }

  public void showLineOnGUI(final ID remote, final String line) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        try {
          if (localGUI != null)
            localGUI.showLine(new ChatLine(line, getUserForID(remote)));
        } catch (final Exception e) {
          log("Exception in showLineOnGUI", e); //$NON-NLS-1$
        }
      }
    });
  }

  public void showRawLine(final ID sender, final String line, final Runnable onClick) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        try {
          if (localGUI != null) {
            final ChatLine rawLine = new ChatLine(line, getUserForID(sender), onClick);
            rawLine.setRaw(true);
            localGUI.showLine(rawLine);
          }
        } catch (final Exception e) {
          log("Exception in showLineOnGUI", e); //$NON-NLS-1$
        }
      }
    });
  }

  public static class SharedMarker implements Serializable {
    private static final long serialVersionUID = 7419507867486828728L;
    String message = null;
    Integer offset = null;
    Integer length = null;

    public SharedMarker(String message, Integer offset, Integer length) {
      this.message = message;
      this.offset = offset;
      this.length = length;
    }

    public String getMessage() {
      return message;
    }

    public Integer getOffset() {
      return offset;
    }

    public Integer getLength() {
      return length;
    }

    /**
     * @since 2.0
     */
    public String toString() {
      final StringBuffer buf = new StringBuffer("SharedMarker["); //$NON-NLS-1$
      buf.append("message=").append(message).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
      buf.append("offset=").append(offset).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
      buf.append("length=").append(length).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
      return buf.toString();
    }
  }

  /**
   * @since 2.0
   */
  public void sendAddMarkerForFile(IUser touser, String resourceName, int offset, int length) {
    ID receiver = null;
    if (touser != null) {
      receiver = touser.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_ADD_MARKER_FOR_FILE_MSG, getUser(), resourceName, new SharedMarker(Messages.EclipseCollabSharedObject_MARKER_NAME, new Integer(offset), new Integer(length)));
      forwardMsgTo(receiver, m);
      if (receiver == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("Exception on sendAddMarkerForFile to " + touser, e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendOpenAndSelectForFile(IUser touser, String resourceName, int offset, int length) {
    ID receiver = null;
    if (touser != null) {
      receiver = touser.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_OPEN_AND_SELECT_FOR_FILE_MSG, getUser(), resourceName, new SharedMarker(Messages.EclipseCollabSharedObject_MARKER_NAME, new Integer(offset), new Integer(length)));
      forwardMsgTo(receiver, m);
      if (receiver == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("sendOpenAndSelectForFile", e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendLaunchEditorForFile(IUser touser, String resourceName) {
    ID receiver = null;
    if (touser != null) {
      receiver = touser.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_LAUNCH_EDITOR_FOR_FILE_MSG, getUser(), resourceName);
      forwardMsgTo(receiver, m);
      if (receiver == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("Exception on sendLaunchEditorForFile to " + touser, e); //$NON-NLS-1$
    }
  }

  protected Runnable createOpenEditorAndSelectForFileRunnable(final String resourceName, final SharedMarker marker) {
    final Integer offset = marker.getOffset();
    final Integer length = marker.getLength();
    return new Runnable() {
      public void run() {
        final IWorkbench wb = PlatformUI.getWorkbench();
        final IWorkbenchWindow ww = wb.getActiveWorkbenchWindow();
        final IFile file = getIFileForResource(ww, resourceName);
        if (file != null) {
          final EditorHelper eh = new EditorHelper(ww);
          try {
            eh.openAndSelectForFile(file, (offset == null) ? 0 : offset.intValue(), (length == null) ? 0 : length.intValue());
          } catch (final Exception e) {
            log("Exception in openEditorAndSelectForFile", e); //$NON-NLS-1$
          }
        }
      }
    };
  }

  protected IFile getIFileForResource(IWorkbenchWindow ww, String resourceName) {
    final IFile file = getLocalFileForRemote(resourceName);
    if (file == null || !file.exists()) {
      MessageDialog.openInformation(ww.getShell(), Messages.EclipseCollabSharedObject_CANNOT_OPEN_EDITOR_TITLE, NLS.bind(Messages.EclipseCollabSharedObject_CANNOT_OPEN_EDITOR_MESSAGE, resourceName));
      return null;
    }
    return file;
  }

  protected Runnable createOpenEditorForFileRunnable(final String resourceName) {
    return new Runnable() {
      public void run() {
        final IWorkbench wb = PlatformUI.getWorkbench();
        final IWorkbenchWindow ww = wb.getActiveWorkbenchWindow();
        final IFile file = getIFileForResource(ww, resourceName);
        if (file != null) {
          final EditorHelper eh = new EditorHelper(ww);
          try {
            eh.openEditorForFile(file);
          } catch (final Exception e) {
            log("Exception in openEditorAndSelectForFile", e); //$NON-NLS-1$
          }
        }
      }
    };
  }

  protected void addMarkerForFile(final IFile file, final SharedMarker marker) {
    if (file == null) {
      return;
    }
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        final IWorkbench wb = PlatformUI.getWorkbench();
        final IWorkbenchWindow ww = wb.getActiveWorkbenchWindow();
        final EditorHelper eh = new EditorHelper(ww);
        try {
          eh.openAndAddMarkerForFile(file, marker);
        } catch (final Exception e) {
          log("Exception in addMarkerForFile", e); //$NON-NLS-1$
        }
      }
    });
  }

  /**
   * @since 2.0
   */
  protected void handleAddMarkerForFile(final IUser fromuser, final String resourceName, SharedMarker marker) {
    addMarkerForFile(getLocalFileForRemote(resourceName), marker);
  }

  /**
   * @since 2.0
   */
  protected void handleOpenAndSelectForFile(final IUser fromuser, final String resourceName, SharedMarker marker) {
    final IUser local = getUserForID(fromuser.getID());
    if (local != null) {
      final Runnable runnable = createOpenEditorAndSelectForFileRunnable(resourceName, marker);
      showEventInChatOutput(fromuser, resourceName, marker, runnable);
      verifyAndOpenEditorLocally(fromuser, resourceName, runnable);
    }
  }

  /**
   * @since 2.0
   */
  protected boolean isLocalUser(IUser fromuser) {
    if (fromuser != null && fromuser.getID().equals(getUser().getID()))
      return true;
    return false;
  }

  /**
   * @since 2.0
   */
  protected void verifyAndOpenEditorLocally(final IUser fromuser, final String resourceName, final Runnable runnable) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        if (isLocalUser(fromuser)) {
          runnable.run();
        } else {
          if (showSharedEditorEventsImmediately()) {
            if (!askUserToDisplaySharedEditorEvents() || MessageDialog.openQuestion(null, Messages.EclipseCollabSharedObject_DIALOG_OPEN_SHARED_EDITOR_TEXT, NLS.bind(Messages.EclipseCollabSharedObject_OPEN_SHARED_EDITOR_QUESTION, resourceName, fromuser.getNickname()))) {
              runnable.run();
            }
          }
        }
      }
    });
  }

  /**
   * @since 2.0
   */
  protected void handleLaunchEditorForFile(final IUser fromuser, final String resourceName) {
    final IUser local = getUserForID(fromuser.getID());
    if (local != null) {
      final Runnable runnable = createOpenEditorForFileRunnable(resourceName);
      showEventInChatOutput(fromuser, resourceName, null, runnable);
      verifyAndOpenEditorLocally(fromuser, resourceName, runnable);
    }
  }

  protected boolean showSharedEditorEventsImmediately() {
    return ClientPlugin.getDefault().getPreferenceStore().getBoolean(ClientPlugin.PREF_SHAREDEDITOR_PLAY_EVENTS_IMMEDIATELY);
  }

  protected boolean askUserToDisplaySharedEditorEvents() {
    return ClientPlugin.getDefault().getPreferenceStore().getBoolean(ClientPlugin.PREF_SHAREDEDITOR_ASK_RECEIVER);
  }

  /**
   * @since 2.0
   */
  protected void showEventInChatOutput(IUser fromuser, String resourceName, SharedMarker marker, Runnable runnable) {
    if (localGUI != null) {
      showRawLine(fromuser.getID(), createDisplayStringForEditorOpen(resourceName, marker), runnable);
    }
  }

  protected String createDisplayStringForEditorOpen(String resourceName, SharedMarker marker) {
    return EclipseCollabHyperlinkDetector.createDisplayStringForEditorOpen(resourceName, marker);
  }

  protected IFile getLocalFileForRemote(String file) {
    final IResource res = getResource();
    if (res instanceof IWorkspaceRoot) {
      return ((IWorkspaceRoot) res).getFile(new Path(file));
    }
    IFile aFile = null;
    final IProject proj = res.getProject();
    if (proj == null) {
      // workspace
      final IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
      aFile = myWorkspaceRoot.getFile(new Path(file));
    } else {
      aFile = proj.getFile(file);
    }
    return aFile;
  }

  /**
   * @since 2.0
   */
  public void sendShowViewWithID(IUser touser, String id, String secID, Integer mode) {
    ID receiver = null;
    if (touser != null) {
      receiver = touser.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_SHOW_VIEW_WITH_ID_MSG, getUser(), id, secID, mode);
      forwardMsgTo(receiver, m);
      if (receiver == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("Exception on handleShowViewWithID to " + touser, e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  public void sendShowView(IUser touser, String id) {
    ID receiver = null;
    if (touser != null) {
      receiver = touser.getID();
    }
    try {
      final SharedObjectMsg m = SharedObjectMsg.createMsg(null, HANDLE_SHOW_VIEW_MSG, getUser(), id);
      forwardMsgTo(receiver, m);
      if (receiver == null) {
        sendSelf(m);
      }
    } catch (final Exception e) {
      log("Exception on sendShowView to " + touser, e); //$NON-NLS-1$
    }
  }

  /**
   * @since 2.0
   */
  protected void handleShowViewWithID(IUser fromUser, final String id, final String secID, final Integer mode) {
    Display.getDefault().syncExec(new Runnable() {
      public void run() {
        try {
          showViewWithID(id, secID, mode.intValue());
        } catch (final Exception e) {
          log("Exception in showing view id=" + id + ";secID=" + secID + ";mode=" + mode, e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        }
      }
    });
  }

  /**
   * @since 2.0
   */
  protected void handleShowView(IUser fromUser, final String id) {
    Display.getDefault().syncExec(new Runnable() {
      public void run() {
        try {
          showView(id);
        } catch (final Exception e) {
          log("Exception in showing view id=" + id, e); //$NON-NLS-1$
        }
      }
    });
  }

  protected IViewPart showViewWithID(String id, String secID, int mode) throws PartInitException {
    final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    final IWorkbenchPage wp = ww.getActivePage();
    if (wp == null)
      throw new PartInitException("workbench page is null"); //$NON-NLS-1$
    return wp.showView(id, secID, mode);
  }

  protected IViewPart showView(String id) throws PartInitException {
    final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    final IWorkbenchPage wp = ww.getActivePage();
    if (wp == null)
      throw new PartInitException("workbench page is null"); //$NON-NLS-1$
    return wp.showView(id);
  }

  /**
   * @since 2.0
   */
  public FileReceiverUI getFileReceiverUI(EclipseFileTransfer transfer, FileTransferParams params) {
    return new FileReceiverUI() {
      public void receiveStart(ID from, File aFile, long length, float rate) {
        final IUser user = getUserForID(from);
        String nick = Messages.EclipseCollabSharedObject_UNKNOWN_USERNAME;
        if (user != null) {
          nick = user.getNickname();
        }
        showRawLine(from, NLS.bind(Messages.EclipseCollabSharedObject_FILE_TRANSFER_RECEIVING, nick, aFile.getName()), null);
      }

      public void receiveData(ID from, File aFile, int dataLength) {
      }

      public void receiveDone(ID from, File aFile, Exception e) {
        final IUser user = getUserForID(from);
        String nick = Messages.EclipseCollabSharedObject_UNKNOWN_USERNAME;
        if (user != null) {
          nick = user.getNickname();
        }
        showRawLine(from, NLS.bind(Messages.EclipseCollabSharedObject_FILE_TRANSFER_RECEIVED, new Object[] {aFile.getName(), nick, getLocalFullDownloadPath()}), null);
        refreshProject();
      }
    };
  }

  public ViewPart getViewPart() {
    if (localGUI == null)
      return null;
    return localGUI.getView();
  }

  public ID createObject(ID target, String classname, Map map) throws Exception {
    return createObject(target, new ReplicaSharedObjectDescription(Class.forName(classname), IDFactory.getDefault().createGUID(), config.getHomeContainerID(), map));
  }
}
TOP

Related Classes of org.eclipse.ecf.example.collab.share.EclipseCollabSharedObject

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.