Home » Eclipse Projects » Standard Widget Toolkit (SWT) » Select all text inside a Spinner(Select all text inside a Spinner on keyPressed)
Select all text inside a Spinner [message #642696] |
Thu, 02 December 2010 12:14 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
Hi,
I'm looking for a way to select all text (digits) inside a Spinner every time when a digit is entered using keyboard. Spinner widget doesn't have a selectAll() method as e.g. Text widget.
Is there any way to achieve this?
Best regards,
Albert
[Updated on: Thu, 02 December 2010 12:41] Report message to a moderator
|
|
| | | | |
Re: Select all text inside Spinner [message #642741 is a reply to message #642725] |
Thu, 02 December 2010 15:17 |
Grant Gayed Messages: 2150 Registered: July 2009 |
Senior Member |
|
|
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 15:34 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
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 11:35 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
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 11:36] Report message to a moderator
|
|
| |
Goto Forum:
Current Time: Thu Apr 25 04:47:55 GMT 2024
Powered by FUDForum. Page generated in 0.03536 seconds
|