[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Re: Snippet234, synchronized table scroll problem on OSx

Hi,

It looks like the snippet you posted is the swt-only one that doesn't show
errors, so I'm not sure what the problem is that you're seeing.  That being
said, if the introduction of a TreeViewer is what makes errors start
happening then the eclipse.platform.jface newsgroup could be a better place
to post the jface snippet.

Grant


"Wim Jongman" <wim.jongman@xxxxxxxxx> wrote in message
news:h81apk$41b$1@xxxxxxxxxxxxxxxxxxxx
> Hi Grant,
>
> I have a huge problem getting this to work in combination with the
> SWT.VIRTUAL style and a jface lazytree contentprovider. I tried
SWT.VIRTUAL
> in combination with an SWT.SetData event listener which works great.
However,
> when I wrap a TreeViewer around the tree, I get a lot of errors.
>
> Any ideas on this or should I try the JFACE newsgroup.
>
> Here is your snippet with the SWT.VIRTUAL and with a gridlayout for
sizing.
> Please note that the SWT.NO_SCROLL eliminates the need for the expand
> listeners.
>
> Thanks,
>
> Wim
>
>
>
/***************************************************************************
****
> * Copyright (c) 2000, 2008 IBM Corporation and others.
> * All rights reserved. This program and the accompanying materials
> * are made available under the terms of the Eclipse Public License v1.0
> * which accompanies this distribution, and is available at
> * http://www.eclipse.org/legal/epl-v10.html
> *
> * Contributors:
> * IBM Corporation - initial API and implementation
>
>
****************************************************************************
***/
> package org.eclipse.swt.snippets;
>
> /*
> * ScrolledComposite snippet: use a ScrolledComposite to scroll a virtual
Tree
> vertically
> *
> * For a list of all SWT example snippets see
> * http://www.eclipse.org/swt/snippets/
> */
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.custom.ScrolledComposite;
> import org.eclipse.swt.events.SelectionAdapter;
> import org.eclipse.swt.events.SelectionEvent;
> import org.eclipse.swt.graphics.Point;
> import org.eclipse.swt.graphics.Rectangle;
> 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.Listener;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.Tree;
> import org.eclipse.swt.widgets.TreeItem;
>
> public class Snippet296Virtual {
>
> public static void main(String[] args) {
> final Display display = new Display();
> Shell shell = new Shell(display);
> shell.setBounds(10, 10, 300, 300);
> shell.setLayout(new GridLayout(1, true));
> final ScrolledComposite sc = new ScrolledComposite(shell, SWT.VERTICAL);
> sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
> // sc.setBounds (10, 10, 280, 200);
>
> final Tree tree = new Tree(sc, SWT.VIRTUAL | SWT.NO_SCROLL);
> tree.addListener(SWT.SetData, new Listener() {
>
> public void handleEvent(Event event) {
> TreeItem item = (TreeItem) event.item;
> System.out.println(tree.indexOf(item));
> TreeItem parentItem = item.getParentItem();
> String text = null;
> if (parentItem == null) {
> text = "node " + tree.indexOf(item);
> } else {
> text = parentItem.getText() + " - "
> + parentItem.indexOf(item);
> }
> item.setText(text);
> System.out.println(text);
> item.setItemCount(10);
> }
> });
>
> tree.setItemCount(100);
> sc.setContent(tree);
> sc.setExpandHorizontal(true);
> //sc.setExpandVertical(true);
> final int clientWidth = shell.getClientArea().width;
> System.out.println("clientwidth " + clientWidth);
> int prefHeight = tree.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
> System.out.println("prefHeight " + prefHeight);
> tree.setSize(clientWidth, prefHeight);
>
> /*
> * The following listener ensures that a newly-selected item in the Tree
> * is always visible.
> */
> tree.addSelectionListener(new SelectionAdapter() {
> public void widgetSelected(SelectionEvent e) {
> TreeItem[] selectedItems = tree.getSelection();
> if (selectedItems.length > 0) {
> Rectangle itemRect = selectedItems[0].getBounds();
> Rectangle area = sc.getClientArea();
> Point origin = sc.getOrigin();
> if (itemRect.x < origin.x
> || itemRect.y < origin.y
> || itemRect.x + itemRect.width > origin.x
> + area.width
> || itemRect.y + itemRect.height > origin.y
> + area.height) {
> sc.setOrigin(itemRect.x, itemRect.y);
> }
> }
> }
> });
> /*
> * The following listener scrolls the Tree one item at a time in
> * response to MouseWheel events.
> */
> tree.addListener(SWT.MouseWheel, new Listener() {
> public void handleEvent(Event event) {
> Point origin = sc.getOrigin();
> if (event.count < 0) {
> origin.y = Math.min(origin.y + tree.getItemHeight(), tree
> .getSize().y);
> } else {
> origin.y = Math.max(origin.y - tree.getItemHeight(), 0);
> }
> sc.setOrigin(origin);
> }
> });
>
> Button downButton = new Button(shell, SWT.PUSH);
> downButton.setBounds(10, 220, 120, 30);
> downButton.setText("Down 10px");
> downButton.addListener(SWT.Selection, new Listener() {
> public void handleEvent(Event event) {
> sc.setOrigin(0, sc.getOrigin().y + 10);
> }
> });
> Button upButton = new Button(shell, SWT.PUSH);
> upButton.setBounds(140, 220, 120, 30);
> upButton.setText("Up 10px");
> upButton.addListener(SWT.Selection, new Listener() {
> public void handleEvent(Event event) {
> sc.setOrigin(0, sc.getOrigin().y - 10);
> }
> });
> shell.open();
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch())
> display.sleep();
> }
> display.dispose();
> }
> }
>
>
> > Hi,
> >
> > This can probably be made to work by putting each of the Tables into a
> > ScrolledComposite, and scrolling the ScrolledComposites with setOrigin()
> > since this is pixel-based. For an example that does something like this
see
> >
>
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet296.java?view=co
>
> > Note that I just added a listener to this snippet that makes using the
> > scroll wheel work, but snippet changes sometimes take a while to
replicate
> > on the eclipse.org servers, so if the scroll wheel does not work for you
> > then add the following to the snippet:
> >
> > /*
> > * The following listener scrolls the Tree one item at a time
> > * in response to MouseWheel events.
> > */
> > tree.addListener(SWT.MouseWheel, new Listener() {
> > public void handleEvent(Event event) {
> > Point origin = sc.getOrigin();
> > if (event.count < 0) {
> > origin.y = Math.min(origin.y + tree.getItemHeight(),
> > tree.getSize().y);
> > } else {
> > origin.y = Math.max(origin.y - tree.getItemHeight(), 0);
> > }
> > sc.setOrigin(origin);
> > }
> > });
> >
> > HTH,
> > Grant
> >
> >
> > "Wim Jongman" <wim.jongman@xxxxxxxxx> wrote in message
> > news:h7f2em$2r8$1@xxxxxxxxxxxxxxxxxxxx
> >> Hi,
> >>
> >> This snippet
> >>
> >>
> >>
> >
>
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet234.java?view=co
> >>
> >> The problem is that we can pixel scroll the table but that will not be
> >> detected because the scroll appears to be by item as
vbar.getSelection()
> >> indicates. If you drag the thumb pixel by pixel, the second table will
> > only
> >> jump every $itemHeight$ pixels.
> >>
> >> Also the left table snippet does not react on mouse scroll in osx
> > snippet167
> >> uses an alternative listener which does react on mouse scroll.
> >>
> >> Is there a way to get this going neatly on OSx? Blocking the pixel
> > scrolling
> >> capabilities could be one solution. Is that possible?
> >>
> >> Regards,
> >>
> >> Wim Jongman