[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.
|