package com.osmnavigator;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import org.osmdroid.bonuspack.kml.KmlFeature;
import org.osmdroid.bonuspack.kml.KmlFolder;
public class KmlTreeActivity extends Activity {
/* request codes */
public static final int KML_TREE_REQUEST = 200;
KmlListAdapter mListAdapter;
ListView mListView;
KmlFeature mCurrentKmlFeature; //feature currently edited.
KmlFolder mKmlClipboard; //link to the global KML clipboard.
int mItemPosition; //last item opened
EditText eHeader, eDescription;
Spinner sStyleSpinner;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.kml_main);
mListView = (ListView) findViewById(R.id.listviewKml);
registerForContextMenu(mListView);
mCurrentKmlFeature = MapActivity.mKmlStack.peek();
mKmlClipboard = MapActivity.mKmlClipboard;
eHeader = (EditText)findViewById(R.id.name);
eHeader.setText(mCurrentKmlFeature.mName);
eDescription = (EditText)findViewById(R.id.description);
eDescription.setText(mCurrentKmlFeature.mDescription);
sStyleSpinner = (Spinner) findViewById(R.id.styleSpinner);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, stylesWithEmpty());
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sStyleSpinner.setAdapter(spinnerAdapter);
if (mCurrentKmlFeature.mStyle != null){
int spinnerPosition = spinnerAdapter.getPosition(mCurrentKmlFeature.mStyle);
sStyleSpinner.setSelection(spinnerPosition);
}
CheckBox cVisible = (CheckBox)findViewById(R.id.checkbox_visible);
cVisible.setChecked(mCurrentKmlFeature.mVisibility);
if (mCurrentKmlFeature instanceof KmlFolder){
mListAdapter = new KmlListAdapter(this, (KmlFolder)mCurrentKmlFeature);
// setting list adapter
mListView.setAdapter(mListAdapter);
// Listview on child click listener
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> arg0, View view, int position, long index) {
mItemPosition = position;
KmlFeature item = ((KmlFolder)mCurrentKmlFeature).mItems.get(position);
Intent myIntent = new Intent(view.getContext(), KmlTreeActivity.class);
//myIntent.putExtra("KML", item);
MapActivity.mKmlStack.push(item);
startActivityForResult(myIntent, KML_TREE_REQUEST);
}
});
}
}
/** @return an array with all shared styles ids, plus one empty entry at the beginning */
String[] stylesWithEmpty(){
String[] styles = MapActivity.mKmlDocument.getStylesList();
String[] stylesPlusEmpty = new String[styles.length+1];
stylesPlusEmpty[0] = "";
System.arraycopy(styles, 0, stylesPlusEmpty, 1, styles.length);
return stylesPlusEmpty;
}
@Override protected void onStop(){
saveCurrentFeature();
//setResult(RESULT_OK);
//finish();
super.onStop();
}
protected void saveCurrentFeature(){
mCurrentKmlFeature.mName = eHeader.getText().toString();
mCurrentKmlFeature.mDescription = eDescription.getText().toString();
Object item = sStyleSpinner.getSelectedItem();
if (item != null && !"".equals(item.toString()))
mCurrentKmlFeature.mStyle = item.toString();
else
mCurrentKmlFeature.mStyle = null;
}
/* method assigned to the checkbox in the layout */
public void onCheckboxClicked(View view) {
boolean checked = ((CheckBox)view).isChecked();
switch(view.getId()) {
case R.id.checkbox_visible:
mCurrentKmlFeature.mVisibility = checked;
break;
}
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case KML_TREE_REQUEST:
MapActivity.mKmlStack.pop();
mListAdapter.notifyDataSetChanged();
if (intent != null && intent.getParcelableExtra("KML_FEATURE") != null){
saveCurrentFeature();
setResult(RESULT_OK, intent);
finish();
}
break;
default:
break;
}
}
//------------ Context Menu implementation
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.kml_item_menu, menu);
}
@Override public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
KmlFolder currentKmlFolder = (KmlFolder)mCurrentKmlFeature;
switch (item.getItemId()) {
case R.id.kml_item_menu_cut: //=move to the emptied clipboard
mKmlClipboard.mItems.clear();
mKmlClipboard.add(currentKmlFolder.mItems.get(info.position));
currentKmlFolder.removeItem(info.position);
mListAdapter.notifyDataSetChanged();
return true;
case R.id.kml_item_menu_copy:
KmlFeature copy = currentKmlFolder.mItems.get(info.position).clone();
mKmlClipboard.mItems.clear();
mKmlClipboard.mItems.add(copy);
return true;
case R.id.kml_item_menu_behind:
if (info.position > 0){
KmlFeature kmlItem = currentKmlFolder.removeItem(info.position);
currentKmlFolder.mItems.add(info.position-1, kmlItem);
mListAdapter.notifyDataSetChanged();
}
return true;
case R.id.kml_item_menu_front:
if (info.position < currentKmlFolder.mItems.size()-1){
KmlFeature kmlItem = currentKmlFolder.removeItem(info.position);
currentKmlFolder.mItems.add(info.position+1, kmlItem);
mListAdapter.notifyDataSetChanged();
}
return true;
case R.id.kml_item_menu_show_on_map:
Intent intent = new Intent();
//TODO: is it the right way to pass a handle to an object?
intent.putExtra("KML_FEATURE", currentKmlFolder.mItems.get(info.position));
saveCurrentFeature();
setResult(RESULT_OK, intent);
finish();
return true;
default:
return super.onContextItemSelected(item);
}
}
//------------ Option Menu implementation
@Override public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.kml_option_menu, menu);
return true;
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.kml_option_menu_paste:
if (mCurrentKmlFeature instanceof KmlFolder){
KmlFolder currentKmlFolder = (KmlFolder)mCurrentKmlFeature;
for (KmlFeature kmlItem:mKmlClipboard.mItems){
currentKmlFolder.add(kmlItem.clone());
}
mListAdapter.notifyDataSetChanged();
}
return true;
case R.id.kml_option_menu_new:
if (mCurrentKmlFeature instanceof KmlFolder){
KmlFolder currentKmlFolder = (KmlFolder)mCurrentKmlFeature;
currentKmlFolder.add(new KmlFolder());
mListAdapter.notifyDataSetChanged();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}