diff src/editor.tp @ 126:a2d2d8e09291

Merge
author Mike Pavone <pavone@retrodev.com>
date Mon, 05 Aug 2013 23:37:17 -0700
parents 1157639353e7
children 2b25d0ce2946
line wrap: on
line diff
--- a/src/editor.tp	Mon Aug 05 23:36:18 2013 -0700
+++ b/src/editor.tp	Mon Aug 05 23:37:17 2013 -0700
@@ -5,7 +5,10 @@
 each <- foreign: :iterable fun {}
 addClass <- foreign: :node className {}
 removeClass <- foreign: :node className {}
+hasClass <- foreign: :node className {}
 get <- foreign: :url onSuccess onFail onOther {}
+getEl <- foreign: :from idx {}
+setEl <- foreign: :to idx val {}
 newEl <- foreign: :tagname props {}
 
 //TP Parser
@@ -24,9 +27,62 @@
 }
 
 //kernel definitions
-import: kernel
+//import: kernel
+
+filter <- :arr pred {
+	output <- arr slice: 0 0
+	each: arr :idx el {
+		if: (pred: el) {
+			output push: el
+		} else: {}
+	}
+	output
+}
 
 //editor code
+selection <- #{
+	valid? <- false
+}
+
+setSelection:withInNode <- :astnode :innode {
+	fakeEvent <- #{
+		stopPropagation <- :Blah {
+		}
+	}
+	selection <- #{
+		valid? <- true
+		in <- {
+			(innode domNode) onclick: fakeEvent
+		}
+		out <- {
+			fakeEvent <- #{
+				stopPropagation <- :Blah {
+				}
+			}
+			((astnode up) domNode) onclick: fakeEvent
+		}
+	}
+}
+
+setSelection <- :astnode {
+	fakeEvent <- #{
+		stopPropagation <- :Blah {
+		}
+	}
+	selection <- #{
+		valid? <- true
+		in <- {
+		}
+		out <- {
+			fakeEvent <- #{
+				stopPropagation <- :Blah {
+				}
+			}
+			((astnode up) domNode) onclick: fakeEvent
+		}
+	}
+}
+
 editFile <- :path {
 	get: path :request {
 		addClass: (q: "body") "editorMode"
@@ -59,9 +115,9 @@
 
 selectParent <- :node {
 	each: (qall: ".selectParent") :idx el {
-		removeClass: el "selected"
+		removeClass: el "selectParent"
 	}
-	addClass: (node parentNode) "selectParent"
+	addClass: node "selectParent"
 }
 
 popInscope:onClick <- :syms :handler {
@@ -70,34 +126,146 @@
 	each: syms :idx key {
 		inscope appendChild: (newEl: "li" #{
 			textContent <- key
-			onclick <- { handler: key }
+			onclick <- :Event { handler: key }
 		})
 	}
 }
 
+scalarClick <- :domnode astnode event {
+	selectNode: domnode
+	setSelection: astnode
+	event stopPropagation: (foreign: undefined)
+	//TODO: set focus
+}
+
 symbolClick <- :domnode astnode event {
-	console log: astnode
 	selectNode: domnode
-	popInscope: ((astnode symbols) allSymbols) onClick: :key {
+	popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key {
 		domnode textContent!: key
 		astnode name!: key
 	}
-	event stopPropagation
+	setSelection: astnode
+	event stopPropagation: (foreign: undefined)
+}
+
+assignClick <- :domnode astnode event {
+	selectParent: domnode
+	selectQuery: ".selectParent > .varname" in: domnode
+	popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key {
+		(domnode firstChild) textContent!: key
+		(astnode symbol) name!: key
+	}
+	setSelection: astnode withInNode: (astnode expression)
+	event stopPropagation: (foreign: undefined)
+}
+
+opClick <- :domnode astnode event {
+	selectParent: domnode
+	selectQuery: ".selectParent > .opname" in: domnode
+	showOps
+	setSelection: astnode withInNode: (astnode left)
+	event stopPropagation: (foreign: undefined)
 }
 
 funClick <- :domnode astnode event {
 	selectParent: domnode
-	selectQuery: ".selectParent > .funpart" in: (domnode parentNode)
+	selectQuery: ".selectParent > .funpart" in: domnode
 	symtable <- astnode symbols
-	syms <- filter: (symtable allSymbols) :sym {
+	syms <- filter: (symtable allSymbols: (foreign: undefined)) :sym {
 		isLambda: ((symtable find: sym) def)
 	}
-	popInscope: syms onClick: {}
-	event stopPropagation
+	inner <- if: (astnode receiver) != (foreign: null) {
+		astnode receiver
+	} else: {
+		(astnode args) getEl: 0
+	}
+	setSelection: astnode withInNode: inner
+	popInscope: syms onClick: :key {
+		astnode name!: key
+		parts <- key split: ":"
+		nodes <- []
+		each: (domnode children) :idx val{
+			nodes push: val
+		}
+		partIdx <- 0
+		nodeIdx <- 0
+		lastWasNamePart <- true
+		while: { partIdx < (parts length) || nodeIdx < (nodes length) } do: {
+			if: nodeIdx < (nodes length) {
+				node <-getEl: nodes nodeIdx
+				nodeIdx <- nodeIdx + 1
+				if: (hasClass: node "funpart") {
+					if: partIdx < (parts length) {
+						postfix <- if: partIdx = 0 && nodeIdx = 2 && (parts length) = 1 && (nodes length) = 2 { "" } else: { ":" }
+						t <- (getEl: parts partIdx)
+						node textContent!: (getEl: parts partIdx) . postfix
+						partIdx <- partIdx + 1
+					} else: {
+						domnode removeChild: node
+					}
+					lastWasNamePart <- true
+				} else: {
+					if: (not: lastWasNamePart) && partIdx < (parts length) && nodeIdx > 0 {
+						domnode insertBefore: (newEl: "span" #{
+							className <- "funpart selected"
+							textContent <- (getEl: parts partIdx) . ":"
+						}) node
+						partIdx <- partIdx + 1
+					}
+					lastWasNamePart <- false
+				}
+			} else: {
+				console log: "part: " . (getEl: parts partIdx)
+				domnode appendChild: (newEl: "span" #{
+					className <- "funpart selected"
+					textContent <- (getEl: parts partIdx) . ":"
+				})
+				partIdx <- partIdx + 1
+			}
+		}
+	}
+	event stopPropagation: (foreign: undefined)
 }
 
 lambdaClick <- :domnode astnode event {
-	symbolClick: domnode astnode event
+	selectNode: domnode
+	popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key {
+		console log: "foooobar!"
+	}
+	inner <- if: ((astnode args) length) > 0 {
+		(astnode args) getEl: 0
+	} else: {
+		(astnode expressions) getEl: 0
+	}
+	setSelection: astnode withInNode: inner
+	event stopPropagation: (foreign: undefined)
+}
+
+objectClick <- :domnode astnode event {
+	selectNode: domnode
+	popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key {
+		console log: "fooobar!"
+	}
+	setSelection: astnode withInNode: ((astnode messages) getEl: 0)
+	event stopPropagation: (foreign: undefined)
+}
+
+visible <- "showops"
+
+showOps <- {
+	each: (qall: ".controls") :idx el {
+		removeClass: el visible
+		addClass: el "showops"
+	}
+	visible <- "showops"
+}
+
+showLit <- {
+	each: (qall: ".controls") :idx el {
+		removeClass: el visible
+		addClass: el "showlit"
+	}
+	visible <- "showlit"
 }
 
 main <- {
@@ -124,7 +292,7 @@
 			}
 		}
 	}
-	
+
 	//bind handlers for editor buttons
 	each: (qall: ".controls li") :idx el {
 		el onclick!: :event {
@@ -133,15 +301,30 @@
 		}
 	}
 	(q: "#ops_button") onclick!: :event {
-		each: (qall: ".controls") :idx el {
-			addClass: el "showops"
+		showOps
+	}
+	(q: "#lit_button") onclick!: :event {
+		showLit
+	}
+
+	(q: "#in") onclick!: :event {
+		console log: "inwards"
+		if: (selection valid?) {
+			selection in
 		}
 	}
-	
+
+	(q: "#out") onclick!: :event {
+		console log: "outwards"
+		if: (selection valid?) {
+			selection out
+		}
+	}
+
 	path <- (window location) pathname
 	if: (path indexOf: "/edit/") = 0 {
 		editFile: (path substr: 5)
-	} else: {}
+	}
 }
 
 }