/*
* Display.java
*
* Created on 21 Май 2011 г., 0:05
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package jimmui.view.base;
import java.util.Vector;
import javax.microedition.lcdui.*;
import jimm.JimmMidlet;
import jimmui.view.chat.Chat;
import jimm.comm.Util;
import jimm.modules.*;
import jimmui.view.*;
import jimmui.view.form.Menu;
/**
*
* @author Vladimir Kryukov
*/
public class Display {
private javax.microedition.lcdui.Display display;
private NativeCanvas nativeCanvas;
private Object currentScreen = null;
private Vector<Object> stack = new Vector<Object>();
public static final long LONG_INTERVAL = 700;
private DisplayableEx main;
/** Creates a new instance of Display */
public Display() {
}
public void updateDisplay() {
display = javax.microedition.lcdui.Display.getDisplay(JimmMidlet.getMidlet());
nativeCanvas = new NativeCanvas();
}
public javax.microedition.lcdui.Display getNativeDisplay() {
return display;
}
private boolean isSystem(Object screen) {
if (screen instanceof InputTextBox) {
return true;
}
if (screen instanceof Displayable) {
return true;
}
return false;
}
public boolean isPaused() {
if (isSystem(getCurrentDisplay())) {
return false;
}
for (int i = stack.size() - 1; 0 <= i; --i) {
if (isSystem(stack.elementAt(i))) {
return false;
}
}
Displayable d = display.getCurrent();
return (null == d) || !d.isShown();
}
public boolean isShown(Displayable d) {
Displayable c = display.getCurrent();
return (c == d) && c.isShown();
}
public void hide() {
display.setCurrent(null);
}
public void hideIfNeed() {
Displayable c = display.getCurrent();
if ((null != c) && !c.isShown()) {
hide();
}
}
public Object getCurrentDisplay() {
return currentScreen;
}
private void setCurrentDisplay(Object o) {
final Object prev = currentScreen;
currentScreen = o;
if ((o != prev) && (null != prev)) {
nativeCanvas.stopKeyRepeating();
if (prev instanceof DisplayableEx) {
((DisplayableEx)prev).closed();
}
// #sijapp cond.if modules_TOUCH is "true" #
if ((prev instanceof CanvasEx) && (o instanceof CanvasEx)) {
((CanvasEx) o).touchUsed = ((CanvasEx) prev).touchUsed;
}
// #sijapp cond.end#
// #sijapp cond.if modules_LIGHT is "true" #
if (!(prev instanceof CanvasEx)) {
CustomLight.setLightMode(CustomLight.ACTION_SYSTEM_OFF);
}
// #sijapp cond.end#
}
Displayable d = null;
if (o instanceof CanvasEx) {
d = nativeCanvas;
} else if (o instanceof InputTextBox) {
d = ((InputTextBox)o).getBox();
} else if (o instanceof Displayable) {
d = (Displayable)o;
}
if (d instanceof Canvas) {
((Canvas)d).setFullScreenMode(true);
}
if (o instanceof DisplayableEx) {
((DisplayableEx)o).restoring();
}
// #sijapp cond.if modules_LIGHT is "true" #
if (!(o instanceof CanvasEx)) {
CustomLight.setLightMode(CustomLight.ACTION_SYSTEM);
}
// #sijapp cond.end#
if (o instanceof CanvasEx) {
nativeCanvas.setCanvas((CanvasEx)o);
// #sijapp cond.if modules_ANDROID isnot "true" #
if ((prev instanceof CanvasEx) && isShown(nativeCanvas)) {
nativeCanvas.invalidate((CanvasEx)o);
return;
}
// #sijapp cond.end#
}
display.setCurrent(d);
}
public synchronized void back(Object o) {
if (currentScreen != o) {
int index = Util.getIndex(stack, o);
if (-1 == index) {
return;
}
while (pop() != o) {
}
}
if (stack.isEmpty()) {
setCurrentDisplay(main);
} else {
setCurrentDisplay(pop());
}
}
public synchronized void closeMenus() {
Object o = currentScreen;
while (o instanceof jimmui.view.menu.Select) {
o = pop();
}
setCurrentDisplay(o);
}
public synchronized void restore(Object o) {
int index = Util.getIndex(stack, o);
if (0 <= index) {
while (pop() != o) {
}
}
setCurrentDisplay(o);
}
public synchronized void show(Object o) {
if (null != currentScreen) {
push(currentScreen);
}
setCurrentDisplay(o);
}
public synchronized void showMain(DisplayableEx o) {
stack.removeAllElements();
main = o;
setCurrentDisplay(o);
}
public DisplayableEx getMain() {
return main;
}
public synchronized void showTop(DisplayableEx o) {
stack.removeAllElements();
setCurrentDisplay(o);
}
public synchronized void pushWindow(Menu c) {
pushWindow((CanvasEx) c);
}
public synchronized void pushWindow(CanvasEx c) {
Object old = currentScreen;
if (null != old) {
push(old);
}
c.showing();
// setup without showing
currentScreen = c;
}
private Object pop() {
Object top = stack.lastElement();
stack.removeElementAt(stack.size() - 1);
return top;
}
private void push(Object o) {
stack.addElement(o);
}
public Vector getStack() {
return stack;
}
public static boolean isLongAction(long start) {
return start + LONG_INTERVAL < System.currentTimeMillis();
}
public boolean remove(Chat chat) {
if (!stack.isEmpty() && (chat == stack.firstElement())) {
stack.removeElementAt(0);
while (!stack.isEmpty()) {
Object o = stack.firstElement();
if (o instanceof jimmui.view.menu.Select) {
stack.removeElementAt(0);
} else {
break;
}
}
return true;
}
return false;
}
public NativeCanvas getNativeCanvas() {
return nativeCanvas;
}
public boolean hasPointerEvents() {
// #sijapp cond.if modules_ANDROID is "true"#
if (true) return true;
// #sijapp cond.elseif modules_TOUCH is "true"#
if (true) return nativeCanvas.hasPointerEvents();
// #sijapp cond.end#
return false;
}
public int getMinScreenMetrics() {
return nativeCanvas.getMinScreenMetrics();
}
public int getScreenWidth() {
return nativeCanvas.getWidth();
}
public int getScreenHeight() {
return nativeCanvas.getHeight();
}
}