Package com.eclipsesource.tabris.internal

Source Code of com.eclipsesource.tabris.internal.PrinterImpl

/*******************************************************************************
* Copyright (c) 2014 EclipseSource and others.
* 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:
*    EclipseSource - initial API and implementation
******************************************************************************/
package com.eclipsesource.tabris.internal;

import static com.eclipsesource.tabris.internal.Clauses.when;
import static com.eclipsesource.tabris.internal.Clauses.whenNull;
import static com.eclipsesource.tabris.internal.Constants.EVENT_CANCEL;
import static com.eclipsesource.tabris.internal.Constants.EVENT_ERROR;
import static com.eclipsesource.tabris.internal.Constants.EVENT_SUCCESS;
import static com.eclipsesource.tabris.internal.Constants.METHOD_PRINT;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_DUPLEX;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_JOB_NAME;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_MESSAGE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_OUTPUT_TYPE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_PRINTER;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_QUALITY;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_SHOW_NUMBER_OF_COPIES;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_SHOW_PAGE_RANGE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_URL;
import static com.eclipsesource.tabris.internal.Constants.TYPE_PRINTER;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.internal.lifecycle.ProcessActionRunner;
import org.eclipse.rap.rwt.internal.remote.ConnectionImpl;
import org.eclipse.rap.rwt.remote.AbstractOperationHandler;
import org.eclipse.rap.rwt.remote.RemoteObject;

import com.eclipsesource.tabris.print.Printer;
import com.eclipsesource.tabris.print.PrintError;
import com.eclipsesource.tabris.print.PrintListener;
import com.eclipsesource.tabris.print.PrintOptions;


@SuppressWarnings("restriction")
public class PrinterImpl extends AbstractOperationHandler implements Printer {

  private final RemoteObject remoteObject;
  private final List<PrintListener> printListeners;

  public PrinterImpl() {
    remoteObject = ( ( ConnectionImpl )RWT.getUISession().getConnection() ).createServiceObject( TYPE_PRINTER );
    remoteObject.setHandler( this );
    printListeners = new ArrayList<PrintListener>();
  }

  @Override
  public void print( String url, PrintOptions options ) {
    whenNull( options ).throwIllegalArgument( "Options must not be null" );
    whenNull( url ).throwIllegalArgument( "URL must not be null." );
    when( url.isEmpty() ).throwIllegalArgument( "URL must not be empty" );
    JsonObject properties = createProperties( options );
    properties.add( PROPERTY_URL, url);
    remoteObject.call( METHOD_PRINT, properties );
  }

  private JsonObject createProperties( PrintOptions options ) {
    JsonObject properties = new JsonObject();
    addJobName( properties, options );
    addPrinter( properties, options );
    addOutputType( properties, options );
    addQuality( properties, options );
    addShowPageRange( properties, options );
    addShowNumberOfCopies( properties, options );
    addDuplex( properties, options );
    return properties;
  }

  private void addPrinter( JsonObject properties, PrintOptions options ) {
    String printer = options.getPrinter();
    if( printer != null ) {
      properties.add( PROPERTY_PRINTER, printer );
    }
  }

  private void addJobName( JsonObject properties, PrintOptions options ) {
    String jobName = options.getJobName();
    if( jobName != null ) {
      properties.add( PROPERTY_JOB_NAME, jobName );
    }
  }

  private void addShowPageRange( JsonObject properties, PrintOptions options ) {
    if( options.showPageRange() ) {
      properties.add( PROPERTY_SHOW_PAGE_RANGE, true );
    }
  }

  private void addShowNumberOfCopies( JsonObject properties, PrintOptions options ) {
    if( options.showNumberOfCopies() ) {
      properties.add( PROPERTY_SHOW_NUMBER_OF_COPIES, true );
    }
  }

  private void addOutputType( JsonObject properties, PrintOptions options ) {
    properties.add( PROPERTY_OUTPUT_TYPE, options.getOutputType().name().toLowerCase() );
  }

  private void addQuality( JsonObject properties, PrintOptions options ) {
    properties.add( PROPERTY_QUALITY, options.getQuality().name().toLowerCase() );
  }

  private void addDuplex( JsonObject properties, PrintOptions options ) {
    if( options.isDuplex() ) {
      properties.add( PROPERTY_DUPLEX, true );
    }
  }

  @Override
  public void handleNotify( String event, JsonObject properties ) {
    if( EVENT_SUCCESS.equals( event ) ) {
      notifyListenersWithPrintSucceeded( properties );
    } else if( EVENT_CANCEL.equals( event ) ) {
      notifyListenersWithPrintCancelled( properties );
    } else if( EVENT_ERROR.equals( event ) ) {
      notifyListenersWithError( getPrintError( properties ) );
    }
  }

  private void notifyListenersWithPrintSucceeded( final JsonObject properties ) {
    ProcessActionRunner.add( new Runnable() {

      @Override
      public void run() {
        doNotifyListenersWithPrintSucceeded( properties );
      }

    } );
  }

  private void doNotifyListenersWithPrintSucceeded( final JsonObject properties ) {
    List<PrintListener> listeners = new ArrayList<PrintListener>( printListeners );
    String printer = getAsString( properties, PROPERTY_PRINTER );
    String jobName = getAsString( properties, PROPERTY_JOB_NAME );
    for( PrintListener listener : listeners ) {
      listener.printSucceeded( printer, jobName );
    }
  }

  private void notifyListenersWithPrintCancelled( final JsonObject properties ) {
    ProcessActionRunner.add( new Runnable() {

      @Override
      public void run() {
        doNotifyListenersWithPrintCancelled( properties );
      }

    } );
  }

  private void doNotifyListenersWithPrintCancelled( final JsonObject properties ) {
    List<PrintListener> listeners = new ArrayList<PrintListener>( printListeners );
    String printer = getAsString( properties, PROPERTY_PRINTER );
    String jobName = getAsString( properties, PROPERTY_JOB_NAME );
    for( PrintListener listener : listeners ) {
      listener.printCanceled( printer, jobName );
    }
  }

  private void notifyListenersWithError( final PrintError error ) {
    ProcessActionRunner.add( new Runnable() {

      @Override
      public void run() {
        doNotifyListenersWithError( error );
      }

    } );
  }

  private void doNotifyListenersWithError( final PrintError error ) {
    List<PrintListener> listeners = new ArrayList<PrintListener>( printListeners );
    for( PrintListener listener : listeners ) {
      listener.printFailed( error );
    }
  }

  private PrintError getPrintError( JsonObject properties ) {
    String printer = getAsString( properties, PROPERTY_PRINTER );
    String jobName = getAsString( properties, PROPERTY_JOB_NAME );
    String message = getAsString( properties, PROPERTY_MESSAGE );
    return new PrintError( printer, jobName, message );
  }

  private String getAsString( JsonObject properties, String property ) {
    JsonValue jsonValue = properties.get( property );
    if ( jsonValue != null ) {
      return jsonValue.asString();
    }
    return null;
  }

  RemoteObject getRemoteObject() {
    return remoteObject;
  }

  @Override
  public void addPrintListener( PrintListener listener ) {
    whenNull( listener ).throwIllegalArgument( "Listener must not be null" );
    printListeners.add( listener );
  }

  @Override
  public void removePrintListener( PrintListener listener ) {
    whenNull( listener ).throwIllegalArgument( "Listener must not be null" );
    printListeners.remove( listener );
  }

}
TOP

Related Classes of com.eclipsesource.tabris.internal.PrinterImpl

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.