blob: d57f67cb0c7c7c684b604abb5088fb16764bb93b [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2004, 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.internal.example.collab.ui;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.example.collab.share.User;
import org.eclipse.ecf.example.collab.share.io.FileTransferParams;
import org.eclipse.ecf.internal.example.collab.ClientPlugin;
import org.eclipse.ecf.ui.screencapture.IImageSender;
import org.eclipse.ecf.ui.screencapture.ScreenCaptureJob;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
import org.eclipse.ui.views.IViewCategory;
import org.eclipse.ui.views.IViewDescriptor;
import org.eclipse.ui.views.IViewRegistry;
public class ChatComposite extends Composite {
private static final String CHAT_OUTPUT_FONT = "ChatFont"; //$NON-NLS-1$
final LineChatClientView view;
private Color meColor = null;
private Color otherColor = null;
private Color systemColor = null;
Action appShare = null;
Action coBrowseURL = null;
Action outputClear = null;
Action outputCopy = null;
Action outputPaste = null;
Action outputSelectAll = null;
Action sendFileToGroup = null;
Action sendFileToGroupAndLaunch = null;
Action sendMessage = null;
Action closeGroup = null;
Action sendShowViewRequest = null;
Action showChatWindow;
protected final String TEXT_INPUT_INIT = MessageLoader.getString("LineChatClientView.textinputinit"); //$NON-NLS-1$
protected static final int DEFAULT_INPUT_HEIGHT = 25;
protected static final int DEFAULT_INPUT_SEPARATOR = 5;
Text textinput = null;
StyledText textoutput = null;
TableViewer tableView = null;
ChatDropTarget chatDropTarget = null;
TreeDropTarget treeDropTarget = null;
ChatWindow chatWindow;
boolean typing;
ChatComposite(LineChatClientView view, Composite parent, TableViewer table, String initText) {
this(view, parent, table, initText, null);
}
ChatComposite(LineChatClientView view, Composite parent, TableViewer table, String initText, ChatWindow chatWindow) {
super(parent, SWT.NONE);
this.view = view;
this.chatWindow = chatWindow;
setLayout(new FillLayout());
meColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_ME_TEXT_COLOR));
otherColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_OTHER_TEXT_COLOR));
systemColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_SYSTEM_TEXT_COLOR));
ClientPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(new ColorPropertyChangeListener());
this.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (meColor != null) {
meColor.dispose();
}
if (otherColor != null) {
otherColor.dispose();
}
if (systemColor != null) {
systemColor.dispose();
}
}
});
final SashForm sf = new SashForm(this, SWT.NORMAL);
sf.setLayout(new FillLayout());
sf.setOrientation(SWT.VERTICAL);
tableView = table;
textoutput = createStyledTextWidget(sf);
textoutput.setLayoutData(new GridData(SWT.FILL));
final String fontName = ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_CHAT_FONT);
if (!(fontName == null) && !(fontName.equals(""))) { //$NON-NLS-1$
final FontRegistry fr = ClientPlugin.getDefault().getFontRegistry();
final FontData[] newFont = {new FontData(fontName)};
fr.put(CHAT_OUTPUT_FONT, newFont);
textoutput.setFont(fr.get(CHAT_OUTPUT_FONT));
}
ClientPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(new FontPropertyChangeListener());
textoutput.append(initText);
textinput = new Text(sf, SWT.SINGLE | SWT.BORDER);
textinput.setText(TEXT_INPUT_INIT);
textinput.setLayoutData(new GridData(SWT.FILL));
textinput.selectAll();
textinput.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent evt) {
handleKeyPressed(evt);
}
public void keyReleased(KeyEvent evt) {
handleKeyReleased(evt);
}
});
textinput.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
final String t = textinput.getText();
if (t.equals(TEXT_INPUT_INIT)) {
textinput.selectAll();
}
}
public void focusLost(FocusEvent e) {
}
});
textinput.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
final String t = textinput.getText();
if (t.equals(TEXT_INPUT_INIT)) {
textinput.selectAll();
}
}
});
textinput.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (typing && textinput.getText().trim().length() == 0)
typing = false;
else if (!typing) {
typing = true;
ChatComposite.this.view.lch.sendStartedTyping();
}
}
});
sf.setWeights(new int[] {90, 10});
// make actions
makeActions();
hookContextMenu();
contributeToActionBars();
initializeDropTargets();
}
private StyledText createStyledTextWidget(Composite parent) {
try {
final SourceViewer result = new SourceViewer(parent, null, null, true, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY);
result.configure(new TextSourceViewerConfiguration(EditorsUI.getPreferenceStore()));
result.setDocument(new Document());
return result.getTextWidget();
} catch (final Exception e) {
ClientPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, ClientPlugin.PLUGIN_ID, IStatus.WARNING, MessageLoader.getString("ChatComposite.NO_HYPERLINKING"), e)); //$NON-NLS-1$
return new StyledText(parent, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY);
} catch (final NoClassDefFoundError e) {
ClientPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, ClientPlugin.PLUGIN_ID, IStatus.WARNING, MessageLoader.getString("ChatComposite.NO_HYPERLINKING"), e)); //$NON-NLS-1$
return new StyledText(parent, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY);
}
}
public void appendText(ChatLine text) {
if (text == null || textoutput == null || textoutput.isDisposed()) {
return;
}
final User user = text.getOriginator();
final StyleRange range = new StyleRange();
range.start = textoutput.getText().length();
if (user != null) {
String prefix = user.getNickname() + ": "; //$NON-NLS-1$
final String date = text.getDate();
if (date != null && !date.equals("")) { //$NON-NLS-1$
prefix = date + ' ' + prefix;
}
range.length = prefix.length();
range.foreground = user.equals(view.userdata) ? meColor : otherColor;
textoutput.append(prefix);
textoutput.setStyleRange(range);
textoutput.append(text.getText());
} else {
String content = text.getText();
final String date = text.getDate();
if (date != null && !date.equals("")) { //$NON-NLS-1$
content = date + ' ' + content;
}
range.length = content.length();
range.foreground = otherColor;
textoutput.append(content);
}
if (!text.isNoCRLF()) {
textoutput.append(Text.DELIMITER);
}
// scroll to end
final String t = textoutput.getText();
if (t != null) {
textoutput.setSelection(t.length());
}
}
protected void clearInput() {
textinput.setText(""); //$NON-NLS-1$
}
private void contributeToActionBars() {
final IActionBars bars = this.view.view.getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
// fillLocalToolBar(bars.getToolBarManager());
// bars.getToolBarManager().markDirty();
}
protected void copyFileLocally(String inputFile, String outputFile) throws IOException {
final File aFile = new java.io.File(outputFile);
final File dir = aFile.getParentFile();
dir.mkdirs();
final java.io.BufferedInputStream ins = new java.io.BufferedInputStream(new java.io.FileInputStream(inputFile));
final byte[] buf = new byte[1024];
final java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(new java.io.FileOutputStream(aFile));
// Actually copy file
while (ins.read(buf) != -1)
bos.write(buf);
// Close input and output streams
ins.close();
bos.close();
}
private void fillContextMenu(IMenuManager manager) {
if (chatWindow != null) {
manager.add(showChatWindow);
manager.add(new Separator());
}
manager.add(outputCopy);
manager.add(outputPaste);
manager.add(outputClear);
manager.add(new Separator());
manager.add(outputSelectAll);
manager.add(new Separator());
manager.add(sendFileToGroup);
// manager.add(sendFileToGroupAndLaunch);
manager.add(coBrowseURL);
manager.add(new Separator());
manager.add(sendMessage);
manager.add(sendShowViewRequest);
manager.add(new Separator());
manager.add(closeGroup);
// other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalPullDown(IMenuManager manager) {
if (chatWindow != null) {
manager.add(showChatWindow);
manager.add(new Separator());
}
manager.add(outputCopy);
manager.add(outputPaste);
manager.add(outputClear);
manager.add(new Separator());
manager.add(outputSelectAll);
manager.add(new Separator());
manager.add(sendFileToGroup);
manager.add(coBrowseURL);
// manager.add(startProgram);
manager.add(appShare);
manager.add(new Separator());
manager.add(sendMessage);
manager.add(sendShowViewRequest);
manager.add(new Separator());
manager.add(closeGroup);
}
private void fillTreeContextMenu(IMenuManager manager) {
final IStructuredSelection iss = (IStructuredSelection) tableView.getSelection();
final Object element = iss.getFirstElement();
if (element == null || !(element instanceof User)) {
fillContextMenu(manager);
} else {
fillTreeContextMenuUser(manager, (User) element);
}
}
private void sendImage(final User toUser) {
if (MessageDialog.openQuestion(null, MessageLoader.getString("ChatComposite.DIALOG_SCREEN_CAPTURE_TITLE"), MessageLoader.getString("ChatComposite.DIALOG_SCREEN_CAPTURE_TEXT"))) { //$NON-NLS-1$ //$NON-NLS-2$
final Job job = new ScreenCaptureJob(getDisplay(), toUser.getUserID(), toUser.getNickname(), new IImageSender() {
public void sendImage(ID targetID, ImageData imageData) {
view.lch.sendImage(toUser.getUserID(), imageData);
}
});
job.schedule(5000);
}
}
private void fillTreeContextMenuUser(IMenuManager man, final User user) {
boolean toUs = false;
if (this.view.userdata != null) {
if (this.view.userdata.getUserID().equals(user.getUserID())) {
// this is us...so we have a special menu
toUs = true;
}
}
if (!toUs) {
final Action sendImageToUser = new Action() {
public void run() {
sendImage(user);
}
};
sendImageToUser.setText(NLS.bind(MessageLoader.getString("ChatComposite.SEND_SCREEN_CAPTURE_TEXT"), user.getNickname())); //$NON-NLS-1$
sendImageToUser.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
man.add(sendImageToUser);
final Action sendFileToUser = new Action() {
public void run() {
sendFileToUser(user, false);
}
};
sendFileToUser.setText(NLS.bind(MessageLoader.getString("ChatComposite.SEND_FILE_TEXT"), user.getNickname())); //$NON-NLS-1$
sendFileToUser.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
// XXX disabled
sendFileToUser.setEnabled(false);
man.add(sendFileToUser);
final Action sendFileToUserAndLaunch = new Action() {
public void run() {
sendFileToUser(user, true);
}
};
sendFileToUserAndLaunch.setText(NLS.bind(MessageLoader.getString("ChatComposite.SEND_FILE_AND_LAUNCH_TEXT"), user.getNickname())); //$NON-NLS-1$
sendFileToUserAndLaunch.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
// XXX disabled
sendFileToUserAndLaunch.setEnabled(false);
man.add(sendFileToUserAndLaunch);
final Action coBrowseToUser = new Action() {
public void run() {
sendCoBrowseToUser(user);
}
};
coBrowseToUser.setText(NLS.bind(MessageLoader.getString("ChatComposite.COBROWSE_TEXT"), user.getNickname())); //$NON-NLS-1$
man.add(coBrowseToUser);
man.add(new Separator());
man.add(new Separator());
final Action ringUser = new Action() {
public void run() {
sendRingMessageToUser(user);
}
};
ringUser.setText(NLS.bind(MessageLoader.getString("ChatComposite.RING_OTHER_TEXT"), user.getNickname())); //$NON-NLS-1$
man.add(ringUser);
final Action sendMessageToUser = new Action() {
public void run() {
sendPrivateTextMsg(user);
}
};
sendMessageToUser.setText(NLS.bind(MessageLoader.getString("ChatComposite.SEND_PRIVATE_MESSAGE_TEXT"), user.getNickname())); //$NON-NLS-1$
man.add(sendMessageToUser);
final Action sendShowViewRequest = new Action() {
public void run() {
sendShowViewRequest(user);
}
};
sendShowViewRequest.setText(NLS.bind(MessageLoader.getString("ChatComposite.SEND_SHOW_VIEW_REQUEST_TEXT"), user.getNickname())); //$NON-NLS-1$
man.add(sendShowViewRequest);
} else {
// This is a menu to us
final Action sendMessageToUser = new Action() {
public void run() {
MessageDialog.openError(null, MessageLoader.getString("ChatComposite.MESSAGE_TO_TITLE") + user.getNickname(), MessageLoader.getString("ChatComposite.MESSAGE_TO_TEXT") + user.getNickname() + "\n\tID: " + user.getUserID().getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
};
sendMessageToUser.setText(MessageLoader.getString("ChatComposite.MENU_SEND_MESSAGE_TO_YOURSELF_TEXT")); //$NON-NLS-1$
man.add(sendMessageToUser);
}
// other plug-ins can contribute there actions here
man.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
protected String[] getArgs(String aString) {
final StringTokenizer st = new StringTokenizer(aString);
final int argscount = st.countTokens() - 1;
if (argscount < 1)
return null;
final String[] newArray = new String[argscount];
st.nextToken();
int i = 0;
while (st.hasMoreTokens()) {
newArray[i++] = st.nextToken();
}
return newArray;
}
protected String getCommand(String aString) {
final StringTokenizer st = new StringTokenizer(aString);
return st.nextToken();
}
private String getID(String title, String message, String initialValue) {
final InputDialog id = new InputDialog(this.view.view.getSite().getShell(), title, message, initialValue, null);
id.setBlockOnOpen(true);
final int res = id.open();
if (res == InputDialog.OK)
return id.getValue();
else
return null;
}
protected void handleEnter() {
if (textinput.getText().trim().length() > 0)
this.view.handleTextInput(textinput.getText());
clearInput();
typing = false;
}
protected void handleKeyPressed(KeyEvent evt) {
if (evt.character == SWT.CR) {
handleEnter();
} else if (evt.character == SWT.ESC && chatWindow != null) {
chatWindow.getShell().setVisible(false);
}
}
protected void handleKeyReleased(KeyEvent evt) {
}
private void hookContextMenu() {
final MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
final Menu menu = menuMgr.createContextMenu(textoutput);
textoutput.setMenu(menu);
final ISelectionProvider selectionProvider = new ISelectionProvider() {
public void addSelectionChangedListener(ISelectionChangedListener listener) {
}
public ISelection getSelection() {
final ISelection selection = new TextSelection(textoutput.getSelectionRange().x, textoutput.getSelectionRange().y);
return selection;
}
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
}
public void setSelection(ISelection selection) {
if (selection instanceof ITextSelection) {
final ITextSelection textSelection = (ITextSelection) selection;
textoutput.setSelection(textSelection.getOffset(), textSelection.getOffset() + textSelection.getLength());
}
}
};
this.view.view.getSite().registerContextMenu(menuMgr, selectionProvider);
final MenuManager treeMenuMgr = new MenuManager();
treeMenuMgr.setRemoveAllWhenShown(true);
treeMenuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillTreeContextMenu(manager);
}
});
final Menu treeMenu = treeMenuMgr.createContextMenu(tableView.getControl());
tableView.getControl().setMenu(treeMenu);
this.view.view.getSite().registerContextMenu(treeMenuMgr, tableView);
}
protected Control getTreeControl() {
return tableView.getControl();
}
protected Control getTextControl() {
return textoutput;
}
protected void makeActions() {
outputSelectAll = new Action() {
public void run() {
outputSelectAll();
}
};
outputSelectAll.setText(MessageLoader.getString("LineChatClientView.contextmenu.selectall")); //$NON-NLS-1$
outputSelectAll.setToolTipText(MessageLoader.getString("LineChatClientView.contextmenu.selectall.tooltip")); //$NON-NLS-1$
outputSelectAll.setAccelerator(SWT.CTRL | 'A');
outputCopy = new Action() {
public void run() {
outputCopy();
}
};
outputCopy.setText(MessageLoader.getString("LineChatClientView.contextmenu.copy")); //$NON-NLS-1$
outputCopy.setToolTipText(MessageLoader.getString("LineChatClientView.contextmenu.copy.tooltip")); //$NON-NLS-1$
outputCopy.setAccelerator(SWT.CTRL | 'C');
outputCopy.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
outputClear = new Action() {
public void run() {
outputClear();
}
};
outputClear.setText(MessageLoader.getString("LineChatClientView.contextmenu.clear")); //$NON-NLS-1$
outputClear.setToolTipText(MessageLoader.getString("LineChatClientView.contextmenu.clear.tooltip")); //$NON-NLS-1$
outputPaste = new Action() {
public void run() {
outputPaste();
}
};
outputPaste.setText(MessageLoader.getString("LineChatClientView.contextmenu.paste")); //$NON-NLS-1$
outputPaste.setToolTipText(MessageLoader.getString("LineChatClientView.contextmenu.paste.tooltip")); //$NON-NLS-1$
outputPaste.setAccelerator(SWT.CTRL | 'V');
outputPaste.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
sendFileToGroup = new Action() {
public void run() {
sendFileToGroup(false);
}
};
sendFileToGroup.setText(MessageLoader.getString("LineChatClientView.contextmenu.sendfile")); //$NON-NLS-1$
sendFileToGroup.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
// XXX disabled
sendFileToGroup.setEnabled(false);
coBrowseURL = new Action() {
public void run() {
sendCoBrowseToUser(null);
}
};
coBrowseURL.setText(MessageLoader.getString("LineChatClientView.contextmenu.cobrowse")); //$NON-NLS-1$
appShare = new Action() {
public void run() {
}
};
appShare.setText(MessageLoader.getString("LineChatClientView.contextmenu.appshare")); //$NON-NLS-1$
appShare.setEnabled(Platform.getOS().equalsIgnoreCase(Platform.OS_WIN32));
sendMessage = new Action() {
public void run() {
sendMessageToGroup();
}
};
sendMessage.setText(MessageLoader.getString("LineChatClientView.contextmenu.sendmessage")); //$NON-NLS-1$
// Close projectGroup
closeGroup = new Action() {
public void run() {
closeProjectGroup(null);
}
};
closeGroup.setText(MessageLoader.getString("LineChatClientView.contextmenu.leaveGroup")); //$NON-NLS-1$
closeGroup.setEnabled(true);
sendShowViewRequest = new Action() {
public void run() {
sendShowViewRequest(null);
}
};
sendShowViewRequest.setText(MessageLoader.getString("LineChatClientView.contextmenu.sendShowViewRequest")); //$NON-NLS-1$
sendShowViewRequest.setEnabled(true);
if (chatWindow != null) {
showChatWindow = new Action() {
public void run() {
chatWindow.open();
if (!chatWindow.hasFocus())
chatWindow.getShell().forceActive();
}
};
showChatWindow.setText(MessageLoader.getString("ChatComposite.SHOW_CHAT_WINDOW_TEXT")); //$NON-NLS-1$
}
}
protected void sendShowViewRequest(User touser) {
final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
final IWorkbenchPage page = ww.getActivePage();
if (page == null)
return;
final ElementTreeSelectionDialog dlg = new ElementTreeSelectionDialog(getShell(), new LabelProvider() {
private HashMap images = new HashMap();
public Image getImage(Object element) {
ImageDescriptor desc = null;
if (element instanceof IViewCategory)
desc = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER);
else if (element instanceof IViewDescriptor)
desc = ((IViewDescriptor) element).getImageDescriptor();
if (desc == null)
return null;
Image image = (Image) images.get(desc);
if (image == null) {
image = desc.createImage();
images.put(desc, image);
}
return image;
}
public String getText(Object element) {
String label;
if (element instanceof IViewCategory)
label = ((IViewCategory) element).getLabel();
else if (element instanceof IViewDescriptor)
label = ((IViewDescriptor) element).getLabel();
else
label = super.getText(element);
for (int i = label.indexOf('&'); i >= 0 && i < label.length() - 1; i = label.indexOf('&', i + 1))
if (!Character.isWhitespace(label.charAt(i + 1)))
return label.substring(0, i) + label.substring(i + 1);
return label;
}
public void dispose() {
for (final Iterator i = images.values().iterator(); i.hasNext();)
((Image) i.next()).dispose();
images = null;
super.dispose();
}
}, new ITreeContentProvider() {
private HashMap parents = new HashMap();
public Object[] getChildren(Object element) {
if (element instanceof IViewRegistry)
return ((IViewRegistry) element).getCategories();
else if (element instanceof IViewCategory) {
final IViewDescriptor[] children = ((IViewCategory) element).getViews();
for (int i = 0; i < children.length; ++i)
parents.put(children[i], element);
return children;
} else
return new Object[0];
}
public Object getParent(Object element) {
if (element instanceof IViewCategory)
return PlatformUI.getWorkbench().getViewRegistry();
else if (element instanceof IViewDescriptor)
return parents.get(element);
else
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof IViewRegistry || element instanceof IViewCategory)
return true;
else
return false;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
parents = null;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
parents.clear();
}
});
dlg.setTitle(MessageLoader.getString("LineChatClientView.contextmenu.sendShowViewRequest")); //$NON-NLS-1$
dlg.setMessage(MessageLoader.getString("LineChatClientView.contextmenu.sendShowViewRequest.dialog.title")); //$NON-NLS-1$
dlg.addFilter(new ViewerFilter() {
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IViewDescriptor && "org.eclipse.ui.internal.introview".equals(((IViewDescriptor) element).getId())) //$NON-NLS-1$
return false;
else
return true;
}
});
dlg.setComparator(new ViewerComparator());
dlg.setValidator(new ISelectionStatusValidator() {
public IStatus validate(Object[] selection) {
for (int i = 0; i < selection.length; ++i)
if (!(selection[i] instanceof IViewDescriptor))
return new Status(Status.ERROR, ClientPlugin.getDefault().getBundle().getSymbolicName(), 0, "", null); //$NON-NLS-1$
return new Status(Status.OK, ClientPlugin.getDefault().getBundle().getSymbolicName(), 0, "", null); //$NON-NLS-1$
}
});
final IViewRegistry reg = PlatformUI.getWorkbench().getViewRegistry();
dlg.setInput(reg);
final IDialogSettings dlgSettings = ClientPlugin.getDefault().getDialogSettings();
final String DIALOG_SETTINGS = "SendShowViewRequestDialog"; //$NON-NLS-1$
final String SELECTION_SETTING = "SELECTION"; //$NON-NLS-1$
IDialogSettings section = dlgSettings.getSection(DIALOG_SETTINGS);
if (section == null)
section = dlgSettings.addNewSection(DIALOG_SETTINGS);
else {
final String[] selectedIDs = section.getArray(SELECTION_SETTING);
if (selectedIDs != null && selectedIDs.length > 0) {
final ArrayList list = new ArrayList(selectedIDs.length);
for (int i = 0; i < selectedIDs.length; ++i) {
final IViewDescriptor desc = reg.find(selectedIDs[i]);
if (desc != null)
list.add(desc);
}
dlg.setInitialElementSelections(list);
}
}
dlg.open();
if (dlg.getReturnCode() == Window.CANCEL)
return;
final Object[] descs = dlg.getResult();
if (descs == null)
return;
final String[] selectedIDs = new String[descs.length];
for (int i = 0; i < descs.length; ++i) {
selectedIDs[i] = ((IViewDescriptor) descs[i]).getId();
view.lch.sendShowView(touser, selectedIDs[i]);
}
section.put(SELECTION_SETTING, selectedIDs);
}
protected void closeProjectGroup(User user) {
if (MessageDialog.openConfirm(null, MessageLoader.getString("LineChatClientView.contextmenu.closeMessageTitle"), //$NON-NLS-1$
MessageLoader.getFormattedString("LineChatClientView.contextmenu.closeMessageMessage", this.view.name))) { //$NON-NLS-1$
this.view.lch.chatGUIDestroy();
}
}
protected void outputClear() {
if (MessageDialog.openConfirm(null, MessageLoader.getString("ChatComposite.DIALOG_CONFIRM_CLEAR_TITLE"), MessageLoader.getString("ChatComposite.DIALOG_CONFIRM_CLEAR_TEXT"))) //$NON-NLS-1$ //$NON-NLS-2$
textoutput.setText(""); //$NON-NLS-1$
}
protected void outputCopy() {
final String t = textoutput.getSelectionText();
if (t == null || t.length() == 0) {
textoutput.selectAll();
}
textoutput.copy();
textoutput.setSelection(textoutput.getText().length());
}
protected void outputPaste() {
textinput.paste();
}
protected void outputSelectAll() {
textoutput.selectAll();
}
protected int getChunkPreference() {
final IPreferenceStore pstore = ClientPlugin.getDefault().getPreferenceStore();
int chunksize = pstore.getInt(ClientPlugin.DEFAULT_FILE_TRANSFER_CHUNKTIME_NAME);
if (chunksize <= 0) {
chunksize = 1024;
}
return chunksize;
}
protected int getDelayPreference() {
final IPreferenceStore pstore = ClientPlugin.getDefault().getPreferenceStore();
int delay = pstore.getInt(ClientPlugin.DEFAULT_FILE_TRANSFER_DELAY_NAME);
if (delay <= 0) {
delay = 10;
}
return delay;
}
protected void readStreamAndSend(java.io.InputStream local, String fileName, Date startDate, ID target, final boolean launch) {
try {
final ID eclipseStageID = IDFactory.getDefault().createStringID(org.eclipse.ecf.example.collab.share.EclipseCollabSharedObject.ID);
final java.io.BufferedInputStream ins = new java.io.BufferedInputStream(local);
final java.io.File remoteFile = new File((new File(fileName)).getName());
final FileTransferParams sp = new FileTransferParams(remoteFile, getChunkPreference(), getDelayPreference(), null, true, -1, null);
final Object[] args = {view, target, ins, sp, eclipseStageID};
// Do it
new Thread(new Runnable() {
public void run() {
if (launch) {
ChatComposite.this.view.createObject(null, org.eclipse.ecf.example.collab.share.io.EclipseFileTransferAndLaunch.class.getName(), new String[] {FileSenderUI.class.getName(), ID.class.getName(), java.io.InputStream.class.getName(), FileTransferParams.class.getName(), ID.class.getName()}, args);
} else {
ChatComposite.this.view.createObject(null, org.eclipse.ecf.example.collab.share.io.EclipseFileTransfer.class.getName(), new String[] {FileSenderUI.class.getName(), ID.class.getName(), java.io.InputStream.class.getName(), FileTransferParams.class.getName(), ID.class.getName()}, args);
}
}
}, "FileRepObject creator").start(); //$NON-NLS-1$
} catch (final Exception e) {
if (this.view.lch != null)
this.view.lch.chatException(e, "readStreamAndSend()"); //$NON-NLS-1$
}
}
protected void sendCoBrowseToUser(User user) {
String res = null;
ID userID = null;
if (user != null) {
res = getID(NLS.bind(MessageLoader.getString("ChatComposite.COBROWSE_TITLE"), user.getNickname()), MessageLoader.getString("ChatComposite.COBROWSE_URL_TEXT"), "http://"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
userID = user.getUserID();
} else {
res = getID(MessageLoader.getString("ChatComposite.DIALOG_COBROWSE_TITLE"), MessageLoader.getString("ChatComposite.DIALOG_COBROWSE_TEXT"), MessageLoader.getString("ChatComposite.DIALOG_COBROWSE_HTTPPREFIX")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if (res != null) {
final Object[] args = {userID, res};
// Do it
this.view.createObject(null, LineChatClientView.SHOWURLCLASSNAME, LineChatClientView.SHOWURLARGTYPES, args);
}
}
protected void sendFile(String pathName, final String fileName, Date startDate, ID target, boolean launch) {
try {
copyFileLocally(pathName, fileName);
} catch (final IOException e) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openError(null, MessageLoader.getString("ChatComposite.DIALOG_COPY_ERROR_TITLE"), MessageLoader.getString("ChatComposite.DIALOG_COPY_ERROR_TEXT") + e); //$NON-NLS-1$ //$NON-NLS-2$
}
});
if (this.view.lch != null)
this.view.lch.chatException(e, "sendFile(" + pathName + "/" + fileName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return;
}
java.io.FileInputStream ins = null;
try {
ins = new java.io.FileInputStream(pathName);
} catch (final java.io.FileNotFoundException e) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openError(null, MessageLoader.getString("ChatComposite.DIALOG_FILE_OPEN_ERROR_TITLE"), NLS.bind(MessageLoader.getString("ChatComposite.EXCEPTION_FILE_NOT_FOUND_TEXT"), fileName, e.getLocalizedMessage())); //$NON-NLS-1$ //$NON-NLS-2$
}
});
if (this.view.lch != null)
this.view.lch.chatException(e, NLS.bind(MessageLoader.getString("ChatComposite.EXCEPTION_FILE_NOT_FOUND_TEXT1"), fileName)); //$NON-NLS-1$
}
readStreamAndSend(ins, fileName, startDate, target, launch);
}
protected void sendFileToGroup(boolean launch) {
final FileDialog fd = new FileDialog(Display.getDefault().getActiveShell(), SWT.OPEN);
fd.setFilterPath(System.getProperty("user.dir")); //$NON-NLS-1$
fd.setText(MessageLoader.getString("ChatComposite.SELECT_FILE_FOR_GROUP_TEXT")); //$NON-NLS-1$
final String res = fd.open();
if (res != null) {
final java.io.File selected = new java.io.File(res);
final File localTarget = new File(this.view.downloaddir, selected.getName());
sendFile(selected.getPath(), localTarget.getAbsolutePath(), null, null, launch);
}
}
protected void sendFileToUser(User user, boolean launch) {
final FileDialog fd = new FileDialog(Display.getDefault().getActiveShell(), SWT.OPEN);
fd.setFilterPath(System.getProperty("user.dir")); //$NON-NLS-1$
fd.setText(NLS.bind(MessageLoader.getString("ChatComposite.SELECt_FILE_TITLE"), user.getNickname())); //$NON-NLS-1$
final String res = fd.open();
if (res != null) {
final java.io.File selected = new java.io.File(res);
final File localTarget = new File(this.view.downloaddir, selected.getName());
sendFile(selected.getPath(), localTarget.getAbsolutePath(), null, user.getUserID(), launch);
}
}
protected void sendMessageToGroup() {
final String res = getID(MessageLoader.getString("ChatComposite.MESSAGE_TO_GROUP_TITLE"), MessageLoader.getString("ChatComposite.MESSAGE_TO_GROUP_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (res != null & !res.equals("")) { //$NON-NLS-1$
final String[] args = {res, this.view.userdata.getNickname()};
this.view.createObject(null, LineChatClientView.MESSAGECLASSNAME, args);
}
}
protected void sendPrivateTextMsg(User data) {
if (this.view.lch != null) {
final String res = getID(MessageLoader.getString("ChatComposite.PRIVATE_MESSAGE_TITLE") + data.getNickname(), MessageLoader.getString("ChatComposite.PRIVATE_MESSAGE_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (res != null)
this.view.lch.sendPrivateMessageToUser(data, res);
}
}
protected void sendRepObjectToGroup(User user) {
final String result = getID(MessageLoader.getString("ChatComposite.SEND_REPLICATED_OBJECT_TITLE"), MessageLoader.getString("ChatComposite.SEND_REPLICATED_OBJECT_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (result != null && !result.equals("")) { //$NON-NLS-1$
this.view.createObject(null, getCommand(result), getArgs(result));
}
}
protected void sendRepObjectToServer() {
// XXX TODO
}
protected void sendRingMessageToUser(User data) {
String res = null;
if (this.view.lch != null) {
if (data != null) {
res = getID(MessageLoader.getString("ChatComposite.RING_TITLE") + data.getNickname(), MessageLoader.getString("ChatComposite.RING_MESSAGE_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else {
res = getID(MessageLoader.getString("ChatComposite.RING_GROUP_TITLE"), MessageLoader.getString("ChatComposite.RING_MESSAGE_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if (res != null)
this.view.lch.sendRingMessageToUser(data, res);
}
}
protected void startProgram(User ud) {
String res = null;
ID receiver = null;
if (ud == null) {
res = getID(MessageLoader.getString("ChatComposite.START_PROGRAM_GROUP_TITLE"), MessageLoader.getString("ChatComposite.START_PROGRAM_GROUP_TEXT"), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else {
res = getID(MessageLoader.getString("ChatComposite.START_PROGRAM_TITLE") + ud.getNickname(), MessageLoader.getString("ChatComposite.START_PROGRAM_TEXT") + ud.getNickname() + ":", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
receiver = ud.getUserID();
}
if (res != null)
this.view.runProgram(receiver, res, null);
}
protected void initializeDropTargets() {
chatDropTarget = new ChatDropTarget(view, textoutput, this);
treeDropTarget = new TreeDropTarget(view, tableView.getControl(), this);
}
private Color colorFromRGBString(String rgb) {
if (rgb == null || rgb.equals("")) { //$NON-NLS-1$
return new Color(getShell().getDisplay(), 0, 0, 0);
} else {
final String[] vals = rgb.split(","); //$NON-NLS-1$
return new Color(getShell().getDisplay(), Integer.parseInt(vals[0]), Integer.parseInt(vals[1]), Integer.parseInt(vals[2]));
}
}
private class ColorPropertyChangeListener implements org.eclipse.core.runtime.Preferences.IPropertyChangeListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
meColor.dispose();
otherColor.dispose();
systemColor.dispose();
meColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_ME_TEXT_COLOR));
otherColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_OTHER_TEXT_COLOR));
systemColor = colorFromRGBString(ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_SYSTEM_TEXT_COLOR));
}
}
private class FontPropertyChangeListener implements org.eclipse.core.runtime.Preferences.IPropertyChangeListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener#propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
*/
public void propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) {
if (event.getProperty().equals(ClientPlugin.PREF_CHAT_FONT)) {
final String fontName = ClientPlugin.getDefault().getPluginPreferences().getString(ClientPlugin.PREF_CHAT_FONT);
if (!(fontName == null) && !(fontName.equals(""))) { //$NON-NLS-1$
final FontRegistry fr = ClientPlugin.getDefault().getFontRegistry();
final FontData[] newFont = {new FontData(fontName)};
fr.put(CHAT_OUTPUT_FONT, newFont);
textoutput.setFont(fr.get(CHAT_OUTPUT_FONT));
}
}
}
}
}