/*
 * @(#)Ridual.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-3 : Site map editor
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/10/23
 */
package jp.co.nri;

import java.awt.BorderLayout;

import java.text.DecimalFormat;

import java.io.*;

import java.util.Properties;
import java.util.Enumeration;
import java.util.Vector;
import java.util.Locale;
import java.util.Calendar;

import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.ZSplashWindow;
import jp.co.iti.fagot.ZSplashPanel;
import jp.co.iti.fagot.IZFileable;

import jp.co.iti.fagot.action.ZChildWindowAction;
import jp.co.iti.fagot.action.ZFileAction;
import jp.co.iti.fagot.action.ZUIAction;
import jp.co.iti.fagot.action.ZExitAction;
import jp.co.iti.fagot.action.ZGroupToggleButton;

import jp.co.iti.fagot.ui.UFrame;
import jp.co.iti.fagot.ui.UDialog;

import jp.co.iti.fagot.doc.DocBar;
import jp.co.iti.fagot.doc.DocDocument;
import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.doc.DocPane;
import jp.co.iti.fagot.doc.IApplication;

import jp.co.iti.fagot.util.ZDebug;
import jp.co.iti.fagot.util.ZFileFilter;
import jp.co.iti.fagot.util.ZFile;
import jp.co.iti.fagot.util.ZInstance;
import jp.co.iti.fagot.util.ZMessage;
import jp.co.iti.fagot.util.ZProperties;
import jp.co.iti.fagot.util.ZScript;
import jp.co.iti.fagot.util.ZResource;

import jp.co.nri.Rid;
import jp.co.nri.rid.RWindowManager;
import jp.co.nri.rid.RidMIT;

import jp.co.nri.rid.action.RidFileAction;
import jp.co.nri.rid.action.RidToolAction;
import jp.co.nri.rid.action.RidClipAction;
import jp.co.nri.rid.action.RidUndoAction;
import jp.co.nri.rid.action.RidGobAction;
import jp.co.nri.rid.action.RidListAction;
import jp.co.nri.rid.action.RidZoomAction;
import jp.co.nri.rid.action.RidEnvAction;
import jp.co.nri.rid.action.RidViewAction;
import jp.co.nri.rid.action.RidHelpAction;
import jp.co.nri.rid.action.RidProjectConfigAction;

import jp.co.nri.rid.doc.RidElementZone;
import jp.co.nri.rid.doc.RidDocumentSite;

import jp.co.nri.rid.environment.EnvironmentDialog;
import jp.co.nri.rid.environment.MessageDialog;

import jp.co.nri.rid.error.RidMessage;
/**
 * RidEditor Main Program
 */
public class Ridual extends UFrame implements IZFileable {

	/**
	 * ロゴ
	 */
	final static String mLogo = "Ridual_logo.gif";
	
	/**
     * バージョン情報の取得
	 */
	static String getVersionInfo() {
	String szVar = "Ridual ";
	szVar += RidMIT.mVerMajor+".";
	szVar += RidMIT.mVerMinor+" ";
	szVar += "build ";
	szVar += new DecimalFormat("0000").format( RidMIT.mBuild );
/*
	if ( !RidMIT.checkMIT() ) {
		szVar += " *** trial ***";
	}
*/
	int pages = RidMIT.checkMIT();
	switch(pages){
	case 0:		// 無制限
		szVar += " *** unlimited ***";
		break;
	case -3:	// 起動前
		break;
	case -2:	// trial
		szVar += " *** trial ***";
		break;
	case -1:	// ライセンス異常
		szVar += " *** license error ***";
		break;
	default:
		szVar += " *** " + pages + "p ***";
	}
	/** t3-nishimura@nri.co.jp added **/
	//szVar += " pre1";

	return szVar;
	}

	/**
     * コンストラクタ：ファイル名指定
     * @param szFile  初期ロードファイル名
     * @param bWindow ウィンドウモード
	 */
	public Ridual(String szFile, boolean bShow) {
	super("main");

	if ( bShow ) {
		// ウィンドウモード
		init();

		boolean bLoad = false;
		if ( szFile == null ) {
			// 直前に開いたファイルの読み込み
			szFile = getResource().getString("recent1");
		}

		if ( szFile != null ) {
			bLoad = open(szFile);
		}

		while ( !bLoad ) {
			ZResource res = getResource();
			Object[] msg = new Object[2];
			ButtonGroup group = new ButtonGroup();
			JRadioButton btnNew  = new JRadioButton(res.getString("tool.new.tooltip"));
			JRadioButton btnOpen = new JRadioButton(res.getString("tool.open.tooltip"));
			group.add( btnNew )  ; msg[0] = btnNew ; btnNew.setSelected(true);
			group.add( btnOpen ) ; msg[1] = btnOpen;
			int result = JOptionPane.showOptionDialog(null,
				msg,"Ridual",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,null,null);

			if ( result == JOptionPane.YES_OPTION ) {
				if ( btnNew.isSelected() ) {
					bLoad = open(null);
				} else if ( btnOpen.isSelected() ) {
					bLoad = ((RidFileAction)getAction(ZFileAction.OPEN)).openImpl();
				} else {
					System.exit(0);
				}
			} else {
				System.exit(0);
			}
		}

		// 子ウィンドウの表示
		getWindowManager().openWindow();

	} else {
		// コマンドモード
		ZApp.setTheApp(this);

		createResource()	;		// リソースの作成
//		createUIFactory()	;		// UIファクトリーの作成
		ZResource res = getResource();
		if ( mRidXDir != null ) {
			res.putString("app.install.path",mRidXDir);
		}

		ZDebug.trace("rid-x dir:"+res.getString("app.install.path"));
		ZDebug.trace("version  :"+getVersionInfo());

		// アプリケーションの初期化
		mApplication = DocManager.createApplication();

		// ブラウザ起動をオフ
		res.putBoolean("generate.browser",false);

		if ( szFile != null ) {
			RidualScript app = new RidualScript();
			// ドキュメントを開く
			boolean bRet = app.open(szFile);
			if ( bRet ) {
				// コマンド実行
				RidToolAction act = null;

				if ( mImpPage || mImpResource || mImpDocument) {
					app.setProperty("import.page",mImpPage);
					app.setProperty("import.resource",mImpResource);
					app.setProperty("import.document",mImpDocument);

					app.execImport();
				}

				if ( mAnalyze ) {
					app.execAnalyze();
				}

				if ( mProduct || mPresent || mSitemap ) {
					app.setProperty("generate.product",mProduct);
					app.setProperty("generate.present",mPresent);
					app.setProperty("generate.sitemap",mSitemap);
					app.execGenerate();
				}

				// ドキュメントを保存
				if ( mImpPage || mImpResource || mImpDocument || mAnalyze ) {
					app.save();
				}
			}
		} else if ( mScript != null ) {
			// スクリプトの実行
			ZDebug.trace("start script:"+mScript);
			ZScript scr = new ZScript();
			scr.loadScript( mScript ) ;
			scr.invoke("main",null);
		}
	}
	}
	
	private PrintStream getLog() throws FileNotFoundException {
		ZResource res = getResource();
		
		File inst		= new File(res.getString("app.install.path"));
		File todayLog	= new File(inst, res.getString("log.today"));
		
		String dt = res.getString("log.date");
		Calendar	cal	= Calendar.getInstance();
		String		now	= cal.get(Calendar.YEAR)+"/"+
						(cal.get(Calendar.MONTH) + 1)+"/"+
						cal.get(Calendar.DATE);
		if(now.equals(dt))	return new PrintStream(new FileOutputStream(todayLog.getAbsolutePath(), true));
		
		File yesterdayLog = new File(inst, res.getString("log.yesterday"));
		yesterdayLog.delete();
		todayLog.renameTo(yesterdayLog);
		res.putString("log.date", now);
		return new PrintStream(new FileOutputStream(todayLog));
	}
	
	/**
	 * アプリケーションの初期化
	 */
	protected void init() {
	ZApp.setTheApp(this);

	createResource();		// リソースの作成
	
	ZResource res = getResource();
	
//	ZDebug.setTraceFile(log.getAbsolutePath());
	
	// アプリケーション起動状況チェック
	int nPreMajor = res.getInt("app.major",-1);
	int nPreMinor = res.getInt("app.minor",-1);
	int nPreBuild = res.getInt("app.build",-1);

	res.putInt("app.major",RidMIT.mVerMajor);
	res.putInt("app.minor",RidMIT.mVerMinor);
	res.putInt("app.build",RidMIT.mBuild);

	if ( mRidXDir != null ) {
		res.putString("app.install.path",mRidXDir);
	}
	
//	バージョンアップ時にダイアログを表示するのを止める
/*
	if ( nPreMajor == -1        ||	// 初回起動時
		 nPreMajor < mVerMajor  ||	// Major up
		 nPreMinor < mVerMinor  ||	// Minor up
		 nPreBuild < mBuild     ){	// Build up
		// 環境設定ダイアログの表示
		EnvironmentDialog env = new EnvironmentDialog();
		env.EnvDialog();
	}
*/

	// L&F 設定（環境設定ダイアログ表示前に行う）
//	setLookAndFeel()	;		// UIの初期化
	setTitle()			;		// フレームタイトルの表示

	// 初回インストール時に初期値設定
	if ( nPreMajor == -1 ){
		initialSetting();
		// 環境設定ダイアログの表示
		try {
			res.putBoolean("env.first",true);
			EnvironmentDialog env = new EnvironmentDialog();
			env.EnvDialog();
			saveResource();
	    } catch (Throwable t) {
		}
	}
	
	// ログ出力
	try{
		PrintStream ps = getLog();
		
		System.setOut(ps);
		System.setErr(ps);
	} catch(FileNotFoundException e){ e.printStackTrace(); }
	
	ZDebug.trace("rid-x dir:"+res.getString("app.install.path"));
	ZDebug.trace("version  :"+getVersionInfo());
	
	System.out.println("java "+
				System.getProperty("java.version")+"/"+
				System.getProperty("java.vendor")+"("+
				System.getProperty("java.vendor.url")+")");
	System.out.println("java-specification: "+
				System.getProperty("java.specification.name")+" "+
				System.getProperty("java.specification.version")+"/"+
				System.getProperty("java.specification.vendor"));
	System.out.println("javaVM: "+
				System.getProperty("java.vm.name")+" "+
				System.getProperty("java.vm.version")+"/"+
				System.getProperty("java.vm.vendor"));
	System.out.println("VM-specification: "+
				System.getProperty("java.vm.specification.name")+" "+
				System.getProperty("java.vm.specification.version")+"/"+
				System.getProperty("java.vm.specification.vendor"));
	System.out.println("JITcompiler: "+System.getProperty("java.compiler"));
	System.out.println("os: "+System.getProperty("os.name")+" "+
				System.getProperty("os.version")+"/"+
				System.getProperty("os.arch"));
	System.out.println("language: "+System.getProperty("user.language"));
	
	// Rid-x Dirのチェック
	while ( !checkRidxDir() ) {
		String szRidxDir = res.getString("app.install.path");
        RidMessage ridMsg = new RidMessage();
		MessageDialog.showError(ridMsg.Error("E1011",szRidxDir));

		// 環境設定ダイアログの表示
		try {
			res.putBoolean("env.first",true);
			EnvironmentDialog env = new EnvironmentDialog();
			env.EnvDialog();
			saveResource();
	    } catch (Throwable t) {
		}
	}

	getResource().loadGeometry(this,"main");	// フレームの位置取得

	addFrameAdapter()	;		// フレームアダプタの設定
	createUIFactory()	;		// UIファクトリーの作成

	getContentPane().setLayout(new BorderLayout());	// パネルの初期化

	// UI コンポーネントの初期化
	createAction();
	createMenuBar();
	createToolBar();

	// アプリケーションの初期化
	mApplication = DocManager.createApplication();
	mApplication.initApplication(this);

	// ツールバーのグループ化
	createGroupToolBar();

	// ウィンドウマネージャの初期化
	setWindowManager( new RWindowManager(this) );

	// 直前に開いたファイルメニューのUI更新
	updateRecent( null );
	}

	//## メイン #######################################################
	/**
     * メインプログラム
	 */
	public static void main(String[] args) {
    try {
		// バージョンチェック
        String vers = System.getProperty("java.version");
        if (vers.compareTo("1.1.2") < 0) {
            System.out.println("!!!WARNING: Swing must be run with a " +
                               "1.1.2 or higher version VM!!!");
        }

		// 英語版のテスト
//		ZDebug.trace("English version");
//		Locale.setDefault( Locale.ENGLISH );

		String szInitFile = null;
		boolean bShow = true;
		boolean bScript = false;
		if ( args.length > 0 ) {
			for( int nIndex=0; nIndex<args.length; nIndex++ ) {
				ZDebug.trace(args[nIndex]);
				String arg = args[nIndex].toLowerCase();
				if ( args[nIndex].startsWith("-ridx_dir=") ) {
					mRidXDir = args[nIndex].substring(10);
				} else if ( args[nIndex].startsWith("-script=") ) {
					mScript  = args[nIndex].substring(8);	bShow = false;
				} else if ( args[nIndex].equals("-script") ) {
					bScript = true;			bShow = false;
				} else if ( args[nIndex].equals("-import_page") ) {
					mImpPage = true;		bShow = false;
				} else if ( args[nIndex].equals("-import_resource") ) {
					mImpResource = true;	bShow = false;
				} else if ( args[nIndex].equals("-import_document") ) {
					mImpDocument = true;	bShow = false;
				} else if ( args[nIndex].equals("-analyze") ) {
					mAnalyze = true;		bShow = false;
				} else if ( args[nIndex].equals("-generate_product") ) {
					mProduct = true;		bShow = false;
				} else if ( args[nIndex].equals("-generate_present") ) {
					mPresent = true;		bShow = false;
				} else if ( args[nIndex].equals("-generate_sitemap") ) {
					mSitemap = true;		bShow = false;
				} else if ( args[nIndex].equals("-english") ) {
					ZDebug.trace("English version");
					Locale.setDefault( Locale.ENGLISH );
				} else {
					if ( bScript ) {
						mScript = args[nIndex];
					} else {
						szInitFile = args[nIndex];
					}
				}
			}
		}
		
		/* メニューバーを画面上部に出す */
		System.setProperty("com.apple.macos.useScreenMenuBar", "true");
		System.setProperty("apple.laf.useScreenMenuBar", "true");

/*
		// システムプロパティのデバッグ
		Properties prop = System.getProperties();
		Enumeration elm = prop.keys();
		while ( elm.hasMoreElements() ) {
			String szKey = (String)elm.nextElement();
			String szVal = prop.getProperty( szKey );
			ZDebug.trace(szKey+"="+szVal);
		}
*/

		if ( bShow ) {
			// ウィンドウモード
			Ridual.showSplashWindow()	;	// スプラッシュウィンドウの表示

			Ridual app = new Ridual(szInitFile, bShow);

			app.show();
//			app.updatePropertyFrame()	;	// 画面再描画
			Ridual.hideSplashWindow()	;	// スプラッシュウィンドウの終了

		} else {
			// コマンドモード
			ZDebug.trace("Command mode");
			Ridual app = new Ridual(szInitFile, bShow);

			System.exit(0);

		}
    } catch (Throwable t) {
        System.out.println("uncaught exception: " + t);
        t.printStackTrace();
    }
	}

	//## UI ###########################################################
	/**
	 * スプラッシュウィンドウの表示
	 */
	static protected void showSplashWindow() {
	mSplashWindow = new ZSplashWindow(mLogo,getVersionInfo());
	}

	/**
	 * スプラッシュウィンドウの終了
	 */
	static protected void hideSplashWindow() {
	mSplashWindow.dispose();
	mSplashWindow = null ;
//	ZDebug.trace("スプラッシュウィンドウの終了");
	}

	/**
	 * バージョン情報の表示
	 */
	public void showVersion() {
	UDialog dlg = new UDialog(this,"version");
	dlg.setComponent( new ZSplashPanel( mLogo, getVersionInfo() ),false );
	dlg.setControlPanel(UDialog.OK);
	dlg.getRootPane().setDefaultButton(dlg.getOKButton());
	dlg.doModal();
	}

	//## 固有 #########################################################
	/**
	 * アクション作成
	 */
	public void createAction() {
    Action[] defaultActions = {
		// ファイルメニュー
			new RidFileAction(this,this,ZFileAction.NEW),
			new RidFileAction(this,this,ZFileAction.OPEN,"recent1",
					new ZFileFilter( new String("xml"), "XML File")),
			new RidFileAction(this,this,ZFileAction.SAVE,"recent1",
					new ZFileFilter( new String("xml"), "XML File")),
			new RidFileAction(this,this,ZFileAction.SAVEAS,"recent1",
					new ZFileFilter( new String("xml"), "XML File")),

			new RidGobAction(this,RidGobAction.SVG),
			new RidListAction(this,RidListAction.CSV_PANEL),
			new RidListAction(this,RidListAction.CSV_SITE),
			new RidListAction(this,RidListAction.CSV_RESOURCE),
			new RidListAction(this,RidListAction.CSV_DOCUMENT),
			new RidProjectConfigAction(this,RidProjectConfigAction.SET_HTMLDIR),
//			new RidProjectConfigAction(this,RidProjectConfigAction.CHG_HTMLDIR),
//			new RidProjectConfigAction(this,RidProjectConfigAction.CHG_HTMLBASE),
			new RidProjectConfigAction(this,RidProjectConfigAction.CHG_TOPZONEURL),

		// 編集メニュー
			new RidClipAction(this,RidClipAction.CUT),

			new RidUndoAction(this,RidUndoAction.UNDO),
			new RidUndoAction(this,RidUndoAction.REDO),

			new RidGobAction(this,RidGobAction.UP),
			new RidGobAction(this,RidGobAction.DOWN),
			new RidGobAction(this,RidGobAction.GRID),
			new RidGobAction(this,RidGobAction.OMISSION_ZONE_ZONE),
			new RidGobAction(this,RidGobAction.OMISSION_MAP_PAGE),

			new RidEnvAction(this,RidEnvAction.SET_ENV),
			new RidEnvAction(this,RidEnvAction.SET_LOG),

		// ツールメニュー
			new RidToolAction(this,RidToolAction.GENERATE),
			new RidToolAction(this,RidToolAction.ANALYZE_HTML),
			new RidToolAction(this,RidToolAction.IMPORT),
			new RidToolAction(this,RidToolAction.EXIST),

			new RidToolAction(this,RidToolAction.SNAPSHOT),
			new RidToolAction(this,RidToolAction.CLEANUP),
			new RidToolAction(this,RidToolAction.ACCESSLOG),
			new RidToolAction(this,RidToolAction.DOWNLOAD),

		// 表示メニュー
			new ZUIAction(this,this,ZUIAction.LF_METAL),
			new ZUIAction(this,this,ZUIAction.LF_MOTIF),
			new ZUIAction(this,this,ZUIAction.LF_WINDOWS),

			new RidZoomAction(this,RidZoomAction.ZOOM_025),
			new RidZoomAction(this,RidZoomAction.ZOOM_050),
			new RidZoomAction(this,RidZoomAction.ZOOM_075),
			new RidZoomAction(this,RidZoomAction.ZOOM_100),
			new RidZoomAction(this,RidZoomAction.ZOOM_125),
			new RidZoomAction(this,RidZoomAction.ZOOM_150),
			new RidZoomAction(this,RidZoomAction.ZOOM_200),
			new RidZoomAction(this,RidZoomAction.ZOOM_300),
			new RidZoomAction(this,RidZoomAction.ZOOM_400),

			new ZChildWindowAction(this,RWindowManager.PROPERTY),
			new ZChildWindowAction(this,RWindowManager.PANPANEL),

		// 表示オプション
			new RidViewAction(this,RidViewAction.LINK_VIRTUAL),
			new RidViewAction(this,RidViewAction.LINK_REAL),
			new RidViewAction(this,RidViewAction.LINK_SELECT),
			new RidViewAction(this,RidViewAction.ZONE_NAM),
			new RidViewAction(this,RidViewAction.ZONE_CMT),
			new RidViewAction(this,RidViewAction.ZONE_FIL),
			new RidViewAction(this,RidViewAction.PAGE_NAM),
			new RidViewAction(this,RidViewAction.PAGE_TTL),
			new RidViewAction(this,RidViewAction.PAGE_CMT),
			new RidViewAction(this,RidViewAction.PAGE_FIL),
			new RidViewAction(this,RidViewAction.URL_NAM),
			new RidViewAction(this,RidViewAction.URL_CMT),
			new RidViewAction(this,RidViewAction.PAGE_ACCESS),

		// ヘルプメニュー
			new RidHelpAction(this,RidHelpAction.VERSION),
			new RidHelpAction(this,RidHelpAction.HELPDOC),
			new RidHelpAction(this,RidHelpAction.LICENSE),

		// 最後
			new ZExitAction(this)
   		 };

	addActions(defaultActions);

	addActions(DocManager.createAction());
	}

	//## public #######################################################
	/**
	 * フレームの終了
	 * ×ボタンが押されたときに呼び出される。
	 */
	public void exitFrame() {
	preExit( true );
	exit();
	}

	/**
	 * 終了前処理
	 */
	public boolean preExit( boolean bForce ) {
	// ドキュメントが更新されている場合には、セーブするか問い合わせ
	if ( mApplication.isModified() && checkLicense(false) ) {
		int result = 0;
		String szMsg = getResource().getString("msg.asksave");
		if ( bForce ) {
			result = JOptionPane.showConfirmDialog(this,
				szMsg,"Ridual",JOptionPane.YES_NO_OPTION);
		} else {
			result = JOptionPane.showConfirmDialog(this,
				szMsg,"Ridual",JOptionPane.YES_NO_CANCEL_OPTION);
		}

		if (result==JOptionPane.YES_OPTION) {
			save();
		} else if ( result == JOptionPane.CANCEL_OPTION ) {
			return false;
		}
	}
	mApplication.exitApplication();

	// 子フレームが表示されていれば、次回起動時にも表示するよう、
	// 表示状態を保存する
	getWindowManager().closeWindow();

	getResource().saveGeometry(this,"main");	// フレームの位置保存
	saveResource();		// リソースの保存
	return true;
	}

	/**
	 * アプリケーションの終了
	 */
	public void exit() {
		System.exit(0);
	}

	//## IZFileableインターフェイス ###################################
	/**
	 * ファイルを開く
	 * @param szFile 開くファイル名(nullの時新規作成)
	 */
	public boolean open(String szFile) {
	return mApplication.open(szFile);
	}

	/**
	 * ファイルを上書き保存
	 */
	public boolean save() {
	return mApplication.save();
	}

	/**
	 * ファイル名を付けて保存
	 * @param szFile ファイル名
	 */
	public boolean saveAs(String szFile) {
	return mApplication.saveAs(szFile);
	}

	/**
	 * セーブ可能か？
	 * 「新規作成」の場合、「書込み不可」の場合のみtrue
	 */
	public boolean canSave() {
	return mApplication.canSave();
	}

	/**
	 * 直前に開いたファイルの設定
	 * @param szRecentMenu メニュー項目名
	 * @param szRecentFile 直前に開いたファイル
	 */
	public Action createRecentAction(String szRecentMenu,String szRecentFile) {
	if ( szRecentMenu.equals("recent") ) {
		return ( new ZFileAction( this,this,ZFileAction.OPEN,szRecentFile ) );
	}
	return ( null ) ;
	}

	/**
     * 最近開いたファイルメニューの更新
     *
	 * 履歴は更新されないが、dlg.setCurrentDirectoryを行ってディレクトリが
	 * 変更になるとメニュー表示でエラーがでるため、ここでファイル履歴を更新する
	 *
     * @param szFile ファイル名（メニューの更新のみの場合null）
	 */
	public void updateRecent(String szFile) {
	getUIFactory().updateRecent( this, "recent", szFile );
	}

	//## ツールバー ###################################################
	/**
	 * グループツールバーの作成
	 */
	public void createGroupToolBar() {
	mViewtextZoneZone = new ZGroupToggleButton(this,getUIFactory(),
		new String[]{
			RidViewAction.ZONE_NAM,
			RidViewAction.ZONE_CMT,
			RidViewAction.ZONE_FIL
		});
	mViewtextZonePage = new ZGroupToggleButton(this,getUIFactory(),
		new String[]{
			RidViewAction.PAGE_NAM,
			RidViewAction.PAGE_TTL,
			RidViewAction.PAGE_CMT,
			RidViewAction.PAGE_FIL
		});
	mViewtextZoneUrl = new ZGroupToggleButton(this,getUIFactory(),
		new String[]{
			RidViewAction.URL_NAM,
			RidViewAction.URL_CMT
		});

	// 初期化
	resetGroupToolBar();
	}

	/**
	 * グループツールバーの初期設定
	 */
	public void resetGroupToolBar() {

	if ( getAction(RidGobAction.GRID) != null ) {

		// グリッド
		((RidGobAction)getAction(RidGobAction.GRID)).update();

		// リンク
		((RidViewAction)getAction(RidViewAction.LINK_VIRTUAL)).update();
		((RidViewAction)getAction(RidViewAction.LINK_REAL)).update();
		((RidViewAction)getAction(RidViewAction.LINK_SELECT)).update();

		// アクセスカウント
		((RidViewAction)getAction(RidViewAction.PAGE_ACCESS)).update();

		// Zone
		String szValue = getResource().getString("viewtext.Zone.ZoneUnit");
		if ( szValue.equals("Name") ) {
			mViewtextZoneZone.setState(RidViewAction.ZONE_NAM);
		} else if ( szValue.equals("Comment") ) {
			mViewtextZoneZone.setState(RidViewAction.ZONE_CMT);
		} else if ( szValue.equals("File") ) {
			mViewtextZoneZone.setState(RidViewAction.ZONE_FIL);
		}

		// Page
		szValue = getResource().getString("viewtext.Zone.PageUnit");
		if ( szValue.equals("Name") ) {
			mViewtextZonePage.setState(RidViewAction.PAGE_NAM);
		} else if ( szValue.equals("Title") ) {
			mViewtextZonePage.setState(RidViewAction.PAGE_TTL);
		} else if ( szValue.equals("Comment") ) {
			mViewtextZonePage.setState(RidViewAction.PAGE_CMT);
		} else if ( szValue.equals("File") ) {
			mViewtextZonePage.setState(RidViewAction.PAGE_FIL);
		}

		// Url
		szValue = getResource().getString("viewtext.Zone.UrlUnit");
		if ( szValue.equals("Name") ) {
			mViewtextZoneUrl.setState(RidViewAction.URL_NAM);
		} else if ( szValue.equals("Comment") ) {
			mViewtextZoneUrl.setState(RidViewAction.URL_CMT);
		}
	}
	}

	//## バージョンアップ #############################################
	/**
	 * 初期設定
	 */
	private void initialSetting() {
	ZResource res = getResource();
	String szOs = ( System.getProperty("os.arch").equals("ppc") )? ".mac" : ".win";
	
	// RID-X dir
	// 環境設定側で自動設定
//	if ( mRidXDir == null ) {
//		res.putString("app.install.path",res.getString("app.install.path"+szOs));
//	}

	// ignore key
	res.putString("rid.ignore.prefix",res.getString("rid.ignore.prefix.default"));
	
	// browser
	String szTmp = res.getString("generate.browser_command.1"+szOs);
	res.putString("generate.browser_command",szTmp);
	res.putString("generate.browser_command.1",szTmp);
	res.putString("generate.browser_command.2",res.getString("generate.browser_command.2"+szOs));

	// html editor
	szTmp = res.getString("command.html.editor.1"+szOs);
	res.putString("command.html.editor",szTmp);
	res.putString("command.html.editor.1",szTmp);
	res.putString("command.html.editor.2",res.getString("command.html.editor.2"+szOs));

	// text editor
	res.putString("command.text.editor",res.getString("command.text.editor"+szOs));

	// explorer
	res.putString("command.explorer",res.getString("command.explorer"+szOs));

	// documenter
	for ( int nAt=1 ; nAt < 100 ; nAt++ ) {
		String szApp = res.getString("command.doc.app."+nAt+".default");
		if ( szApp != null ) {
			res.putString("command.doc.app."+nAt,szApp);
			res.putString("command.doc.ext."+nAt,res.getString("command.doc.ext."+nAt+".default"));
			res.putString("command.doc.view."+nAt,res.getString("command.doc.view."+nAt+".default"));
			res.putString("command.doc.cmd."+nAt,res.getString("command.doc.cmd."+nAt+szOs));
		} else {
			break;
		}
	}

	}

	/**
	 * RID-Xディレクトリチェック
	 * <ul>
	 * <li>Template Dirの存在チェック
	 * <li>Project Dirの存在チェック
	 * <li>Config Dirの存在チェック
	 * </ul>
	 */
	private boolean checkRidxDir() {
	ZResource res = getResource();
	String szRidxDir = res.getString("app.install.path");

	// Template Dirの存在チェック
	String szDir = szRidxDir + File.separator + res.getString("app.template.dir");
	File fDir = new File(szDir);
	if ( !fDir.exists() || !fDir.isDirectory() ) {
		ZDebug.err( "template dir bad:"+fDir.exists()+","+fDir.isDirectory());
		return false;
	}

	// Project Dirの存在チェック
	szDir = szRidxDir + File.separator + res.getString("app.project.dir");
	fDir = new File(szDir);
	if ( !fDir.exists() || !fDir.isDirectory() ) {
		ZDebug.err( "project dir bad:"+fDir.exists()+","+fDir.isDirectory());
		return false;
	}

	// Config Dirの存在チェック
	szDir = szRidxDir + File.separator + res.getString("app.config.dir");
	fDir = new File(szDir);
	if ( !fDir.exists() || !fDir.isDirectory() ) {
		ZDebug.err( "config dir bad:"+fDir.exists()+","+fDir.isDirectory());
		return false;
	}

	return true;
	}

	/**
	 * ライセンスのチェック
	 */
	public boolean checkLicense(boolean viewMsg) {
	int pages = RidMIT.checkMIT();
	if(-2 == pages)	pages = RidMIT.TCOUNT;
//	boolean bEnable = RidMIT.checkMIT();
//	if ( !bEnable ) {
	switch ( pages ) {
	case 0:		return true;	// 無制限
	case -1:					// ライセンスなし
	case -3:					// 起動前(ありえないが一応)
		return false;
	default:
		RidDocumentSite doc = (RidDocumentSite)ZInstance.map().get( Rid.DOCUMENT_SITE );
		RidElementZone top  = doc.getTopZone();
		Vector vec = top.getPages(true);
		if ( vec.size() <= pages )	return true;
		
		if ( viewMsg ) {
			// エラーメッセージ表示
			RidMessage ridMsg = new RidMessage();
			MessageDialog.showError(ridMsg.Error("E1010",""));
		}
		
		return false;
	}
//	return bEnable;
	}
	
	
	public static final String getHtmlDir(){
		try {
	   		DocDocument doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
			String htmldir	= doc.getDocumentElement().getAttribute("HtmlDir");
			if(0 < htmldir.length())	return htmldir;
		} catch(NullPointerException e){}
		
		return ZInstance.prop().getProperty(Rid.PJ_DIR) + File.separator +
					ZApp.getTheApp().getResource().getString("rid.html.dir");
	}
	
	public static final String getHtmlDir2(){
		try {
	   		DocDocument doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
			String htmldir	= doc.getDocumentElement().getAttribute("HtmlDir");
			if(0 < htmldir.length())	return htmldir;
		} catch(NullPointerException e){}
		
		return null;
	}
	
	public static final void setHtmlDir(String htmldir){
		setHtmlDir(htmldir, (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE));
		setHtmlDir(htmldir, (DocDocument)ZInstance.map().get(Rid.DOCUMENT_RESOURCE));
	}
	
	private static final void setHtmlDir(String htmldir, DocDocument doc){
		doc.beginTransaction();
		try {
			if(null == htmldir) doc.getDocumentElement().removeAttribute("HtmlDir");
			else doc.getDocumentElement().setAttribute("HtmlDir", htmldir.replace(File.separatorChar, '/') );
			doc.commit();
		} catch(NullPointerException e){ doc.rollback(); }
	}
	
	public static final String getHtmlDirPIP(){
		try {
	   		DocDocument doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
			String htmldir	= doc.getDocumentElement().getAttribute("HtmlDirPIP");
			if(0 < htmldir.length())	return htmldir;
		} catch(NullPointerException e){}
		
		return null;
	}
	
	public static final void setHtmlDirPIP(String htmldir){
		String[] docs = new String[]{ Rid.DOCUMENT_SITE, Rid.DOCUMENT_RESOURCE };
		
		for(int i = docs.length - 1; 0 <= i; i--){
	   		DocDocument doc = (DocDocument)ZInstance.map().get(docs[i]);
			doc.beginTransaction();
			try {
				if(null == htmldir)	doc.getDocumentElement().removeAttribute("HtmlDirPIP");
				else doc.getDocumentElement().setAttribute("HtmlDirPIP", htmldir.replace(File.separatorChar, '/') );
				doc.commit();
			} catch(NullPointerException e){ doc.rollback(); }
		}
	}
	
	public static final String getTopZoneURL(){
		try {
	   		DocDocument doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
			String url	= doc.getDocumentElement().getAttribute("TopZoneURL");
			if(0 < url.length())	return url.endsWith("/") ? url : (url + "/");
		} catch(NullPointerException e){}
		
		return null;
	}
	
	public static final void setTopZoneURL(String url){
   		DocDocument doc = (DocDocument)ZInstance.map().get(Rid.DOCUMENT_SITE);
		doc.beginTransaction();
		try {
			if(null == url)	doc.getDocumentElement().removeAttribute("TopZoneURL");
			else doc.getDocumentElement().setAttribute("TopZoneURL", url);
			doc.commit();
		} catch(NullPointerException e){ doc.rollback(); }
	}

	//## アトリビュート ###############################################
    /**
     * アプリケーションクラス
     */
	protected IApplication	mApplication		= null;

	/**
	 * SplashWindow
	 */
	protected static ZSplashWindow mSplashWindow = null;

    /**
     * Zone表示（ツールバーのグループ化オブジェクト）
     */
	protected ZGroupToggleButton mViewtextZoneZone = null;

    /**
     * Page表示（ツールバーのグループ化オブジェクト）
     */
	protected ZGroupToggleButton mViewtextZonePage = null;

    /**
     * Url表示（ツールバーのグループ化オブジェクト）
     */
	protected ZGroupToggleButton mViewtextZoneUrl = null;

    /**
     * 起動オプション：RID-X ディレクトリ
     */
	static protected String  mRidXDir		= null;

    /**
     * 起動オプション：インポートページ
     */
	static protected boolean mImpPage		= false;

    /**
     * 起動オプション：インポートリソース
     */
	static protected boolean mImpResource	= false;

    /**
     * 起動オプション：インポートドキュメント
     */
	static protected boolean mImpDocument	= false;

    /**
     * 起動オプション：アナライズ
     */
	static protected boolean mAnalyze		= false;

    /**
     * 起動オプション：製作指示書生成
     */
	static protected boolean mProduct		= false;

    /**
     * 起動オプション：紙芝居生成
     */
	static protected boolean mPresent		= false;

    /**
     * 起動オプション：サイトマップ生成
     */
	static protected boolean mSitemap		= false;

    /**
     * 起動オプション：起動スクリプト
     */
	static protected String  mScript		= null;
}
