All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cogchar.lifter.model.control.AbstractMultiSelectControl.scala Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright 2012 by The Cogchar Project (www.cogchar.org).
 * 
 *  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.
 */

package org.cogchar.lifter.model.control

import org.cogchar.impl.web.config.WebControlImpl
import org.cogchar.impl.web.util.HasLoggerConv
import org.cogchar.lifter.model.main.{PageCommander, ControlMultiAction}
import org.cogchar.impl.web.wire.{LifterState, SessionOrganizer}

import org.cogchar.lifter.view.TextBoxFactory
import org.cogchar.name.lifter.ActionStrings
import net.liftweb.common.Full
import net.liftweb.http.{S, StatefulSnippet}
import net.liftweb.http.js.{JsCmd, JsCmds}
import net.liftweb.util.CssSel
import net.liftweb.util.Helpers._ // This wildcard import is the way Lift Helpers roll for CssSel operations and etc.
import scala.collection.mutable.HashMap
import scala.xml.NodeSeq

import org.cogchar.api.web.{WebControl}


abstract class AbstractMultiSelectControlObject(mySessOrg: SessionOrganizer) 
	extends AbstractControlSnippet with AbstractMultiSelectControl {
  

  override protected def generateXmlForControl(sessionId:String, slotNum:Int, control:WebControl): NodeSeq =  {
	// From the RDF "text" value we assume a comma separated list with the first item the title and the rest option labels
	val textItems = control.getText.split(ActionStrings.stringAttributeSeparator)
	val titleText = textItems(0)
	val labelItems = textItems.tail
	makeMultiControl(mySessOrg, sessionId, slotNum, titleText, labelItems)
  }
  
  val titlePrefix: String
  
  final def makeMultiControl(sessOrg: SessionOrganizer, sessionId:String, slotNum: Int, titleText: String, labelList:Array[String]): NodeSeq = {
	initializeMaps(sessOrg, titleText, labelList, sessionId, slotNum);
	makeMultiControlImpl(titleText, labelList, slotNum)
  }
  
  def makeMultiControlImpl(titleText: String, labelList:Array[String], slotNum: Int): NodeSeq
  
  def initializeMaps(sessOrg: SessionOrganizer, titleText: String, labelList:Array[String], sessionId:String, slotNum:Int) {
	val controlData = new MultiSelectControlData
	controlData title = titleText
	controlData labels = labelList
	val snipDataMap = sessOrg.hackIntoSnippetDataMap(sessionId)
	snipDataMap(slotNum) = controlData
  }
}

trait AbstractMultiSelectControl extends StatefulSnippet with HasLoggerConv {
  var formId: Int = blankId
  val blankId = -1
  var sessionId: String = ""
  
  final def snippetData(sessionId:String) = PageCommander.hackIntoSnippetDataMap(sessionId)
  
  // Override to true to specify a Multi-action control, leave false for Multi-select
  def multiActionFlag = false
  
  def getName: String
  
  def dispatch = {case "render" => render}
  
  def render(xhtml:NodeSeq): NodeSeq = {
	
	S.session match {
	  case Full(myLiftSession) => {
		  sessionId = myLiftSession.uniqueId
		  formId = (S.attr("formId") openOr "-1").toInt
		  var valid = false
		  var selectors:CssSel = "i_eat_yaks_for_breakfast" #> "" // This is just to produce a "Null" CssSel so we can initialize this here, but not add any meaningful info until we have checked for valid form data. (As recommended by the inventor of Lift)
		  var errorSeq: NodeSeq = NodeSeq.Empty
		  snippetData(sessionId)(formId) match {
			case snippetResources: MultiSelectControlData => {
				if (formId != blankId) {
				  valid = true
				  selectors = generateSelectors(sessionId, formId, snippetResources.title, snippetResources.labels)
				} else {
				  errorSeq = produceErrorMessages(getName + ".render cannot find a valid formId!")
				}
			  }
			case _ => {
				errorSeq = produceErrorMessages(getName + " cannot find snippet data in LifterState!")
			}
		  }
		  if (valid) selectors.apply(xhtml) else errorSeq
		}
	  case _ => {
		  produceErrorMessages(getName + " cannot get sessionId, not rendering!")
		}
	}
	
  }
  
  def produceErrorMessages(errorText:String): NodeSeq = {
	myLogger.error(errorText)
	TextBoxFactory.makeBox(errorText, "", true)
  }
  
  def process(result: String): JsCmd = {
	info4("{} says item number {} on slot {} is selected in session {}",
		getName, result.asInstanceOf[AnyRef], formId.asInstanceOf[AnyRef], sessionId)
	PageCommander ! ControlMultiAction(sessionId, formId, result.toInt, multiActionFlag)
	JsCmds.Noop
  }
  
  def generateSelectors(sessionId:String, formId:Int, title: String, labels: Array[String]): CssSel
}

class MultiSelectControlData {
  var title: String = null
  var labels: Array[String] = null
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy