[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 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