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

📄 tableeditpart.java

📁 对eclipse gef进行封装,可以生成图形化编辑器
💻 JAVA
字号:
/*******************************************************************************
 * $Header: /cvsroot/EOS6/work_dir/niegy/com.primeton.studio.gef.ui/src/com/primeton/studio/gef/ui/parts/TableEditPart.java,v 1.5 2006/12/30 02:45:04 niegy Exp $
 * $Revision: 1.5 $
 * $Date: 2006/12/30 02:45:04 $
 *
 *==============================================================================
 *
 * Copyright (c) 2001-2006 Primeton Technologies, Ltd.
 * All rights reserved.
 * 
 * Created on 2006-11-21
 *******************************************************************************/


package com.primeton.studio.gef.ui.parts;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.gef.editpolicies.DirectEditPolicy;
import org.eclipse.gef.editpolicies.LayoutEditPolicy;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.gef.tools.DragEditPartsTracker;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;

import com.primeton.studio.gef.core.Node;
import com.primeton.studio.gef.core.CorePackage;
import com.primeton.studio.gef.core.NodeElement;
import com.primeton.studio.gef.core.TNodeType;
import com.primeton.studio.gef.ui.GefUiPluginImages;
import com.primeton.studio.gef.ui.commands.ChangeNameCommand;
import com.primeton.studio.gef.ui.commands.NodeCreateCommand;
import com.primeton.studio.gef.ui.editor.AbstractGraphicalEditor;
import com.primeton.studio.gef.ui.figure.FigureKeyListener;
import com.primeton.studio.gef.ui.figure.TableFigure;

/**
 * TODO 此处填写 class 信息
 *
 * @author niegy (mailto:niegy@primeton.com)
 */
/*
 * 修改历史
 * $Log: TableEditPart.java,v $
 * Revision 1.5  2006/12/30 02:45:04  niegy
 * 重构代码
 *
 * Revision 1.4  2006/12/11 08:36:11  niegy
 * 设置是否画间隔间的连线
 *
 * Revision 1.3  2006/12/05 05:18:59  niegy
 * 修改模型,增加连线的扩展点
 *
 * Revision 1.2  2006/11/23 02:42:21  niegy
 * table
 *
 * Revision 1.1  2006/11/22 07:07:38  niegy
 * 增加table
 * 
 */
public class TableEditPart extends BaseEditPart {

	private static Font ITALICS;
	private List modelChildren;
	/**
	 * @param editor
	 */
	public TableEditPart(AbstractGraphicalEditor editor) {
		super(editor);
		// TODO Auto-generated constructor stub
		modelChildren = new ArrayList();
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.BaseEditPart#createDirectEditPolicy()
	 */	
	protected DirectEditPolicy createDirectEditPolicy() {
		// TODO Auto-generated method stub
		return new DirectEditPolicy() {
			protected Command getDirectEditCommand(DirectEditRequest request) {
				return new ChangeNameCommand(getCastedModel(), 
						(String)request.getCellEditor().getValue());
			}
			protected void showCurrentEditValue(DirectEditRequest request) {
				IFigure fig = getDirectEditFigure();
				if (fig instanceof Label) {
					((Label)fig).setText((String)request.getCellEditor().getValue());
					fig.getUpdateManager().performUpdate();
				}
			}
		};
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.BaseEditPart#createEditPolicies()
	 */
	
	protected void createEditPolicies() {
		// TODO Auto-generated method stub
		super.createEditPolicies();
		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
		installEditPolicy(EditPolicy.LAYOUT_ROLE, new LayoutEditPolicy() {
			protected EditPolicy createChildEditPolicy(EditPart child) {
				return null;
			}
			protected Command getCreateCommand(CreateRequest request) {
				if (request.getNewObject() instanceof NodeElement){
						if(((NodeElement)request.getNewObject()).getNodeType()==TNodeType.ATTRICOLUMN_LITERAL ||
								((NodeElement)request.getNewObject()).getNodeType()==TNodeType.OPERATIONCOLUMN_LITERAL)
					return new NodeCreateCommand(
							getCastedModel(),
							request,null);
				}
				return UnexecutableCommand.INSTANCE;
			}
			protected Command getDeleteDependantCommand(Request request) {
				return null;
			}
			protected Command getMoveChildrenCommand(Request request) {
				return UnexecutableCommand.INSTANCE;
			}
		});
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.BaseEditPart#getDragTracker(org.eclipse.gef.Request)
	 */
	
	public DragTracker getDragTracker(Request request) {
		// TODO Auto-generated method stub
		return new DragEditPartsTracker(this);
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.NodeEditPartEx#refreshVisuals()
	 */
	
	protected void refreshVisuals() {
		// TODO Auto-generated method stub
//		super.refreshVisuals();
		Rectangle constraint = new Rectangle(0, 0, -1, -1);
		Point point = new Point(getCastedModel().getLocation().getX(),getCastedModel().getLocation().getY());
		constraint.setLocation(point);
		constraint.width = getCastedModel().getSize().getWidth();
		((GraphicalEditPart)getParent()).setLayoutConstraint(this, getFigure(), constraint);
		refreshTable();
	}

	private void refreshTable(){//GefUiPluginImages
		Label header = (Label)((TableFigure)getFigure()).getHeader();
		header.setText(getCastedModel().getName());
		header.setIcon(GefUiPluginImages.CLASS);
		
//		if (getEClass().isAbstract()) {
//			if (ITALICS == null) {
//				FontData[] fontDatas = header.getFont().getFontData();
//				for (int i = 0; i < fontDatas.length; i++) {
//					fontDatas[i].setStyle(fontDatas[i].getStyle() | SWT.ITALIC);
//				}
//				ITALICS = new Font(null, fontDatas);
//			}
//			header.setFont(ITALICS);
//			getFigure().setBackgroundColor(ColorConstants.lightGreen);
//		} else {
			header.setFont(null);
			getFigure().setBackgroundColor(TableFigure.CLASS_COLOR);
//		}
	}
	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.NodeEditPartEx#notifyChanged(org.eclipse.emf.common.notify.Notification)
	 */
	
	public void notifyChanged(Notification notification) {
		// TODO Auto-generated method stub
		int type = notification.getEventType();
	    int featureId = notification.getFeatureID(CorePackage.class);
	    switch(type) {
		    case Notification.ADD:
		    case Notification.REMOVE:
		    	 switch(featureId) {
		    	 case CorePackage.NODE_ELEMENT__NODES:
//		    		 ((EditPart)getChildren().get(0)).refresh();
//		    		 ((EditPart)getChildren().get(1)).refresh();
		    		    refreshChildren();
		    		 break;
//		    	 case TNodeType.OPERATIONCOLUMN:
//		    		 ((EditPart)getChildren().get(1)).refresh();
//		    		 break;
		    	 }
		    case Notification.SET:
		    	 switch(featureId) {
		    	 case CorePackage.NODE__NAME:
		    		 refreshVisuals();
		    		 break;
		    	 }
	    }
		super.notifyChanged(notification);
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.BaseEditPart#createFigure()
	 */
	
	protected IFigure createFigure() {
		// TODO Auto-generated method stub
		Label label = new Label();
		label.addKeyListener(new FigureKeyListener());
		return new TableFigure(label);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getContentPane()
	 */
	
	public IFigure getContentPane() {
		// TODO Auto-generated method stub
		return ((TableFigure)getFigure()).getContentPane();
	}

	/* (non-Javadoc)
	 * @see com.primeton.studio.gef.ui.parts.BaseEditPart#getDirectEditFigure()
	 */
	IFigure getDirectEditFigure() {
		// TODO Auto-generated method stub
		return ((TableFigure)getFigure()).getHeader();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
	 */	
	protected List getModelChildren() {
		// TODO Auto-generated method stub
		modelChildren.clear();
		//儿子为空的情况
		nullNodeCase();
		List operList = new ArrayList();
		boolean isAttri = false;
		for (int i=0; i < getCastedModel().getNodes().size(); i++) {
			NodeElement element = (NodeElement) getCastedModel().getNodes().get(i);
			if(element.getNodeType()==TNodeType.ATTRICOLUMN_LITERAL){
				//第一次不增加操作
				if(i != 0)
					modelChildren.add(new PlaceHolderModel(operList));
				operList = new ArrayList();
				modelChildren.add(new PlaceHolderModel(element));
				//当前接口是最后一个节点
				if(i+1==getCastedModel().getNodes().size()){
					modelChildren.add(new PlaceHolderModel(operList));
					operList = new ArrayList();
				}
//				else{
//					Node element1 = (Node) getCastedModel().getNodes().get(i+1);
//					//当前接口的下一个节点是接口
//					if(element1.getNodeType()== TNodeType.ATTRICOLUMN_LITERAL)
//						modelChildren.add(new PlaceHolderModel(operList));
//				}
				isAttri = true;
			}
			else if(element.getNodeType()==TNodeType.OPERATIONCOLUMN_LITERAL){
				isAttri = false;
				operList.add(element);
			}
		}
		if(operList.size()>0)
			modelChildren.add(new PlaceHolderModel(operList));
		return modelChildren;
	}

	
	private void nullNodeCase(){
		int attriNum = 0;
		int operNum = 0;
		if(getCastedModel().getNodes().size()>0)
			for (Iterator iter = getCastedModel().getNodes().iterator(); iter.hasNext();) {
				NodeElement element = (NodeElement) iter.next();
				if(element.getNodeType() == TNodeType.ATTRICOLUMN_LITERAL)
					attriNum++;
				else if(element.getNodeType() == TNodeType.OPERATIONCOLUMN_LITERAL)
					operNum++;
			}
		if(attriNum == 0){
			modelChildren.add(new PlaceHolderModel(getCastedModel()));
			modelChildren.add(new PlaceHolderModel(new ArrayList()));
		}
	}
	public static final class PlaceHolderModel{
		private NodeElement nodeElement;
		private boolean attriColumn;
		private boolean isDrawLine = true;
		List attriList = new ArrayList();
		List operList = null;
		public PlaceHolderModel(NodeElement nodeElement) {
			if(nodeElement.getNodeType() == TNodeType.ATTRICOLUMN_LITERAL){
				this.nodeElement = nodeElement;
				attriList.add(nodeElement);
			}
			this.attriColumn = true;
		}
		
		public void setDrawLine(boolean drawLine){
			isDrawLine = drawLine;
		}
		
		public boolean isDrawLine(){
			return	isDrawLine;
		}
		public PlaceHolderModel(List list){
			operList = list;
			this.attriColumn = false;
		}
		public NodeElement getNode(){
			return nodeElement;
		}
		
		public boolean isAttri(){
			return attriColumn;
		}
		public List getChildren() {
			if(attriColumn)
				return attriList;
			else
				return operList;
			
//			for (Iterator iter = node.getNodes().iterator(); iter.hasNext();) {
//				Node element = (Node) iter.next();
//				if(element.getNodeType()==TNodeType.ATTRICOLUMN_LITERAL)
//					attriList.add(element);
//				else if(element.getNodeType()==TNodeType.OPERATIONCOLUMN_LITERAL)
//					operList.add(element);
//			}
//			if (attriColumn){				
//				return attriList;
//			}
//			else{
//				return operList;
//			}
		}
	}
	
	
}

⌨️ 快捷键说明

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