Package

Source Code of MainController

/*
* Copyright (c) 2005 Elondra S.L. All Rights Reserved.
*/
package @np-name@.control;
/* -----------------------------------------------------------------------------
    AppTemplate, an application for building defect management built with BaseMovil
    Copyright (C) 2004-2008 Elondra S.L.

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.
    If not, see <a href="http://www.gnu.org/licenses">http://www.gnu.org/licenses</a>.
----------------------------------------------------------------------------- */

import bm.mvc.BaseController;
import @np-name@.AppState;
import @np-name@.Model;
import bm.core.*;
import bm.core.event.Event;
import bm.core.event.EventListener;
import bm.core.event.ProgressEvent;
import bm.core.fs.FSException;
import bm.core.io.SerializationException;
import bm.core.log.Log;
import bm.core.log.LogFactory;
import bm.core.math.FixedPoint;
import bm.core.mvc.ControllerEvent;
import bm.core.mvc.HelpView;
import bm.core.mvc.View;
import bm.core.tools.DeviceInfo;
import bm.db.DBException;
import bm.db.Database;
import bm.db.LoginManager;
import bm.db.Settings;
import bm.err.ErrorLog;
import bm.mvc.DataboundView;
import bm.mvc.DefaultFieldResolver;
import bm.mvc.MenuView;
import bm.mvc.ViewFactory;
import bm.net.NetException;
import bm.net.rpc.RemoteCall;
import bm.net.rpc.RemoteCallException;
import bm.storage.InvalidRecordIDException;
import bm.storage.RSException;
import bm.storage.RecordStoreFullException;
import bm.storage.Store;
import bm.ui.ProgressView;
import bm.ui.Ui;
import bm.util.Util;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Gauge;
import javax.microedition.rms.RecordStoreException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;

/*
* File Information
*
* Created on       : 27-jul-2005 12:03:31
* Created by       : narciso
* Last modified by : $Author: narciso $
* Last modified on : $Date: 2005/11/30 10:21:30 $
* Revision         : $Revision: 1.9 $
*/

/**
* Controller for general view.
*
* @author <a href="mailto:narciso@elondra.com">Narciso Cerezo</a>
* @version $Revision: 1.9 $
*/
public class MainController
        extends BaseController
        implements EventListener
{
    private static Log log = LogFactory.getLog( "MainController" );

    public static final int VIEW_ID_MAIN                        = 1;
    public static final int VIEW_ID_LANGUAGE                    = 2;
    public static final int VIEW_ID_TOOLS                       = 15;
    public static final int VIEW_ID_PREFERENCES                 = 16;
    public static final int VIEW_ID_FONTSIZE                    = 18;
    public static final int VIEW_ID_DIAGNOSIS                   = 19;

    private static final int MAINM_ABOUT                         = 105;

    public static final int TOOLSMENU_DELETE_DATA       = 204;

    public static final int DIAGMENU_INFO                   = 101;
    public static final int DIAGMENU_CHEK_MEM               = 102;
    public static final int DIAGMENU_DEVICE_INFO            = 106;
    public static final int DIAGMENU_FORCE_DEVICE_INFO      = 107;
    public static final int DIAGMENU_VIEW_LOG               = 109;

    private static final int ACTION_FTS_SMALL   = 201;
    private static final int ACTION_FTS_MEDIUM  = 202;
    private static final int ACTION_FTS_LARGE   = 203;

    private static final int LANG_ES                             = 201;
    private static final int LANG_EN                             = 202;

    // Cache for custom view
    private static Hashtable        views       = new Hashtable( 40 );
    // List of view that should not have a back action
    private static Vector           noBack      = new Vector( 3 );
    // List of view taht should have an exit option
    private static Vector           exitPoints  = new Vector( 3 );
    // Event for triggering when creating a new instance of a custom view
//    private static ProgressEvent    waitEvent;

    private EventListener           progressListener        = new ProgressView();

    // -------------------------------------------------------------------------
    // Public methods
    // -------------------------------------------------------------------------

    /**
     * Get access to the application database.
     *
     * @return the application database
     * @throws DBException on database errors
     * @throws RecordStoreFullException if no space left
     * @throws RSException on storage errors
     * @throws SerializationException on object serialization errors
     */
    protected Database getDatabase()
            throws DBException,
                   RecordStoreFullException,
                   RSException,
                   SerializationException
    {
        return Model.getDatabase();
    }

    /**
     * Handle language change events.
     * @param event the event
     */
    public void handleEvent( Event event )
    {
        switch( event.getType().intValue() )
        {
            case Event.ET_LANGUAGE_CHANGE:
                // Create a new progress view when the language changes, so it
                // gets built with the appropriate resources
                progressListener = new ProgressView();
                break;

            case 1000: // ViewFactory.EVENT_VIEW_CREATED:
                final View view = (View) event.getAttachment( "view" );
                addView( (String) event.getAttachment( "viewName" ), view, false );
                if( view instanceof DataboundView )
                {
                    ((DataboundView) view).setResolver(
                            DefaultFieldResolver.getInstance()
                    );
                }
                break;
        }
    }

    // <Application Startup> ---------------------------------------------------
    /**
     * Start application.
     */
    public void startApplication()
    {
        // Local variable to improve speed on CDC
        final Log log = MainController.log;
        bm.core.ErrorHandler.setHandler( new ErrorHandler() );
        Event.register( this, Event.LANGUAGE_CHANGE );
        ProgressEvent pe = new ProgressEvent( this, new Integer( 4 ), 0 );
        pe.setTitle( ResourceManager.getResource( "main.StartApplication" ) );
        pe.dispatch();
        try
        {
            init();
            pe.increment();
            pe.dispatch();

            log.debug( "Starting application" );
            if( !checkConfig() )
            {
                exitApplication();
                return;
            }
            setup();
            pe.increment();
            pe.dispatch();

            View nextView = startDatabase();
            checkDatabaseSanity();
            pe.increment();
            pe.dispatch();
            final Database database = Model.getDatabase();
            DefaultFieldResolver.setDatabase( database );
            if( nextView == null )
            {
                nextView = restoreLastView();
            }
            if( nextView == null )
            {
                nextView = ViewFactory.getMenu( "mainMenu" );
            }
            Event.unregisterAll( Event.PROGRESS );
            Event.register( progressListener, Event.PROGRESS );
            nextView.show();
        }
        catch( RuntimeException e )
        {
            e.printStackTrace();
            log.error( e );
            Application.getManager().showError(
                    ResourceManager.getResource( "error.cantStartApp" ),
                    e
            );
            exitApplication();
        }
        catch( Throwable e )
        {
            e.printStackTrace();
            log.error( e );
            Application.getManager().showError(
                    ResourceManager.getResource( "error.cantStartApp" ) +
                    ": " + e.toString()
            );
            exitApplication();
        }
    }

    private View restoreLastView()
    {
        try
        {
            // ToDo: if there's something to restore do it here and return the view that should be shown next
            return null;
        }
        catch( Exception e )
        {
            log.error( e );
            return null;
        }
    }

    /**
     * Basic setup needed by anything else.
     *
     * @throws IOException on errors
     * @throws DBException on errors
     */
    private void init()
            throws IOException,
                   DBException
    {
        final String locale = Settings.getProperty( Model.CONFIG_ACTIVE_LOCALE );
        if( locale != null )
        {
            ResourceManager.setActiveLocale( locale );
        }
        DefaultFieldResolver.registerDefinition( "/app.resolver" );
        Event.register( this, ViewFactory.EVENT_VIEW_CREATED );
//        waitEvent = new ProgressEvent();
//        waitEvent.setAnimate( true );
//        final String waitMessage = ResourceManager.getResource( "global.Wait" );
//        waitEvent.setMessage( "" );
//        waitEvent.setPhase( waitMessage );
//        waitEvent.setTitle( waitMessage );

        // ToDo: add the id's of the views that should have an exit command
        exitPoints.addElement( new Integer( MainController.VIEW_ID_MAIN ) );

        // ToDo: add the id's of the views that shouldn't have a back action
//        noBack.addElement( new Integer( VIEW_ID ) );
    }

    /**
     * Check that the needed configuration values are set.
     * @return true if so
     */
    private boolean checkConfig()
    {
        // ToDo: check for any configuration setting that must be present
//        if( Application.getManager().getProperty( "server.url" ) == null )
//        {
//            Application.getManager().showError(
//                    ResourceManager.getResource(
//                            "error.missconfigured"
//                    )
//            );
//            return false;
//        }
        return true;
    }

    /**
     * Perform the extended setup
     * @throws DBException on errors
     */
    private void setup()
            throws DBException
    {
        Application.getManager().setMainView( ViewFactory.getMenu( "mainMenu" ) );
        // The server.url property is the default for remote calls if defined
        final String serverURL =
                Application.getManager().getProperty( "server.url" );
        if( serverURL != null )
        {
            RemoteCall.setDefaultURL( serverURL );
        }
        //#ifdef bluetooth
        if( Util.hasBluetoothAPI() )
        {
            ViewFactory.setFlag( "bluetooth" );
        }
        //#endif
        //#ifdef cldc11
        ViewFactory.setFlag( "cldc11" );
        //#endif
    }

    /**
     * Start the database.
     * @return the next view, that will be login if no database or main view if downloaded
     * @throws SerializationException on errors
     * @throws IOException on errors
     * @throws NetException on errors
     * @throws RemoteCallException on errors
     * @throws RSException on errors
     * @throws RecordStoreFullException on errors
     * @throws DBException on errors
     */
    private View startDatabase()
            throws SerializationException,
                   IOException,
                   NetException,
                   RemoteCallException,
                   RSException,
                   RecordStoreFullException,
                   DBException
    {
        final Database database = Model.getDatabase();
        database.start();
        return ViewFactory.getMenu( "mainMenu" );
    }

    /**
     * Entry point for all events.
     *
     * @param event event
     * @throws SerializationException on errors
     * @throws NetException on errors
     * @throws RecordStoreFullException on errors
     * @throws DBException on errors
     * @throws RSException on errors
     * @throws RemoteCallException on errors
     * @throws Exception on errors
     * @noinspection DuplicateThrows
     */
    protected void continueProcess( final ControllerEvent event )
            throws SerializationException,
                   NetException,
                   RecordStoreFullException,
                   DBException,
                   RSException,
                   RemoteCallException,
                   Exception
    {
        switch( event.getSource().getId() )
        {
            case VIEW_ID_MAIN:
                processMainView( event );
                break;

            case VIEW_ID_TOOLS:
                processToolsView( event );
                break;

            case VIEW_ID_LANGUAGE:
                processLanguageView( event );
                break;

            case VIEW_ID_FONTSIZE:
                processFontSizeView( event );
                break;

            case VIEW_ID_PREFERENCES:
                processPreferencesView( event );
                break;

            case VIEW_ID_DIAGNOSIS:
                processDiagnosisView( event );
                break;
        }

    }

    private void processDiagnosisView( final ControllerEvent event )
            throws SerializationException,
                   InvalidRecordIDException,
                   RecordStoreFullException,
                   DBException,
                   RSException
    {
        switch( event.getCode() )
        {
            case ControllerEvent.BACK:
                goBack( event.getSource());
                break;

            case DIAGMENU_INFO:
                showSystemInfo( event );
                break;

            case DIAGMENU_CHEK_MEM:
                try
                {
                    checkMemory( event );
                }
                catch( RecordStoreException e )
                {
                    Application.getManager().showError( e );
                }
                break;

            case DIAGMENU_DEVICE_INFO:
                showDeviceInfo( event );
                break;

            case DIAGMENU_FORCE_DEVICE_INFO:
                Store.safeDeleteRecordStore( "sys_devinfo" );
                DeviceInfo.setDeviceInfo( null );
                showDeviceInfo( event );
                break;

            case DIAGMENU_VIEW_LOG:
                try
                {
                    final String logTxt = ErrorLog.getErrors();
                    HelpView v =  HelpView.getInstance();
                    v.setText( logTxt );
                    event.getSource().go( v );
                }
                catch( J2MEException e )
                {
                    Application.getManager().showError( e );
                }
                break;

            case ControllerEvent.HOME:
                ViewFactory.getMenu( "main" ).show();
                break;
        }
    }

    private void showDeviceInfo( final ControllerEvent event )
    {
        final StringBuffer buffer = new StringBuffer();

        final DeviceInfo deviceInfo = DeviceInfo.getDeviceInfo();
        buffer
                .append( ResourceManager.getResource( "deviceInfo.speed" ) )
                .append( ": " )
                .append( deviceInfo.getmHz() )
                .append( "MHz" )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.performance" ) )
                .append( ": " )
                .append( deviceInfo.getComputationPerformance() )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.memSpeed" ) )
                .append( ": " )
                .append( deviceInfo.getMemoryReadSpeed() )
                .append( "/" )
                .append( deviceInfo.getMemoryWriteSpeed() )
                .append( "/" )
                .append( deviceInfo.getMemoryCopySpeed() )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.rsSizeLimit" ) )
                .append( ": " );

        final long rsSizeLimit = deviceInfo.getRsSizeLimit();
        if( rsSizeLimit == DeviceInfo.RS_LIMIT_UNKOWN )
        {
            buffer.append( ResourceManager.getResource(
                    "deviceInfo.rslimit.unknown"
            ) );
        }
        else if( rsSizeLimit == DeviceInfo.RS_LIMIT_NONE )
        {
            buffer.append( ResourceManager.getResource(
                    "deviceInfo.rslimit.none"
            ) );
        }
        else
        {
            buffer.append( (rsSizeLimit / 1024) ).append( "Kb" );
        }
        buffer
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.allocHandling" ) )
                .append( ": " );
        switch( deviceInfo.getAllocHandling() )
        {
            case DeviceInfo.AH_UNKNOWN:
                buffer.append( ResourceManager.getResource( "deviceInfo.ah.unknown" ) );
                break;

            case DeviceInfo.AH_OK:
                buffer.append( ResourceManager.getResource( "deviceInfo.ah.ok" ) );
                break;

            case DeviceInfo.AH_FREES_ON_RECORD_DELETE:
                buffer.append( ResourceManager.getResource( "deviceInfo.ah.freesOnRecord" ) );
                break;

            case DeviceInfo.AH_FREES_ON_RS_DELETE:
                buffer.append( ResourceManager.getResource( "deviceInfo.ah.freesOnRS" ) );
                break;

            case DeviceInfo.AH_BOGUS:
                buffer.append( ResourceManager.getResource( "deviceInfo.ah.bogus" ) );
                break;
        }
        buffer
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.hasAllocBug" ) )
                .append( ": " )
                .append( deviceInfo.hasAllocBug() ?
                         ResourceManager.getResource( "global.Yes" ) :
                         ResourceManager.getResource( "global.No" )
                )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.growingHeap" ) )
                .append( ": " )
                .append( deviceInfo.isGrowingHeap() ?
                         ResourceManager.getResource( "global.Yes" ) :
                         ResourceManager.getResource( "global.No" )
                )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.bluetooth" ) )
                .append( ": " )
                .append( Util.hasBluetoothAPI() ?
                         ResourceManager.getResource( "global.Yes" ) :
                         ResourceManager.getResource( "global.No" )
                )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.fileApi" ) )
                .append( ": " )
                .append( Util.hasFileAPI() ?
                         ResourceManager.getResource( "global.Yes" ) :
                         ResourceManager.getResource( "global.No" )
                )
                .append( '\n' )
                .append( ResourceManager.getResource( "deviceInfo.location" ) )
                .append( ": " )
                .append( Util.hasLocationAPI() ?
                         ResourceManager.getResource( "global.Yes" ) :
                         ResourceManager.getResource( "global.No" )
                );

        buffer
                .append( '\n' )
                .append( "Error de tipo de letra en listas: " )
                .append( deviceInfo.hasListFontBug() ? "si" : "no" );

        final HelpView view = HelpView.getInstance();
        view.setTitle( ResourceManager.getResource( "diagnostics.deviceInfo" ) );
        view.setText( buffer.toString() );
        view.setCaller( event.getSource() );
        view.setFont( Util.SMALL_FONT );
        view.show();
    }

    private void checkMemory( final ControllerEvent event )
            throws RecordStoreException
    {
        final String report = Util.buildMemoryReport();
        final HelpView view = HelpView.getInstance();
        view.setTitle( ResourceManager.getResource( "diagnostics.memoryReport" ) );
        view.setText( report );
        view.setCaller( event.getSource() );
        view.show();
    }

    private void showSystemInfo( final ControllerEvent event )
            throws DBException,
                   SerializationException,
                   RecordStoreFullException,
                   RSException
    {
        final ProgressEvent pe = new ProgressEvent();
        pe.setAnimate( true );
        pe.setTitle( ResourceManager.getResource( "sysinfo.Title" ) );
        pe.dispatch();

        final StringBuffer buffer = new StringBuffer();
        final long totalMemory = Runtime.getRuntime().totalMemory() / KB;
        final long freeMemory  = Runtime.getRuntime().freeMemory() / KB;
        final Database db = Model.getDatabase();
        final long dbTotalSize = db.getTotalSize();
//        final int freeDisk = Settings.getFreeDisk();
        buffer.append( ResourceManager.getResource( "sysinfo.totalMemory" ) )
                .append( ": " )
                .append( totalMemory ).append( " Kb" )
                .append( "\n" )
                .append( ResourceManager.getResource( "sysinfo.freeMemory" ) )
                .append( ": " )
                .append( freeMemory ).append( " Kb" )
                .append( "\n" )
                .append( ResourceManager.getResource( "sysinfo.databaseSize" ) )
                .append( ": " )
                .append( sizeIn( dbTotalSize, KB ) )
                .append( " Kb (" )
                .append( sizeIn( dbTotalSize, MB ) )
                .append( " Mb)" );
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.freeDisk" ) )
//                .append( ": " )
//                .append( sizeIn( freeDisk, KB ) )
//                .append( " Kb (" )
//                .append( sizeIn( freeDisk, MB ) )
//                .append( " Mb)" );

//        FixedPoint hitRatio = new FixedPoint( SimpleCache.getWideHits() );
//        hitRatio = hitRatio.setPrecision( 2 );
//        final long totalCacheMoves = SimpleCache.getWideHits() +
//                                     SimpleCache.getWideMisses();
//        if( totalCacheMoves  > 0 )
//        {
//            hitRatio = hitRatio.mult( 100 );
//            hitRatio = hitRatio.div( totalCacheMoves );
//        }

//        FixedPoint rsHitRatio = new FixedPoint( Store.getHits() );
//        rsHitRatio = rsHitRatio.setPrecision( 2 );
//        final long totalRsCacheMoves = Store.getHits() +
//                                     Store.getMisses();
//        if( totalRsCacheMoves  > 0 )
//        {
//            rsHitRatio = rsHitRatio.mult( 100 );
//            rsHitRatio = rsHitRatio.div( totalRsCacheMoves );
//        }
//
//        final RecordStoreStats stats = Store.getWideStats();
//        buffer.append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.avgDeleteTime" ) )
//                .append( ": " )
//                .append( stats.getAverageDeleteTime() )
//                .append( " ms." )
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.avgFindTime" ) )
//                .append( ": " )
//                .append( Index.getAverageWideFindTime() )
//                .append( " ms." )
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.avgReadTime" ) )
//                .append( ": " )
//                .append( stats.getAverageReadTime() )
//                .append( " ms." )
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.avgUpdateTime" ) )
//                .append( ": " )
//                .append( stats.getAverageUpdateTime() )
//                .append( " ms." )
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.avgWriteTime" ) )
//                .append( ": " )
//                .append( stats.getAverageAddTime() )
//                .append( " ms." )
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.hitRatio" ) )
//                .append( ": " )
//                .append( SimpleCache.getWideHits() )
//                .append( "/" )
//                .append( totalCacheMoves )
//                .append( " (" )
//                .append( hitRatio.toString() )
//                .append( "%)")
//                .append( "\n" )
//                .append( ResourceManager.getResource( "sysinfo.rsCache" ) )
//                .append( ": " )
//                .append( Store.getHits() )
//                .append( "/" )
//                .append( totalRsCacheMoves )
//                .append( " (" )
//                .append( rsHitRatio.toString() )
//                .append( "%)");

        final HelpView helpView = HelpView.getInstance();
        helpView.setText( buffer.toString() );
        helpView.setTitle( ResourceManager.getResource( "sysinfo.Title" ) );
        helpView.setCaller( event.getSource() );
        helpView.show();
    }

    private String sizeIn( final long size, final int divisor )
    {
        FixedPoint f = new FixedPoint( size );
        f = f.setPrecision( 5 );
        f = f.div( divisor );
        f = f.setPrecision( 1 );
        return f.toString();
    }

    private void processPreferencesView( final ControllerEvent event )
            throws SerializationException,
                   DBException,
                   NetException,
                   IOException,
                   RemoteCallException
    {
        switch( event.getCode() )
        {
            case ControllerEvent.BACK:
                goBack( event.getSource() );
                break;

            case ControllerEvent.HOME:
                ViewFactory.getMenu( "mainMenu" ).show();
                event.getSource().release();
                break;
        }
    }

    private void processFontSizeView( final ControllerEvent event )
    {
        switch( event.getCode() )
        {
            case ACTION_FTS_SMALL:
                setFont( event, Font.SIZE_SMALL );
                break;

            case ACTION_FTS_MEDIUM:
                setFont( event, Font.SIZE_MEDIUM );
                break;

            case ACTION_FTS_LARGE:
                setFont( event, Font.SIZE_LARGE );
                break;

            case ControllerEvent.BACK:
                goBack( event.getSource() );
                break;

            case ControllerEvent.HOME:
                Application.getManager().getMainView().show();
                break;
        }
    }

    private void setFont( final ControllerEvent event, final int size )
    {
        final ProgressEvent e = new ProgressEvent( this );
        e.setAnimate( true );
        final String changing =
                ResourceManager.getResource( "fontSize.changing" );
        e.setPhase( changing );
        e.setTitle( changing );
        e.setMessage( "" );
        e.dispatch();
        Ui.setFontSize( size );
        event.getSource().show();
    }

    // <ToolsView> -------------------------------------------------------------
    private void processToolsView( final ControllerEvent event )
            throws
            SerializationException,
            NetException,
            RemoteCallException,
            DBException,
            RSException,
            RecordStoreFullException
    {
        switch( event.getCode() )
        {
            case ControllerEvent.BACK:
                goBack( event.getSource() );
                break;

            case TOOLSMENU_DELETE_DATA:
                tools_clearData();
                break;
        }
    }

    private void tools_clearData()
    {
        final boolean doIt = Application.getManager().confirm(
                ResourceManager.getResource( "tools.eraseData.Title" ),
                ResourceManager.getResource( "tools.eraseData.Message" )
        );
        if( doIt )
        {
            try
            {
                Model.getDatabase().drop();
                Application.getManager().showInfo(
                        ResourceManager.getResource( "tools.eraseData.Done" )
                );
            }
            catch( Exception e )
            {
                log.error( e );
                Application.getManager().showError( e );
            }
            exitApplication();
        }
    }

    /**
     * Utility method to check if a view has another one in the path, that is,
     * if the user comes from that view.
     * @param source current view
     * @param view target view
     * @return true if so
     */
    private boolean comesFrom( final View source, final View view )
    {
        final View caller = source.getCaller();
        return caller != null && (
                    caller.getId() == view.getId() ||
                    comesFrom( caller, view )
        );
    }

    // <MainView> --------------------------------------------------------------
    private void processMainView( final ControllerEvent event )
            throws DBException,
                   NetException,
                   RecordStoreFullException,
                   SerializationException,
                   RemoteCallException,
                   FSException,
                   IOException,
                   RSException
    {
        AppState.clearState();
        switch( event.getCode() )
        {
            case ControllerEvent.EXIT:
                mildExitApplication();
                break;

            case ControllerEvent.HELP:
                mildExitApplication();
                break;

            case MAINM_ABOUT:
                showAboutInfo( event );
                break;
        }
    }

    private void showAboutInfo( final ControllerEvent event )
    {
        final StringBuffer buffer = new StringBuffer();
        buffer.append( "BaseMovil " )
                .append( Model.APPLICATION_NAME )
                .append( " v" )
                .append( Application.getManager().getProperty(
                        "basemovil.version"
                ) );
        buffer
                .append( '\n' )
                .append( ResourceManager.getResource( "about.licensedTo" ) )
                .append( ":\n" )
                .append( LoginManager.getCompanyName() != null ? LoginManager.getCompanyName() : "" )
                .append( '\n' )
                .append( LoginManager.getUserFullName() )
                .append( '\n' );
        buffer.append( "id: " ).append( LoginManager.getUserCustomId() );
        buffer.append( '\n' )
                .append( ResourceManager.getResource( "about.text" ) );

        final HelpView view = HelpView.getInstance();
        view.setCaller( event.getSource() );
        view.setText( buffer.toString() );
        view.setTitle( ResourceManager.getResource( "about.Title" ) );
        view.show();
    }
    // </MainView> -------------------------------------------------------------

    // <LanguageView> ----------------------------------------------------------
    private void processLanguageView( final ControllerEvent event )
            throws DBException
    {
        switch( event.getCode() )
        {
            case ControllerEvent.BACK:
                goBack( event.getSource() );
                break;

            default:
                setLanguage( event );
                break;
        }
    }

    private void setLanguage( final ControllerEvent event )
            throws DBException
    {
        final ProgressEvent pe = new ProgressEvent(
                event.getSource(),
                new Integer( Gauge.INDEFINITE ),
                Gauge.CONTINUOUS_RUNNING
        );
        pe.setTitle( ResourceManager.getResource(
                "languageView.LoadingLanguage"
        ));
        pe.dispatch();
        final String locale;
        switch( event.getCode() )
        {
            case LANG_ES:
                locale = "es";
                break;

            default:
                locale = "en";
        }
        if( !locale.equals( ResourceManager.getLocale() ) )
        {
            ResourceManager.setActiveLocale( locale );
            Settings.setProperty( Model.CONFIG_ACTIVE_LOCALE, locale );
            Settings.setProperty(
                    CoreConstants.PROP_RESOURCE_LOCALE,
                    locale
            );
            views.clear();
            ViewFactory.clear();
            System.gc();
        }
        final MenuView mainView = ViewFactory.getMenu( "mainMenu" );
        Application.getManager().setMainView( mainView );
        mainView.show();
    }
    // </LanguageView> ---------------------------------------------------------


    /**
     * Configure default actions and update custom view cache.
     *
     * @param key view key
     * @param view view
     * @param cache add it to the cache
     */
    private static void addView(
            final String    key,
            final View      view,
            final boolean   cache
    )
    {
        final int viewId = view.getId();
        if( exitPoints.contains( new Integer( viewId ) ) )
        {
            view.addCommand( Application.getCommandFactory().exitCommand() );
        }
        else if( !noBack.contains( new Integer( viewId ) ) )
        {
            view.addCommand( Application.getCommandFactory().backCommand() );
        }

        if( view instanceof HelpAssisted && ((HelpAssisted)view).getHelpId() != null )
        {
            view.addCommand( Application.getCommandFactory().helpCommand() );
        }

        if( cache )
        {
            views.put( key, view );
        }
    }
}
TOP

Related Classes of MainController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.