[Exmmt-commit] SF.net SVN: exmmt: [110] net.sourceforge.exmmt/trunk
Status: Inactive
Brought to you by:
lgrammel
From: <lgr...@us...> - 2006-10-12 16:29:31
|
Revision: 110 http://svn.sourceforge.net/exmmt/?rev=110&view=rev Author: lgrammel Date: 2006-10-12 09:29:21 -0700 (Thu, 12 Oct 2006) Log Message: ----------- #1500774 scenario "shopping list" Modified Paths: -------------- net.sourceforge.exmmt/trunk/plugin.xml net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/Controller.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/ControllerTreeBuilder.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/graphics/IDrawArea.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/navigation/Focus.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/renderer/HorizontalSequenceRenderer.java Added Paths: ----------- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/DefaultDrawArea.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelEditor.java net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelText.java Modified: net.sourceforge.exmmt/trunk/plugin.xml =================================================================== --- net.sourceforge.exmmt/trunk/plugin.xml 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/plugin.xml 2006-10-12 16:29:21 UTC (rev 110) @@ -9,6 +9,12 @@ icon="resources/icons/editor.gif" id="net.sourceforge.exmmt.ModelEditor" name="Model Editor"/> + <editor + class="net.sourceforge.exmmt.NewModelEditor" + extensions="xml" + icon="resources/icons/editor.gif" + id="net.sourceforge.exmmt.NewModelEditor" + name="New Model Editor"/> </extension> </plugin> Added: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/DefaultDrawArea.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/DefaultDrawArea.java (rev 0) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/DefaultDrawArea.java 2006-10-12 16:29:21 UTC (rev 110) @@ -0,0 +1,43 @@ +/** + * + */ +package net.sourceforge.exmmt; + +import net.sourceforge.exmmt.graphics.IDrawArea; + +import org.eclipse.swt.graphics.GC; + +public class DefaultDrawArea implements IDrawArea { + + private final GC gc; + + private int x; + + private int y; + + public DefaultDrawArea(GC gc) { + this.gc = gc; + } + + public void setPosition(int x, int y) { + this.x = x; + this.y = y; + } + + public int getY() { + return y; + } + + public int getX() { + return x; + } + + public void drawText(String text) { + gc.drawText(text, x, y); + } + + public void changePosition(int deltaX, int deltaY) { + x += deltaX; + y += deltaY; + } +} \ No newline at end of file Added: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelEditor.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelEditor.java (rev 0) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelEditor.java 2006-10-12 16:29:21 UTC (rev 110) @@ -0,0 +1,317 @@ +/* $HeadURL: https://svn.sourceforge.net/svnroot/exmmt/net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/ModelEditor.java $ + * ----------------------------------------------------------------------------- + * + * Copyright (C) Lars Grammel and others. + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the Common Public License v1.0 which accompanies + * this distribution, and is available at + * + * http://www.eclipse.org/legal/cpl-v10.html + * + */ +package net.sourceforge.exmmt; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.part.EditorPart; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.Format; +import org.jdom.output.XMLOutputter; + +public class NewModelEditor extends EditorPart { + + final static boolean IS_CARBON, IS_GTK, IS_MOTIF; + + // TODO move / change + static { + String platform = SWT.getPlatform(); + IS_CARBON = "carbon".equals(platform); + IS_GTK = "gtk".equals(platform); + IS_MOTIF = "motif".equals(platform); + } + + IModelElement selectedLiteral; + + IModelElement rootArea; + + private Canvas control; + + private Document document; + + private boolean dirty = false; + + private IFile file; + + private Map<String, IMetaModelElement> metaModelMap; + + @Override + public void createPartControl(Composite parent) { + control = new NewModelText(this, parent, SWT.NONE); + } + + @Override + public void dispose() { + if (control != null) { + control.dispose(); + } + + super.dispose(); + } + + @Override + public void doSave(IProgressMonitor monitor) { + try { + // write the document back + XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + outputter.output(document, out); + + out.flush(); + out.close(); + + ByteArrayInputStream in = new ByteArrayInputStream(out + .toByteArray()); + + file.setContents(in, true, true, null); + + dirty = false; + firePropertyChange(PROP_DIRTY); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public void doSaveAs() { + } + + public Document getMappingFile() throws JDOMException, IOException { + String mappingFile = document.getRootElement().getAttributeValue( + "file", document.getRootElement().getNamespace("mapping")); + + System.out.println(mappingFile); + + IPath projectLocation = file.getProject().getLocation(); + IPath path2 = projectLocation.append(file.getProjectRelativePath() + .removeLastSegments(1)); + IPath path = path2.append(mappingFile); + + SAXBuilder builder = new SAXBuilder(); + return builder.build(path.toFile()); + } + + @Override + public void init(IEditorSite site, IEditorInput input) + throws PartInitException { + setSite(site); + setInput(input); + + file = (IFile) input.getAdapter(IFile.class); + try { + document = new SAXBuilder().build(file.getContents()); + System.out.println(document); + } catch (JDOMException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + createMetaModelMap(); + rootArea = metaModelMap.get(document.getRootElement().getName()) + .create(document.getRootElement(), null); + selectedLiteral = getNavigationElements().get(0); + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public void setFocus() { + } + + void handleKeyDown(Event event) { + System.out.println(event); + + // TODO refactor + if (((event.keyCode == SWT.TAB) && ((event.stateMask & SWT.SHIFT) == SWT.SHIFT)) + || event.keyCode == SWT.ARROW_UP) { + int index = getNavigationElements().indexOf(selectedLiteral) - 1; + if (index < 0) { + index = getNavigationElements().size() - 1; + } + selectedLiteral = getNavigationElements().get(index); + control.redraw(); + } else if (((event.keyCode == SWT.TAB) && !((event.stateMask & SWT.SHIFT) == SWT.SHIFT)) + || event.keyCode == SWT.ARROW_DOWN) { + int index = getNavigationElements().indexOf(selectedLiteral) + 1; + if (index >= getNavigationElements().size()) { + index = 0; + } + selectedLiteral = getNavigationElements().get(index); + control.redraw(); + } else if (selectedLiteral instanceof VariableLiteral) { + VariableLiteral literal = (VariableLiteral) selectedLiteral; + if (event.keyCode == SWT.ARROW_RIGHT) { + literal.setCaretPosition(literal.getCaretPosition() + 1); + } else if (event.keyCode == SWT.ARROW_LEFT) { + literal.setCaretPosition(literal.getCaretPosition() - 1); + } else if (event.keyCode == SWT.DEL + && (literal.getCaretPosition() < literal.getValue() + .length())) { + StringBuffer value = new StringBuffer(literal.getValue()); + value.deleteCharAt(literal.getCaretPosition()); + literal.setValue(value.toString()); + changed(); + } else if (event.keyCode == SWT.BS + && (literal.getCaretPosition() > 0)) { + StringBuffer value = new StringBuffer(literal.getValue()); + value.deleteCharAt(literal.getCaretPosition() - 1); + literal.setValue(value.toString()); + literal.setCaretPosition(literal.getCaretPosition() - 1); + changed(); + } else if (isValidCharacter(event.stateMask, event.character)) { + StringBuffer value = new StringBuffer(literal.getValue()); + value.insert(literal.getCaretPosition(), event.character); + literal.setValue(value.toString()); + literal.setCaretPosition(literal.getCaretPosition() + 1); + changed(); + } + control.redraw(); + } else if (event.keyCode == SWT.CR + && selectedLiteral instanceof AdditionPoint) { + AdditionPoint literal = (AdditionPoint) selectedLiteral; + literal.execute(); + control.redraw(); + } + } + + private void changed() { + dirty = true; + firePropertyChange(PROP_DIRTY); + } + + private void createMetaModelMap() { + metaModelMap = new HashMap<String, IMetaModelElement>(); + Map<String, IMetaMetaModelElement> metaMetaModelMap = createMetaMetaModelMap(); + + try { + Document mappingFile = getMappingFile(); + + Element rootElement = mappingFile.getRootElement(); + List<Element> mappings = rootElement.getChildren("mapping"); + + for (Element mappingElement : mappings) { + Element configuration = (Element) mappingElement.getChildren() + .get(0); + + IMetaMetaModelElement metaMetaModelElement = metaMetaModelMap + .get(configuration.getName()); + IMetaModelElement metaModelElement = metaMetaModelElement + .create(configuration, metaMetaModelMap, metaModelMap); + + metaModelMap.put(mappingElement.getAttributeValue("select"), + metaModelElement); + } + + } catch (JDOMException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + private Map<String, IMetaMetaModelElement> createMetaMetaModelMap() { + Map<String, IMetaMetaModelElement> metaMappingMap = new HashMap<String, IMetaMetaModelElement>(); + + metaMappingMap.put("area", new AreaFactoryFactory()); + metaMappingMap.put("line", new LineFactoryFactory()); + metaMappingMap.put("edit", new VariableFactoryFactory()); + metaMappingMap.put("literal", new FixedLiteralFactoryFactory()); + metaMappingMap.put("apply-mappings", new ApplyMappingsFactoryFactory()); + metaMappingMap.put("addition-point", new AdditionPointFactoryFactory()); + + return metaMappingMap; + } + + // TODO performance: use caching instead of recalculation + private List<IModelElement> getNavigationElements() { + NavigationElementSearcher visitor = new NavigationElementSearcher(); + + rootArea.accept(visitor); + + return visitor.getNavigationElements(); + } + + private boolean isValidCharacter(int stateMask, char character) { + boolean ignore = false; + + if (IS_CARBON) { + // Ignore accelerator key combinations (we do not want to + // insert a character in the text in this instance). Do not + // ignore COMMAND+ALT combinations since that key sequence + // produces characters on the mac. + ignore = (stateMask ^ SWT.COMMAND) == 0 + || (stateMask ^ (SWT.COMMAND | SWT.SHIFT)) == 0; + } else if (IS_MOTIF) { + // Ignore accelerator key combinations (we do not want to + // insert a character in the text in this instance). Do not + // ignore ALT combinations since this key sequence + // produces characters on motif. + ignore = (stateMask ^ SWT.CTRL) == 0 + || (stateMask ^ (SWT.CTRL | SWT.SHIFT)) == 0; + } else { + // Ignore accelerator key combinations (we do not want to + // insert a character in the text in this instance). Don't + // ignore CTRL+ALT combinations since that is the Alt Gr + // key on some keyboards. See bug 20953. + ignore = (stateMask ^ SWT.ALT) == 0 || (stateMask ^ SWT.CTRL) == 0 + || (stateMask ^ (SWT.ALT | SWT.SHIFT)) == 0 + || (stateMask ^ (SWT.CTRL | SWT.SHIFT)) == 0; + } + boolean isCharacter = !ignore && character > 31 && character != SWT.DEL; + // -ignore anything below SPACE except for line delimiter keys and tab. + // -ignore DEL + return isCharacter; + } +} Added: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelText.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelText.java (rev 0) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/NewModelText.java 2006-10-12 16:29:21 UTC (rev 110) @@ -0,0 +1,116 @@ +/* $HeadURL: https://svn.sourceforge.net/svnroot/exmmt/net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/ModelText.java $ + * ----------------------------------------------------------------------------- + * + * Copyright (C) Lars Grammel and others. + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the Common Public License v1.0 which accompanies + * this distribution, and is available at + * + * http://www.eclipse.org/legal/cpl-v10.html + * + */ +package net.sourceforge.exmmt; + +import net.sourceforge.exmmt.builder.Controller; +import net.sourceforge.exmmt.builder.ControllerTreeBuilder; +import net.sourceforge.exmmt.graphics.IDrawArea; +import net.sourceforge.exmmt.graphics.ISizeCalculator; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.TextLayout; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Caret; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.jdom.Element; + +public class NewModelText extends Canvas { + + private final NewModelEditor editor; + + private Listener listener; + + private Caret caret; + + public NewModelText(NewModelEditor editor, Composite parent, int style) { + super(parent, style); + this.editor = editor; + + listener = new Listener() { + public void handleEvent(Event event) { + switch (event.type) { + case SWT.Paint: + handlePaint(event); + break; + case SWT.KeyDown: + NewModelText.this.editor.handleKeyDown(event); + break; + } + } + + }; + addListener(SWT.Paint, listener); + addListener(SWT.KeyDown, listener); + + caret = new Caret(this, SWT.NULL); + setCaret(caret); + } + + public void dispose() { + caret.dispose(); + super.dispose(); + } + + void handlePaint(Event event) { + System.out.println("handlePaint"); + final GC gc = event.gc; + + Color color = new Color(gc.getDevice(), new RGB(255, 255, 255)); + Color color2 = new Color(gc.getDevice(), new RGB(200, 255, 255)); + Color color3 = new Color(gc.getDevice(), new RGB(255, 200, 200)); + gc.setBackground(color); + drawBackground(gc, getClientArea().x, getClientArea().y, + getClientArea().width, getClientArea().height); + + // create draw area + // call render with draw area + IDrawArea area = new DefaultDrawArea(gc); + + ControllerTreeBuilder builder = new ControllerTreeBuilder(); + Element root = getDocumentRoot(); + Controller controller = builder.build(root); + + controller.getRenderer().calculateSize(new ISizeCalculator() { + + public Rectangle calculateSize(String text) { + TextLayout textLayout = new TextLayout(gc.getDevice()); + + textLayout.setText(text); + + return textLayout.getBounds(); + } + + }); + controller.getRenderer().render(area); + + color.dispose(); + color2.dispose(); + color3.dispose(); + } + + private Element getDocumentRoot() { + Element root = new Element("root"); + + root.setAttribute("blah","blub"); + root.setAttribute("blah2","blub222"); + + return root; + } + +} \ No newline at end of file Modified: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/Controller.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/Controller.java 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/Controller.java 2006-10-12 16:29:21 UTC (rev 110) @@ -18,6 +18,7 @@ import net.sourceforge.exmmt.renderer.IRenderer; import net.sourceforge.exmmt.renderer.NullRenderer; +// @tag structure.tree public class Controller { private final Object model; @@ -30,6 +31,7 @@ public Controller(Object model) { assert model != null; + this.model = model; } @@ -43,7 +45,7 @@ assert children.contains(child); } - // TODO result should be immutable or a copy + // @tag todo: result should be immutable or a copy public List<Controller> getChildren() { return children; } Modified: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/ControllerTreeBuilder.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/ControllerTreeBuilder.java 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/builder/ControllerTreeBuilder.java 2006-10-12 16:29:21 UTC (rev 110) @@ -23,6 +23,7 @@ public class ControllerTreeBuilder { + // @tag structure.tree public Controller build(Element element) { Controller controller = new Controller(element); Modified: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/graphics/IDrawArea.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/graphics/IDrawArea.java 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/graphics/IDrawArea.java 2006-10-12 16:29:21 UTC (rev 110) @@ -12,7 +12,7 @@ */ package net.sourceforge.exmmt.graphics; -// TODO check introduction of Point class +// @tag todo.introduce: Point class public interface IDrawArea { void drawText(String text); Modified: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/navigation/Focus.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/navigation/Focus.java 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/navigation/Focus.java 2006-10-12 16:29:21 UTC (rev 110) @@ -51,6 +51,8 @@ int currentIndex = siblings.indexOf(focusedElement); + // @tag todo.refactor.extractStaticMethod: interval restriction + assert currentIndex >= 0; assert currentIndex <= siblings.size() - 1; @@ -78,6 +80,8 @@ int currentIndex = siblings.indexOf(focusedElement); + // @tag todo.refactor.extractStaticMethod: interval restriction + assert currentIndex >= 0; assert currentIndex <= siblings.size() - 1; Modified: net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/renderer/HorizontalSequenceRenderer.java =================================================================== --- net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/renderer/HorizontalSequenceRenderer.java 2006-06-05 16:10:27 UTC (rev 109) +++ net.sourceforge.exmmt/trunk/src/java/net/sourceforge/exmmt/renderer/HorizontalSequenceRenderer.java 2006-10-12 16:29:21 UTC (rev 110) @@ -27,15 +27,13 @@ public void calculateSize(ISizeCalculator sizeCalculator) { int height = 0; int width = 0; - + for (IRenderer renderer : subRenderers) { renderer.calculateSize(sizeCalculator); + Rectangle bounds = renderer.getSize(); - if (bounds.height > height) { - height = bounds.height; - } - + height = Math.max(height, bounds.height); width += bounds.width; } @@ -43,18 +41,15 @@ } public void render(IDrawArea drawArea) { - int oldX = drawArea.getX(); - int oldY = drawArea.getY(); - + int originalX = drawArea.getX(); + int originalY = drawArea.getY(); + for (IRenderer renderer : subRenderers) { renderer.render(drawArea); - - Rectangle bounds = renderer.getSize(); - - drawArea.changePosition(bounds.width, 0); + drawArea.changePosition(renderer.getSize().width, 0); } - - drawArea.setPosition(oldX, oldY); + + drawArea.setPosition(originalX, originalY); } public void add(IRenderer subRenderer) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |