/* * Copyright (c) 2000, 2003 IBM Corp. All rights reserved. * This file is made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ /* * Table example snippet: place arbitrary controls in a table * * For a list of all SWT example snippets see * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets */ package org.gudy.azureus2.ui.swt.test; import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.custom.*; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; public class Main { private Color blue; private Table table; private boolean mousePressed; private TableItem selectedItem; Rectangle oldBounds; Image oldImage; public Main() { final Display display = new Display (); blue = new Color(display,0,0,128); final Shell shell = new Shell (display); GridLayout layout = new GridLayout(); layout.numColumns = 3; GridData gridData; shell.setLayout (layout); table = new Table (shell, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 3; table.setLayoutData(gridData); table.setLinesVisible (true); Font f = table.getFont(); FontData fd = f.getFontData()[0]; fd.setHeight(9); Font font = new Font(display, fd); table.setFont(font); Button bOk = new Button(shell,SWT.PUSH); bOk.setText("Ok"); gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END | GridData.HORIZONTAL_ALIGN_FILL); gridData.grabExcessHorizontalSpace = true; gridData.widthHint = 70; bOk.setLayoutData(gridData); Button bCancel = new Button(shell,SWT.PUSH); bCancel.setText("Cancel"); gridData = new GridData(GridData.HORIZONTAL_ALIGN_END); gridData.grabExcessHorizontalSpace = false; gridData.widthHint = 70; bCancel.setLayoutData(gridData); Button bApply = new Button(shell,SWT.PUSH); bApply.setText("Apply"); gridData = new GridData(GridData.HORIZONTAL_ALIGN_END); gridData.grabExcessHorizontalSpace = false; gridData.widthHint = 70; bApply.setLayoutData(gridData); for (int i=0; i<2; i++) { new TableColumn(table, SWT.NONE); } for (int i=0; i<12; i++) { createTableRow(-1,"Toto" + i , false); } TableItem item = new TableItem(table,SWT.NULL); item.setText(1,"---"); //Hack to get a correct width table.getColumn(0).setWidth(20); table.getColumn(1).setWidth(200); table.addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent arg0) { mousePressed = true; selectedItem = table.getItem(new Point(arg0.x,arg0.y)); if(selectedItem.getText(1).equals("---")) { selectedItem = null; } } public void mouseUp(MouseEvent e) { mousePressed = false; //1. Restore old image if(oldBounds != null && oldImage != null) { GC gc = new GC(table); gc.drawImage(oldImage,oldBounds.x,oldBounds.y); oldImage.dispose(); oldImage = null; oldBounds = null; } Point p = new Point(e.x,e.y); TableItem item = table.getItem(p); if(item != null && selectedItem != null) { int index = table.indexOf(item); int oldIndex = table.indexOf(selectedItem); if(index == oldIndex) return; String name = (String) selectedItem.getData("name"); Button oldBtn = (Button)selectedItem.getData("button"); boolean selected = oldBtn.getSelection(); oldBtn.dispose(); createTableRow(index,name,selected); selectedItem.dispose(); Point size = shell.getSize(); shell.setSize(size.x+1,size.y+1); shell.setSize(size); } } }); table.addMouseMoveListener(new MouseMoveListener(){ public void mouseMove(MouseEvent e) { if(mousePressed && selectedItem != null) { Point p = new Point(e.x,e.y); TableItem item = table.getItem(p); if(item != null) { GC gc = new GC(table); Rectangle bounds = item.getBounds(1); //1. Restore old image if(oldBounds != null && oldImage != null) { gc.drawImage(oldImage,oldBounds.x,oldBounds.y); oldImage.dispose(); oldImage = null; oldBounds = null; } //2. Store the image oldImage = new Image(display,bounds.width,2); gc.copyArea(oldImage,bounds.x,bounds.y); oldBounds = bounds; //3. Draw a thick line gc.setBackground(blue); gc.fillRectangle(bounds.x,bounds.y,bounds.width,2); } } } }); shell.pack (); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); if (font != null && !font.isDisposed()) { font.dispose(); } } private void createTableRow(int index,String name,boolean selected) { TableItem item; if(index == -1) item = new TableItem (table, SWT.NONE); else item = new TableItem (table, SWT.NONE,index); item.setText(1,name); item.setData("name",name); TableEditor editor = new TableEditor (table); Button button = new Button (table, SWT.CHECK); button.setSelection(selected); button.pack (); editor.minimumWidth = button.getSize ().x; editor.horizontalAlignment = SWT.CENTER; editor.setEditor (button, item, 0); item.setData("button",button); } public static void main(String[] args) { new Main(); } }