Java tutorial
/** * Copyright (c) 2007, 2009 Hugo Corbucci and others.<br> * 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<br> * <br> * Contributors:<br> * Hugo Corbucci - initial API and implementation<br> * Luiz C. Real - later contributions<br> * <br> * This file was created on 2007/01/19, 00:03:02, by Hugo Corbucci.<br> * It is part of package br.org.archimedes.gui.rca.editor on the br.org.archimedes.core project.<br> */ package br.org.archimedes.gui.rca.editor; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Observable; import java.util.Observer; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.opengl.GLCanvas; import org.eclipse.swt.opengl.GLData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.GLContext; import br.org.archimedes.Constant; import br.org.archimedes.exceptions.NoActiveDrawingException; import br.org.archimedes.exceptions.NullArgumentException; import br.org.archimedes.gui.model.MouseClickHandler; import br.org.archimedes.gui.model.MouseMoveHandler; import br.org.archimedes.gui.model.VisualHelper; import br.org.archimedes.gui.model.Workspace; import br.org.archimedes.gui.opengl.OpenGLWrapper; import br.org.archimedes.gui.rca.Activator; import br.org.archimedes.gui.rca.InterpreterView; import br.org.archimedes.model.Drawing; public class DrawingEditor extends EditorPart implements Observer, ISelectionProvider { public static final String EDITOR_ID = "br.org.archimedes.gui.rca.editor.DrawingEditor"; //$NON-NLS-1$ private static List<Cursor> cursors; private GLCanvas canvas; private OpenGLWrapper openGL; private VisualHelper visualHelper; private IViewPart view; private int currentCursor; private Collection<ISelectionChangedListener> selectionListeners = new LinkedList<ISelectionChangedListener>(); /** * @return the currentCursor */ public int getCurrentCursor() { return this.currentCursor; } /** * @param currentCursor * the currentCursor to set */ public void setCurrentCursor(int currentCursor) { this.currentCursor = currentCursor; canvas.setCursor(cursors.get(currentCursor)); } /** * Creates all mouse cursors. * * @param display * The display to be used * @return The list containing all the cursors */ private static List<Cursor> createCursors(Display display) { List<Cursor> cursors = new ArrayList<Cursor>(); PaletteData paletteData = new PaletteData(new RGB[] { new RGB(0, 0, 0), new RGB(255, 255, 255) }); ImageData sourceData = new ImageData(1, 1, 1, paletteData); sourceData.setPixels(0, 0, 1, new int[] { 0 }, 0); Cursor normalCursor = new Cursor(display, sourceData, 0, 0); cursors.add(normalCursor); cursors.add(createCursor("cursors/open_hand.png")); //$NON-NLS-1$ cursors.add(createCursor("cursors/closed_hand.png")); //$NON-NLS-1$ return cursors; } /** * @param path * The path to the cursor image. * @return The created cursor or null if the image couldn't be found. */ private static Cursor createCursor(String path) { ImageDescriptor imageDescriptor = Activator.getImageDescriptor(path); //$NON-NLS-1$ Cursor openHandCursor = null; if (imageDescriptor != null) { // found the image ImageData openHand = imageDescriptor.getImageData(); openHandCursor = new Cursor(Display.getCurrent(), openHand, 12, 12); } return openHandCursor; } @Override public void doSave(IProgressMonitor monitor) { // TODO Use this system to save the drawing } @Override public void doSaveAs() { // TODO Use this system to save the drawing } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { if (cursors == null) { cursors = DrawingEditor.createCursors(site.getShell().getDisplay()); } setSite(site); setInput(input); setPartName(input.getName()); openGL = br.org.archimedes.Utils.getOpenGLWrapper(); visualHelper = new VisualHelper(openGL, br.org.archimedes.Utils.getWorkspace(), br.org.archimedes.Utils.getInputController()); getDrawing().addObserver(this); getSite().setSelectionProvider(this); getEditorSite().getWorkbenchWindow().getPartService().addPartListener(new IPartListener() { private IWorkbenchPart lastActivated; public void partActivated(IWorkbenchPart part) { if (part == DrawingEditor.this) { System.out.println("Ativando: " //$NON-NLS-1$ + getDrawing().getTitle()); lastActivated = part; br.org.archimedes.Utils.getInputController().setDrawing(getDrawing()); } } public void partBroughtToTop(IWorkbenchPart part) { // Nothing to do } public void partClosed(IWorkbenchPart part) { br.org.archimedes.Utils.getInputController().setDrawing(null); partActivated(lastActivated); } public void partDeactivated(IWorkbenchPart part) { if (part == DrawingEditor.this) { System.out.println("Desativando: " //$NON-NLS-1$ + getDrawing().getTitle()); lastActivated = null; } } public void partOpened(IWorkbenchPart part) { // Nothing to do } }); } @Override public boolean isDirty() { return !getDrawing().isSaved(); } @Override public boolean isSaveAsAllowed() { return true; } @Override public void createPartControl(Composite parent) { if (canvas == null) { Drawing drawing = getDrawing(); GLData data = new GLData(); data.doubleBuffer = true; canvas = new GLCanvas(parent, SWT.NO_BACKGROUND | SWT.NO_FOCUS, data); canvas.setCurrent(); try { GLContext.useContext(canvas); } catch (LWJGLException e) { // This means trouble! e.printStackTrace(); } try { openGL.addDrawingCanvas(drawing, canvas); } catch (NullArgumentException e) { // The drawing or the canvas are null e.printStackTrace(); } addListeners(); openGL.setCurrentCanvas(canvas); setCurrentCursor(Constant.NORMAL_CURSOR); } } /** * Adds the mouse listener, the mouse wheel listener, the mouse move listener and a paint * listener. */ private void addListeners() { final MouseClickHandler mouseClickHandler = MouseClickHandler.getInstance(); final MouseMoveHandler mouseMoveHandler = MouseMoveHandler.getInstance(); canvas.addMouseListener(new MouseListener() { private Workspace workspace = br.org.archimedes.Utils.getWorkspace(); public void mouseDoubleClick(MouseEvent event) { if (event.button == 1) { mouseClickHandler.receiveDoubleClick(event); } } public void mouseDown(MouseEvent event) { if (event.button == 3) { mouseClickHandler.receiveRightClick(); } else { workspace.setMouseDown(true); if (event.button == 1) { mouseClickHandler.receiveClick(event); } else if (event.button == 2) { mouseClickHandler.receiveMiddleClick(event); } } } public void mouseUp(MouseEvent event) { workspace.setMouseDown(false); if (event.button == 2) { mouseClickHandler.receiveMiddleClick(event); } } }); canvas.addListener(SWT.MouseWheel, new Listener() { public void handleEvent(Event event) { mouseClickHandler.receiveMouseWheel(event); } }); canvas.addMouseMoveListener(new MouseMoveListener() { public void mouseMove(MouseEvent event) { mouseMoveHandler.receiveMouseMove(event); update(); } }); canvas.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { update(); } }); } protected void update() { Drawing drawing = getDrawing(); Drawing active = null; try { br.org.archimedes.Utils.getWorkspace().setViewport(drawing.getViewportPosition(), drawing.getZoom()); active = br.org.archimedes.Utils.getController().getActiveDrawing(); } catch (NullArgumentException e) { // Should never reach this block } catch (NoActiveDrawingException e) { // Then the selected item is the active drawing return; } openGL.setCurrentDrawing(drawing); openGL.clear(); drawing.draw(openGL); setPartName(getEditorInput().getName()); if (drawing == active) { visualHelper.draw(currentCursor == Constant.NORMAL_CURSOR); } openGL.update(); } private Drawing getDrawing() { return ((DrawingInput) getEditorInput()).getDrawing(); } @Override public void setFocus() { br.org.archimedes.Utils.getInputController().setDrawing(getDrawing()); if (view == null) { this.view = getSite().getPage().findView(InterpreterView.ID); } view.setFocus(); update(); } public void update(Observable arg0, Object arg1) { update(); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionListeners.add(listener); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { return new StructuredSelection(getDrawing()); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionListeners.remove(listener); } /** * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ public void setSelection(ISelection selection) { // Ignores this } }