Browse Source

ui fixes
cleanup
write position to field bus register

Martin Kunz 4 years ago
parent
commit
0cb315b707

+ 6 - 6
src/main/java/uraxis/Activator.java

@@ -7,8 +7,9 @@ import org.osgi.framework.BundleContext;
 import com.ur.urcap.api.contribution.InstallationNodeService;
 import com.ur.urcap.api.contribution.ProgramNodeService;
 import com.ur.urcap.api.contribution.DaemonService;
-import uraxis.programnodes.AbsoluteNodeService;
-import uraxis.programnodes.AbsoluteNodeView;
+import uraxis.programnodes.AbsFestoNodeService;
+import uraxis.programnodes.NodeType;
+import uraxis.programnodes.RelFestoNodeService;
 import uraxis.toolbar.MyToolbarService;
 
 /**
@@ -25,12 +26,11 @@ public class Activator implements BundleActivator {
 		MyDaemonInstallationNodeService installationNodeService = new MyDaemonInstallationNodeService(daemonService);
 
 		context.registerService(InstallationNodeService.class, installationNodeService, null);
-		context.registerService(ProgramNodeService.class, new MyDaemonProgramNodeService(), null);
+		// context.registerService(ProgramNodeService.class, new MyDaemonProgramNodeService(), null);
 		context.registerService(DaemonService.class, daemonService, null);
 		context.registerService(SwingToolbarService.class, new MyToolbarService(), null);
-		context.registerService(SwingProgramNodeService.class, new AbsoluteNodeService(), null);
-
-
+		context.registerService(SwingProgramNodeService.class, new AbsFestoNodeService(), null);
+		context.registerService(SwingProgramNodeService.class, new RelFestoNodeService(), null);
 	}
 
 	@Override

+ 3 - 30
src/main/java/uraxis/MyDaemonInstallationNodeContribution.java

@@ -37,9 +37,6 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
         Activator.daemonInterface=daemonInterface;
 	}
 
-	@Input(id = POPUPTITLE_KEY)
-	private InputTextField popupTitleField;
-
 	@Input(id = "btnEnableDaemon")
 	private InputButton enableDaemonButton;
 
@@ -55,24 +52,13 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
 	@Label(id = "lblStatus")
 	private LabelComponent refLblStatus;
 
-	@Input(id = "numberPos")
-	private InputTextField refNumberPos;
-
-	@Input(id = "btnPos")
-	private InputButton refButtonPos;
-
 	@Input(id = "btnDisableDaemon")
 	private InputButton disableDaemonButton;
 
 	@Label(id = "lblDaemonStatus")
 	private LabelComponent daemonStatusLabel;
 
-	@Input(id = POPUPTITLE_KEY)
-	public void onMessageChange(InputEvent event) {
-		if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
-			setPopupTitle(popupTitleField.getText());
-		}
-	}
+
 	@Input(id = "btnRef")
 	public void onBtnRef(InputEvent event) {
 		if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
@@ -84,18 +70,6 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
 		}
 	}
 
-	@Input(id = "btnPos")
-	public void onBtnPos(InputEvent event) {
-		if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
-			try {
-				String pos=refNumberPos.getText();
-				getDaemonInterface().client.execute("pos", new String[]{pos});
-			} catch (XmlRpcException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
 	@Input(id = "btnEnableDaemon")
 	public void onStartClick(InputEvent event) {
 		if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
@@ -116,7 +90,6 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
 	public void openView() {
 		enableDaemonButton.setText("Start Daemon");
 		disableDaemonButton.setText("Stop daemon");
-		popupTitleField.setText(getPopupTitle());
 		refTextIP.setText(getIP());
 		refTextPort.setText(getPort());
 
@@ -231,7 +204,6 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
 
 
 	private void resetToDefaultValue() {
-		popupTitleField.setText(DEFAULT_VALUE);
 		model.set(POPUPTITLE_KEY, DEFAULT_VALUE);
 		setDaemonTitle(DEFAULT_VALUE);
 	}
@@ -267,7 +239,8 @@ public class MyDaemonInstallationNodeContribution implements InstallationNodeCon
 //		daemonService.getDaemon().start();
 //		long endTime = System.nanoTime() + timeOutMilliSeconds * 1000L * 1000L;
 //		while(System.nanoTime() < endTime && (daemonService.getDaemon().getState() != DaemonContribution.State.RUNNING || !daemonInterface.isReachable())) {
-//			Thread.sleep(100);
+//			Thread.sleep(100)
+
 //		}
 //	}
 //

+ 5 - 26
src/main/java/uraxis/MyDaemonInterface.java

@@ -14,6 +14,7 @@ public class MyDaemonInterface {
 		config.setEnabledForExtensions(true);
 		try {
 			config.setServerURL(new URL("http://" + host + ":" + port + "/RPC2"));
+
 		} catch (MalformedURLException e) {
 			e.printStackTrace();
 		}
@@ -44,43 +45,21 @@ public class MyDaemonInterface {
 
 	public boolean rel(int val) {
 		try {
-			ArrayList l = new ArrayList();
-			l.add(val);
-
-			client.execute("rel", l);
+			client.execute("rel", new Object[]{String.valueOf(val)});
 			return true;
 		} catch (XmlRpcException e) {
+			e.printStackTrace();
 			return false;
 		}
 	}
 
 	public boolean abs(int val) {
 		try {
-			ArrayList l = new ArrayList();
-			l.add(val);
-			client.execute("abs", l);
+			client.execute("abs", new Object[]{String.valueOf(val)});
 			return true;
 		} catch (XmlRpcException e) {
+			e.printStackTrace();
 			return false;
 		}
 	}
-
-//	public String getTitle() throws XmlRpcException, UnknownResponseException {
-//		Object result = client.execute("get_title", new ArrayList<String>());
-//		return processString(result);
-//	}
-//
-//	public String setTitle(String title) throws XmlRpcException, UnknownResponseException {
-//		ArrayList<String> args = new ArrayList<String>();
-//		args.add(title);
-//		Object result = client.execute("set_title", args);
-//		return processString(result);
-//	}
-//
-//	public String getMessage(String name) throws XmlRpcException, UnknownResponseException {
-//		ArrayList<String> args = new ArrayList<String>();
-//		args.add(name);
-//		Object result = client.execute("get_message", args);
-//		return processString(result);
-//	}
 }

+ 0 - 146
src/main/java/uraxis/MyDaemonProgramNodeContribution.java

@@ -1,146 +0,0 @@
-package uraxis;
-
-import com.ur.urcap.api.contribution.ProgramNodeContribution;
-import com.ur.urcap.api.domain.URCapAPI;
-import com.ur.urcap.api.domain.data.DataModel;
-import com.ur.urcap.api.domain.script.ScriptWriter;
-import com.ur.urcap.api.ui.annotation.Input;
-import com.ur.urcap.api.ui.annotation.Label;
-import com.ur.urcap.api.ui.component.InputEvent;
-import com.ur.urcap.api.ui.component.InputRadioButton;
-import com.ur.urcap.api.ui.component.InputTextField;
-import com.ur.urcap.api.ui.component.LabelComponent;
-
-import java.awt.*;
-import java.util.Timer;
-import java.util.TimerTask;
-
-public class MyDaemonProgramNodeContribution implements ProgramNodeContribution {
-	private static final String POS = "pos";
-    private static final String ABSOLUTE = "absolute";
-
-
-    private final DataModel model;
-	private final URCapAPI api;
-	private Timer uiTimer;
-
-	public MyDaemonProgramNodeContribution(URCapAPI api, DataModel model) {
-		this.api = api;
-		this.model = model;
-	}
-
-	@Input(id = "pos")
-	private InputTextField posTextField;
-
-	@Input(id = "rbAbs")
-	private InputRadioButton radioAbsButton;
-
-	@Input(id = "rbRel")
-	private InputRadioButton radioRelButton;
-
-	@Label(id = "titlePreviewLabel")
-	private LabelComponent titlePreviewLabel;
-
-	@Label(id = "messagePreviewLabel")
-	private LabelComponent messagePreviewLabel;
-
-	@Input(id = "pos")
-	public void onInput(InputEvent event) {
-		if (event.getEventType() == InputEvent.EventType.ON_CHANGE) {
-			setPos(posTextField.getText());
-			updatePreview();
-		}
-	}
-
-	@Override
-	public void openView() {
-		posTextField.setText(getPos());
-		if(isAbsolute())
-			radioAbsButton.setSelected();
-		else
-			radioRelButton.setSelected();
-		//UI updates from non-GUI threads must use EventQueue.invokeLater (or SwingUtilities.invokeLater)
-		uiTimer = new Timer(true);
-		uiTimer.schedule(new TimerTask() {
-			@Override
-			public void run() {
-				EventQueue.invokeLater(new Runnable() {
-					@Override
-					public void run() {
-						updatePreview();
-					}
-				});
-			}
-		}, 0, 1000);
-	}
-
-
-
-	@Override
-	public void closeView() {
-		uiTimer.cancel();
-		if(radioAbsButton.isSelected())
-			model.set(ABSOLUTE, true);
-		else model.set(ABSOLUTE, false);
-		System.out.println("closeView " + radioAbsButton.isSelected());
-	}
-
-	@Override
-	public String getTitle() {
-		return "Axis " + (isAbsolute()?"Abs":"Rel") + (model.isSet(POS) ? getPos() : "");
-	}
-
-	@Override
-	public boolean isDefined() {
-		// return getInstallation().isDefined() && !getName().isEmpty();
-        return !getPos().isEmpty();
-    }
-
-	@Override
-	public void generateScript(ScriptWriter writer) {
-		// Interact with the daemon process through XML-RPC calls
-		// Note, alternatively plain sockets can be used.
-        //		if(radioRelButton.isSelected()) {
-        //			writer.appendLine( getInstallation().getXMLRPCVariable() + ".rel(\"" + getName() + "\")");
-        //		}
-        //		else if(radioAbsButton.isSelected()) {
-        //			writer.appendLine( getInstallation().getXMLRPCVariable() + ".abs(\"" + getName() + "\")");
-        //		}
-		if(isAbsolute()) {
-			writer.appendLine( getInstallation().getXMLRPCVariable() + ".abs(\"" + getPos() + "\")");
-
-		}
-		else
-			writer.appendLine( getInstallation().getXMLRPCVariable() + ".rel(\"" + getPos() + "\")");
-		writer.writeChildren();
-	}
-
-	private void updatePreview() {
-		titlePreviewLabel.setText("pos: " + (radioAbsButton.isSelected()?"Abs":"Rel"));
-		//messagePreviewLabel.setText(message);
-	}
-
-	private String getPos() {
-		return model.get(POS, "0");
-	}
-
-    private void setPos(String name) {
-		if ("".equals(name)){
-			model.remove(POS);
-		}else{
-			model.set(POS, name);
-		}
-	}
-
-    private boolean isAbsolute() {
-	    return model.get(ABSOLUTE, true);
-    }
-
-    private void setAbsolute(boolean absolute) {
-	    model.set(ABSOLUTE, absolute);
-    }
-
-    private MyDaemonInstallationNodeContribution getInstallation(){
-		return api.getInstallationNode(MyDaemonInstallationNodeContribution.class);
-	}
-}

+ 0 - 45
src/main/java/uraxis/MyDaemonProgramNodeService.java

@@ -1,45 +0,0 @@
-package uraxis;
-
-import com.ur.urcap.api.contribution.ProgramNodeContribution;
-import com.ur.urcap.api.contribution.ProgramNodeService;
-import com.ur.urcap.api.domain.URCapAPI;
-import com.ur.urcap.api.domain.data.DataModel;
-
-import java.io.InputStream;
-
-public class MyDaemonProgramNodeService implements ProgramNodeService {
-
-	public MyDaemonProgramNodeService() {
-	}
-
-	@Override
-	public String getId() {
-		return "FestoAxisNode";
-	}
-
-	@Override
-	public String getTitle() {
-		return "Axis";
-	}
-
-	@Override
-	public InputStream getHTML() {
-		InputStream is = this.getClass().getResourceAsStream("/uraxis/programnode.html");
-		return is;
-	}
-
-	@Override
-	public boolean isDeprecated() {
-		return false;
-	}
-
-	@Override
-	public boolean isChildrenAllowed() {
-		return false;
-	}
-
-	@Override
-	public ProgramNodeContribution createNode(URCapAPI api, DataModel model) {
-		return new MyDaemonProgramNodeContribution(api, model);
-	}
-}

+ 50 - 0
src/main/java/uraxis/programnodes/AbsFestoNodeService.java

@@ -0,0 +1,50 @@
+package uraxis.programnodes;
+
+import com.ur.urcap.api.contribution.ViewAPIProvider;
+import com.ur.urcap.api.contribution.program.ContributionConfiguration;
+import com.ur.urcap.api.contribution.program.CreationContext;
+import com.ur.urcap.api.contribution.program.ProgramAPIProvider;
+import com.ur.urcap.api.contribution.program.swing.SwingProgramNodeService;
+import com.ur.urcap.api.domain.SystemAPI;
+import com.ur.urcap.api.domain.data.DataModel;
+
+import java.util.Locale;
+
+public class AbsFestoNodeService implements SwingProgramNodeService<FestoNodeContribution, FestoNodeView> {
+
+
+    @Override
+    public String getId() {
+        return "FestoABS";
+    }
+
+    @Override
+    public void configureContribution(ContributionConfiguration configuration) {
+        configuration.setChildrenAllowed(false);
+    }
+
+    @Override
+    public String getTitle(Locale locale) {
+        return "FestoABS";
+    }
+
+    @Override
+    public FestoNodeView createView(ViewAPIProvider apiProvider) {
+        SystemAPI systemAPI = apiProvider.getSystemAPI();
+        Style style =  new V5Style();
+        return new FestoNodeView(style);
+    }
+
+    @Override
+    public FestoNodeContribution createNode(
+            ProgramAPIProvider apiProvider,
+            FestoNodeView view,
+            DataModel model,
+            CreationContext context) {
+        return new FestoNodeContribution(apiProvider, view, model, NodeType.ABS);
+    }
+
+    public AbsFestoNodeService() {
+
+    }
+}

+ 19 - 11
src/main/java/uraxis/programnodes/AbsoluteNodeContribution.java

@@ -6,51 +6,59 @@ import com.ur.urcap.api.domain.ProgramAPI;
 import com.ur.urcap.api.domain.data.DataModel;
 import com.ur.urcap.api.domain.script.ScriptWriter;
 import com.ur.urcap.api.domain.undoredo.UndoRedoManager;
-import com.ur.urcap.api.domain.undoredo.UndoableChanges;
 import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardInputCallback;
 import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardInputFactory;
 import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardNumberInput;
-import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardTextInput;
 import uraxis.MyDaemonInstallationNodeContribution;
 
-public class AbsoluteNodeContribution implements ProgramNodeContribution {
-
+public class FestoNodeContribution implements ProgramNodeContribution {
+    private final String VALUE="VALUE";
     private final ProgramAPI programAPI;
     private final UndoRedoManager undoRedoManager;
     private final KeyboardInputFactory keyboardFactory;
 
-    private final AbsoluteNodeView view;
+    private final FestoNodeView view;
     private final DataModel model;
+    private final NodeType nodeType;
 
-    public AbsoluteNodeContribution(ProgramAPIProvider apiProvider, AbsoluteNodeView view, DataModel model) {
+    public FestoNodeContribution(ProgramAPIProvider apiProvider, FestoNodeView view, DataModel model, NodeType nt) {
         this.programAPI = apiProvider.getProgramAPI();
         this.undoRedoManager = apiProvider.getProgramAPI().getUndoRedoManager();
         this.keyboardFactory = apiProvider.getUserInterfaceAPI().getUserInteraction().getKeyboardInputFactory();
 
         this.view = view;
         this.model = model;
+        this.nodeType=nt;
     }
 
     @Override
     public void openView() {
-        view.setPopupText(0);
+        view.setValue(model.get(VALUE, 0));
     }
 
     @Override
     public void closeView() {
+        model.set(VALUE, view.getValue());
     }
 
     @Override
     public String getTitle() {
-        return "Hello World Swing: ";
+        return "Festo "+ nodeType.name();
     }
 
 
     @Override
     public void generateScript(ScriptWriter writer) {
-        // Directly generate this Program Node's popup message + access the popup title through a global variable
-        writer.appendLine("popup(\"" + "generatePopupMessage()" + "\", hello_world_swing_popup_title, False, False, blocking=True)");
+        if(nodeType==NodeType.ABS) {
+            writer.appendLine(getInstallation().getXMLRPCVariable() + ".abs(\"" + view.getValue() + "\")");
+            writer.appendLine("write_output_integer_register(3,"+view.getValue()+")");
+        }
+        else {
+            writer.appendLine(getInstallation().getXMLRPCVariable() + ".rel(\"" + view.getValue() + "\")");
+            writer.appendLine("write_output_integer_register(3," + view.getValue() + ")");
+        }
         writer.writeChildren();
+
     }
 
     public KeyboardNumberInput getKeyboardForTextField() {
@@ -63,7 +71,7 @@ public class AbsoluteNodeContribution implements ProgramNodeContribution {
         return new KeyboardInputCallback<Integer>() {
             @Override
             public void onOk(Integer value) {
-                view.setPopupText(value);
+                view.setValue(value);
             }
         };
     }

+ 10 - 9
src/main/java/uraxis/programnodes/AbsoluteNodeView.java

@@ -3,7 +3,6 @@ package uraxis.programnodes;
 import com.ur.urcap.api.contribution.ContributionProvider;
 import com.ur.urcap.api.contribution.program.swing.SwingProgramNodeView;
 import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardNumberInput;
-import com.ur.urcap.api.domain.userinteraction.keyboard.KeyboardTextInput;
 
 import javax.swing.Box;
 import javax.swing.BoxLayout;
@@ -12,29 +11,27 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.Font;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
-public class AbsoluteNodeView implements SwingProgramNodeView<AbsoluteNodeContribution>{
+public class FestoNodeView implements SwingProgramNodeView<FestoNodeContribution>{
 
     private final Style style;
     private JTextField jTextField;
 
-    public AbsoluteNodeView(Style style) {
+    public FestoNodeView(Style style) {
         this.style = style;
     }
 
     @Override
-    public void buildUI(JPanel jPanel, final ContributionProvider<AbsoluteNodeContribution> provider) {
+    public void buildUI(JPanel jPanel, final ContributionProvider<FestoNodeContribution> provider) {
         jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS));
-
         jPanel.add(createVerticalSpacing(style.getVerticalSpacing()));
         jPanel.add(createInput(provider));
         jPanel.add(createVerticalSpacing(style.getExtraLargeVerticalSpacing()));
     }
 
-    private Box createInput(final ContributionProvider<AbsoluteNodeContribution> provider) {
+    private Box createInput(final ContributionProvider<FestoNodeContribution> provider) {
         Box inputBox = Box.createHorizontalBox();
         inputBox.setAlignmentX(Component.LEFT_ALIGNMENT);
         inputBox.add(new JLabel("Move by:"));
@@ -64,7 +61,11 @@ public class AbsoluteNodeView implements SwingProgramNodeView<AbsoluteNodeContri
         return Box.createRigidArea(new Dimension(style.getHorizontalSpacing(), 0));
     }
 
-    public void setPopupText(Integer popupText) {
-        jTextField.setText(popupText.toString());
+    public void setValue(Integer value) {
+        jTextField.setText(value.toString());
+    }
+
+    public Integer getValue() {
+        return Integer.parseInt(jTextField.getText());
     }
 }

+ 5 - 0
src/main/java/uraxis/programnodes/NodeType.java

@@ -0,0 +1,5 @@
+package uraxis.programnodes;
+
+public enum NodeType {
+    ABS, REL
+}

+ 9 - 8
src/main/java/uraxis/programnodes/AbsoluteNodeService.java

@@ -10,11 +10,12 @@ import com.ur.urcap.api.domain.data.DataModel;
 
 import java.util.Locale;
 
-public class AbsoluteNodeService implements SwingProgramNodeService<AbsoluteNodeContribution, AbsoluteNodeView> {
+public class RelFestoNodeService implements SwingProgramNodeService<FestoNodeContribution, FestoNodeView> {
+
 
     @Override
     public String getId() {
-        return "AbsoluteNodeService";
+        return "FestoREL";
     }
 
     @Override
@@ -24,22 +25,22 @@ public class AbsoluteNodeService implements SwingProgramNodeService<AbsoluteNode
 
     @Override
     public String getTitle(Locale locale) {
-        return "AbsoluteNodeService";
+        return "FestoREL";
     }
 
     @Override
-    public AbsoluteNodeView createView(ViewAPIProvider apiProvider) {
+    public FestoNodeView createView(ViewAPIProvider apiProvider) {
         SystemAPI systemAPI = apiProvider.getSystemAPI();
         Style style =  new V5Style();
-        return new AbsoluteNodeView(style);
+        return new FestoNodeView(style);
     }
 
     @Override
-    public AbsoluteNodeContribution createNode(
+    public FestoNodeContribution createNode(
             ProgramAPIProvider apiProvider,
-            AbsoluteNodeView view,
+            FestoNodeView view,
             DataModel model,
             CreationContext context) {
-        return new AbsoluteNodeContribution(apiProvider, view, model);
+        return new FestoNodeContribution(apiProvider, view, model, NodeType.REL);
     }
 }

+ 7 - 13
src/main/resources/uraxis/installation.html

@@ -19,26 +19,20 @@
 	<body>
 		<h1>Festo Axis</h1>
 		<form>
-			<p>Bla bla blarg<br />Cannot be empty.</p>
+			<p>Fest Achse Config</p>
 			<br />
-			<label>Popup title:</label><input id="popuptitle" type="text"/>
-			<div class="spacer">&nbsp;</div>		
+
+			<label for="textIP">Daemon IP</label>
+			<input id="textIP" type="text" style="font-size: 18px;" /><br/>
+			<label for="textIP">Daemon Port</label>
+			<input id="textPort" type="text" style="font-size: 18px;" />
 			<input id="btnEnableDaemon" type="button" style="font-size: 18px;" />
 			<input id="btnDisableDaemon" type="button" style="font-size: 18px;" />
 			<br>
 			<label  id="lblStatus" style="width: 400px;height: 200px;vertical-align: top"></label>
 			<label id="lblDaemonStatus" style="width: 200px">Status of daemon</label>
 			<br>
-			<label for="textIP">Daemon IP</label>
-			<input id="textIP" type="text" style="font-size: 18px;" />
-			<label for="textIP">Daemon Port</label>
-			<input id="textPort" type="text" style="font-size: 18px;" />
-			<br>
-			<input id="btnRef" type="button" style="font-size: 18px;" value="ref"/>
-			<br>
-			<input id="numberPos" type="number"  style="font-size: 18px;"/>
-			<input id="btnPos" type="button" style="font-size: 18px;" value="pos"/>
-			<br>
+
 		</form>
 	</body>
 </html>

+ 0 - 45
src/main/resources/uraxis/programnode.html

@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html>
-	<head>
-		<title>Festo Axis</title>
-		<style>
-			input {
-				display: inline-block;
-				width: 200px;
-				height: 28px;
-			}
-
-			label {
-				display: inline-block;
-				width: 150px;
-				height: 28px;
-			}
-
-			#preview {
-				display: block;
-				padding: 35px 20px 20px 0px;
-			}
-
-			#header {
-				padding: 0px 0px 20px 0px;
-			}
-		</style>
-	</head>
-	<body>
-		<form>
-			<p>Move axis relative by x</p>
-			<br \>
-			<input id="rbAbs" type="radio">
-			<label for="rbAbs">Absolute</label><br/>
-			<input id="rbRel" type="radio">
-			<label for="rbRel">Relative</label><br/>
-			<input id="pos" type="number"/>
-			<br/>
-			<div id="preview">
-				<h3 id="header">Preview</h3><br \>
-				Title: <label id="titlePreviewLabel" style="width: 400px;"/> <br \>
-				Message: <label id="messagePreviewLabel" style="width: 400px;"/>
-			</div>
-		</form>
-	</body>
-</html>