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

📄 listbodycomposite.java

📁 利用它可以做出非常漂亮的swt界面,包含的组件有PShelf Plist
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.swtplus.widgets.list.internal;

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

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import com.swtplus.internal.PGC;
import com.swtplus.widgets.PListItem;
import com.swtplus.widgets.PList;
import com.swtplus.widgets.list.IListStrategy;

/**
 * 
 *
 * @author chris
 */
public class ListBodyComposite extends Canvas {

    private PList list;
    private IListStrategy strategy;
    
    private ArrayList items = new ArrayList();

    private ArrayList selectedItems = new ArrayList();
    
    private PListItem focus;
    private PListItem previousFocus;
    
    private ArrayList heights = new ArrayList();
    
    private int hovering = -1;
    private int previousHovering = -1;
    
    private ArrayList selectListeners = new ArrayList();
    
    private boolean singleSelect = false;

    /**
     * @param parent
     * @param style
     */
    public ListBodyComposite(Composite parent, int style) {
        super(parent, SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED );
        
        list = (PList) parent;
        
        this.addPaintListener(new PaintListener(){
            public void paintControl(PaintEvent arg0) {
                paint(arg0);
            }});
     
        
        this.addMouseListener(new MouseListener(){
            public void mouseDoubleClick(MouseEvent e) {
            }
            public void mouseDown(MouseEvent e) {
                PListItem item = findItem(e.x,e.y);
                if (item == null)
                    return;
                if (selectedItems.size() == 1 && selectedItems.contains(item))
                	return;
                if (e.button != 1){
                    if (selectedItems.contains(item))
                        return;
                }
                previousFocus = focus;
                focus = item;
                reveal(item);
                updateSelection(item,e.stateMask);
            }
            public void mouseUp(MouseEvent e) {
            }});
        
        this.addKeyListener(new KeyListener(){
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.ARROW_UP){
                    if (focus != null){
                        int item = items.indexOf(focus);
                        if (item > 0){
                            item --;
                            previousFocus = focus;
                            focus = (PListItem) items.get(item);
                            reveal(focus);
                            updateSelection(focus,e.stateMask);
                        }
                    }
                } else if (e.keyCode == SWT.ARROW_DOWN) {
                    if (focus != null){
                        int item = items.indexOf(focus);
                        if (item < items.size() -1){
                            item ++;
                            previousFocus = focus;
                            focus = (PListItem) items.get(item);
                            reveal(focus);
                            updateSelection(focus,e.stateMask);
                        }
                    }                 
                }
            }
            public void keyReleased(KeyEvent e) {
            }});
        
        addListener (SWT.Traverse, new Listener () {
    		public void handleEvent (Event e) {
    			switch (e.detail) {
    				/* Do tab group traversal */
    				case SWT.TRAVERSE_ESCAPE:
    				case SWT.TRAVERSE_RETURN:
    				case SWT.TRAVERSE_TAB_NEXT:	
    				case SWT.TRAVERSE_TAB_PREVIOUS:
    				case SWT.TRAVERSE_PAGE_NEXT:	
    				case SWT.TRAVERSE_PAGE_PREVIOUS:
    					e.doit = true;
    					break;
    			}
    		}
    	});
    	
        addListener (SWT.FocusIn, new Listener () {
    		public void handleEvent (Event e) {
    			paintItems(new int[]{indexOf(focus)});
				//reveal(getSelectionIndex());
    		    //redraw();
    		}
    	});
        addListener (SWT.FocusOut, new Listener () {
    		public void handleEvent (Event e) {
    			paintItems(new int[]{indexOf(focus)});
    		    //redraw();
    		}
    	});
        
        addMouseTrackListener(new MouseTrackListener(){
            public void mouseEnter(MouseEvent e) {
                int item = findItemNumber(e.x,e.y);
                if (item != hovering){
                	previousHovering = hovering;
                    hovering = item;
                    if (strategy.isHoverOnUnselected())
                        redrawOnHover();
                }
            }
            public void mouseExit(MouseEvent e) {
            	previousHovering = hovering;
                hovering = -1;
                if (strategy.isHoverOnUnselected())
                    redrawOnHover();
            }
            public void mouseHover(MouseEvent e) {
            }
        });
        	
        this.addMouseMoveListener(new MouseMoveListener(){
            public void mouseMove(MouseEvent e) {
                int item = findItemNumber(e.x,e.y);
                if (item != hovering){
                	previousHovering = hovering;
                    hovering = item;
                    if (strategy.isHoverOnUnselected())
                        redrawOnHover();
                }
            }});
        
    }
    
    void paint(PaintEvent e){
        
        Font f = e.gc.getFont();
        Color back = e.gc.getBackground();
        Color fore = e.gc.getForeground();

        
        int yOffset = 0;
        int i = 0;
        
        PGC gcPlus = new PGC(e.gc);
        
        for (Iterator iter = items.iterator(); iter.hasNext();) {
            PListItem item = (PListItem) iter.next();
            
            if (i > 0)
                yOffset += ((Integer) heights.get(i - 1)).intValue();
            
            if (e.gc.getClipping().y > yOffset + ((Integer)heights.get(i)).intValue() ){
        		i ++;
        		continue;  
            }
            
            if (e.gc.getClipping().y + e.gc.getClipping().height < yOffset){
            	return;
            }
            
            gcPlus.setYOffset(yOffset);

            strategy.paintItem(item,gcPlus,selectedItems.contains(item),focus == item && this.isFocusControl(),i == hovering,new Point(getSize().x,((Integer)heights.get(i)).intValue()));
            
            e.gc.setFont(f);
            e.gc.setBackground(back);
            e.gc.setForeground(fore);
            
            i ++;
        }        
    }
    

    public Point computeSize(int wHint, int hHint, boolean changed) {
        int width = wHint;
        if (width == SWT.DEFAULT)
            width = 125;
        int height = 0;
        int i = 0;
        
        heights.clear();
        
        GC gc = new GC(this);
        PGC gcPlus = new PGC(gc);
        
        for (Iterator iter = items.iterator(); iter.hasNext();) {
            PListItem item = (PListItem) iter.next();
            
            Integer newHeight = new Integer(strategy.computeSize(item,gcPlus,width, SWT.DEFAULT).y);
            heights.add(newHeight);
            height += newHeight.intValue();
            
            i++;
        }
        
        gc.dispose();
        
        Point size = new Point(width,height);  
        
        return size;
    }
    
    public void createItem(PListItem item,int beforeIndex){
        strategy.checkItem(item);
        
        if (beforeIndex == -1){
            items.add(item);
        } else {
            items.add(beforeIndex,item);
        }
        //TODO resize/reflow?
        redraw();
    }

    
    public void setBackground(Color color) {
        super.setBackground(color);
    }
     
    public int findItemNumber(int x, int y){
        int height = 0;
        int i = 0;
        for (i = 0; i < heights.size(); i++) {
            height += ((Integer) heights.get(i)).intValue();
            if (y <= height){
                break;
            }
        }    
        return i;
    }
    
    public PListItem findItem(int x,int y){

⌨️ 快捷键说明

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