001 /* 002 * Copyright 2007 - 2009 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: MathView.java,v 2986a8eeaebc 2009/09/24 12:53:08 max $ */ 018 019 package net.sourceforge.jeuclid.swt; 020 021 import net.sourceforge.jeuclid.MutableLayoutContext; 022 import net.sourceforge.jeuclid.context.LayoutContextImpl; 023 import net.sourceforge.jeuclid.elements.generic.DocumentElement; 024 025 import org.eclipse.swt.events.DisposeEvent; 026 import org.eclipse.swt.events.DisposeListener; 027 import org.eclipse.swt.events.PaintEvent; 028 import org.eclipse.swt.events.PaintListener; 029 import org.eclipse.swt.graphics.Color; 030 import org.eclipse.swt.graphics.Device; 031 import org.eclipse.swt.graphics.GC; 032 import org.eclipse.swt.graphics.Image; 033 import org.eclipse.swt.graphics.ImageData; 034 import org.eclipse.swt.widgets.Canvas; 035 import org.eclipse.swt.widgets.Composite; 036 import org.w3c.dom.Node; 037 038 /** 039 * Contains a display component for SWT. 040 * <p> 041 * TODO: This is a very basic implementation. 042 * 043 * @version $Revision: 2986a8eeaebc $ 044 */ 045 public final class MathView extends Canvas { 046 047 // /** 048 // * Logger for this class 049 // */ 050 // private static final Log LOGGER = LogFactory.getLog(MathView.class); 051 052 private final MathRenderer mathRenderer = MathRenderer.getInstance(); 053 054 private Node document; 055 056 private ImageData renderedFormula; 057 058 private MutableLayoutContext layoutContext = new LayoutContextImpl( 059 LayoutContextImpl.getDefaultLayoutContext()); 060 061 /** 062 * Create a new MathView Widget. 063 * 064 * @param parent 065 * Parent component 066 * @param style 067 * SWT style attributes. 068 */ 069 public MathView(final Composite parent, final int style) { 070 super(parent, style); 071 this.setDocument(new DocumentElement()); 072 this.addDisposeListener(new DisposeListener() { 073 public void widgetDisposed(final DisposeEvent e) { 074 MathView.this.widgetDisposed(e); 075 } 076 }); 077 this.addPaintListener(new PaintListener() { 078 public void paintControl(final PaintEvent e) { 079 MathView.this.paintControl(e); 080 } 081 }); 082 } 083 084 private void paintControl(final PaintEvent e) { 085 final GC gc = e.gc; 086 final Device device = gc.getDevice(); 087 final Color c = new Color(device, 255, 255, 255); 088 gc.setBackground(c); 089 gc.fillRectangle(e.x, e.y, e.width, e.height); 090 c.dispose(); 091 if (this.renderedFormula != null) { 092 final Image im = new Image(device, this.renderedFormula); 093 gc.drawImage(im, 0, 0); 094 im.dispose(); 095 } 096 } 097 098 private void widgetDisposed(final DisposeEvent e) { 099 this.document = null; 100 this.renderedFormula = null; 101 } 102 103 private void recreate() { 104 this.renderedFormula = this.mathRenderer.render(this.document, 105 this.layoutContext); 106 } 107 108 /** 109 * @param doc 110 * the document to set 111 */ 112 public void setDocument(final Node doc) { 113 final Node oldValue = this.document; 114 this.document = doc; 115 if (doc != oldValue) { 116 this.recreate(); 117 this.redraw(); 118 } 119 } 120 121 /** 122 * @return the document 123 */ 124 public Node getDocument() { 125 return this.document; 126 } 127 128 }