⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inputzdj.java

📁 有限自动机输入,转换,识别,图形显示与化简
💻 JAVA
字号:
package cn.work.zdj.ui;

import java.util.Hashtable;
import java.util.Vector;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import cn.work.zdj.sys.AutoMachine;
import cn.work.zdj.sys.AutoMachineFactory;
import cn.work.zdj.sys.IAppConstants;
import cn.work.zdj.sys.AutoMachine.ThreeRow;

public class InputZdj extends ViewPart implements ISelectionListener{
	private Group group_1,group_2,group_3,group_4,group_5;
	private Button bState_1,bLetter_1,bFunction_1,bFirState_1,bEndState_1;
	private Text lState_1,lLetter_1,lFunction_1,lFirState_1,lEndState_1;
	private AutoMachine machine;
	private int funLine = 6;
	private Vector threeRow;
	
	public InputZdj() {
		// TODO 自动生成构造函数存根
		
	}

	@Override
	public void createPartControl(Composite parent) {
		// TODO 自动生成方法存根
		Composite composite = new Composite(parent,SWT.NONE);
		composite.setLayout(new GridLayout(1,false));
		//Color fontColor = new Color(Display.getCurrent(),0xff,0x00,0x00);
		
		Composite comLabel = new Composite(composite,SWT.None);
		comLabel.setLayout(new GridLayout(2,true));
		Label label = new Label(comLabel,SWT.NONE);
		label.setText("请输入该自动机的名称");
		final Text txtLabel = new Text(comLabel,SWT.BORDER);
		txtLabel.setLayoutData(new GridData(SWT.FILL,SWT.CENTER,true,false));
		
		//第一组
		group_1 = new Group(composite,SWT.None);
		GridData gd = new GridData(GridData.FILL_BOTH);
		group_1.setLayoutData(gd);
		group_1.setText("输入状态集");
		final GridLayout gridLayout = new GridLayout(3,false);
		gridLayout.marginRight = 10;
		gridLayout.verticalSpacing = 10;
		gridLayout.marginHeight = 10;
		group_1.setLayout(gridLayout);
		
		final Label label1 = new Label(group_1,SWT.None);
		label1.setText("状态集");
		
		final Text tState_1 = new Text(group_1,SWT.RIGHT|SWT.BORDER);
		tState_1.setText("");
		bState_1 = new Button(group_1,SWT.NONE);
		bState_1.setText("增加");
		gd = new GridData();
		lState_1 = new Text(group_1,SWT.None);		
		lState_1.setText("未输入状态集");
		lState_1.setText("q0,q1,q2,q3,q4,");
		lState_1.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,3,1));
		//lState_1.setEnabled(false);
		
		
		//		第二组
		group_2 = new Group(composite,SWT.None);
		gd = new GridData(GridData.FILL_BOTH);
		group_2.setLayoutData(gd);
		group_2.setText("输入字母表");
		group_2.setLayout(new GridLayout(3,false));
		
		final Label label2 = new Label(group_2,SWT.None);
		label2.setText("字母表");
		
		final Text tLetter_1 = new Text(group_2,SWT.RIGHT|SWT.BORDER);
		tLetter_1.setText("");
		bLetter_1 = new Button(group_2,SWT.NONE);
		bLetter_1.setText("增加");
		lLetter_1 = new Text(group_2,SWT.None);		
		lLetter_1.setText("未输入字母表");
		lLetter_1.setText("a,b,");
		lLetter_1.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,3,1));
		//lLetter_1.setEnabled(false);
		
		//		第三组
		group_3 = new Group(composite,SWT.None);
		gd = new GridData(GridData.FILL_BOTH);
		group_3.setLayoutData(gd);
		group_3.setText("输入转换函数");
		group_3.setLayout(new GridLayout(9,false));
		
		final Label label3 = new Label(group_3,SWT.None);
		label3.setText("转换函数");
		final Label label4 = new Label(group_3,SWT.None);
		label4.setText("(");
		final Text tFunction_1 = new Text(group_3,SWT.RIGHT|SWT.BORDER);
		final Label label5 = new Label(group_3,SWT.None);
		label5.setText(",");
		final Text tFunction_2 = new Text(group_3,SWT.RIGHT|SWT.BORDER);
		final Label label6 = new Label(group_3,SWT.None);
		label6.setText(")");
		final Label label7 = new Label(group_3,SWT.None);
		label7.setText("=");
		final Text tFunction_3 = new Text(group_3,SWT.RIGHT|SWT.BORDER);
		tFunction_3.setText("");
		bFunction_1 = new Button(group_3,SWT.NONE);
		bFunction_1.setText("增加");
		
		lFunction_1 = new Text(group_3,SWT.COLOR_RED);
		lFunction_1.setText("未输入转换函数");
		lFunction_1.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,9,9));
		
		
		//		第四组
		group_4 = new Group(composite,SWT.None);
		gd = new GridData(GridData.FILL_BOTH);
		group_4.setLayoutData(gd);
		group_4.setText("输入初始状态");
		group_4.setLayout(new GridLayout(3,false));
		
		final Label label8 = new Label(group_4,SWT.None);
		label8.setText("初始状态");
		
		final Text tFirState_1 = new Text(group_4,SWT.RIGHT|SWT.BORDER);
		
		
		bFirState_1 = new Button(group_4,SWT.NONE);
		bFirState_1.setText("增加");
		lFirState_1 = new Text(group_4,SWT.None);		
		lFirState_1.setText("未输入初始状态");
		//lFirState_1.setText("q0");
		lFirState_1.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,3,1));
		//lFirState_1.setEnabled(false);
		
		//		第五组
		group_5 = new Group(composite,SWT.None);
		gd = new GridData(GridData.FILL_BOTH);
		group_5.setLayoutData(gd);
		group_5.setText("输入终止状态");
		group_5.setLayout(new GridLayout(3,false));
		
		final Label label9 = new Label(group_5,SWT.None);
		label9.setText("终止状态");
		
		final Text tEndState_1 = new Text(group_5,SWT.RIGHT|SWT.BORDER);
		tEndState_1.setText("");
		bEndState_1 = new Button(group_5,SWT.NONE);
		bEndState_1.setText("增加");
		lEndState_1 = new Text(group_5,SWT.None);		
		lEndState_1.setText("未输入终止状态");
		//lEndState_1.setText("q3,");
		lEndState_1.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,3,1));
		//lEndState_1.setEnabled(false);
		
		
		gd = new GridData();
		gd.horizontalAlignment = SWT.CENTER;
		Composite comBtn = new Composite(composite,SWT.None);
		comBtn.setLayout(new GridLayout(3,true));
		comBtn.setLayoutData(gd);
		final Button sure = new Button(comBtn,SWT.RIGHT);
		sure.setText("增加自动机");
		final Button modify = new Button(comBtn,SWT.RIGHT);
		modify.setText("删除");
		modify.setEnabled(false);
		
		final Button clear = new Button(comBtn,SWT.RIGHT);
		clear.setText("重置");
		
		SelectionListener listener = new SelectionListener(){

			public void widgetDefaultSelected(SelectionEvent e) {
				// TODO 自动生成方法存根			
			}

			public void widgetSelected(SelectionEvent e) {
				// TODO 自动生成方法存根
				Widget w = e.widget;
				
				if(w == bState_1){
					if(tState_1.getText().trim().equals("")){
						return ;
					}
					if(lState_1.getText().equals("未输入状态集")){
						lState_1.setText("状态集:"+tState_1.getText()+",");
					}else{
						lState_1.append(tState_1.getText()+",");
					}
					//dialog.setType(1);
					//dialog.open();
					tState_1.setText("");
				}else if(w == bLetter_1){
					if(tLetter_1.getText().trim().equals("")){
						return ;
					}
					if(tLetter_1.getText().trim().length() != 1){
						MessageDialog.openError(null,"提示","字母表中输入的字母必须为一位");
						return;
					}
					if(lLetter_1.getText().equals("未输入字母表")){
						lLetter_1.setText("字母表:"+tLetter_1.getText()+",");
					}else{
						lLetter_1.append(tLetter_1.getText()+",");
					}
					tLetter_1.setText("");
				}else if(w == bFunction_1){
					
					if(tFunction_1.getText().trim().equals("") || tFunction_2.getText().trim().equals("") 
							|| tFunction_3.getText().trim().equals("")){
						return ;
					}
					if(lFunction_1.getText().equals("未输入转换函数")){
						lFunction_1.setText("转换函数:("+tFunction_1.getText()+","+tFunction_2.getText()
														+") = "+tFunction_3.getText()+", ");
					}else{
						lFunction_1.append(" ("+tFunction_1.getText()+","+tFunction_2.getText()
								+") = "+tFunction_3.getText()+", ");
					}
					if(--funLine ==0){
						funLine =6;
						lFunction_1.append("\n");
					}
					//tFunction_1.setText("");
					//tFunction_2.setText("");
					//tFunction_3.setText("");
				}else if(w == bFirState_1){
					if(tFirState_1.getText().trim().equals(""))
						return;
					if(lFirState_1.getText().equals("未输入初始状态")){
						lFirState_1.setText("初始状态:"+tFirState_1.getText());
					}
					bFirState_1.setEnabled(false);
				}else if(w == bEndState_1){
					if(tEndState_1.getText().trim().equals("")){
						return;
					}
					if(lEndState_1.getText().equals("未输入终止状态")){
						lEndState_1.setText("终止状态:"+tEndState_1.getText()+",");
					}else{
						lEndState_1.append(tEndState_1.getText()+",");
					}
					tEndState_1.setText("");
					
				}else if(w == sure){
					
					Vector states = analyzeStates(lState_1.getText());
					Vector letters = analyzeLetters(lLetter_1.getText());
					Hashtable functions = analyzeFunctions(lFunction_1.getText());
					Vector endStates = analyzeStates(lEndState_1.getText());
					String temp = lFirState_1.getText();
					String firState = temp.substring(temp.indexOf(":")+1,temp.length());
					if(firState.indexOf("未输入") != -1){
						firState = "";
					}
					
					machine = new AutoMachine(txtLabel.getText());
					machine.Init(states, letters, functions, firState, endStates,threeRow);
					if(! machine.isValidate() || !isValidate(txtLabel.getText(),states,letters,functions,firState,endStates)){
						MessageDialog.openError(null,"提示","自动机无法正常初始化");
						return;
					}			
					AutoMachineFactory.getInstance().add(machine);
					OldZdj.selectionChanged();
					
					modify.setEnabled(true);
					
					clear();
					//init();
					
				}else if(w == modify){
					IViewPart vp = getViewSite().getPage().findView(IAppConstants.OLD_ZDJ_VIEW_ID);
					Table table = ((OldZdj)vp).getTableViewer().getTable();
					if(table.getSelectionIndex() == -1){
						MessageDialog.openInformation(null,"提示","请先在左边选择要删除的自动机");
						return;
					}
					machine = (AutoMachine)table.getItem(table.getSelectionIndex()).getData();
					AutoMachineFactory.getInstance().remove(machine);
					OldZdj.selectionChanged();
					if(AutoMachineFactory.getInstance().getMachines().size() ==0)
						modify.setEnabled(false);
				}else if(w == clear){
					clear();
				}
			}

			private boolean isValidate(String text, Vector states, Vector letters, Hashtable functions,String firState, Vector endStates) {
				// TODO 自动生成方法存根
				if(text.trim().equals("")||states.size() == 0||letters.size() ==0
						||functions == null||firState.trim().equals("")||endStates.size()==0)
					return false;
				return true;
			}
			
			private void clear(){
				txtLabel.setText("");
				lState_1.setText("未输入状态集");
				lLetter_1.setText("未输入字母表");
				lFunction_1.setText("未输入转换函数");
				lFirState_1.setText("未输入初始状态");
				lEndState_1.setText("未输入终止状态");
				bFirState_1.setEnabled(true);
			}
			private void init(){
				lState_1.setText("q0,q1,q2,q3,");
				lLetter_1.setText("a,b,");
				lFirState_1.setText("q0");
				lEndState_1.setText("q3,");
			}
		};
		bState_1.addSelectionListener(listener);
		bFunction_1.addSelectionListener(listener);
		bFirState_1.addSelectionListener(listener);
		bLetter_1.addSelectionListener(listener);
		bEndState_1.addSelectionListener(listener);
		sure.addSelectionListener(listener);
		modify.addSelectionListener(listener);
		clear.addSelectionListener(listener);
		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addSelectionListener(this);
	}
	
	private Vector analyzeLetters(String letters){
		letters = letters.substring(0,letters.length()-1);
		String[] array = letters.split(",");
		Vector<Character> letter = new Vector<Character>();
		if(array.length ==1 && array[0].trim().indexOf("未输入") != -1){
			return letter;
		}
		for(int i=0;i<array.length;i++){
			if(i==0){
				String temp = array[i];
				letter.add((temp.substring(temp.indexOf(":")+1, temp.length())).charAt(0));
				continue;
			}
			letter.add(array[i].charAt(0));
		}
		//MessageDialog.openError(null,"提示",letter.toString());
		return letter;
	}
	private Vector analyzeStates(String states){
		states = states.substring(0,states.length()-1);
		String[] array = states.split(",");
		Vector state = new Vector();
		if(array.length ==1 && array[0].trim().indexOf("未输入") != -1){
			return state;
		}
		for(int i=0;i<array.length;i++){
			if(i==0){
				String temp = array[i];
				state.add(temp.substring(temp.indexOf(":")+1, temp.length()));
				continue;
			}
			state.add(array[i]);
			
		}
		//MessageDialog.openError(null,"提示",state.toString());
		return state;
	}
	private Hashtable analyzeFunctions(String functions){
		functions = functions.trim().substring(0,functions.trim().length()-1);
		String[] array = functions.split(", ");
		Hashtable funs = new Hashtable();
		if(array.length ==1 && array[0].trim().equals("未输入转换函数")){
			return null;
		}
		for(int i=0;i<array.length;i++){
			
			String fun = array[i];
			int pos_one = fun.indexOf("(");
			int pos_two = fun.indexOf(",");
			int pos_thr = fun.indexOf(")");
			int pos_fou = fun.indexOf("=");
			String one = fun.substring(pos_one+1, pos_two).trim();
			char two = fun.substring(pos_two+1, pos_thr).trim().charAt(0);
			String three = fun.substring(pos_fou+1,fun.length()).trim();			
			Hashtable temp = new Hashtable();	
			temp.put(two,three);
			if(!funs.containsKey(one)){
				Vector<Hashtable> vecTemp = new Vector<Hashtable>();
				vecTemp.add(temp);
				funs.put(one, vecTemp);
			}else{
				Vector vecTemp = (Vector)funs.get(one);
				vecTemp.add(temp);
			}
			if(threeRow == null)
				threeRow = new Vector();
			
			String row = one+":"+two+":"+three;
			threeRow.add(row);
			//MessageDialog.openError(null,"提示",one+":"+two+":"+three);
			//MessageDialog.openError(null,"提示",temp.toString());
		}
		
		//MessageDialog.openError(null,"提示",""+array.length);
		return funs;
	}

	@Override
	public void setFocus() {
		// TODO 自动生成方法存根

	}

	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
		// TODO 自动生成方法存根
		
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -