Package org.eclipse.ecf.tutorial.scribbleshare

Source Code of org.eclipse.ecf.tutorial.scribbleshare.ScribbleView

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

}
TOP

Related Classes of org.eclipse.ecf.tutorial.scribbleshare.ScribbleView

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.