/*
!=======================================================================
!
!  PROGRAM  PHASE-Viewer  (PHASE-Viewer 2014.01 ver.3.3.0)
!
!  Created on 2006/12/22 18:27:32
!  AUTHOR(S): KOGA, Junichiro
!  File : CoordsViewerInterface.java
!  
!  Contact address :  Phase System Consortium
!                     E-mail: phase_system@nims.go.jp URL https://azuma.nims.go.jp
!
!
!   Since 2002, this program set had been intensively developed as a part of the following 
!  national projects supported by the Ministry of Education, Culture, Sports, Science and
!  Technology (MEXT) of Japan; "Frontier Simulation Software for Industrial Science
!  (FSIS)" from 2002 to 2005, "Revolutionary Simulation Software (RSS21)" from 2006 to
!  2008. "Research and Development of Innovative Simulation Software (RISS)" from 2008
!  to 2013. These projects is lead by the Center for Research on Innovative Simulation 
!  Software (CISS), the Institute of Industrial Science (IIS), the University of Tokyo.
!   Since 2013, this program set has been further developed centering on PHASE System
!  Consortium. 
!   The activity of development of this program set has been supervised by Takahisa Ohno.
!
!=======================================================================
 */
package ciss.phase_viewer.acviewer;

import java.util.Vector;

import ciss.phase_viewer.acviewer.operations.BasicOperations;
import ciss.phase_viewer.acviewer.operations.UnitCellOperations;
import ciss.phase_viewer.atomcoord.AtomCoords;

public interface CoordsViewerInterface {

    public static final int STAND_ALONE = 0;

    public static final int FROM_CHASE = 1;

    /**
     * このビューアーに関連付けられたAnimaterオブジェクトを取得する.
     * 
     * @return 上記の通り
     */
    public abstract Animater getAssociatedAnimater();

    /**
     * ユニットセル操作を行う. 境界上の原子を足すことと原子を単位胞の中に入れるということを行う.
     * 
     */
    public abstract void doUnitCell();

    /**
     * 更新用のメソッドを, 手動で呼ぶ場合updateをfalseとする.
     * 
     * @param update
     */
    public abstract void doUnitCell(boolean update);

    /**
     * 原子配置ビューアーの情報をセット, 初期化
     * 
     * @param data
     *            原子配置ビューアーの必要とする情報
     */
    public abstract void setData(ACVData data);

    /**
     * フレームをセット. Vectorのエレメントは, 必ずやAtomCoordsクラスのみにすること！
     * 
     * @param frames
     *            フレーム情報を格納したVector.
     */
    public abstract void setFrame(Vector frames);

    /**
     * フレームをセット. AtomCoordsオブジェクトの配列を引数にとる.
     * 
     * @param fr
     *            フレーム情報の配列.
     */
    public abstract void setFrame(AtomCoords[] cds);

    public abstract UnitCellOperations getUnitCellManipulator();

    public abstract Show3D getScene();

    public abstract Vector getFramesAC();

    public abstract void initializeRectangle(float fx, float fy);

    public abstract void updateRectangle(float w, float h);

    public abstract void finalizeRectangle();

    /**
     * 各原子を識別するためのラベルをセットする. 実はxyzデータから取得するので, 引数などはない.
     */
    public abstract void setLabel();

    /**
     * すべての情報をセットし終えたあと, このメソッドを呼んで実際に 原子配置を描画する. Show3DオブジェクトからBranchGroupを取得し,
     * それをSimpleUniverse オブジェクトに登録する. その際, BranchGroupに色々許可を明示的に 与える必要があることに注意.
     */
    public abstract void display3D() throws Exception;

    /**
     * @return 原子配置ビューアーが必要とする情報を格納したクラス, ACVDataへの参照
     */
    public abstract ACVData getData();

    /**
     * @return 原子配置の情報を保持するクラスを返す.
     */
    public abstract ConfigDataManager getCD();

    public abstract void selectedRow(int row);

    /**
     * 比較的軽い?と思われる再描画を実行する
     */
    public abstract void lightRedraw();

    /**
     * 原子配置の再描画を行う. この際, - 表示方法の変更 - 原子配置そのものの変更 - ユーザーが施した回転・並進・拡大操作 .
     * は全て反映された状態で再描画が行われる. 動画の場合, パフォーマンスを優先 するためにまずdoRedrawをfalseすること(その代わり,
     * 「完全な再描画」は得られない).
     */
    public abstract void redraw();

    /**
     * redraw from the beginning.... but does not work...
     * 
     * @param always
     *            set this value to false when you want a 'light' redraw when
     *            there are only one frame.
     */
    public abstract void heavyRedraw(boolean always);

    public abstract BasicOperations getBasicOperations();

}
