/** * MicroEmulator * Copyright (C) 2008 Bartek Teodorczyk <barteo@barteo.net> * * It is licensed under the following two licenses as alternatives: * 1. GNU Lesser General Public License (the "LGPL") version 2.1 or any newer version * 2. Apache License (the "AL") Version 2.0 * * You may not use this file except in compliance with at least one of * the above two licenses. * * You may obtain a copy of the LGPL at * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt * * You may obtain a copy of the AL 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 LGPL or the AL for the specific language governing permissions and * limitations. * * @version $Id: AndroidCanvasUI.java 2507 2011-07-12 07:52:03Z barteo@gmail.com $ */ package org.microemu.android.device.ui; import javax.microedition.lcdui.Canvas; import android.view.View; import android.widget.RelativeLayout; import jimmui.view.chat.Chat; import org.microemu.android.MicroEmulatorActivity; import org.microemu.android.device.AndroidDeviceDisplay; import org.microemu.device.ui.CanvasUI; import ru.net.jimm.R; import ru.net.jimm.input.Input; public class AndroidCanvasUI extends AndroidDisplayableUI<Canvas> implements CanvasUI { private CanvasView canvasView; private Input input; private View view; public AndroidCanvasUI(final MicroEmulatorActivity activity, Canvas canvas) { super(activity, canvas); activity.post(new Runnable() { public void run() { canvasView = new CanvasView(activity, AndroidCanvasUI.this, 666); input = new Input(activity, null, R.id.input_line); input.setVisibility(View.INVISIBLE); view = createView(canvasView, input); } }); } private View createView(CanvasView canvas, Input input) { RelativeLayout all = new RelativeLayout(activity); all.addView(canvas, set(create(RelativeLayout.LayoutParams.FILL_PARENT), RelativeLayout.ABOVE, input.getId())); all.addView(input, set(create(RelativeLayout.LayoutParams.WRAP_CONTENT), RelativeLayout.ALIGN_PARENT_BOTTOM)); return all; } private RelativeLayout.LayoutParams create(int h) { return new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, h); } private RelativeLayout.LayoutParams set(RelativeLayout.LayoutParams params, int verb, int anchor) { params.addRule(verb, anchor); return params; } private RelativeLayout.LayoutParams set(RelativeLayout.LayoutParams params, int verb) { params.addRule(verb); return params; } @Override public void hideNotify() { ((AndroidDeviceDisplay) activity.getEmulatorContext().getDeviceDisplay()).removeDisplayRepaintListener(canvasView); } @Override public void showNotify() { activity.post(new Runnable() { public void run() { activity.setContentView(view); canvasView.requestFocus(); ((AndroidDeviceDisplay) activity.getEmulatorContext().getDeviceDisplay()).addDisplayRepaintListener(canvasView); displayable.repaint(); } }); } public Input getInput() { return input; } public void setInputVisibility(final boolean v, final Chat chat) { if ((null == chat) && (null != input)) { input.resetOwner(); } activity.post(new Runnable() { public void run() { boolean prevV = (input.getVisibility() == View.VISIBLE); input.setVisibility(v ? View.VISIBLE : View.GONE); if (null != chat) { input.setOwner(chat); } view.requestLayout(); if (v && input.hasText()) { input.showKeyboard(); } else { canvasView.requestFocus(); if ((prevV && !v) || !input.hasText()) { input.hideKeyboard(view); } } } }); } public void layout() { view.requestLayout(); } public CanvasView getCanvasView() { return canvasView; } }