proppanel.java

来自「一个简单的visio程序。」· Java 代码 · 共 1,380 行 · 第 1/3 页

JAVA
1,380
字号
package webide.views.prop;

import java.awt.Font;
import java.awt.Color;
import java.awt.Panel;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Scrollbar;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
import java.beans.PropertyEditor;
import webide.itools.Util;
import Editor.*;
import HAB.object.*;

public class PropPanel extends Panel implements AdjustmentListener,	KeyListener,
												MouseListener, MouseMotionListener,
												ComponentListener
{
	private  boolean        componentresize = false;
	private  boolean        mousedragged    = false;
	private  boolean        mousepressed    = false;
	private  boolean		keypressed      = false;
	private  boolean        keyReleased     = false;
	private  boolean        valuechanged    = false;
	
	private  int            bwidth          = 16;
	private  int            currentRow      = 0;
	         int            CurrentValue    = -1;    
	private  int            increaseunit    = 0;
	private  int            maxLength       = 0;
	private  int            pointcount      = 0;
	private  int            properlength;
	private  int            rowheight       = 16;
	private  int            ScrollMoveCount = 0;
	private  int            scrollwidth     = 16;
	private  int            strLeft         = 2;	
	private  int            start           = 0;
	private  int            Wodd            = 6;
	private  int            Hodd            = 8;
	private  int            wodd            = 0;
	private  int            hodd            = 0;
	
	private  String         label0;
	private  String         label1;
	
	private  webide.Wrapper wrapper         = null;
	public   PropSheet      propsheet       = null;
	private  Component      isVisibelView;
	public   Component      views[];
	public   Hashtable      pTab            = null;
	private  Image          offImage;
	private  Graphics       offGrap;
	private  Scrollbar      scrollbar ;
	private  Font           f;
	
	/**
	 *Constructor
	 */
	public PropPanel(PropSheet propsheet)  
	{
		super();
		this.propsheet = propsheet;
		setLayout(null);
		setBackground(Color.white);

		scrollbar = new Scrollbar();
		add(scrollbar);

		wrapper = webide.MainConsole.currentFocus;
		pTab = new Hashtable();		
		f = new Font("Dialog",Font.PLAIN,11);
		wodd = Wodd/2;
		hodd = Hodd/2;

		addKeyListener(this);
		addMouseListener(this);
		addMouseMotionListener(this);
		addComponentListener(this);
		scrollbar.addAdjustmentListener(this);
		doLayout();
	}

/* ---------------------------------------- Paint -------------------------------------- */

    public void update(Graphics g) 
	{
	    int l = -1;

        if (g == null) {
             return;
        }
        Dimension d = getSize();
		
		g.setColor(Color.gray);
		g.drawLine(1,2,d.width-2,2);
		g.drawLine(1,2,1,d.height-3);
		g.setColor(Color.black);
		g.drawLine(2,3,d.width-3,3);
		g.drawLine(2,3,2,d.height-4);

		g.setColor(Color.white);
		g.drawLine(1,d.height-3,d.width-2,d.height-3);
		g.drawLine(d.width-2,2,d.width-2,d.height-3);
		g.setColor(Color.lightGray);
		g.drawLine(2,d.height-4,d.width-3,d.height-4);
		g.drawLine(d.width-3,3,d.width-3,d.height-4);
		
		g.drawLine(0,0,0,d.height-1);
		g.drawLine(0,0,d.width-1,0);
		g.drawLine(d.width-1,0,d.width-1,d.height-1);
		g.drawLine(0,d.height-1,d.width-1,d.height-1);

		g.drawLine(1,1,d.width-2,1);
		g.drawLine(1,d.height-2,d.width-2,d.height-2);
				
        if (offImage == null || componentresize) {
			if(d.width < Wodd || d.height < Hodd) return;
            offImage = createImage(d.width - Wodd, d.height - Hodd);
        }
        if(offImage == null) return;
        offGrap  = offImage.getGraphics();

        offGrap.setColor(Color.white);
        offGrap.fillRect(0,0,d.width - Wodd, d.height - Hodd);		
		
		if(pTab != null)
		{	
			if(mousepressed && pTab.size() != 0)
			{
				offGrap.setColor(new Color(0x00000080));
				offGrap.fillRect(0,getL()*rowheight,100+getAddLength()-scrollwidth-8, rowheight);
				l = getL();
				CurrentValue = getL();
				mousepressed = false;
			}
			else if(valuechanged && pTab.size() != 0)
			{
				offGrap.setColor(new Color(0x00000080));
				CurrentValue = CurrentValue - increaseunit;
				l = CurrentValue;
				offGrap.fillRect(0,CurrentValue*rowheight,100+getAddLength()-scrollwidth-8, rowheight);
				valuechanged = false;         
			}
			else if(pTab.size() != 0)
			{
				offGrap.setColor(new Color(0x00000080));
				//start = 0;
				//scrollbar.setValue((start+1)*16);
				offGrap.fillRect(0,CurrentValue*rowheight,100+getAddLength()-scrollwidth-8,rowheight);
				l = CurrentValue;
				componentresize = false;
			} 
			offGrap.setColor(Color.black);
			offGrap.setFont(f);
	
			int HashSize = pTab.size();
			int PropSize = propsheet.properties.length;
			if(HashSize != PropSize) return;

			for(int i = 0; i < pTab.size()-start; i++)
			{
				Object s[] = (Object[])pTab.get(""+(i+start));

				PropertyEditor EDitor = (PropertyEditor)s[3];
				label0 = s[0].toString();
				label1 = getPropToLabel(((Integer)s[1]).intValue(), views[i+start], (PropertyEditor)s[3]);
				
				if( label0 == null)
					label0 = "";
				if(label1 == null)
					label1 = "";
            
				// label0 is the property name, label1 is the property value.
				if(i == l)
				{
				    	
					offGrap.setColor(Color.white);
    				offGrap.drawString(label0, strLeft, rowheight-2+rowheight*i);
					if(EDitor instanceof Editor.ColorEditor)
					{
						Object val = wrapper.getPropValue(((Integer)s[1]).intValue());
						int Icolor = ((Integer)val).intValue();
						Color color = Util.updateColor(Icolor);
						int colorwidth = 0;
						if(views[i+start].isVisible())
							colorwidth = getEditWidth() - bwidth - 4;
						else
							colorwidth = getEditWidth() - 4;
						offGrap.setColor(color);
						offGrap.fillRect(101+getAddLength()+strLeft-scrollwidth-8, rowheight*i + 2, colorwidth, rowheight-4);
					}
					else
					{    					
    					offGrap.setColor(Color.black);
    					offGrap.drawString(label1, 101+getAddLength()+strLeft-scrollwidth-8,rowheight-4+rowheight*i);
					}
				} 
				else
				{    			  
					offGrap.setColor(Color.black);
    				offGrap.drawString(label0, strLeft,rowheight-2+rowheight*i);
					if(EDitor instanceof Editor.ColorEditor)
					{
						Object val = wrapper.getPropValue(((Integer)s[1]).intValue());
						int Icolor = ((Integer)val).intValue();
						Color color = Util.updateColor(Icolor);
						int colorwidth = getEditWidth() - 4;
						offGrap.setColor(color);
						offGrap.fillRect(101+getAddLength()+strLeft-scrollwidth-8, rowheight*i + 2, colorwidth, rowheight-4);
					}
					else
    					offGrap.drawString(label1, 101+getAddLength()+strLeft-scrollwidth-8,rowheight-4+rowheight*i);
				}
				offGrap.setColor(Color.lightGray);
				offGrap.drawLine(0,rowheight*i+rowheight,d.width,rowheight*i+rowheight);
			} 
		}
		offGrap.drawLine(100+getAddLength()-scrollwidth-8,0,100+getAddLength()-scrollwidth-8,rowheight*(pTab.size()-1-start)+rowheight);
		
        g.drawImage(offImage, wodd, hodd,this);
        offGrap.dispose();        
    }   

    public void paint(Graphics g) 
	{
        update(g);
    }

/* ------------------------------------------ Method --------------------------------------*/

	/**
	 *Private Methods
	 */
	public void setHashtable(Hashtable tab)   
	{
		if(views != null)
		{		
			for(int i = 0; i < views.length; i++ )
			{			
				if(views[i] != null)
					remove(views[i]);
				else 
					System.err.println("views is null " + ((Object [])pTab.get(""+i))[0]);
			} 
		}
		if(tab == null)
		{
			pTab.clear();
			views = new PropTextbox[0];
			repaint();
			return;
		}      
		
		pTab.clear();
		properlength = tab.size();
		views = new Component[tab.size()];
	
		int i = 0;
		Vector vec = SortedElement(tab);
		for(i = 0; i < vec.size(); i++)
		{
			Object[] ss = new Object[4];
			ss[0] = capitalize((String)vec.elementAt(i));
			Object[] obj = (Object[])tab.get(ss[0].toString().toLowerCase());
			ss[1] = (Integer)obj[0];
			ss[2] = (Class)obj[1];
			ss[3] = (PropertyEditor)obj[2];
			PropertyEditor editor = (PropertyEditor)obj[2];

			if(editor == null) 
			{
				System.out.println("Name : " + (String)ss[0] + "editor in PropPanel : " + editor + " --->>Value : " + obj[3]);
				maxLengthString((String)ss[0]);
				continue;
			}			

			if(((String)ss[0]).equalsIgnoreCase("custom")) 
			{     
				views[i] = new SubButton(this, editor);
				System.out.println("this is Custom");
			} 
			else if (editor.isPaintable() && editor.supportsCustomEditor()) 
			{
				 if(editor instanceof Editor.ColorEditor
				 || editor instanceof Editor.VBListEditor
				 || editor instanceof Editor.ItemListEditor)
				{
            		views[i] = new DropButton(this, editor);
				}
				else
				{
            		views[i] = new SubButton(this, editor);
            	}
			}
			else if(editor.getTags() != null)
			{
				views[i] = new PropChoice(this, editor);
			}
			else if (obj[3] instanceof Object[]) 
			{
				views[i] = new PropChoice(this, editor);
			}			
			else if(editor instanceof Editor.PictureEditor)
			{
				views[i] = new SubButton(this, editor);
        	}
			else if(editor.getAsText() != null)
			{
				views[i] = new PropTextbox(this, editor);
			}

			if(views[i] == null) System.out.println("name : " + ss[0] + "-->>type : " + ss[2] + " << -- Value " + obj[3].getClass());
			add(views[i]);
			views[i].setVisible(false);

			pTab.put(""+i,ss);
			maxLengthString((String)ss[0]);
		}
	
		if((getSize().height - 8) >= properlength*rowheight)
		{
			start = 0;
			scrollbar.setVisible(false);
			update(getGraphics());
			return;
		}		
		scrollbar.setBounds(getSize().width-scrollwidth - wodd, hodd, scrollwidth+1,getSize().height-6);
		scrollbar.setVisible(true);

		scrollbar.setMaximum((properlength+1)*rowheight);
		scrollbar.setMinimum(0);
		scrollbar.setVisibleAmount(getSize().height - Hodd);
		scrollbar.setBlockIncrement(rowheight*4);
		scrollbar.setUnitIncrement(rowheight);

		float max    = properlength*rowheight;
		float value   = (float)scrollbar.getValue();
		start = (int)((value/max)*((float)properlength));

		repaint();
	}

	private String capitalize(String aString) 
	{
		StringBuffer workString;

		if ( aString.length() == 0 ) 
		{
			return aString;
		}

		workString = new StringBuffer(aString);
		workString.setCharAt(0, Character.toUpperCase(workString.charAt(0)) );

		return workString.toString();
	}

	private Vector SortedElement(Hashtable tab)
	{
		Vector vec = new Vector();
		for(Enumeration e = tab.keys(); e.hasMoreElements();)
		{
			String str = (String)e.nextElement();
				
			if(vec.size() > 0)
			{
				boolean insert = false;
				for(int j = 0; j < vec.size(); j++)
				{
					if(str.compareTo((String)vec.elementAt(j)) <= 0)
					{
						insert = true;
						vec.insertElementAt(str, j);
						break;
					}					
				}
				if(!insert) 
				{
					vec.addElement(str);
				}
			}
			else
				vec.addElement(str);			
		}		
		return vec;
	}
	
	public Component[] getViews()
	{
	    Component[] VIEWS = new Component[views.length];
	    for(int i = 0; i < views.length; i++)
	    {
	        Object s[] = (Object[])pTab.get(""+i);
	        int j = ((Integer)s[1]).intValue();
	        VIEWS[j] = views[i];
	    }
	    return VIEWS;
	}

	private String getPropToLabel(int i, Component view, PropertyEditor editor) 
	{

	    String             nm   = this.propsheet.properties[i].getDisplayName();
		webide.MainConsole mM   = webide.MainConsole.getMainConsole();

        Object value = null;

		if(wrapper != null)
			value = wrapper.getPropValue(i);

        String contrlname = "";
        if(wrapper != null && wrapper.getChild() != null && !(wrapper.getChild() instanceof webide.form.PainterForm))
		{
            webide.Controlslist contrl = wrapper.getControl();
            if(contrl != null)
            contrlname  = contrl.className;
        }
        if (value == null) value = "";

		String label = "";
		String name = nm.toLowerCase();

        try
		{
			if(view instanceof PropChoice)
			{
				try
				{
            		editor.setValue(value);
				}
				catch(Exception e)
				{
					System.err.println("Warning2: " + e);
				}

				try
				{
    				label = editor.getAsText();
				}
				catch(Exception e)
				{
					System.err.println("Warning3: " + e);
				}
				return label;
			}
			else if(name.equalsIgnoreCase("propertypages"))

⌨️ 快捷键说明

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