groovy/mudspace/domains/minnovar/
groovy/mudspace/domains/minnovar/objects/containers/
groovy/mudspace/domains/minnovar/objects/mobs/
groovy/mudspace/domains/minnovar/objects/mobs/scripts/
groovy/mudspace/domains/minnovar/objects/weapons/
groovy/mudspace/domains/minnovar/town/
groovy/mudspace/resources/
groovy/mudspace/std/
groovy/mudspace/std/game/
groovy/mudspace/std/game/guild/
groovy/mudspace/std/game/guild/skill/
groovy/mudspace/std/game/objects/
groovy/mudspace/std/game/objects/alive/
groovy/mudspace/std/game/objects/bodyparts/
groovy/mudspace/std/game/objects/containers/
groovy/mudspace/std/game/objects/exits/
groovy/mudspace/std/game/objects/exits/events/
groovy/mudspace/std/game/objects/trappings/
groovy/mudspace/std/game/objects/views/
groovy/mudspace/std/game/races/
groovy/scripts/
groovy/scripts/commands/creator/
groovy/scripts/commands/god/
scripts/
package commands.creator;
/** Copyright 2008 Matthew Corby-Eaglen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0 
*
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/
import org.groovymud.shell.telnetd.ExtendedTerminalIO
import net.wimpi.telnetd.io.BasicTerminalIO
import static net.wimpi.telnetd.io.BasicTerminalIO.*

ExtendedTerminalIO stream = source.terminalOutput

if(argstr == null){
	stream.writeln("You need to specify a filename to edit.")
	return
}
stream.setLinewrapping(false)
enum Mode {
	INSERT, APPEND, DELETE, MOVE
}
Mode currentMode = Mode.MOVE

int xPos = 0
int yPos = 0
def file = new File(argstr)
def fileContents = "" 

if(file.exists()){
	fileContents = file.getText()
}else{
	file.createNewFile()
}

List<StringBuffer> buffers = fileContents.tokenize('\n').collect{ new StringBuffer(it) }

stream.eraseToBeginOfScreen()
stream.write(fileContents)
stream.moveCursor(xPos, yPos)

boolean exit = false
def redrawLine = {
	stream.eraseToBeginOfLine()
	stream.write buffers[yPos]
    stream.moveCursor(xPos, yPos)
}
Map commandMap = [
	"i": {currentMode = INSERT}, 
	"a" : {
		currentMode = APPEND
		stream.moveCursor(buffer[yPos].length, yPos)
	}, 
	"x" : {
		  if(currentMode != INSERT || currentMode != APPEND){
			  buffers[yPos].deleteCharAt(xPos)
			  redrawLine
		  }
	},
	UP :{ 
	    	 if(yPos != 0){
	    		 yPos = yPos - 1
	    		 if(xPos > buffers[yPos].length){
	    			 xPos = buffers[yPos].length
	    		 }
	    		 stream.moveCursor(xPos, yPos)
	    	 }
	},
	DOWN : {
	    	 if(yPos != buffers.size()){
	    		 yPos = yPos + 1
	    		 if(xPos > buffers[yPos].length){
	    			 xPos = buffers[yPos].length
	    		 }
	    		 stream.moveCursor(xPos, yPos)
	    	 }
	     },
	LEFT : {	     
	    	 if(xPos != 0){
	    		 xPos = xPos - 1		            		 
	    		 stream.moveCursor(xPos, yPos)
	    	 }
	},
	RIGHT: {
		 if(xPos != buffers[yPos].length){
			 xPos = xPos + 1		            		 
			 stream.moveCursor(xPos, yPos)
		 }
	},
	ESCAPE : {
		if(currentMode == MOVEMENT){
			buffers.each{
				file.write("${it}\n") // save the file
				stream.eraseToBeginOfScreen()
				stream.writeln(".. saved ${argstr}")
			}
			
			exit = true
		}
	}
]

Map insertModeMap = [
    ESCAPE : {currentMode = MOVEMENT},
    ENTER : {
    	buffers.add(yPos, new StringBuffer(""))
    },
    DELETE : {
    	// do some deleting here
    }
]

while(!exit){
	char ch = stream.read()
	if(currentMode == INSERT || currentMode == APPEND){		                             
		StringBuffer strbuf= buffers[yPos]
        if(insertModeMap.respondsTo("${ch}")){
        	insertModeMap."${ch}"
        }else{
	        strbuf.insert(xPos, ch)
	        redrawLine
        }
	}else{
		if(commandMap.respondsTo("${ch}")){
			commandMap."${ch}"
		}
		
	}
}
stream.setLinewrapping(true)