znmud-0.0.1/benchmark/
znmud-0.0.1/cmd/
znmud-0.0.1/cmd/emotes/
znmud-0.0.1/cmd/objects/
znmud-0.0.1/cmd/tiny/
znmud-0.0.1/doc/
znmud-0.0.1/farts/
znmud-0.0.1/lib/
znmud-0.0.1/lib/combat/
znmud-0.0.1/lib/core/bodytypes/
znmud-0.0.1/lib/engine/
znmud-0.0.1/lib/farts/
znmud-0.0.1/logs/
# File: editor.rb
# Author: Craig Smith
# This source code copyright (C) 2009 Craig Smith
# All rights reserved.
#
# Released under the terms of the GNU Public License
# See COPYING file for additional information.
#


require 'utility/log'
require 'olc/olcmenu'
require 'olc/olcmenuoption'
require 'olc/olceditor'

# Multi-line method editor.  Wrapper for OlcEditor
class Editor
  logger 'DEBUG'

  attr_accessor :ch, :classname, :method, :editstr, :title, :menu, :menu_stack

  # Initializes an OLC Object
  def initialize(id, classname, method)
	self.title = "OLC Multi-Line Editor (#{method})" if not title
	self.ch = get_object(id)
	self.classname = classname
	self.method = method
	if not classname.respond_to?(method) or not classname.respond_to?("#{method}=") 
		ch.sendto("ERROR: Invalid method (#{method}) for class #{classname}")
		exit_olc(true)
	end
	self.editstr = classname.send(method)
	if not editstr
		self.editstr = String.new
	elsif not editstr.is_a? String
		ch.sendto("Method #{method} is not a String.")
		exit_olc(true)
	end
	self.menu = olc_basemenu(title,self,nil)
	self.menu_stack = []
	ch.mode = :olc
	ch.sendroom("#{ch.name} closes #{ch.pos_pronoun} eyes and begins concentrating...")
	show_menu
  end

  # Creates a basic menu with just a Quit button
  # [+title+] title of the menu
  # [+calling+] Calling object (one who controls this menu)
  # [+init+] Init function that sets up this menu
  # [+reset+] Optional reset
  # [+return+] basic menu object
  def olc_basemenu(title,calling,init,reset=nil)
	if reset == "reset"
		m = menu
	else
		m = OlcMenu.new(title,calling,init)
	end
	m.add_editor_option("E","Edit", editstr, self, :edit_str)
	m.add_text_option("X","Abort", self, :abort_menu)
	m.add_text_option("Q","Quit", self, :quit_menu)
	m
  end

  # Main command parsing routine.  Overwrite with your object editor
  # [+m+] command to parse
  def parse(m)
	return if not menu
	msg = menu.parse(m)
	if msg
		if msg.size > 0
			ch.sendto(msg)
		else
			show_menu
		end
	else
		show_menu
	end
  end

  # Add a submenu
  # [+menu+] A created OlcMenu object
  # [+reset+] Optional.  If set ignore
  def submenu(newmenu, reset=nil)
	if not reset == "reset"
		self.menu_stack.push menu
		self.menu = newmenu
	end
	show_menu
  end

  # Quit the current menu.  If last menu, exit OLC
  # [+m+] ignored
  def quit_menu(m)
	if menu_stack.size > 0
		self.menu = menu_stack.pop
		menu.reset
		show_menu
	else
		exit_olc
	end
  end

  # Abort the editing
  def abort_menu(m)
	ch.sendto("Aborting...")
	exit_olc(true)
  end

  # Exits the OLC session
  def exit_olc(cancel=false)
	ch.mode = :playing
	ch.olc = nil
	self.menu = nil
	if not cancel and editstr.size > 0
		# Strip off ALL \r\n at the end of sentences
		self.editstr.gsub!(/([\r\n]+)$/,"")
		classname.send("#{method}=", editstr)
		ch.sendto("Saved #{method}.")
	end
	ch.sendroom("#{ch.name} has finished creating.")
  end

  # Updates the edited string
  def edit_str(str)
	self.editstr = str
	show_menu
	editstr
  end

  # Display the menu to the user
  def show_menu
	ch.sendto(menu.to_s)
  end

  def get_object(oid)
    Engine.instance.db.get(oid)
  end

end