【プログラムCont7v2.java】**************************

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

import nice.*;
 

class ListFrame extends JFrame implements WindowListener,ListSelectionListener,ActionListener{
	
	Container cn=getContentPane();
	JPanel pc=new JPanel(new GridLayout(2,0),true);
	JTextArea ta=new JTextArea(0,0);
	JScrollPane spc=new JScrollPane(ta);
	
	DefaultListModel dl;
	JList lic;
	JScrollPane spc2;
	
	JPanel pe=new JPanel(new GridLayout(2,0),true);
	JPanel pe1=new JPanel(new GridLayout(1,0),true);
	JScrollPane sp;
	JList lie;
	Color c1,c2;
	
	JPanel pe2=new JPanel(new GridLayout(3,0),true);
	JLabel lc=new JLabel();
	JLabel lim=new JLabel();//アイコン用ラベル
	
	final Icon ic1=new ImageIcon("iw.gif");//limのアイコン
	final Icon ic2=new ImageIcon("iwe.gif");
	final Icon ic3=new ImageIcon("iwl.gif");
	final Icon ic4=new ImageIcon("iwul.gif");
	
	final Icon icn=new ImageIcon("nice2.gif");//ダイアログ用アイコン
	final Icon icb=new ImageIcon("bb2.gif");
	final Icon icp=new ImageIcon("pc2.gif");
	final Icon[] inbp=new Icon[3];
	
	final Icon icwn=new ImageIcon("nw.gif");//ダイアログ用アイコンと一緒に使うlimのアイコン
	final Icon icwb=new ImageIcon("bw.gif");
	final Icon icwp=new ImageIcon("pw.gif");
	final Icon[] inbpw=new Icon[3];
	
	JTextField tf=new JTextField();
	
	final IoControl ioc=new IoControl();
	JFileChooser jf;

		//初期文字配列**********************************************************************************************
		
	String[] ss0={"原本を作成、編集","定型文を編集、登録、削除","タグを編集、登録"};
	String[] ss1={"モード変更","原本をロード","原本をセーブ","原本を上書き","最近使ったファイル","定型文挿入"};
	String[] ss2={"モード変更","定型文をロード","定型文を登録","定型文を削除"};
	String[] ss3={"モード変更","タグを追加","タグを削除","タグを編集","タグを保存","タグを初期化","タグをロード"};

	String[] ssti={"<p>","<p><b>ナイス博士</b>「","<p><b>BB君</b>「","<p><b>そよ風さん</b>「",
					"<p><IMG height=56 src=\"nice.gif\" width=70></p>","<p><IMG height=56 src=\"bb.gif\" width=70></p>",
					"<p><IMG height=56 src=\"wind.gif\" width=70></p>"};	
	String[] ssbi={"","」</p>","」</p>","」</p>","","",""};
	
	String spre="初期定型文\n"+"<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>"+"\n"+
		"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">"+"\n"+
		"<head>\n<title>ナイスjava研究所,研究帖6</title>\n</head>\n<body>\n<h1>研究帖6</h1>"+"\n"+
		" <hr />"+"\n"+" <address>"+"\n"+" <a href=\"mailto:nice@f04.itscom.net\">作者へのメッセージ</a>"+"\n"+
		" </address>"+"\n"+"</body>"+"\n"+"</html>"+"\n"+"<HTML>"+"\n"+"<HEAD>"+"\n"+
		"<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=x-sjis\">"+"\n"+
		" <TITLE>研究課題 ナイスなパッケを作ろう</TITLE>"+"\n"+"</HEAD>"+"\n"+"<BODY BGCOLOR=\"#c0c0c0\">"+"\n"+
		"<B><FONT FACE=\"MS 明朝\" LANG=\"JA\" SIZE=3><P ALIGN=\"JUSTIFY\">"+"\n"+
		"研究課題 ナイスなパッケを作ろう。</P>"+"\n"+"</B><P ALIGN=\"JUSTIFY\"></P>"+"\n"+
		"<P ALIGN=\"JUSTIFY\"><IMG SRC=\"nice.gif\" WIDTH=70 HEIGHT=56> "+"\n"+
		"<IMG SRC=\"bb.gif\" WIDTH=70 HEIGHT=56></P>"+"\n"+
		"<IMG SRC=\"wind.gif\" WIDTH=70 HEIGHT=56></P>"+"\n";
		
		//*******************************************************************************************************
	
	String sta="テキストに書き込む。",slc="行を選ぶ。",stf="上の番号を入力";
	String[] sst1=ss2,sst2=ss3;
	String[] ssbf;
	
	final File fuf=new File("UsedFile.nice");
	final DefaultListModel uflist=new DefaultListModel();
	boolean buf;//ファイルからリスト書き込みの結果用フラグ
	
	final File fpr=new File("prepared.nice");//定型文保存用ファイル
	final String snice="@@nice@@";
	final DefaultListModel pflist=new DefaultListModel();
	boolean bpf;
	
	final File ftg=new File("Tag.nice");//タグ保存用ファイル
	final DefaultListModel tglist=new DefaultListModel();
	final DefaultListModel tgliste=new DefaultListModel();
	final String smain="本文";
	boolean btf;
	
	final Mode[] md=new Mode[4];
	int mn;
	File f1;
	
	boolean btx=false;//中央リスト書き換えのフラグ
	final ListFrame li;
	
	String[] sst;
	String[] ssb;
	
	ListFrame(Color cl1,Color cl2){
		
		super("TagWriter EveryOne");
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		setVisible(true);
		addWindowListener(this);
		
		li=this;
		
		buf=ioc.fileWrite(fuf,uflist);
		bpf=ioc.fileWrite(fpr,pflist,snice);//定型文をリストへ
		btf=ioc.fileWrite(ftg,tglist,tgliste,snice);//タグをリストへ
		
		if(!btf){//タグリストの初期化**********************************************************************************
			ioc.fileWrite(ssti,tglist);
			ioc.fileWrite(ssbi,tgliste);
		}
		
		setTag();
		
		inbp[0]=icn;
		inbp[1]=icb;
		inbp[2]=icp;
		
		inbpw[0]=icwn;
		inbpw[1]=icwb;
		inbpw[2]=icwp;
		
		md[0]=new Mode0();
		md[1]=new Mode1();
		md[2]=new Mode2();
		md[3]=new Mode3();
		
		setE1List();
				
		cn.add(pc,BorderLayout.CENTER);
		ta.setBackground(new Color((float)0.8,(float)0.8,(float)0.8));
		ta.setEditable(true);//***************************************************************************
		ta.setBorder(new EtchedBorder());
		ta.addFocusListener(new TextFocusListener(ic4,sta,ta));

		pc.add(spc);
		
		dl=new DefaultListModel();
		dl.addElement("作業開始");

		lic=new JList(dl);     //中央のリスト                         
		lic.setBackground(new Color((float)0.8,(float)0.8,(float)0.8));
		lic.addListSelectionListener(this);
		lic.addFocusListener(new TextFocusListener(ic3,slc,dl));
		
		spc2=new JScrollPane(lic);
		pc.add(spc2);          
		
		
		cn.add(pe,BorderLayout.EAST);
		c1=cl1;
		c2=cl2;
		
		lie=new JList();
		lie.setFixedCellHeight(45);
		lie.setCellRenderer(new MyCellRenderer(c1,c2));
		ioc.fileWrite(md[0].eastlist,lie,1);
		sp=new JScrollPane(lie);
		pe1.add(sp);
	
		pe.add(pe1);
		pe.add(pe2);
		pe2.add(lim);
		lim.setIcon(ic1);
		lim.setBorder(new EtchedBorder());
		
		pe2.add(lc);
		pe2.setBorder(new EtchedBorder());
		pe2.add(tf);
		tf.addActionListener(this);
		tf.addFocusListener(new TextFocusListener(ic1,stf,tf));
		tf.requestFocusInWindow();
		
		
	}
	
	void setTag(){
		sst=null;
		ssb=null;
		sst=new String[tglist.size()];
		ssb=new String[tgliste.size()];
		ioc.fileWrite(tglist,sst);
		ioc.fileWrite(tgliste,ssb);
	}
	
	void setE1List(){
			String[] peast=new String[sst.length];
			for(int i=0;i<sst.length;i++){
				peast[i]=sst[i]+smain+ssb[i];
			}
			md[1].eastlist=new String[ss1.length+sst.length];
			System.arraycopy(ss1,0,md[1].eastlist,0,ss1.length);
			System.arraycopy(peast,0,md[1].eastlist,ss1.length,peast.length);		
		}
	
	public void windowClosing(WindowEvent e){
		
		if(! ioc.fileWrite(uflist,fuf)){
			JOptionPane.showMessageDialog(li,"最近使ったファイルが更新出来ませんでした。");
		}
		if(! ioc.fileWrite(pflist,fpr,snice)){
			JOptionPane.showMessageDialog(li,"定型文登録ファイルが更新出来ませんでした。");
		}

		System.exit(0);
	}
	public void windowOpened(WindowEvent e){}
	public void windowClosed(WindowEvent e){}
	public void windowIconified(WindowEvent e){}
	public void windowDeiconified(WindowEvent e){}
	public void windowActivated(WindowEvent e){}
	public void windowDeactivated(WindowEvent e){}
	
	class TextFocusListener extends FocusAdapter{
		Icon ic;
		String lword;
		Object obj;
		TextFocusListener(Icon icg,String s,Object o){
			ic=icg;
			lword=s;
			obj=o;
		}
		
		public void focusGained(FocusEvent fe){
			lim.setIcon(ic);
			lc.setText(lword);
			if(obj==ta & btx){
				ioc.fileWrite(dl,ta);
				btx=false;
			}
		}
		public void focusLost(FocusEvent fe){
			if(obj==ta){
				ioc.fileWrite(ta,dl);
				btx=false;
			}
		}
	}
	
	public void valueChanged(ListSelectionEvent e){
		JList tmp=(JList)e.getSource();
		String st=(String)tmp.getSelectedValue();
	}
		
	public void actionPerformed(ActionEvent e){
		int isl=md[mn].eastlist.length;
		int ifirst=0;
		if(mn==0)ifirst=1;
		JTextField temp=(JTextField)e.getSource();
		int itn=0;
		
		try{
			itn=Integer.parseInt(temp.getText());
		}
		catch(NumberFormatException ne){
			lc.setText("リストの番号を入力して下さい。");
			lim.setIcon(ic2);
			tf.setText("");
		}
		
		if(itn>=(isl+ifirst) || itn<ifirst){
			lc.setText("番号が違います。    ");
			lim.setIcon(ic2);
			tf.setText("");
		}
		else{
			tf.setText("");
			lim.setIcon(ic1);
			lc.setText("");
			md[mn].selectItem(itn);
		}
	}
	
	
	abstract class Mode{
		int modenum;
		int ia;
		int icx;
		
		String s1;
		
		
		String[] eastlist;
		Object data;
	
		abstract void selectItem(int i);
		abstract void setDefault();
				
		int setModenum(int i){
			modenum=i;
			return modenum;
		}
	}

	class Mode0 extends Mode{
		Mode0(){
			eastlist=ss0;
		}
		
		void setDefault(){};
		void selectItem(int i){
			mn=i;
			ioc.fileWrite(md[i].eastlist,lie,0);
			setModenum(i);
			md[i].setDefault();
		}
	}
			
	class Mode1 extends Mode{   //原本作成

		void setDefault(){}
		void selectItem(int i){
			switch(i){
			case 0:
				mn=i;
				ioc.fileWrite(md[i].eastlist,lie,1);
				setModenum(i);
				break;
			case 1://原本をロード
					lim.setIcon(ic3);
					jf=new JFileChooser();
					int res=jf.showOpenDialog(ta);
					
					if(res==JFileChooser.APPROVE_OPTION){
						f1=jf.getSelectedFile();
						ioc.fileWrite(f1,ta);
						taSet();
						dl.clear();
						ioc.fileWrite(f1,dl);
						lc.setText(f1.getName());
						
						if(! ioc.listChange(uflist,f1.getName())){
							uflist.add(0,f1.getAbsolutePath());
						}
					}
					else{
						lc.setText("番号を入力して下さい。");
					}
				break;
			case 2:
				lc.setText("保存する場所を選んで下さい。");
					lim.setIcon(ic3);
					jf=new JFileChooser();
					res=jf.showSaveDialog(lim);
					
					if(res==JFileChooser.APPROVE_OPTION){
						f1=jf.getSelectedFile();
						ioc.fileWrite(ta,f1);
					}
					else{
						lc.setText("番号を入力して下さい。");
					}
				break;
			case 3://原本を上書き
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				
				if(JOptionPane.showConfirmDialog(ta,"表示されたテキストを上書きしますか?","上書き確認",
					JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,inbp[icx])!=JOptionPane.OK_OPTION) break;
				String strue="上書きしました。";
				String sfalse="上書き出来ませんでした。";
				String s3;
				if(ioc.fileWrite(ta,f1)){
					s3=strue;
				}
				else{
					s3=sfalse;
				}
				JOptionPane.showMessageDialog(lic,s3);
				break;
			case 4://最近使ったファイル
				if(!buf){
					JOptionPane.showMessageDialog(lic,"最近使ったファイルがありません。");
					break;
				}
				
				String[] ss4=new String[uflist.size()];
				uflist.copyInto(ss4);
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(ta,"ファイルを選択してください" , "最近使ったファイル" ,
					JOptionPane.INFORMATION_MESSAGE,inbp[icx],ss4,ss4[0]);
				
				if(data!=null){
					
					ioc.listChange(uflist,data);
					
					f1=new File((String)data);
					dl.clear();
					if(! ioc.fileWrite(f1,dl)){
						JOptionPane.showMessageDialog(li,"ファイルが見つかりません。");
						break;
					}
					ioc.fileWrite(f1,ta);
					taSet();
				}
				
				break;
				
			case 5://定型文挿入//********************************************************************************
				String s5=spre;
				pflist.insertElementAt(s5,0);
				Object[] datalist=pflist.toArray();
				String[] sslist=new String[datalist.length];
				
				for(int j=0;j<datalist.length;j++){
					sslist[j]=(String)datalist[j];
					if(sslist[j].length()>80)sslist[j]=sslist[j].substring(0,80);
				}
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(ta,"定型文を選んでください。" ,"定型文選択",
					JOptionPane.INFORMATION_MESSAGE,inbp[icx],sslist,sslist[sslist.length-1]);
				
				for(int j=0;j<sslist.length;j++){
					if(data.equals(sslist[j])){
						s5=(String)datalist[j];
						break;
					}
				}
				
				String[] ssi5={"先頭","最後"};
				String s52=s5;
				if(s52.length()>400)s52=s52.substring(0,400);
				
				data=JOptionPane.showInputDialog(ta,s52+
					"\n定型文を挿入する位置を選択してください。" ,
					"タイトルと定型文の一部" ,JOptionPane.INFORMATION_MESSAGE,ic1,ssi5,ssi5[0]);
				s5=s5.substring(s5.indexOf("\n")+1);
				if(data.equals("先頭")){
					ta.insert(s5,0);
				}
				else{
					ta.append(s5);
				}
				pflist.remove(0);
				taSet();
				break;
				
			default://タグ挿入
				data=(String)lic.getSelectedValue();
				if(data==null){
					lc.setText("まず、隣のリストで行を選んでください。");
					lim.setIcon(ic2);
					break;
				}
				int lindex=lic.getSelectedIndex();
				int index=i-ss1.length;
				
				data=sst[index]+data+ssb[index];
				dl.set(lindex,data);
				btx=true;
				break;
				
			}
		}
	}
	

	
	class Mode2 extends Mode{//定型文を編集 
		Mode2(){
			eastlist=ss2;		
		}
		
		void setDefault(){
			lc.setText("定型文をテキストエリアに書くか、ロードして編集し、登録するモード");
		}
		
		void selectItem(int i){
			switch(i){
			case 0:
				mn=i;
				ioc.fileWrite(md[i].eastlist,lie,1);
				setModenum(i);
				break;
			case 1:
				Object[] datalist=pflist.toArray();
				String[] sslist=new String[datalist.length];
				String s5="";
				int ia;
				
				for(int j=0;j<datalist.length;j++){
					sslist[j]=(String)datalist[j];
					if(sslist[j].length()>80)sslist[j]=sslist[j].substring(0,80);
				}
				Db.pp(sslist);
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(ta,"定型文を選んでください。" ,"定型文選択",
					JOptionPane.INFORMATION_MESSAGE,inbp[icx],sslist,sslist[sslist.length-1]);
				
				for(int j=0;j<sslist.length;j++){
					Db.pp(j);
					if(data.equals(sslist[j])){//*************************** 例外 ******************************
						
						s5=(String)datalist[j];
						break;
					}
				}
				
				String[] ssi5={"先頭","最後"};
				String s52=s5;
				if(s52.length()>400)s52=s52.substring(0,400);
				
				ia=JOptionPane.showConfirmDialog(ta,s52+
					"\nこの定型文をロードしますか?","編集する定型文",
					JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,ic1);
				
				if(ia==JOptionPane.OK_OPTION){
					s5=s5.substring(s5.indexOf("\n")+1);
					ta.setText(s5);
				}
				break;
			case 2:
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(ta,"テキストエリアの文を定型文として登録します。\n名前を付けてください。",
					"定型文登録" ,JOptionPane.INFORMATION_MESSAGE,inbp[icx],null,"適当な名前");
				pflist.addElement(data+"\n"+(String)ta.getText());
				break;	
				
			case 3:
				
				datalist=pflist.toArray();
				if(datalist.length==1){
					JOptionPane.showMessageDialog(ta,"1つだけは削除できません。","削除不能",
					JOptionPane.INFORMATION_MESSAGE,ic1);
                    break;
				}
				sslist=new String[datalist.length];
				s5="";
				
				for(int j=0;j<datalist.length;j++){
					sslist[j]=(String)datalist[j];
					if(sslist[j].length()>80)sslist[j]=sslist[j].substring(0,80);
				}
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(ta,"削除する定型文を選んでください。" ,"定型文削除",
					JOptionPane.INFORMATION_MESSAGE,inbp[icx],sslist,sslist[sslist.length-1]);
				
				int rindex=0;
				for(int j=0;j<sslist.length;j++){
					if(data.equals(sslist[j])){
						s5=(String)datalist[j];
						rindex=j;
						break;
					}
				}
				
				s52=s5;
				if(s52.length()>400)s52=s52.substring(0,400);
				
				int ans=JOptionPane.showConfirmDialog(ta,s52+"\nこの定型文を削除します。" ,"削除する定型文",
					JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,inbp[icx]);
				if(ans==JOptionPane.OK_OPTION)pflist.remove(rindex);
				
				break;
				
			}
		}
	}

	class Mode3 extends Mode implements ActionListener,ItemListener{//"タグを追加","タグを削除","タグを編集","タグを保存",
		//タグを初期化,タグをロード
		
		String[] ssl;
		String fs1;
		String fs2;
		String s3;
		
		BorderDialog bd;
		Component[][] cp;
		JTextField jf1;
		JTextField jf2;
		JComboBox jc;
		Icon ic1=new ImageIcon("iw.gif");
		JButton jb1;
		JButton jb2;
		JPanel jp1;
		JPanel jp2;	
		
		int index;
		
		Mode3(){
			eastlist=ss3;
		}
		void setDefault(){
			ssl=new String[sst.length];
			for(int j=0;j<sst.length;j++){
				ssl[j]=sst[j]+smain+ssb[j];
			}
		}
		
		public void actionPerformed(ActionEvent ae){
			if(ae.getActionCommand()=="追加"){
				fs1=jf1.getText();
				fs2=jf2.getText();
				tglist.addElement(fs1);
				tgliste.addElement(fs2);
				setTag();
				setE1List();
				bd.dispose();
				
			}
			else if(ae.getActionCommand()=="決定"){
				fs1=jf1.getText();
				fs2=jf2.getText();
				tglist.set(index,fs1);
				tgliste.set(index,fs2);
				setTag();
				setE1List();
				bd.dispose();
			
			}
			else{
				bd.dispose();
			}
		}
		
		public void itemStateChanged(ItemEvent ie){
			data=ie.getItem();
			index=Integer.parseInt(((String)data).substring(0,((String)data).indexOf(".")))-1;
			jf1.setText(sst[index]);
			jf2.setText(ssb[index]);
		}
		void selectItem(int selected){
			switch(selected){
			case 0:
				mn=selected;
				ioc.fileWrite(md[selected].eastlist,lie,1);
				setModenum(selected);
				break;
			case 1:
				setDefault();
				s3=ssl[0];
				
				for(int j=1;j<ssl.length;j++){
					s3+="\n"+ssl[j];
				}
				
				bd=new BorderDialog(li,"タグ追加","今使っているタグ\n\n"+s3+
					"\n\n本文の前後に入れたいタグを書いて、ボタンを押してください。");

				cp=new Component[2][3];
				jf1=new JTextField();
				cp[0][0]=jf1;
				JLabel jl=new JLabel(smain);
				jl.setHorizontalAlignment(SwingConstants.CENTER);
				cp[0][1]=jl;
				
				jf2=new JTextField();
				cp[0][2]=jf2;
				
				jb1=new JButton("追加");
				jb1.addActionListener(this);
				jp1=new JPanel();
				jp1.add(jb1);
				cp[1][0]=jp1;

				JButton jb2=new JButton("中止");
				jb2.addActionListener(this);
				jp2=new JPanel();
				jp2.add(jb2);
				cp[1][2]=jp2;
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				bd.setComponent(cp,inbp[icx]);//***************************************************
				break;
				
			case 2:
				setDefault();
				
				for(int i=0;i<ssl.length;i++){
					ssl[i]=(i+1)+"."+ssl[i];
				}
				
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				data=JOptionPane.showInputDialog(li,"削除したいタグを選んで、ボタンを押してください。" ,"タグ削除",
					JOptionPane.INFORMATION_MESSAGE,inbp[icx],ssl,ssl[0]);
				if(data==null)break;
				
				index=Integer.parseInt(((String)data).substring(0,((String)data).indexOf(".")));
				
				tglist.removeElementAt(index-1);
				tgliste.removeElementAt(index-1);
				
				setTag();
				setE1List();
				
				break;
				
			case 3:
				setDefault();
				
				for(int i=0;i<ssl.length;i++){
					ssl[i]=(i+1)+"."+ssl[i];
				}
				bd=new BorderDialog(li,"タグ編集","タグを選んで編集して、ボタンを押してください。");
				
				cp=new Component[3][3];
				
				jc=new JComboBox(ssl);
				jc.addItemListener(this);
				cp[0][1]=jc;
				
				jf1=new JTextField();
				cp[1][0]=jf1;
				
				JLabel jlc=new JLabel(smain);
				jlc.setHorizontalAlignment(SwingConstants.CENTER);
				cp[1][1]=jlc;
				
				jf2=new JTextField();
				cp[1][2]=jf2;
				
				jb1=new JButton("決定");
				jb1.addActionListener(this);
				jp1=new JPanel();
				jp1.add(jb1);
				cp[2][0]=jp1;

				jb2=new JButton("中止");
				jb2.addActionListener(this);
				jp2=new JPanel();
				jp2.add(jb2);
				cp[2][2]=jp2;
				
				bd.setComponent(cp,ic1);
				break;
				
				
				
			case 4:
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				ia=JOptionPane.showConfirmDialog(ta,"今使っているタグを保存しますか?","タグ保存",
					 JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,inbp[icx]);
				
				if(ia==JOptionPane.YES_OPTION){
					if(! ioc.fileWrite(tglist,tgliste,ftg,snice)){
						JOptionPane.showMessageDialog(li,"タグ保存ファイルが更新出来ませんでした。");
					}
				}
				break;
				
			case 5:
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				ia=JOptionPane.showConfirmDialog(ta,"今使っているタグを初期設定のタグにかえますか?","タグ初期化",
					 JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,inbp[icx]);
				
				if(ia==JOptionPane.YES_OPTION){
					ioc.fileWrite(ssti,tglist);
					ioc.fileWrite(ssbi,tgliste);
					setTag();
					setE1List();
				}
				break;
			case 6://タグをロード
				icx=new Random().nextInt(inbpw.length);
				lim.setIcon(inbpw[icx]);
				ia=JOptionPane.showConfirmDialog(ta,"今使っているタグを保存してあるタグにかえますか?","タグをロード",
					 JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,inbp[icx]);
				
				if(ia==JOptionPane.YES_OPTION){
					btf=ioc.fileWrite(ftg,tglist,tgliste,snice);//タグをリストへ
					if(btf){
						setTag();
						setE1List();
						break;
					}
					JOptionPane.showMessageDialog(li,"タグ保存ファイルからロードが出来ませんでした。");
				}
				
				break;
			}
		}
	}
	
	void taSet(){
		ta.setTabSize(3);
		ta.setPreferredSize(null);
		Dimension di=new Dimension(ta.getPreferredSize());
		di.width +=100;
		ta.setPreferredSize(di);
	}	
}

class BorderDialog extends JDialog{//******************************************************************************
	private int ibp;
	private int cpc;
	private int cpr;
	private String stas;
	
	BorderDialog(Frame owner, String title,String sta){
		super(owner,title,true);
		stas=sta;
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}
	void setComponent(Component[][] cp,Icon ic){
		
		Container cn=getContentPane();
		
		JTextArea sta=new JTextArea(stas);
		Font fo=new Font("Dialog",Font.BOLD,13);
		sta.setFont(fo);
		JScrollPane spc=new JScrollPane(sta);
		
		Dimension di=sta.getPreferredSize();
		di.width +=100;
		di.height +=75;
		if(ic.getIconHeight()>di.height)di.height=ic.getIconHeight()+60;
		sta.setPreferredSize(di);
		sta.setBackground(Color.LIGHT_GRAY);
		cn.add(spc,BorderLayout.CENTER);
		
		cpr=cp.length;
		cpc=cp[0].length;
		JPanel sp=new JPanel(new GridLayout(cpr,cpc));
		cn.add(sp,BorderLayout.SOUTH);
		
		for(int i=0;i<cpr;i++){
			for(int j=0;j<cpc;j++){
				
				if(cp[i][j]==null){
					sp.add(new JLabel(""));
				}
				else{
					sp.add(cp[i][j]);
				}
			}
		}
		
		JLabel sil=new JLabel(ic);
		cn.add(sil,BorderLayout.WEST);
		
		di.width +=100;
		if((di.height +=20*cpr+20)>500)di.height=500;
		
		setSize(di);
		setBackground(Color.LIGHT_GRAY);
		setVisible(true);
	}
}
	

class IoControl{
	boolean fileWrite(File f1,DefaultListModel f2,DefaultListModel f3,String st){
		try{	
			BufferedReader br=new BufferedReader(new FileReader(f1));
			String line;
			String s1="";
			String s2="";
			int i=0;
			
			while((line=br.readLine())!=null){
				if(i==0){
					s1=line;
					i+=1;
				}
				else{
					s2=line;
				}
			}
			br.close();
			
			DefaultListModel dl=f2;
			int ik=0,ist=0,id=st.length();
			String sb="";
			for(i=0;i<=1;i++){
				ik=0;
				ist=0;
				id=st.length();
				if(i==0){
					sb=s1;
				}
				else{
					sb=s2;
					dl=f3;
				}
				while(true){
					ik=sb.indexOf(st,ist);
					if(ik==-1){
						dl.addElement(sb.substring(ist,sb.length()));
						break;
					}
					dl.addElement(sb.substring(ist,ik));
					ist=ik+id;
				}
			}
			return true;
		}
		catch(NullPointerException ex){
			return false;
		}
		catch(Exception ex){
			System.out.println("fileWriteで、その他の例外");
			ex.printStackTrace();
			return false;
		}	
		
	}
	
	boolean fileWrite(DefaultListModel f1,DefaultListModel f2,File f3,String s){
		String s1=(String)f1.get(0);
		String s2=(String)f2.get(0);
		try{
			for(int i=1;i<f1.size();i++){
				s1+=s+f1.get(i);
				s2+=s+f2.get(i);
			}
			PrintWriter pr=new PrintWriter(new BufferedWriter(new FileWriter(f3)));
			pr.println(s1);
			pr.println(s2);
			pr.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
		
	
	boolean fileWrite(String[]f1,DefaultListModel f2){
		f2.clear();
		try{
			for(int i=0;i<f1.length;i++){
				f2.add(i,f1[i]);
			}
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
	
	boolean fileWrite(String[]ss,JList li,int ifirst){
		try{
			String[] index=new String[ss.length];
			for(int i=0,j=ifirst;i<ss.length;i++,j++){
				index[i]=j+". "+ss[i];
			}
			li.setListData(index);
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
	
	
	boolean fileWrite(File f1,JTextArea ta){
		try{
			BufferedReader br=new BufferedReader(new FileReader(f1));
			ta.read(br,null);
			br.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
		
	
	boolean fileWrite(JTextArea ta,File f2){
		try{
			BufferedWriter bw=new BufferedWriter(new FileWriter(f2));
			ta.write(bw);
			bw.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
	
	void fileWrite(String[] ss,JList lie){
		lie.setListData(ss);
	}
	
	boolean fileWrite(File f1,DefaultListModel f2){
		try{	
			BufferedReader br=new BufferedReader(new FileReader(f1));
			String line;
			
			while((line=br.readLine())!=null){
				f2.addElement(line);
			}
			br.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;
		}
		catch(Exception ex){
			System.out.println("その他の例外");
			ex.printStackTrace();
			return false;
		}
	}
	
	
	boolean fileWrite(DefaultListModel f1,JTextArea f2){
		String sl=(String)f1.get(0);
		for(int i=1;i<f1.size();i++){
			sl+="\n"+f1.get(i);
		}
		f2.setText(sl);
		return true;
	}
	
	boolean fileWrite(DefaultListModel f1,File f2){
		
		String sl=(String)f1.get(0);
		for(int i=1;i<f1.size() && i<20;i++){
			sl+="\n"+(String)f1.get(i);
		}
		
		try{
			PrintWriter pr=new PrintWriter(new BufferedWriter(new FileWriter(f2)));
			pr.print(sl);
			pr.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			System.out.println("fileWrite("+f1.toString()+","+f2.toString()+")");
			ex.printStackTrace();
			return false;
		}
	}
	
	
	boolean fileWrite(DefaultListModel f1,File f2,String s){
		
		StringTokenizer st;
		try{
			String sl=(String)f1.get(0);
			for(int i=1;i<f1.size() && i<20;i++){
				sl+=s+(String)f1.get(i);
			}
			st=new StringTokenizer(sl,"\n");
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
		
		try{
			PrintWriter pr=new PrintWriter(new BufferedWriter(new FileWriter(f2)));
			
			while(st.hasMoreTokens()){
				pr.println(st.nextToken());
			}	
			pr.close();
			return true;
		}
		catch(NullPointerException ex){
			return false;	
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
	
	
	boolean fileWrite(JTextArea f1,DefaultListModel f2){
		StringTokenizer st=new StringTokenizer(f1.getText(),"\n");
		f2.clear();
		int i=0;
		while(st.hasMoreTokens()){
			f2.addElement(st.nextToken());
		}	
		return true;
	}
	
	
	boolean listChange(DefaultListModel dl,Object o1){
		int index=dl.indexOf(o1);
		if(index!=-1){
			dl.add(0,dl.remove(index));
			return true;
		}
		else{
			return false;
		}
	}
	
	
	boolean fileWrite(File f1,DefaultListModel dl,String st){
		try{	
			BufferedReader br=new BufferedReader(new FileReader(f1));
			String line;
			String sb="";
			
			while((line=br.readLine())!=null){
				sb+=line+"\n";
			}
			br.close();
			
			int ik=0,ist=0,id=st.length(),i;
			while(true){
				ik=sb.indexOf(st,ist);
				if(ik==-1){
					dl.addElement(sb.substring(ist,sb.length()));
					break;
				}
				dl.addElement(sb.substring(ist,ik));
				ist=ik+id;
			}
			
			return true;
		}
		catch(NullPointerException ex){
			return false;
		}
		catch(Exception ex){
			System.out.println("boolean fileWrite(File f1,DefaultListModel dl,String s1)で、その他の例外");
			ex.printStackTrace();
			return false;
		}
	}
		
	boolean fileWrite(DefaultListModel d1,String[] ss){
		Object[] o1=d1.toArray();
		try{
			for(int i=0;i<o1.length;i++){
				ss[i]=(String)o1[i];
			}	
			return true;
		}
		catch(Exception ex){
			ex.printStackTrace();
			return false;
		}
	}
	
}	

		
class MyCellRenderer extends JLabel implements ListCellRenderer {
	Color c,c1,c2;

	public MyCellRenderer(Color co1,Color co2) {
		setOpaque(true);
		c1=co1;
		c2=co2;
     }
	public Component getListCellRendererComponent(
		JList list,
		Object value,
		int index,
		boolean isSelected,
		boolean cellHasFocus
		)
	{
		setText(value.toString());
		
		switch(index % 2){
				case 0:c=c1;
				break;
				case 1:c=c2;
				break;
			}
		setBackground(c);
		setBorder(new EtchedBorder());
		return this;
     }
}
		
		
public class Cont7{
	
	public static void main(String[] args){
		
		Color[] cc=
		{Color.red,Color.green,Color.white,Color.yellow,Color.orange,Color.cyan,Color.lightGray,
			Color.pink,Color.magenta};
		Random r=new Random();
		int ic1=r.nextInt(cc.length);
		int ic2=r.nextInt(cc.length);
		
		ListFrame li=new ListFrame(cc[ic1],cc[ic2]);
		//Db.pp(cc[ic1].toString()+cc[ic2].toString());
		li.setExtendedState(JFrame.MAXIMIZED_BOTH);
	}
}