📄 listbodycomposite.java
字号:
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 + -