/* * Protocoder * A prototyping platform for Android devices * * Victor Diaz Barrales victormdb@gmail.com * * Copyright (C) 2014 Victor Diaz * Copyright (C) 2013 Motorola Mobility LLC * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ package org.protocoder.fragments; import android.annotation.SuppressLint; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GestureDetectorCompat; import android.text.Editable; import android.text.Selection; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import org.apache.commons.lang3.StringUtils; import org.protocoder.R; import org.protocoderrunner.base.BaseFragment; import org.protocoderrunner.events.Events; import org.protocoderrunner.project.Project; import org.protocoderrunner.project.ProjectManager; import org.protocoderrunner.utils.Fonts; import org.protocoderrunner.utils.MLog; import org.protocoderrunner.utils.TextUtils; import de.greenrobot.event.EventBus; @SuppressLint("NewApi") public class EditorFragment extends BaseFragment { public interface EditorFragmentListener { void onLoad(); void onLineTouched(); } protected static final String TAG = "EditorFragment"; // TODO change this dirty hack private static final int MENU_RUN = 8; private static final int MENU_SAVE = 9; private static final int MENU_BACK = 10; private static final int MENU_FILES = 11; private static final int MENU_API = 12; private float currentSize; EditText edit; private View v; private Project currentProject; private EditorFragmentListener listener; private Menu menu; private boolean bFiles = true; private boolean bAPI = true; private FileManagerFragment fileFragment; private FragmentTransaction ft; private BaseWebviewFragment webviewFragment; public EditorFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.fragment_editor, container, false); edit = (EditText) v.findViewById(R.id.editText1); TextUtils.changeFont(getActivity(), edit, Fonts.CODE); currentSize = edit.getTextSize(); Button btnIncreaseSize = (Button) v.findViewById(R.id.increaseSize); btnIncreaseSize.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentSize += 1; edit.setTextSize(currentSize); } }); Button btnDecreaseSize = (Button) v.findViewById(R.id.decreaseSize); btnDecreaseSize.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentSize -= 1; edit.setTextSize(currentSize); } }); Bundle bundle = getArguments(); if (bundle != null) { String projectName = bundle.getString(Project.NAME); String projectFolder = bundle.getString(Project.FOLDER); MLog.d("mm", projectName); if (projectName != "") { loadProject(ProjectManager.getInstance().get(projectFolder, projectName)); } } edit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MLog.d(TAG, "" + getCurrentCursorLine(edit.getEditableText())); if (listener != null) { listener.onLineTouched(); } } }); // Set actionbar override setHasOptionsMenu(true); GestureDetectorCompat qq = new GestureDetectorCompat(getActivity(), new GestureDetector.OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { MLog.d(TAG, "singleTapUp"); return false; } @Override public void onShowPress(MotionEvent e) { MLog.d(TAG, "showPress"); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { MLog.d(TAG, "onScroll"); return false; } @Override public void onLongPress(MotionEvent e) { MLog.d(TAG, "onLongPress"); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { MLog.d(TAG, "onFling"); return false; } @Override public boolean onDown(MotionEvent e) { MLog.d(TAG, "onDown"); return false; } }); return v; } public static EditorFragment newInstance(ProjectManager project) { EditorFragment myFragment = new EditorFragment(); return myFragment; } @Override public View getView() { return super.getView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); } @Override public void onHiddenChanged(boolean hidden) { Toast.makeText(getActivity(), "HIDDEN? " + hidden, Toast.LENGTH_SHORT).show(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { this.menu = menu; menu.clear(); menu.add(1, MENU_RUN, 0, "Run").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(1, MENU_SAVE, 0, "Save").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(1, MENU_FILES, 0, "Files").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); menu.add(1, MENU_API, 0, "API").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case MENU_RUN: save(); run(); return true; case MENU_SAVE: save(); return true; case MENU_FILES: MenuItem menuFiles = menu.findItem(MENU_FILES).setChecked(bFiles); showFileManager(bFiles); bFiles = !bFiles; return true; case MENU_API: MenuItem menuApi = menu.findItem(MENU_API).setChecked(bFiles); showAPI(bAPI); bAPI = !bAPI; return true; default: return super.onOptionsItemSelected(item); } } public void addListener(EditorFragmentListener listener) { this.listener = listener; } public void loadProject(Project project) { currentProject = project; if (project != null) { edit.setText(ProjectManager.getInstance().getCode(project)); } else { edit.setText("Project loading failed"); } } public void setText(String text) { edit.setText(text); } public void run() { Events.ProjectEvent evt = new Events.ProjectEvent(currentProject, "run"); EventBus.getDefault().post(evt); } public void save() { ProjectManager.getInstance().writeNewCode(currentProject, getCode(), "main.js"); Toast.makeText(getActivity(), "Saving " + currentProject.getName() + "...", Toast.LENGTH_SHORT).show(); } public void toggleEditable(boolean b) { } private int getCurrentCursorLine(Editable editable) { int selectionStartPos = Selection.getSelectionStart(editable); if (selectionStartPos < 0) { // There is no selection, so return -1 like getSelectionStart() does // when there is no seleciton. return -1; } String preSelectionStartText = editable.toString().substring(0, selectionStartPos); return StringUtils.countMatches(preSelectionStartText, "\n"); } public String getCode() { return edit.getText().toString(); } public void showAPI(boolean b) { ft = getChildFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_out_left, R.anim.slide_out_left); if (b) { webviewFragment = new BaseWebviewFragment(); Bundle bundle = new Bundle(); bundle.putString("url", "http://localhost:8585/reference.html"); webviewFragment.setArguments(bundle); ft.add(R.id.fragmentWebview, webviewFragment).addToBackStack(null); edit.animate().translationX(-50).setDuration(500); // fileFragment.getView().animate().translationX(-200).setDuration(500).start(); } else { edit.animate().translationX(0).setDuration(500); // fileFragment.getView().animate().translationX(0).setDuration(500).start(); ft.remove(webviewFragment); // ft.hide(fileFragment); } ft.commit(); } public void showFileManager(boolean b) { ft = getChildFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_left); if (b) { fileFragment = new FileManagerFragment(); Bundle bundle = new Bundle(); bundle.putString(Project.NAME, currentProject.name); bundle.putString(Project.FOLDER, currentProject.folder); fileFragment.setArguments(bundle); ft.add(R.id.fragmentFileManager, fileFragment).addToBackStack("q"); edit.animate().translationX(-50).setDuration(500); // fileFragment.getView().animate().translationX(-200).setDuration(500).start(); } else { edit.animate().translationX(0).setDuration(500); // fileFragment.getView().animate().translationX(0).setDuration(500).start(); // ft.remove(fileFragment); // ft.hide(fileFragment); } ft.commit(); } }