/*******************************************************************************
* Copyright (c) 2011-2012 Nokia Corporation
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Comarch team - initial API and implementation
*******************************************************************************/
package org.ned.client.view;
import com.sun.lwuit.Command;
import com.sun.lwuit.Component;
import com.sun.lwuit.Container;
import com.sun.lwuit.Dialog;
import com.sun.lwuit.Display;
import com.sun.lwuit.Font;
import com.sun.lwuit.Image;
import com.sun.lwuit.Label;
import com.sun.lwuit.TextArea;
import com.sun.lwuit.animations.CommonTransitions;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.layouts.BoxLayout;
import com.sun.lwuit.layouts.FlowLayout;
import com.sun.lwuit.plaf.UIManager;
import java.util.Enumeration;
import java.util.Vector;
import org.ned.client.NedMidlet;
import org.ned.client.NedResources;
import org.ned.client.utils.Utils;
import org.ned.client.view.renderer.DialogTitlePainter;
public class GeneralAlert {
private static Dialog messageDialog;
private static TextArea mMessageTextArea;
private static DialogTitlePainter mDialogTitlePainer = new DialogTitlePainter();
public static final int RESULT_YES = 1;
public static final int RESULT_NO = 0;
public static final int ERROR = 1001;
public static final int QUESTION = 1002;
public static final int INFO = 1003;
public static final int WARNING = 1004;
public static final int ALARM = 1005;
public static final int TEXT = 1006;
private static final int DIALOG_FADE_TIME = 1000;//1s
private static final Command okCommand = new Command( NedResources.MID_OK_COMMAND );
private static final Command yesCommand = new Command( NedResources.MID_ANSWER_YES );
private static final Command noCommand = new Command( NedResources.MID_ANSWER_NO );
public static void show( final String aMessage, final int aAlertType,
boolean aShowEDT ) {
if ( aShowEDT ) {
Display.getInstance().callSeriallyAndWait( new Runnable() {
public void run() {
show( aMessage, aAlertType );
}
} );
} else {
show( aMessage, aAlertType );
}
}
public static void show( String aMessage, int aAlertType ) {
initDialog( aMessage, aAlertType );
messageDialog.addCommand( okCommand );
WaitingScreen.dispose();
showDialog();
}
public static int showQuestion( String message ) {
initDialog( message, QUESTION );
messageDialog.addCommand( yesCommand );
messageDialog.addCommand( noCommand );
WaitingScreen.dispose();
return showDialog() == yesCommand ? GeneralAlert.RESULT_YES
: GeneralAlert.RESULT_NO;
}
private static Command showDialog() {
Container cont1 = messageDialog.getContentPane();
int hi = 0;
int wi = cont1.getPreferredW() + 2 * 5;
int wi2 = messageDialog.getTitleStyle().getFont().stringWidth( mDialogTitlePainer.
getTitle() )
+ 2 * 5 + DialogTitlePainter.TITLE_LEFT_MARGIN;
wi = Math.max( wi, wi2 );
for ( int i = 0; i < messageDialog.getComponentCount(); i++ ) {
hi += messageDialog.getComponentAt( i ).getPreferredH();
}
int disH = Display.getInstance().getDisplayHeight();
int disW = Display.getInstance().getDisplayWidth();
int H_Margin = hi < disH ? (disH - hi) / 2 : 0;
int V_Margin = wi < disW ? (disW - wi) / 2 : 0;
Command tmp = messageDialog.show( H_Margin, H_Margin, V_Margin, V_Margin, true );
messageDialog.setFocusable( false );
messageDialog.setVisible( false );
messageDialog.dispose();
UIManager.getInstance().getLookAndFeel().setReverseSoftButtons( true );
return tmp;
}
private static void initDialog( String aMessage, int aAlertType ) {
UIManager.getInstance().getLookAndFeel().setReverseSoftButtons( false );
messageDialog = new Dialog( " " );
messageDialog.getTitleComponent().setPreferredH( mDialogTitlePainer.
getFontSize()
+ messageDialog.getTitleStyle().getPadding( Component.TOP )
+ messageDialog.getTitleStyle().getPadding( Component.BOTTOM )
+ messageDialog.getTitleStyle().getMargin( Component.TOP )
+ messageDialog.getTitleStyle().getMargin( Component.BOTTOM ) );
messageDialog.setScrollableX( false );
messageDialog.setLayout( new BorderLayout() );
messageDialog.setTransitionInAnimator( CommonTransitions.createFade( DIALOG_FADE_TIME ) );
messageDialog.setTransitionOutAnimator( CommonTransitions.createFade( DIALOG_FADE_TIME ) );
mDialogTitlePainer.setTitle( alertType2String( aAlertType ) );
messageDialog.getTitleStyle().setBgPainter( mDialogTitlePainer );
messageDialog.setLayout( new BorderLayout() );
Container c = new Container( new FlowLayout() );
Image img = getIcon( aAlertType );
Label imgLabel = new Label( img );
imgLabel.setAlignment( Label.LEFT );
c.addComponent( imgLabel );
messageDialog.addComponent( BorderLayout.NORTH, c );
c.setScrollable( false );
Container c2 = new Container( new BoxLayout( BoxLayout.Y_AXIS ) );
int displayW = Display.getInstance().getDisplayWidth() - 10; // magic number, it should rather be set to width of margins+borders+padding
int displayH = Display.getInstance().getDisplayHeight();
mMessageTextArea = new TextArea( aMessage );
mMessageTextArea.setSelectedStyle( mMessageTextArea.getUnselectedStyle() );
int textWidth = mMessageTextArea.getSelectedStyle().getFont().
stringWidth( aMessage );
int lineHeight = mMessageTextArea.getSelectedStyle().getFont().getHeight()
+ mMessageTextArea.getRowsGap();
mMessageTextArea.setScrollVisible( false );
mMessageTextArea.setEditable( false );
//to fill equally to all lines
mMessageTextArea.setPreferredW( textWidth / (textWidth / displayW + 1)
+ 2 );
final int lines = countLines( aMessage, mMessageTextArea.getPreferredW() );
if ( lines > 1 ) {
mMessageTextArea.setRows( Math.min( lines + 1, 4 ) );
mMessageTextArea.setShouldCalcPreferredSize( true );
int preferredH = lineHeight * mMessageTextArea.getRows() + 2;
if ( preferredH > (displayH * 0.5) ) {
mMessageTextArea.setScrollVisible( true );
preferredH = (int)(displayH * 0.5);
}
mMessageTextArea.setPreferredH( preferredH );
mMessageTextArea.setGrowByContent( true );
} else {
mMessageTextArea.setGrowByContent( false );
mMessageTextArea.setPreferredW( textWidth );
mMessageTextArea.setPreferredH( lineHeight );
}
// WARN: the following line is important!
// Setting it to false caused hard to track OutOfMemoryException
messageDialog.setScrollable( true );
c2.addComponent( mMessageTextArea );
messageDialog.addComponent( BorderLayout.CENTER, c2 );
}
static int countLines( String aMessage, int aPrefferedWidth ) {
int count = 0;
final Font font = mMessageTextArea.getSelectedStyle().getFont();
Vector lines = Utils.split( aMessage, "\n" );
Enumeration en = lines.elements();
while ( en.hasMoreElements() ) {
int current = (int)Math.ceil( font.stringWidth( (String)en.nextElement())
/ aPrefferedWidth ) + 1;
count += current;
}
return count;
}
private static Image getIcon( int aAlertType ) {
switch ( aAlertType ) {
case ERROR:
return NedMidlet.getRes().getImage( "error" );
case QUESTION:
return NedMidlet.getRes().getImage( "question" );
case WARNING:
return NedMidlet.getRes().getImage( "warning" );
case TEXT:
return null;
case INFO:
default:
return NedMidlet.getRes().getImage( "info" );
}
}
private static String alertType2String( int aAlertType ) {
switch ( aAlertType ) {
case ERROR:
return NedResources.ERROR;
case QUESTION:
return NedResources.QUESTION;
case WARNING:
return NedResources.WARNING;
case TEXT:
case INFO:
default:
return NedResources.INFO;
}
}
}