/*******************************************************************************
 * Copyright 2005-2007, CHISEL Group, University of Victoria, Victoria, BC,
 * Canada. 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: The Chisel Group, University of Victoria
 ******************************************************************************/
package org.eclipse.zest.core.widgets;

/**
 * Style constants used in Zest.
 * 
 * @author Chris Callendar
 */
public final class ZestStyles {

	/**
	 * A constant known to be zero (0), used in operations which take bit flags
	 * to indicate that "no bits are set".
	 */
	public static final int NONE = 0;

	/**
	 * Style constant indicating that invisible nodes should be ignored for
	 * layouts.
	 */
	public static final int IGNORE_INVISIBLE_LAYOUT = 1 << 1;

	/**
	 * Style constant indicating if the selected node's neighbors should be
	 * highlighted. Note: this is a node-level style. It should not be applied
	 * to graph views during construction.
	 * 
	 */
	//public static final int NODES_HIGHLIGHT_ADJACENT = 1 << 1;
	/**
	 * Style constant indicating that node labels should be cached. This is
	 * important under GTK+ because font drawing is slower than Windows.
	 */
	public static final int NODES_CACHE_LABEL = 1 << 1;

	/**
	 * Style to specify that the node should contain a fisheye label
	 * when the mouse moves over it.  By default the fisheye node is just the
	 * label with larger text.
	 */
	public static final int NODES_FISHEYE = 1 << 2;

	/**
	 * Style to specify that the node should not show its text (only its image).
	 * This with the NODES_FISHEYE style should help with large graphs (since the
	 * fisheye style will show the text).
	 */
	public static final int NODES_HIDE_TEXT = 1 << 3;

	/**
	 * Style constant indiciating that nodes should not be resized on layout.
	 */
	public static final int NODES_NO_LAYOUT_RESIZE = 1 << 4;

	/**
	 * Style constant indiciating the graph should not be animated during layout
	 * or refresh.
	 */
	public static final int NODES_NO_LAYOUT_ANIMATION = 1 << 8;

	/**
	 * Style constant indiciating the graph should not be animated during fisheye.
	 */
	public static final int NODES_NO_FISHEYE_ANIMATION = 1 << 16;

	/**
	 * Style constant indiciating the graph should not be animated.
	 */
	public static final int NODES_NO_ANIMATION = NODES_NO_LAYOUT_ANIMATION | NODES_NO_FISHEYE_ANIMATION;
	/**
	 * Style indicating that connections should show their direction by default.
	 */
	public static final int CONNECTIONS_DIRECTED = 1 << 1;

	/**
	 * Style constant to indicate that connections should be drawn with solid
	 * lines (this is the default).
	 */
	public static final int CONNECTIONS_SOLID = 1 << 2;
	/**
	 * Style constant to indicate that connections should be drawn with dashed
	 * lines.
	 */
	public static final int CONNECTIONS_DASH = 1 << 3;
	/**
	 * Style constant to indicate that connections should be drawn with dotted
	 * lines.
	 */
	public static final int CONNECTIONS_DOT = 1 << 4;
	/**
	 * Style constant to indicate that connections should be drawn with
	 * dash-dotted lines.
	 */
	public static final int CONNECTIONS_DASH_DOT = 1 << 5;

	/**
	 * Bitwise ANDs the styleToCheck integer with the given style.
	 * 
	 * @param style
	 * @param styleToCheck
	 * @return boolean if styleToCheck is part of the style
	 */
	public static boolean checkStyle(int style, int styleToCheck) {
		return ((style & styleToCheck) == styleToCheck);
	}

	/**
	 * Validates the given style for connections to see if it is legal. Returns
	 * false if not.
	 * 
	 * @param style
	 *            the style to check.
	 * @return true iff the given style is legal.
	 */
	public static boolean validateConnectionStyle(int styleToValidate) {
		int style = styleToValidate;
		// int illegal = CONNECTIONS_CURVED | CONNECTIONS_STRAIGHT |
		// CONNECTIONS_BEZIER;
		/*
		int illegal = CONNECTIONS_STRAIGHT;
		style &= illegal;
		int rightBit = style & (-style);
		boolean okay = (style == rightBit);
		if (!okay) {
			return okay;
		}
		*/

		int illegal = CONNECTIONS_DASH_DOT | CONNECTIONS_DASH | CONNECTIONS_DOT | CONNECTIONS_SOLID;
		style = styleToValidate;
		style &= illegal;
		int rightBit = style & (-style);
		boolean okay = (style == rightBit);
		if (!okay) {
			return okay;
		}

		return true;

		// @tag zest.bug.160368-ConnectionAlign.fix : must check the connections
		// to make sure that there isnt' an illegal combination of alignments.
		/*
		illegal = CONNECTIONS_VALIGN_BOTTOM | CONNECTIONS_VALIGN_MIDDLE | CONNECTIONS_VALIGN_TOP;
		style = styleToValidate;
		style &= illegal;
		rightBit = style & (-style);
		return (style == rightBit);
		*/
	}
}
