content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR.
   *  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:
   *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
   */
  package tern.eclipse.ide.core;
  
  import java.io.IOException;
  import java.util.Collection;
  import java.util.List;
  
  import tern.EcmaVersion;
  import tern.TernException;
  import tern.server.ITernModule;
  
  /**
   * A working copy is used to update tern project :
   * 
   * <ul>
   * <li>tern modules</li>
   * </ul>
   *
   * A working copy is usefull when several preference pages can update tern
   * modules (eg : Tern -> Modules and Tern -> Validation -> JSHint).
   */
  public interface IWorkingCopy {
  
  	/**
  	 * The caller (eg : page preference) which uses the working copy.
  	 * 
  	 * @param caller
  	 */
  	void call(Object caller);
  
  	/**
  	 * Initialize checked tern modules from the tern project.
  	 * 
  	 * @throws TernException
  	 */
  	void initialize() throws TernException;
  
  	/**
  	 * Returns true if the working copy is dirty and false otherwise.
  	 * 
  	 * @return true if the working copy is dirty and false otherwise.
  	 */
  	boolean isDirty();
  
  	/**
  	 * Try to commit (save tern modules) in the .tern-project.
  	 * 
  	 * @param caller
  	 * @throws IOException
  	 */
  	void commit(Object caller) throws IOException;
  
  	/**
  	 * Clear the working copy.
  	 */
  	void clear();
  
  	/**
  	 * Returns the tern modules of the tern project.
  	 * 
  	 * @return the tern modules of the tern project.
  	 */
  	Collection<ITernModule> getCheckedModules();
  
  	/**
  	 * Returns the tern module found by the given name.
  	 * 
  	 * @param name
  	 * @return the tern module foudn by the given name.
  	 * @throws TernException
  	 */
  	ITernModule getTernModule(String name) throws TernException;
  
  	/**
  	 * Returns true if the tern project have the given module name and false
  	 * otheriwse.
  	 * 
  	 * @param name
  	 * @return true if the tern project have the given module name and false
  	 *         otheriwse.
  	 */
  	boolean hasCheckedTernModule(String name);
  
  	/**
  	 * Add working copy listener.
  	 * 
  	 * @param listener
  	 */
  	void addWorkingCopyListener(IWorkingCopyListener listener);
  
  	/**
  	 * Remove working copy listener.
  	 * 
  	 * @param listener
  	 */
  	void removeWorkingCopyListener(IWorkingCopyListener listener);
  
  	/**
  	 * Return the all modules.
  	 * 
  	 * @return the all modules.
  	 */
  	List<ITernModule> getAllModules();
  
  	/**
  	 * Returns the all modules without ECMAScript and JSDoc.
  	 * 
  	 * @return the all modules without ECMAScript and JSDoc.
  	 */
  	List<ITernModule> getFilteredModules();
  	
  	/**
  	 * Returns the owner tern project.
  	 * 
  	 * @return the owner tern project.
  	 */
  	IIDETernProject getProject();
  
  	EcmaVersion getEcmaVersion();
  	
  	void setEcmaVersion(EcmaVersion ecmaVersion);
  
  }
  