/*
 * Copyright (c) 2011, 2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.releng.doc.article;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc --> The <b>Factory</b> for the model. It provides a create method for each non-abstract class of
 * the model. <!-- end-user-doc -->
 *
 * @see org.eclipse.emf.cdo.releng.doc.article.ArticlePackage
 * @generated
 */
public interface ArticleFactory extends EFactory
{
  /**
   * The singleton instance of the factory. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @generated
   */
  ArticleFactory eINSTANCE = org.eclipse.emf.cdo.releng.doc.article.impl.ArticleFactoryImpl.init();

  /**
   * Returns a new object of class '<em>Documentation</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Documentation</em>'.
   * @generated
   */
  Documentation createDocumentation();

  /**
   * Returns a new object of class '<em>Context</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Context</em>'.
   * @generated
   */
  Context createContext();

  /**
   * Returns a new object of class '<em>Category</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Category</em>'.
   * @generated
   */
  Category createCategory();

  /**
   * Returns a new object of class '<em>Article</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Article</em>'.
   * @generated
   */
  Article createArticle();

  /**
   * Returns a new object of class '<em>Chapter</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Chapter</em>'.
   * @generated
   */
  Chapter createChapter();

  /**
   * Returns a new object of class '<em>Snippet</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Snippet</em>'.
   * @generated
   */
  Snippet createSnippet();

  /**
   * Returns a new object of class '<em>Diagram</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Diagram</em>'.
   * @generated
   */
  Diagram createDiagram();

  /**
   * Returns a new object of class '<em>Factory</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Factory</em>'.
   * @generated
   */
  Factory createFactory();

  /**
   * Returns a new object of class '<em>Java Element</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Java Element</em>'.
   * @generated
   */
  JavaElement createJavaElement();

  /**
   * Returns a new object of class '<em>Callout</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Callout</em>'.
   * @generated
   */
  Callout createCallout();

  /**
   * Returns a new object of class '<em>External Target</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>External Target</em>'.
   * @generated
   */
  ExternalTarget createExternalTarget();

  /**
   * Returns a new object of class '<em>Text</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Text</em>'.
   * @generated
   */
  Text createText();

  /**
   * Returns a new object of class '<em>Link</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Link</em>'.
   * @generated
   */
  Link createLink();

  /**
   * Returns a new object of class '<em>Embedding</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Embedding</em>'.
   * @generated
   */
  Embedding createEmbedding();

  /**
   * Returns a new object of class '<em>Source Code</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Source Code</em>'.
   * @generated
   */
  SourceCode createSourceCode();

  /**
   * Returns a new object of class '<em>Plugin</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Plugin</em>'.
   * @generated
   */
  Plugin createPlugin();

  /**
   * Returns a new object of class '<em>Java Package</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Java Package</em>'.
   * @generated
   */
  JavaPackage createJavaPackage();

  /**
   * Returns a new object of class '<em>Javadoc</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Javadoc</em>'.
   * @generated
   */
  Javadoc createJavadoc();

  /**
   * Returns a new object of class '<em>External Article</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>External Article</em>'.
   * @generated
   */
  ExternalArticle createExternalArticle();

  /**
   * Returns a new object of class '<em>Schemadoc</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Schemadoc</em>'.
   * @generated
   */
  Schemadoc createSchemadoc();

  /**
   * Returns a new object of class '<em>Extension Point</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Extension Point</em>'.
   * @generated
   */
  ExtensionPoint createExtensionPoint();

  /**
   * Returns a new object of class '<em>Toc</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Toc</em>'.
   * @generated
   */
  Toc createToc();

  /**
   * Returns a new object of class '<em>Plugin Resource</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Plugin Resource</em>'.
   * @generated
   */
  PluginResource createPluginResource();

  /**
   * Returns a new object of class '<em>Excel</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Excel</em>'.
   * @generated
   */
  Excel createExcel();

  /**
   * Returns a new object of class '<em>Java Formatter</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Java Formatter</em>'.
   * @generated
   */
  JavaFormatter createJavaFormatter();

  /**
   * Returns a new object of class '<em>Xml Formatter</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Xml Formatter</em>'.
   * @generated
   */
  XmlFormatter createXmlFormatter();

  /**
   * Returns a new object of class '<em>Image</em>'. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return a new object of class '<em>Image</em>'.
   * @generated
   */
  Image createImage();

  /**
   * Returns the package supported by this factory. <!-- begin-user-doc --> <!-- end-user-doc -->
   *
   * @return the package supported by this factory.
   * @generated
   */
  ArticlePackage getArticlePackage();

} // ArticleFactory
