/*
!=======================================================================
!
!  PROGRAM  PHASE-Viewer  (PHASE-Viewer 2014.01 ver.3.3.0)
!
!  Created on 2006/12/22 18:13:03
!  AUTHOR(S): KOGA, Junichiro
!  File : J3DPanel.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.awt.Window;
import java.io.IOException;
import java.util.Vector;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.TransformGroup;

import ciss.phase_viewer.atomcoord.VolumetricData;
import ciss.phase_viewer.mainpanel.InternalFrameChase;
import ciss.phase_viewer.settings.GlobalProperties;

import com.sun.j3d.utils.universe.SimpleUniverse;

public interface J3DPanel {

    /**
     * 描画されているオブジェクトの, ルートブランチを取得できる
     * 
     * @return 描画されているオブジェクトのルートブランチ
     */
    public abstract BranchGroup getRootBranch();

    /**
     * プラグインを処理するオブジェクトを取得
     * 
     * @return プラグインの処理を行うオブジェクト
     */
    public abstract PluginParser getPluginParser();

    /**
     * 常にHeavyWeightコンポーネント
     */
    public abstract boolean isHeavyWeight();

    /**
     * 描画されているオブジェクトに関連付けられたUniverseを取得
     * 
     * @return 関連付けられたUniverse
     */
    public abstract SimpleUniverse getUniverse();

    /**
     * この画面をメモリー上からきれいにデアロケートするメソッド (実際にはガーベージコレクションを待つ必要はある)
     */
    public abstract void destroy();

    /**
     * cleanupメソッドの後に呼ばれる 必要に応じてoverrideせよ
     */
    public abstract void postCleanUp();

    /**
     * メイン画面を閉じると同時に閉じるGUIのVectorを取得.
     * 
     * @return 終了時に同時に終了するGUIのVector
     */
    public abstract Vector getDisposeOnExit();

    /**
     * このオブジェクト終了時に同時に終了するウィンドウなどを登録する.
     * 
     * @param window
     *            このオブジェクト終了と同時に終了したいWindow
     */
    public abstract void addDisposeOnExit(Window window);

    /**
     * このオブジェクト終了時に同時に終了するウィンドウなどを登録する.
     * 
     * @param window
     *            このオブジェクト終了と同時に終了したいWindow
     */
    public abstract void addDisposeOnExit(InternalFrameChase window);

    /**
     * 外部ファイルに, このオブジェクトが描いている3D空間をエクスポートする
     * 
     * @param fileName
     *            エクスポート先のファイル名
     */
    public abstract void export(String fileName) throws IOException;

    /**
     * 外部ファイルに, このオブジェクトが描いている3D空間をエクスポートする. ファイル名は, デフォルトが利用される.
     */
    public abstract void export() throws IOException;

    /**
     * ベースとなっているディレクトリーを返す.
     * 
     * @return ベースディレクトリー
     */
    public abstract String getParentDirectory();

    /**
     * VRML97形式でシーンを指定のファイルへ出力する
     * 
     * @param fileName
     *            出力先のファイル名
     */
    public abstract void doExportVRML(String fileName) throws IOException;

    /**
     * @return 3D空間のCanvas3Dオブジェクトを返す.
     */
    public abstract Canvas3D getCanvas();

    /**
     * @return Java3D表示方法に関わる設定を保持するクラスを返す.
     */
    public abstract J3DDataManager getJ3DDataManager();

    /**
     * 「重たい再描画」を行うなら呼ばなくても良いメソッドもある. その判定のため ここで再描画を行うか否かを返す.
     * 
     * @return このパネルで再描画を行うならtrue.
     */
    public abstract boolean doRedraw();

    /**
     * 再描画を, パフォーマンス重視で行う場合にfalseとする. falseの場合, 例えば元素の表示色などは変更されない.
     * 
     * @param パフォーマンス重視の再描画を行う場合false
     *            (デフォルトはtrue)
     */
    public abstract void doRedraw(boolean doRedraw);

    public abstract void prepareRedraw();

    /**
     * 投影方法を変更する
     * 
     * @param projectionPolicy
     *            投影方法; View.PARALLEL_PROJECTIONかView.PERSPECTIVE_PROJECTION
     */
    public abstract void setProjectionPolicy(int projectionPolicy);

    /**
     * 現在の投影方法を取得する
     * 
     * @return 現在の投影方法; View.PARALLEL_PROJECTIONかView.PERSPECTIVE_PROJECTION
     */
    public abstract int getProjectionPolicy();

    public abstract void postRedraw();

    /**
     * 描画に関わるプロパティーを取得.
     * 
     * @return 描画に関わるプロパティー.
     */
    public abstract GlobalProperties getJ3DProperties();

    /**
     * ボリュームデータの配列を取得することができるメソッド; デフォルトではnullを返す. 必要に応じてoverrideせよ.
     * 
     * @return 関連付けられたボリュームデータの配列; デフォルトではnull.
     */
    public abstract VolumetricData[] getAssociatedVolumetricData();

    /**
     * 一番上のTransformGroupを返す. ただし, "一番上のTransformGroup"はサブクラスによって
     * 微妙に作成方法が違うのでベースクラスではnullを返す
     * 
     * @return 一番上のTransformGroup
     */
    public abstract TransformGroup getRootTransform();

    /**
     * "回転"させたいTransformGroupの配列を返す; デフォルトではrootTransform.
     * 
     * @return 回転させたいTransformGroup
     */
    public abstract TransformGroup[] getRotatingTransform();

    /**
     * フレーム情報を持つ場合true; そうでないとfalse.
     * 
     * @param フレームのあるプログラムならtrue
     *            .
     */
    public abstract boolean supportsFrame();

}
