package com.samsung.spensdk.example.zoompan;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.samsung.spensdk.SCanvasConstants;
import com.samsung.spensdk.SCanvasView;
import com.samsung.spensdk.applistener.HistoryUpdateListener;
import com.samsung.spensdk.applistener.SCanvasInitializeListener;
import com.samsung.spensdk.applistener.SCanvasMatrixChangeListener;
import com.samsung.spensdk.applistener.SCanvasModeChangedListener;
import com.samsung.spensdk.example.R;
import com.samsung.spensdk.example.tools.SPenSDKUtils;
public class SPen_Example_ZoomPan extends Activity {
private final String TAG = "SPenSDK Sample";
//==============================
// Application Identifier Setting
// "SDK Sample Application 1.0"
//==============================
private final String APPLICATION_ID_NAME = "SDK Sample Application";
private final int APPLICATION_ID_VERSION_MAJOR = 2;
private final int APPLICATION_ID_VERSION_MINOR = 2;
private final String APPLICATION_ID_VERSION_PATCHNAME = "Debug";
//==============================
// Variables
//==============================
Context mContext = null;
private FrameLayout mLayoutContainer;
private RelativeLayout mCanvasContainer;
private SCanvasView mSCanvas;
private ImageView mPenBtn;
private ImageView mEraserBtn;
private ImageView mTextBtn;
private ImageView mUndoBtn;
private ImageView mRedoBtn;
private TextView mZoomScale;
private Button mUpBtn;
private Button mDownBtn;
private Button mLeftBtn;
private Button mRightBtn;
private Button mZoomInBtn;
private Button mZoomOutBtn;
private float mZoomValue = 1f;
private final int MENU_MOVING = 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editor_zoompan);
mContext = this;
//------------------------------------
// UI Setting
//------------------------------------
mPenBtn = (ImageView) findViewById(R.id.penBtn);
mPenBtn.setOnClickListener(mBtnClickListener);
mEraserBtn = (ImageView) findViewById(R.id.eraseBtn);
mEraserBtn.setOnClickListener(mBtnClickListener);
mTextBtn = (ImageView) findViewById(R.id.textBtn);
mTextBtn.setOnClickListener(mBtnClickListener);
mUndoBtn = (ImageView) findViewById(R.id.undoBtn);
mUndoBtn.setOnClickListener(undoNredoBtnClickListener);
mRedoBtn = (ImageView) findViewById(R.id.redoBtn);
mRedoBtn.setOnClickListener(undoNredoBtnClickListener);
mUpBtn = (Button) findViewById(R.id.panUp);
mUpBtn.setOnClickListener(arrowBtnClickListener);
mDownBtn = (Button) findViewById(R.id.panDown);
mDownBtn.setOnClickListener(arrowBtnClickListener);
mLeftBtn = (Button) findViewById(R.id.panLeft);
mLeftBtn.setOnClickListener(arrowBtnClickListener);
mRightBtn = (Button) findViewById(R.id.panRight);
mRightBtn.setOnClickListener(arrowBtnClickListener);
mZoomInBtn = (Button) findViewById(R.id.zoomIn);
mZoomInBtn.setOnClickListener(zoomBtnClickListener);
mZoomOutBtn = (Button) findViewById(R.id.zoomOut);
mZoomOutBtn.setOnClickListener(zoomBtnClickListener);
mRightBtn.setOnClickListener(arrowBtnClickListener);
mZoomScale = (TextView) findViewById(R.id.zoomScale);
//------------------------------------
// Create SCanvasView
//------------------------------------
mLayoutContainer = (FrameLayout) findViewById(R.id.layout_container);
mCanvasContainer = (RelativeLayout) findViewById(R.id.canvas_container);
mSCanvas = new SCanvasView(mContext);
mCanvasContainer.addView(mSCanvas);
// Do not encode background/foreground image
mSCanvas.setImageBufferEncodingOption(false, false);
//------------------------------------
// SettingView Setting
//------------------------------------
// Resource Map for Layout & Locale
HashMap<String,Integer> settingResourceMapInt = SPenSDKUtils.getSettingLayoutLocaleResourceMap(true, true, true, false);
// Resource Map for Custom font path
HashMap<String,String> settingResourceMapString = SPenSDKUtils.getSettingLayoutStringResourceMap(true, true, true, false);
// Create Setting View
mSCanvas.createSettingView(mLayoutContainer, settingResourceMapInt, settingResourceMapString);
//====================================================================================
//
// Set Callback Listener(Interface)
//
//====================================================================================
//------------------------------------------------
// SCanvas Listener
//------------------------------------------------
mSCanvas.setSCanvasInitializeListener(new SCanvasInitializeListener() {
@Override
public void onInitialized() {
//--------------------------------------------
// Start SCanvasView/CanvasView Task Here
//--------------------------------------------
// Application Identifier Setting
if(!mSCanvas.setAppID(APPLICATION_ID_NAME, APPLICATION_ID_VERSION_MAJOR, APPLICATION_ID_VERSION_MINOR,APPLICATION_ID_VERSION_PATCHNAME))
Toast.makeText(mContext, "Fail to set App ID.", Toast.LENGTH_LONG).show();
// Set Title
if(!mSCanvas.setTitle("SPen-SDK Test"))
Toast.makeText(mContext, "Fail to set Title.", Toast.LENGTH_LONG).show();
// Update button state
updateModeState();
// Init Background
initBackground();
float fZoomScale = mSCanvas.getCanvasZoomScale();
Float f = fZoomScale;
mZoomScale.setText(f.toString());
}
});
//------------------------------------------------
// History Change Listener
//------------------------------------------------
mSCanvas.setHistoryUpdateListener(new HistoryUpdateListener() {
@Override
public void onHistoryChanged(boolean undoable, boolean redoable) {
mUndoBtn.setEnabled(undoable);
mRedoBtn.setEnabled(redoable);
}
});
//------------------------------------------------
// SCanvas Mode Changed Listener
//------------------------------------------------
mSCanvas.setSCanvasModeChangedListener(new SCanvasModeChangedListener() {
@Override
public void onModeChanged(int mode) {
updateModeState();
}
});
//------------------------------------------------
// Matrix Change Listener
//------------------------------------------------
mSCanvas.setSCanvasMatrixChangeListener(new SCanvasMatrixChangeListener() {
@Override
public void onMatrixChanged(Matrix matrix) {
float[] matrixValues = new float[9];
matrix.getValues(matrixValues);
mZoomValue = matrixValues[Matrix.MSCALE_X];
// To display to the first decimal place
float result = mZoomValue * 10f;
result = Math.round(result);
Float f = result/10f;
mZoomScale.setText(f.toString());
//float panningX = matrixValues[Matrix.MTRANS_X];
//float panningY = matrixValues[Matrix.MTRANS_Y];
}
@Override
public void onMatrixChangeFinished() {
// TODO Auto-generated method stub
}
});
mUndoBtn.setEnabled(false);
mRedoBtn.setEnabled(false);
mPenBtn.setSelected(true);
// Caution:
// Do NOT load file or start animation here because we don't know canvas size here.
// Start such SCanvasView Task at onInitialized() of SCanvasInitializeListener
}
@Override
protected void onDestroy() {
super.onDestroy();
// Release SCanvasView resources
if(!mSCanvas.closeSCanvasView())
Log.e(TAG, "Fail to close SCanvasView");
}
@Override
public void onBackPressed() {
SPenSDKUtils.alertActivityFinish(this, "Exit");
}
private OnClickListener undoNredoBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(mUndoBtn)) {
mSCanvas.undo();
}
else if (v.equals(mRedoBtn)) {
mSCanvas.redo();
}
mUndoBtn.setEnabled(mSCanvas.isUndoable());
mRedoBtn.setEnabled(mSCanvas.isRedoable());
}
};
OnClickListener mBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
int nBtnID = v.getId();
// If the mode is not changed, open the setting view. If the mode is same, close the setting view.
if(nBtnID == mPenBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_PEN){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_PEN, false);
updateModeState();
}
}
else if(nBtnID == mEraserBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER);
}
else {
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_ERASER, false);
updateModeState();
}
}
else if(nBtnID == mTextBtn.getId()){
if(mSCanvas.getCanvasMode()==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT){
mSCanvas.setSettingViewSizeOption(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, SCanvasConstants.SCANVAS_SETTINGVIEW_SIZE_NORMAL);
mSCanvas.toggleShowSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT);
}
else{
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_TEXT);
mSCanvas.showSettingView(SCanvasConstants.SCANVAS_SETTINGVIEW_TEXT, false);
updateModeState();
Toast.makeText(mContext, "Tap Canvas to insert Text", Toast.LENGTH_SHORT).show();
}
}
}
};
private OnClickListener zoomBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(mZoomInBtn)) {
mSCanvas.setCanvasZoomScale(mZoomValue += 0.2, false);
mSCanvas.setCanvasZoomScale(mZoomValue, true);
} else if (v.equals(mZoomOutBtn)) {
mSCanvas.setCanvasZoomScale(mZoomValue -= 0.2, false);
mSCanvas.setCanvasZoomScale(mZoomValue, true);
}
}
};
private OnClickListener arrowBtnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(mUpBtn)) {
mSCanvas.panBySCanvas(0, 30, false);
mSCanvas.panBySCanvas(0, 0, true);
}
if (v.equals(mDownBtn)) {
mSCanvas.panBySCanvas(0, -30, false);
mSCanvas.panBySCanvas(0, 0, true);
}
if (v.equals(mLeftBtn)) {
mSCanvas.panBySCanvas(30, 0, false);
mSCanvas.panBySCanvas(0, 0, true);
}
if (v.equals(mRightBtn)) {
mSCanvas.panBySCanvas(-30, 0, false);
mSCanvas.panBySCanvas(0, 0, true);
}
}
};
// Update tool button
private void updateModeState(){
int nCurMode = mSCanvas.getCanvasMode();
mPenBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_PEN);
mEraserBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_ERASER);
mTextBtn.setSelected(nCurMode==SCanvasConstants.SCANVAS_MODE_INPUT_TEXT);
}
private void initBackground() {
Bitmap bmBG = BitmapFactory.decodeResource(getResources(), R.drawable.smemo_bg);
if(bmBG == null)
return;
mSCanvas.setBGImage(bmBG);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
if(mSCanvas.isMovingMode())
menu.add(MENU_MOVING, MENU_MOVING, Menu.NONE, "Moving Mode Off");
else
menu.add(MENU_MOVING, MENU_MOVING, Menu.NONE, "Moving Mode On");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu){
super.onMenuOpened(featureId, menu);
if (menu == null)
return true;
MenuItem menuItem = menu.findItem(MENU_MOVING);
if(mSCanvas.isMovingMode())
menuItem.setTitle("Moving Mode Off");
else
menuItem.setTitle("Moving Mode On");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
super.onOptionsItemSelected(item);
if(mSCanvas == null)
return false;
switch(item.getItemId()) {
case MENU_MOVING:
mSCanvas.setMovingMode(!mSCanvas.isMovingMode());
break;
}
return true;
}
}