/**
 * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
 * tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
 * quis nostrud exercitation ullamco.
 * 
 * @author kilroy
 * @see Example2
 * @see http://wiki.ecipse.org
 * @deprecated Do not use this class, it's only to test formatting on. One two
 *             three four five six seven eight nine ten.
 */
public class Example {
	/**
	 * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
	 * tempor incididunt ut labore et dolore magna aliqua.
	 * 
	 * @param first
	 *                   the first param. Nullam nec ex vitae felis eleifend lacinia
	 *                   in in velit.
	 * @param second
	 *                   a second apram. Curabitur commodo tortor vel sapien
	 *                   elementum, sit amet varius eros varius.
	 * @param x
	 *                   a third param. Pellentesque ac ipsum. Quisque ac nunc
	 *                   odioque id nunc convallis nec mi.
	 * @throws Exception1
	 *                            when the first thing happens. Nam nec sodales sem.
	 *                            Curabitur odio sem, sodales ac lorem eget, pretium
	 *                            tincidunt ligula. Ut eget placerat justo.
	 * @throws OtherException
	 *                            when some other thing happens. Duis feugiat
	 *                            ultricies magna, sit amet sagittis nibh eleifend
	 *                            eu. Curabitur in egestas velit.
	 * @return Lorem consectetur adipiscing ut enim ad minim veniam, quis nostrud
	 *         exercitation ullamco. Nullam nec ex vitae felis eleifend lacinia in
	 *         in velit.
	 * @since 1.1.1
	 */
	void method1() {
	}

	/**
	 * Curabitur commodo tortor vel sapien elementum, sit amet varius eros varius.
	 * Morbi posuere ex sit amet lorem vestibulum pulvinar. In in sagittis urna,
	 * euismod tempus eros.
	 * 
	 * @param parameterOne
	 *                               the first param.
	 *                               <li>item1</li>
	 *                               <li>item2</li>
	 *                               <li>item3</li>
	 * @param theSecondParameter
	 *                               the second param. <code>line1
	 * line2</code>
	 * @deprecated method1 should be used instead
	 */
	void method2() {
	}

	/**
	 * Curabitur rhoncus felis non elit malesuada, et gravida enim tempus. Morbi sit
	 * amet viverra est. Sed eu libero in mauris facilisis condimentum.
	 * 
	 * @see <a href="http://bugs.eclipse.org">bugzilla</a>
	 * @see method1
	 * @return
	 * @throws RuntimeException
	 *                              Curabitur morbi sit amet viverra est. Sed eu
	 *                              libero in mauris facilisis condimentum.
	 */
	void method3() {
	}

	/**
	 * @param argument
	 *                     Integer diam sapien, interdum a dolor sit amet,
	 *                     vestibulum vehicula ante. Mauris ultricies odio sit amet
	 *                     nunc laoreet, sed venenatis enim efficitur.
	 * @throws e
	 *               Proin dignissim enim eu erat cursus fringilla.
	 *               <p>
	 *               Aliquam efficitur sed turpis ut cursus.
	 *               <p>
	 *               Nunc pharetra aliquam massa et sagittis.
	 * @param param
	 * 
	 *                  <pre>
	 *                  int i = 1234;
	 *                  </pre>
	 * 
	 * @return Nunc ultricies neque eu elit porttitor, vel scelerisque metus
	 *         accumsan. Curabitur dictum arcu magna, eget mattis lacus congue id.
	 * @gibberish invalid tag?
	 */
	void method5() {
	}

	/**
	 * Draws as much of the specified image as is currently available with its
	 * northwest corner at the specified coordinate (x, y). This method will return
	 * immediately in all cases, even if the entire image has not yet been scaled,
	 * dithered and converted for the current output device.
	 * <p>
	 * If the current output representation is not yet complete then the method will
	 * return false and the indicated {@link ImageObserver} object will be notified
	 * as the conversion process progresses.
	 *
	 * @param img
	 *                     the image to be drawn
	 * @param x
	 *                     the x-coordinate of the northwest corner of the
	 *                     destination rectangle in pixels
	 * @param y
	 *                     the y-coordinate of the northwest corner of the
	 *                     destination rectangle in pixels
	 * @param observer
	 *                     the image observer to be notified as more of the image is
	 *                     converted. May be <code>null</code>
	 * @return <code>true</code> if the image is completely loaded and was painted
	 *         successfully; <code>false</code> otherwise.
	 * @see Image
	 * @see ImageObserver
	 * @since 1.0
	 */
	public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer);

}