Home » Eclipse Projects » Standard Widget Toolkit (SWT) » Select all text inside a Spinner(Select all text inside a Spinner on keyPressed)
| | | | |
Re: Select all text inside Spinner [message #642741 is a reply to message #642725] |
Thu, 02 December 2010 10:17   |
Eclipse User |
|
|
|
There isn't API on Spinner that does what you want. You can get the effect
you want on Windows and Cocoa by adding the listener below.
spinner.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
// hack to make the spinner's text become selected
spinner.setSelection(spinner.getSelection());
}
});
I don't think there's another way to do this, short of creating your own
emulated Spinner (a Text + 2 buttons). If you want to consider this then
there's a sample implementation available at
http://www.eclipse.org/articles/Article-Writing%20Your%20Own %20Widget/Writing%20Your%20Own%20Widget_files/AppendixE.htm
as part of Eclipse Corner article
http://www.eclipse.org/articles/Article-Writing%20Your%20Own %20Widget/Writing%20Your%20Own%20Widget.htm .
Grant
"Albert" <albert.pikus@gmail.com> wrote in message
news:id8946$bfs$1@news.eclipse.org...
> Hi,
>
> I tried this:
>
>
> spinner.addKeyListener(new KeyListener()
> {
> @Override
> public void keyPressed(KeyEvent event)
> { long hwnd = OS.GetWindow (spinner.handle, OS.GW_CHILD);
> long hwndText = OS.GetWindow (hwnd, OS.GW_HWNDNEXT);
> OS.SendMessage (hwndText, OS.EM_SETSEL, 0, -1);
> }
> @Override
> public void keyReleased(KeyEvent event)
> { }
> });
>
>
> but it has the exactly same effect (only digit that was last entered
> stays, overwriting previously entered digit) as the following:
>
>
> spinner.addKeyListener(new KeyListener()
> {
> @Override
> public void keyPressed(KeyEvent event)
> { spinner.setSelection(spinner.getSelection());
> }
> @Override
> public void keyReleased(KeyEvent event)
> { }
> });
>
>
>
> Best regards,
>
> Albert
>
|
|
|
Re: Select all text inside Spinner [message #642751 is a reply to message #642741] |
Thu, 02 December 2010 10:34   |
Eclipse User |
|
|
|
Hi, Grant,
I tried your suggestion too and this really selects text inside a Spinner, but as in previous cases, all digits are overwritten with the last one.
It's really unfortunate that this API is not available, it would be great if Spinner had a similar behavior as DateTime widget (created with SWT.DATE | SWT.LONG); only digits are allowed to be entered and selected element (day, month or year) is reselected once it was modified using the keyboard. This way, selected text is always overwritten when a digit is input and there is no need to edit it using backspace or delete keys, nor to manually select digits in order to overwrite them.
It really seems that I will have to fake a Spinner somehow.
Thank you for your answer, best regards,
Albert
|
|
| | |
Re: Select all text inside a Spinner [message #642925 is a reply to message #642696] |
Fri, 03 December 2010 06:35   |
Eclipse User |
|
|
|
Hi,
perhaps this can be achieved after all. I managed to produce a snippet that demonstrates desired behavior. Perhaps my description wasn't clear enough: with every new character (digit) entered, all text should be selected, but when typing in subsequent characters, existing text inside a Spinner should not be overwritten, except if some limit is exceeded; suppose I want to set a limit for a number that is entered, e.g. number cannot be less than 1 or greater than 20. In this case behavior should be like this, for example:
* "1" is entered and selected,
* after that "2" is entered, so we have "12" selected inside a Spinner (the
first "1" is NOT overwritten),
* but once I add, say "3", this would result in "123", which exceeds the 20
limit - so "12" is overwritten with "3" and selected.
Basically, this is the same behavior as DateTime widget features. Here is the snippet:
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.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
public class SpinnerTest
{
SpinnerTest()
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FormLayout());
final Spinner spinner = new Spinner (shell, SWT.BORDER);
FormData formData = new FormData();
formData.top = new FormAttachment(0, 10);
formData.left = new FormAttachment(10, 0);
formData.right = new FormAttachment(10, 70);
spinner.setLayoutData(formData);
shell.setSize(200, 100);
spinner.setMinimum(1);
spinner.setMaximum(20);
spinner.setTextLimit(3);
spinner.addKeyListener(new KeyListener()
{
String oldSpinnerText;
String newSpinnerText;
@Override
public void keyPressed(KeyEvent event)
{
try
{
oldSpinnerText = String.valueOf(spinner.getSelection());
String newText = String.valueOf(event.character);
newSpinnerText = oldSpinnerText + newText;
if (Integer.valueOf(newSpinnerText) >= spinner.getMaximum())
{
oldSpinnerText = String.valueOf(spinner.getSelection());
spinner.setSelection(Integer.valueOf(newText));
newSpinnerText = newText;
}
}
catch (NumberFormatException e)
{
e.printStackTrace();
}
}
@Override
public void keyReleased(KeyEvent event)
{
spinner.setSelection(Integer.valueOf(newSpinnerText));
}
});
// Never deselect digits in spinner when clicking inside digits field
spinner.addMouseListener(new MouseListener()
{
@Override
public void mouseUp(MouseEvent arg0)
{
spinner.setSelection(spinner.getSelection());
}
@Override
public void mouseDown(MouseEvent arg0)
{
spinner.setSelection(spinner.getSelection());
}
@Override
public void mouseDoubleClick(MouseEvent arg0)
{
}
});
shell.open();
while(!shell.isDisposed())
{
if(!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
public static void main(String[] argv)
{
new SpinnerTest();
}
}
Best regards,
Albert
[Updated on: Fri, 03 December 2010 06:36] by Moderator
|
|
| |
Goto Forum:
Current Time: Wed Jul 23 13:15:34 EDT 2025
Powered by FUDForum. Page generated in 0.08898 seconds
|