
package pl.magot.vetch.widgets;


import android.app.*;
import android.content.Intent;
import android.os.Bundle;
import android.view.*;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;


public class KeyboardWidget extends Activity
{
	//fields
	public static final int EDIT_TEXT_REQUEST = 113;
	private static final int iSmallButtonWidth = 100;	
	
	//margin from left/right to window frame: 8px. window frame: 2px
	public static final int iMaxWidth = 320 - (20 * 2);
	public static final int iMaxHeight = 480;
	
	//fields
	private static String sStrTitle = "Enter text";
	private static String sStrSet = "set";
	private static String sStrCancel= "cancel";
	
	//fields
	private LinearLayout layContent = null;
	private KeyboardWidgetView keyboard = null;
	private HintEdit edit = null;
	private Button btnCancel = null;
	private Button btnSet = null;
	
  //methods
  @Override
  public void onCreate(Bundle icicle)
  {
  	super.onCreate(icicle);
  	
		setTitle(sStrTitle);
  	  	
  	//get startup data
  	String sText = "";
  	Bundle data = this.getIntent().getExtras();
  	if (data != null)
  	{
  		if (data.containsKey("text"))
  			sText = data.getString("text");
  	}  	
  	
  	//restore data from freeze state
  	if (icicle != null)
  	{
  		sText = icicle.getString("freezeText");
  	}
  	
  	setContentView(generateContentView());
  	
  	initializeEditing(sText);
  }
  
  @Override
  protected void onSaveInstanceState(Bundle outState)
  {
  	super.onSaveInstanceState(outState);
  	//save controls state
  	outState.putString("freezeText", edit.getText().toString().trim());
  }
  
  @Override
  public void onStart()
  {
  	super.onStart();
  	
  }
  
	public static void setStrings(String sStrTitle)
  {  	
		KeyboardWidget.sStrTitle = new String(sStrTitle);
  }  
	
	public static void setStrings(String sStrTitle, String sStrCancel, String strSet)
  {  	
		sStrTitle = new String(sStrTitle);
		sStrCancel = new String(sStrCancel);
		strSet = new String(strSet);
  }  	
  
  public static void Open(Activity parentActivity, String sText)
  {
    Intent it = new Intent("android.intent.action.AnCal.ACTION_MODE_EDIT_TEXT");      
    Bundle data = new Bundle();
    data.putString("text", sText);
    it.putExtras(data);
    parentActivity.startActivityForResult(it, EDIT_TEXT_REQUEST);
  }  

  public static String GetTextOnActivityResult(int requestCode, int resultCode, Bundle extras)
  {
		if ((requestCode == KeyboardWidget.EDIT_TEXT_REQUEST) && (resultCode == RESULT_OK)) 
		{
    	if (extras.containsKey("text"))
    	{
    		return extras.getString("text");
    	}
		}
		return "";
  }
  
  public LinearLayout createLayout(int iOrientation)
  {
		LinearLayout lay = new LinearLayout(this);		
		lay.setLayoutParams(new LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
		lay.setOrientation(iOrientation);
		return lay;
  }
  
  public Button createButton(String sText, int iWidth, int iHeight)
  {
  	Button btn = new Button(this);
  	btn.setText(sText);
  	btn.setLayoutParams(new LayoutParams(iWidth, iHeight));
  	return btn;
  }  

  public TextView createLabel(String sText, int iWidth, int iHeight)
  {
  	TextView label = new TextView(this);
  	label.setText(sText);
  	label.setLayoutParams(new LayoutParams(iWidth, iHeight));
  	return label;
  }
  
  public void generateBottomButtons(LinearLayout layBottomControls)
  {
  	TextView labMargin = createLabel("", 8, android.view.ViewGroup.LayoutParams.FILL_PARENT);
  	
  	btnCancel = createButton(sStrCancel, iSmallButtonWidth, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);  	
  	btnCancel.setBackgroundResource(android.R.drawable.btn_default_small);  	
  	
  	btnSet = createButton(sStrSet, iSmallButtonWidth, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);  	
  	btnSet.setBackgroundResource(android.R.drawable.btn_default_small);
  	
  	//set events
  	btnCancel.setOnClickListener(new Button.OnClickListener()
  	{
			public void onClick(View arg0) {
				OnClose(false);
		}});
  	btnSet.setOnClickListener(new Button.OnClickListener()
  	{
			public void onClick(View arg0) {				
				OnClose(true);
		}});
  	
  	layBottomControls.setGravity(Gravity.CENTER_HORIZONTAL);
  	layBottomControls.addView(btnCancel);
		layBottomControls.addView(labMargin);
  	layBottomControls.addView(btnSet);  	
  }
  
	public void OnClose(boolean bOK)
	{
    Bundle data = new Bundle();    
    data.putString("text", edit.getText().toString().trim());    
		
		Intent intentData = new Intent("");
		intentData.putExtras(data);
		setResult(bOK?RESULT_OK:RESULT_CANCELED, intentData);
		
		this.finish();
	}
  
  public HintEdit createEditBox()
  {
  	edit = new HintEdit(this);
		edit.setLayoutParams(new LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
		edit.setLines(3);
		edit.setGravity(Gravity.TOP);
		edit.setFocusable(true);
				
		return edit;
  }

  private View generateContentView()
  {
  	LinearLayout layMain = createLayout(LinearLayout.VERTICAL);
  	layMain.setPadding(8, 8, 8, 8);
  	
  	LinearLayout layTopControls = createLayout(LinearLayout.HORIZONTAL);
  	LinearLayout layMargin = createLayout(LinearLayout.HORIZONTAL);
		layMargin.getLayoutParams().height = 12;

  	LinearLayout layContentBottom = createLayout(LinearLayout.HORIZONTAL);
  	layContentBottom.getLayoutParams().height = 18;
  	
		LinearLayout layBottomControls = createLayout(LinearLayout.HORIZONTAL);
  	
  	//top edit box
  	edit = createEditBox();
		layTopControls.addView(edit);
  	
  	//content
  	layContent = createLayout(LinearLayout.VERTICAL);
  	  	
  	keyboard = new KeyboardWidgetView(this, iMaxWidth);  
  	
  	layContent.getLayoutParams().width = iMaxWidth;
  	layContent.getLayoutParams().height = keyboard.getTotalHeight();
  	
  	layContent.addView(keyboard);
  	
  	generateBottomButtons(layBottomControls);
  	
  	layMain.addView(layTopControls);
  	layMain.addView(layMargin);
  	layMain.addView(layContent);
  	layMain.addView(layContentBottom);
  	layMain.addView(layBottomControls);
  	
  	return layMain;
  }

  public void initializeEditing(String sText)
  {
  	keyboard.setKeyClickEvent(mOnKeyClick);
  	keyboard.editText = edit;  	
		edit.setText(sText);
  	edit.setSelectAllOnFocus(true);  	
  } 
  
	public KeyboardWidgetView.OnKeyClick mOnKeyClick = new KeyboardWidgetView.OnKeyClick()	
	{
		public void OnKeyClicked(KeyItem key, boolean bCapital)
		{
			key.sendKey(edit, bCapital);
			autoChangeLayout(key);
		}
	};
	
	public void autoChangeLayout(KeyItem key)
	{
		KeyItemLayout keys = keyboard.getKeyLayout();
		String sText = edit.getText().toString();
		
		//reset layout
		if (sText.length() == 0)
		{
			keys.setLayoutBigCaps();
			keyboard.invalidate();
			return;
		}
		
		//change layout to small caps after first letter
		if (sText.length() == 1)
		{
			keys.setLayoutSmallCaps();
			keyboard.invalidate();
			return;
		}
		
		//change layout to big caps after period
		if ((sText.length() > 0) && (key.iType == KeyItem.kAlphaCycle))
		{
			if (sText.charAt(sText.length() - 1) == '.')
			{
				keys.setLayoutBigCaps();
				keyboard.invalidate();
				return;
			}
			if (sText.charAt(sText.length() - 1) == ',')
			{
				keys.setLayoutSmallCaps();
				keyboard.invalidate();
				return;
			}			
		}
		
		//change layout to big caps after period and big letter		
		int index = sText.lastIndexOf(".");
		if ((index != -1) && (sText.length() > 0))
		{
			sText = sText.substring(index + 1).trim();		
			if (sText.length() == 1)
			{
				if (Character.isUpperCase(sText.charAt(0)))
				{
					keys.setLayoutSmallCaps();
					keyboard.invalidate();
					return;					
				}			
			}
		}		
		
	}

}
