/*
 * Copyright 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.user.client.ui;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.LocaleInfo;

/**
 * Characteristic interface which indicates that a widget can be aligned
 * horizontally.
 */
public interface HasHorizontalAlignment {

  /**
   * Horizontal alignment constant.
   */
  public static class HorizontalAlignmentConstant {
    private String textAlignString;

    private HorizontalAlignmentConstant(String textAlignString) {
      this.textAlignString = textAlignString;
    }

    /**
     * Gets the CSS 'text-align' string associated with this constant.
     * 
     * @return the CSS 'text-align' value
     */
    public String getTextAlignString() {
      return textAlignString;
    }
  }

  /**
   * Specifies that the widget's contents should be aligned in the center.
   */
  HorizontalAlignmentConstant ALIGN_CENTER = new HorizontalAlignmentConstant(
      "center");

  /**
   * Specifies that the widget's contents should be aligned to the left.
   */
  HorizontalAlignmentConstant ALIGN_LEFT = new HorizontalAlignmentConstant(
      "left");

  /**
   * Specifies that the widget's contents should be aligned to the right.
   */
  HorizontalAlignmentConstant ALIGN_RIGHT = new HorizontalAlignmentConstant(
      "right");

  /**
   * In a RTL layout, specifies that the widget's contents should be aligned
   * to the right. In a LTR layout, specifies that the widget's constants 
   * should be aligned to the left.
   */
  HorizontalAlignmentConstant ALIGN_DEFAULT = 
      (GWT.isClient() && (LocaleInfo.getCurrentLocale().isRTL()))
        ? ALIGN_RIGHT : ALIGN_LEFT;
      
  /**
   * Gets the horizontal alignment.
   * 
   * @return the current horizontal alignment.
   */
  HorizontalAlignmentConstant getHorizontalAlignment();

  /**
   * Sets the horizontal alignment.
   * 
   * @param align the horizontal alignment (
   *          {@link HasHorizontalAlignment#ALIGN_LEFT},
   *          {@link HasHorizontalAlignment#ALIGN_CENTER},
   *          {@link HasHorizontalAlignment#ALIGN_RIGHT}), or
   *          {@link HasHorizontalAlignment#ALIGN_DEFAULT}).
   */
  void setHorizontalAlignment(HorizontalAlignmentConstant align);
}
