[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Re: MeasureItem suppressing Table Resize Events?

Hi,

Tables do not usually send Resize events when adding items to them.  In your
case you receive one when adding an item because the Table is about to add a
vertical scrollbar (since your new item does not fit within the viewport)
which this reduces the size of its available client area.  However in the
Resize listener your snippet makes the Table and its parent large enough to
hold the new item, so the vertical scrollbar is never shown.  In your
snippet, once "Change Height" has been pressed the Table's scrollbar is
always visible, so Resize events are never received when adding new items.

Grant


"Jared Fordham" <jfordham@xxxxxxxxxx> wrote in message
news:001c1db62b24546c3bbc534078a3a55a$1@xxxxxxxxxxxxxxxxxx
> Hello-
>
> I'm noticing an inconsitent resize event behavior when the MeasureItem
> adjusts the size of my table.  If I don't adjust the height then
> everything seems to be fine.
>
> Windows Vista
> org.eclipse.swt (3.3.0.v3346)
>
> I've created a snippet that illustrates the problem I'm seeing.
>
> The add button will put new rows into the table.  The table resize
> listener will adjust the size of the parent.
>
> The change height button enables the MeasureItem listener to increase the
> height of the table rows.
>
> After enabling measureItem, the table resize listener is never called.
>
>
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.custom.ScrolledComposite;
> import org.eclipse.swt.events.ControlAdapter;
> import org.eclipse.swt.events.ControlEvent;
> import org.eclipse.swt.events.MouseAdapter;
> import org.eclipse.swt.events.MouseEvent;
> import org.eclipse.swt.events.SelectionAdapter;
> import org.eclipse.swt.events.SelectionEvent;
> import org.eclipse.swt.layout.GridData;
> import org.eclipse.swt.layout.GridLayout;
> import org.eclipse.swt.widgets.Button;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Event;
> import org.eclipse.swt.widgets.ExpandBar;
> import org.eclipse.swt.widgets.ExpandItem;
> import org.eclipse.swt.widgets.Listener;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.Table;
> import org.eclipse.swt.widgets.TableItem;
>
> public class TableSizeSnippet {
>     static ExpandBar bar = null;
>     static ExpandItem item = null;
>     static Table table0 = null;
>     static ScrolledComposite scroller = null;
>
>     public static void main(String[] args) {
>         final Display display = new Display();
>         final Shell shell = new Shell(display);
>         shell.setText("Table Size Tester");
>         GridLayout gridLayout = new GridLayout(5, false);
>         shell.setLayout(gridLayout);
>
>         final Button add = new Button(shell, SWT.PUSH);
>         add.setText("Add");
>         final Button hide = new Button(shell, SWT.PUSH);
>         hide.setText("Hide");
>         final Button show = new Button(shell, SWT.PUSH);
>         show.setText("Show");
>         final Button toggle = new Button(shell, SWT.TOGGLE);
>         toggle.setText("Change Height");
>         final Button tryAgain = new Button(shell, SWT.PUSH);
>         tryAgain.setText("Try Again");
>         tryAgain.addSelectionListener(new SelectionAdapter() {
>             @Override
>             public void widgetSelected(SelectionEvent e) {
>                 shell.setRedraw(false);
>                 toggle.setSelection(false);
>                 disposeControls();
>                 createControls(shell);
>                 addListeners(toggle);
>                 shell.layout();
>
> bar.setSize(bar.computeSize(scroller.getClientArea().width, SWT.DEFAULT));
>                 shell.setRedraw(true);
>             }
>         });
>
>         hide.addSelectionListener(new SelectionAdapter() {
>             @Override
>             public void widgetSelected(SelectionEvent e) {
>                 scroller.setVisible(false);
>             }
>         });
>         show.addSelectionListener(new SelectionAdapter() {
>             @Override
>             public void widgetSelected(SelectionEvent e) {
>                 scroller.setVisible(true);
>             }
>         });
>         add.addSelectionListener(new SelectionAdapter() {
>             @Override
>             public void widgetSelected(SelectionEvent e) {
>                 TableItem tableItem1 = new TableItem(table0, SWT.NONE);
>                 tableItem1.setText("Another Item");
>             }
>         });
>         toggle.addSelectionListener(new SelectionAdapter() {
>             @Override
>             public void widgetSelected(SelectionEvent e) {
>                 table0.redraw();
>             }
>         });
>
>         createControls(shell);
>         addListeners(toggle);
>
>         shell.setSize(400, 300);
>         shell.layout();
>         bar.setSize(bar.computeSize(scroller.getClientArea().width,
> SWT.DEFAULT));
>         shell.open();
>
>         while (!shell.isDisposed()) {
>             if (!display.readAndDispatch())
>                 display.sleep();
>         }
>         display.dispose();
>     }
>
>     private static void disposeControls() {
>         scroller.dispose();
>         bar.dispose();
>         item.dispose();
>         table0.dispose();
>
>         bar = null;
>         item = null;
>         table0 = null;
>         scroller = null;
>     }
>
>     private static void createControls(final Shell shell) {
>         scroller = new ScrolledComposite(shell, SWT.V_SCROLL);
>         scroller.setAlwaysShowScrollBars(true);
>         scroller.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
> true, 5, 1));
>         scroller.getVerticalBar().setIncrement(30);
>         bar = new ExpandBar(scroller, SWT.NONE);
>         scroller.setContent(bar);
>         item = new ExpandItem(bar, SWT.NONE);
>         item.setText("Table");
>         table0 = new Table(bar, SWT.BORDER);
>         item.setControl(table0);
>
>         table0.setLinesVisible(true);
>         TableItem tableItem1 = new TableItem(table0, SWT.NONE);
>         tableItem1.setText("Item1");
>         TableItem tableItem2 = new TableItem(table0, SWT.NONE);
>         tableItem2.setText("Item2");
>         item.setHeight(table0.computeSize(bar.getBounds().width,
> SWT.DEFAULT).y);
>         item.setExpanded(true);
>     }
>
>     private static void addListeners(final Button toggle) {
>         table0.addListener(SWT.MeasureItem, new Listener() {
>             @Override
>             public void handleEvent(Event event) {
>                 if (toggle.getSelection())
>                     event.height = 50;
>             }
>         });
>         table0.addControlListener(new ControlAdapter() {
>             @Override
>             public void controlResized(ControlEvent e) {
>                 item.setHeight(table0.computeSize(bar.getBounds().width,
> SWT.DEFAULT).y);
>
> bar.setSize(bar.computeSize(scroller.getClientArea().width, SWT.DEFAULT));
>             }
>         });
>         bar.addMouseListener(new MouseAdapter() {
>             @Override
>             public void mouseUp(MouseEvent e) {
>
> bar.setSize(bar.computeSize(scroller.getClientArea().width, SWT.DEFAULT));
>             }
>         });
>     }
> }
>
>