/*******************************************************************************
* Copyright (c) 2006 IBM, Inc and Composent, Inc. 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: Chris Aniszczyk <zx@us.ibm.com> - initial API and implementation
* Ken Gilmer <kgilmer@gmail.com>
******************************************************************************/
package org.eclipse.ecf.tutorial.scribbleshare;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ecf.datashare.IChannel;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.AbstractTool;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.Box;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.DrawSettings;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.Line;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.ListContentProvider;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.Oval;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.Pencil;
import org.eclipse.ecf.tutorial.scribbleshare.toolbox.ToolboxLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
public class ScribbleView extends ViewPart {
private Display display;
private Canvas canvas;
private AbstractTool currentTool;
private DrawSettings drawSettings = new DrawSettings();
private List tools;
// Default color is black
int red = 0;
int blue = 0;
int green = 0;
// Channel to send data on
IChannel channel = null;
public ScribbleView() {
tools = new ArrayList();
}
public void setUserColor(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
public void setChannel(IChannel channel) {
this.channel = channel;
}
/**
* This is called when a remote client calls <code>sendTool</code>.
*
* @param message
*/
public void handleDrawLine(byte[] message) {
ByteArrayInputStream bins = new ByteArrayInputStream(message);
// DataInputStream dins = new DataInputStream(bins);
try {
ObjectInputStream ois = new ObjectInputStream(bins);
AbstractTool tool = (AbstractTool) ois.readObject();
// Apply the tool to the local canvas.
tool.draw(canvas);
tools.add(tool);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void sendTool(AbstractTool tool) {
if (channel != null && currentTool != null) {
try {
ByteArrayOutputStream bouts = new ByteArrayOutputStream();
// create a byte array from serialized Tool
ObjectOutputStream douts = new ObjectOutputStream(bouts);
douts.writeObject(tool);
// send serialized tool to other clients.
channel.sendMessage(bouts.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void createPartControl(Composite parent) {
Composite backgroundComposite = new Composite(parent, SWT.NONE);
GridLayout backgroundGridLayout = new GridLayout(3, false);
backgroundGridLayout.marginHeight = 0;
backgroundGridLayout.marginBottom = 0;
backgroundGridLayout.marginLeft = 0;
backgroundGridLayout.marginRight = 0;
backgroundGridLayout.marginWidth = 0;
backgroundGridLayout.horizontalSpacing = 0;
backgroundComposite.setLayout(backgroundGridLayout);
backgroundComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite paletteComposite = new Composite(backgroundComposite,
SWT.NONE);
backgroundGridLayout = new GridLayout();
backgroundGridLayout.marginHeight = 0;
backgroundGridLayout.marginBottom = 0;
backgroundGridLayout.marginLeft = 0;
backgroundGridLayout.marginRight = 0;
backgroundGridLayout.marginWidth = 0;
backgroundGridLayout.horizontalSpacing = 0;
paletteComposite.setLayout(backgroundGridLayout);
GridData toolboxGridData = new GridData(GridData.FILL_VERTICAL);
toolboxGridData.widthHint = 60;
paletteComposite.setLayoutData(toolboxGridData);
final TableViewer toolbox = new TableViewer(paletteComposite, SWT.FLAT
| SWT.FULL_SELECTION);
toolboxGridData = new GridData(GridData.FILL_BOTH);
toolbox.getTable().setLayoutData(toolboxGridData);
toolbox.setLabelProvider(new ToolboxLabelProvider());
toolbox.setContentProvider(new ListContentProvider());
toolbox.setInput(createTools());
toolbox.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
currentTool = (AbstractTool) ((StructuredSelection) toolbox
.getSelection()).getFirstElement();
// Apply the drawSettings to the currently selected tool.
currentTool.setDrawSettings(drawSettings);
}
});
// Create the UI widgets to modify the DrawSettings instance.
createSettings(paletteComposite);
Label separator = new Label(backgroundComposite, SWT.SEPARATOR
| SWT.VERTICAL/* SWT.NONE */);
separator.setLayoutData(new GridData(GridData.FILL_VERTICAL));
canvas = new Canvas(backgroundComposite, SWT.NONE);
canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
display = parent.getDisplay();
canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
for (Iterator i = tools.iterator(); i.hasNext();) {
AbstractTool at = (AbstractTool) i.next();
at.draw(canvas);
}
}
});
Listener listener = new Listener() {
public void handleEvent(Event event) {
if (currentTool != null) {
// Have the tool interpret the mouse events.
currentTool.handleUIEvent(event, canvas);
// If the tool interaction is complete, send the tool to
// other clients for rendering.
if (currentTool.isComplete()) {
tools.add(currentTool);
sendTool(currentTool);
// Only do this once per Tool.
currentTool.setComplete(false);
} /*else {
if (currentTool instanceof Pencil) {
tools.add(currentTool);
}
}*/
}
}
};
canvas.addListener(SWT.MouseDown, listener);
canvas.addListener(SWT.MouseMove, listener);
canvas.addListener(SWT.MouseUp, listener);
}
private void createSettings(Composite paletteComposite) {
// Size of Pen (drawWidth) set on the GC.
{
Label l = new Label(paletteComposite, SWT.NONE);
l.setText("Pen Size");
final Text t = new Text(paletteComposite, SWT.BORDER);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
t.setText("1");
t.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
drawSettings.setPenWidth(Integer.parseInt(t.getText()));
currentTool.setDrawSettings(drawSettings);
}
});
}
// Toggles the antialias property on the GC.
{
final Button b = new Button(paletteComposite, SWT.CHECK);
b.setText("Antialias");
b.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
drawSettings.setAntialias(b.getSelection());
currentTool.setDrawSettings(drawSettings);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
}
/**
* Create the list of tools available to be used. Add new subclasses of
* AbstractTool here.
*
* @return
*/
private List createTools() {
List toolList = new ArrayList();
toolList.add(new Pencil());
toolList.add(new Box());
toolList.add(new Line());
toolList.add(new Oval());
return toolList;
}
public void setFocus() {
canvas.setFocus();
}
}