Home » Eclipse Projects » JFace » Manage focus of CellEditor in TableViewer
Manage focus of CellEditor in TableViewer [message #491940] |
Fri, 16 October 2009 15:16 |
Khoa Nguyen Messages: 4 Registered: July 2009 |
Junior Member |
|
|
This is a multi-part message in MIME format.
--------------020507010604020502030408
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Hi friends,
I manage to build a custom Cell Editor for a TableViewer. This cell
editor has 3 common controls which are laid out as in the enclosed image
(http://img62.imageshack.us/img62/3/celleditor.gif). As you might guess,
the [x] button aims to clear that cell value while the [...] button is
for bringing up a chooser dialog.
@Override
protected Control createControl(Composite parent) {
Composite editor = new Composite(parent, getStyle());
Label label = new Label(editor, SWT.NONE);
Button x = new Button(editor, SWT.NONE);
Button ellipsis = new Button(editor, SWT.NONE);
.....
return editor;
}
To deactivate the editor properly, I have to handle the focusLost event
to any of these controls and invoke super.focusLost().
First off, I cannot listen to focusLost event on any of 2 buttons
because if one of them is clicked, the other loses focus and a focusLost
event occurs, thus data is committed before the #widgetSelected() happens.
I tried to solve this problem by not allowing any buttons to grab the
focus (SWT.NO_FOCUS) except the editor control and hope (^_^) as long as
I'm manipulating its sub components (the buttons), the editor control
still doesn't lose its focus. However, the focus of the editor control
is lost as soon as I click on the buttons, even before the
#widgetSelected is invoked... My hope crumbles =((
Now I get stuck. Actually, I may try using #mouseEnter, #mouseExit event
handler to set focus on each button before handling click event.
However, I need a better solution from you guys.
Thanks for spending time on reading my long post ;-)
-instcode
--------------020507010604020502030408
Content-Type: image/gif;
name="celleditor.gif"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="celleditor.gif"
R0lGODlhGwFOAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/ AP//AAAA//8A
/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAz AAAzMwAzZgAz
mQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDM AADMMwDMZgDM
mQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMz ADMzMzMzZjMz
mTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPM ADPMMzPMZjPM
mTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2Yz AGYzM2YzZmYz
mWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bM AGbMM2bMZmbM
mWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kz AJkzM5kzZpkz
mZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nM AJnMM5nMZpnM
mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wz AMwzM8wzZswz
mcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zM AMzMM8zMZszM
mczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8z AP8zM/8zZv8z
mf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/M
mf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAbAU4AAAj/ AP8JHEjwXyqC
KBIqXKiwoMOHECNKnEixosWLGDNq3Mixo0ePBz+KHEmypMmTKFOqdBhypcuX MGPKnGmy5T+G
OBPS3Mmzp8+fEm3mxAm0qNGjSEcKRRFRZ9KnUKNGXdqUqdSrWLPKpArRqdav YMN25PrQq9iz
aNMSJOvQrNq3cLGyLehWY8O4eKPe3YrQalm/eQML7jm37+DDiGMWHlg3sePH IPsO3Qu5smWM
Syc3vsy580CbnkOLtggaI7XTp6ehXj368pSPU6ipXp2adm3bs2nnpjYxs2aC 1Pyhxoda+OnW
ak8TP22c2vLgfvz8e96c+vDi0Z0Xv86ce3Dv1Yv3/5b8eyDq3Oh5I0eb/rbs 06leu2///nb8
8/jn56/Pv/14xoDRBdh2xDUn3EIVBVjWei4JVyCB31ET3XQRfvdgdxdmd6GF FTrYoXYGgnhc
UIZ1NeBu+/ml4EYrMkgSbrbJFt8/q6HoXo331RijjfzpiNt/Am1204DPFYma ijclOaRVTu3V
EGUuvqgdNSgsV+VwExqpnHdFasjll1uGOeWY+AA5ZFXA6Vcbkk0yFqSSSQLW YpQfpYcClfnN
qGZ/eca2J32A7jebmUKaJSKG3yEIJ5JxIignnSiFiA8Kkk6IqKQf4pPdpRBi 6imBhM5pqI+0
BciokkyZihCkJ914Z48z8v8o62r37abQrDDmOmJEiwU5YHjdnabqm8Sm6uaj rJYk5p13Upfl
ds3ieeCY/ngZLLXgZSumP6Giad6fVNIlmZtLAsjknMlihN6r07ALn3z8vYqn sH0Kai+4anZr
YpochpgRuume5OGnEkq34cCdnuYlwf0mzKl6vJI3GXC4QpxgwDPpiiO8N+63 sW47hqzxeaFq
RiSYFmOcVCp+sOxyyzC/LN3LNMdss8xkoqxlzmKWSSJH976nMlRTFG300Ugn rfTSSQcdKL71
mTn01Gr5NjHVWB9l9VBZdw1Ur2d6LfZOYAs59tknlQ0w2mx/pHbbcKP0dtx0 K1XiXx9BWXdc
erv/NPfegGv0d+CEVzR44YhDtHVOiTeuuMRcOy75Z5PjZfLlmF+tUmmVn0Wp P9yCHjro/4he
Oummp4766qP7s3Zk5pbXOVJMhV767bbnjvvuuvd+++tjQc747LT3jjrux7fO e/Knhw48R4cT
/1PtvFfv+/XW/+733W09L71Lny+kvOrjs978+aLfuVL03/NUO6Wlw4/9/Nnb zlTKJbHfPk3w
f54ktw1xXUIE+LsBus55oAtg/FKxq5pwT0D7A8r7EPi/OMUPgBU0Fgapx8FU cM5uAPJWR/oW
QYqETyHOE1/4Lvi5A7ruJgkUXwJbxhv8ue2BOCyhTCaYwd3xUIP/o1T//6qH Ag/aUCT60+FL
hgjABCKQiUKk4AEvSEXX+aGB+cuhr5TovioGcYBBxKAA5VfBMdrPg5sTHlG4 yD/yoc98bowj
61BAQxqlTY0MYSP/6sdH+mGviB9Eoh6vIj/mpQ55xksk74qIRZIEcpASzJwk JYnGlCxujZCk
CXxqxsmbebKTLmNgDe8YO81lMmPUYKAqU8nKVbqylbB85SqPKMgQ7uuUO4mR LnfJS9rYUW5a
DBsugWLDYj6ElpYMptmGaRKIOdM80BTIM6UZzV9aE5i2xBszu5bEbaarmwla pjdPQsI0ZrN7
48QaONMZpXWyk0GXzOM7VRZPRc0zYI+8Jzf1iQO1gAAAOw==
--------------020507010604020502030408--
|
|
|
Re: Manage focus of CellEditor in TableViewer [message #492151 is a reply to message #491940] |
Mon, 19 October 2009 07:30 |
Khoa Nguyen Messages: 4 Registered: July 2009 |
Junior Member |
|
|
Khoa Nguyen wrote:
> Hi friends,
>
> I manage to build a custom Cell Editor for a TableViewer. This cell
> editor has 3 common controls which are laid out as in the enclosed image
> (http://img62.imageshack.us/img62/3/celleditor.gif). As you might guess,
> the [x] button aims to clear that cell value while the [...] button is
> for bringing up a chooser dialog.
>
> @Override
> protected Control createControl(Composite parent) {
> Composite editor = new Composite(parent, getStyle());
> Label label = new Label(editor, SWT.NONE);
> Button x = new Button(editor, SWT.NONE);
> Button ellipsis = new Button(editor, SWT.NONE);
> .....
> return editor;
> }
>
> To deactivate the editor properly, I have to handle the focusLost event
> to any of these controls and invoke super.focusLost().
>
> First off, I cannot listen to focusLost event on any of 2 buttons
> because if one of them is clicked, the other loses focus and a focusLost
> event occurs, thus data is committed before the #widgetSelected() happens.
>
> I tried to solve this problem by not allowing any buttons to grab the
> focus (SWT.NO_FOCUS) except the editor control and hope (^_^) as long as
> I'm manipulating its sub components (the buttons), the editor control
> still doesn't lose its focus. However, the focus of the editor control
> is lost as soon as I click on the buttons, even before the
> #widgetSelected is invoked... My hope crumbles =((
>
> Now I get stuck. Actually, I may try using #mouseEnter, #mouseExit event
> handler to set focus on each button before handling click event.
> However, I need a better solution from you guys.
>
> Thanks for spending time on reading my long post ;-)
> -instcode
>
> ------------------------------------------------------------ ------------
>
No one gives me a comment and now I come up with a urly & dirty
workaround (don't refactor yet):
@Override
protected void doSetFocus() {
getControl().forceFocus();
getControl().removeFocusListener(listener);
getControl().addFocusListener(listener);
}
@Override
protected Control createControl(Composite parent) {
Composite editor = new Composite(parent, getStyle());
final Button bt1 = new Button(editor, SWT.DOWN/*|SWT.NO_FOCUS*/);
button.addMouseTrackListener(new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
bt1.removeFocusListener(listener);
bt2.removeFocusListener(listener);
getControl().removeFocusListener(listener);
bt1.setFocus();
}
@Override
public void mouseExit(MouseEvent e) {
bt1.removeFocusListener(listener);
bt1.addFocusListener(listener);
}
});
final Button bt2 = new Button(editor, SWT.DOWN);
button.addMouseTrackListener(new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
bt1.removeFocusListener(listener);
bt2.removeFocusListener(listener);
getControl().removeFocusListener(listener);
bt2.setFocus();
}
@Override
public void mouseExit(MouseEvent e) {
bt2.removeFocusListener(listener);
bt2.addFocusListener(listener);
}
});
return editor;
}
Let me get it straight: Suppose we have a composite which is being
focus. All of its children *are not focusable*. My question is: Should
mouse events, keyboard events or any kind of events occur within its
children really need to trigger a focusLost event on the parent
composite? Stupid focusLost event in that case anyway!
|
|
|
Re: Manage focus of CellEditor in TableViewer [message #492170 is a reply to message #492151] |
Mon, 19 October 2009 09:34 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
Hi,
http://wiki.eclipse.org/JFaceSnippets#Snippet060TextCellEdit orWithContentProposal
must have solved this also maybe you can take a look there.
Tom
Khoa Nguyen schrieb:
> Khoa Nguyen wrote:
>> Hi friends,
>>
>> I manage to build a custom Cell Editor for a TableViewer. This cell
>> editor has 3 common controls which are laid out as in the enclosed
>> image (http://img62.imageshack.us/img62/3/celleditor.gif). As you
>> might guess, the [x] button aims to clear that cell value while the
>> [...] button is for bringing up a chooser dialog.
>>
>> @Override
>> protected Control createControl(Composite parent) {
>> Composite editor = new Composite(parent, getStyle());
>> Label label = new Label(editor, SWT.NONE);
>> Button x = new Button(editor, SWT.NONE);
>> Button ellipsis = new Button(editor, SWT.NONE);
>> .....
>> return editor;
>> }
>>
>> To deactivate the editor properly, I have to handle the focusLost
>> event to any of these controls and invoke super.focusLost().
>>
>> First off, I cannot listen to focusLost event on any of 2 buttons
>> because if one of them is clicked, the other loses focus and a
>> focusLost event occurs, thus data is committed before the
>> #widgetSelected() happens.
>>
>> I tried to solve this problem by not allowing any buttons to grab the
>> focus (SWT.NO_FOCUS) except the editor control and hope (^_^) as long
>> as I'm manipulating its sub components (the buttons), the editor
>> control still doesn't lose its focus. However, the focus of the editor
>> control is lost as soon as I click on the buttons, even before the
>> #widgetSelected is invoked... My hope crumbles =((
>>
>> Now I get stuck. Actually, I may try using #mouseEnter, #mouseExit
>> event handler to set focus on each button before handling click event.
>> However, I need a better solution from you guys.
>>
>> Thanks for spending time on reading my long post ;-)
>> -instcode
>>
>> ------------------------------------------------------------ ------------
>>
>
> No one gives me a comment and now I come up with a urly & dirty
> workaround (don't refactor yet):
>
> @Override
> protected void doSetFocus() {
> getControl().forceFocus();
> getControl().removeFocusListener(listener);
> getControl().addFocusListener(listener);
> }
>
> @Override
> protected Control createControl(Composite parent) {
> Composite editor = new Composite(parent, getStyle());
> final Button bt1 = new Button(editor, SWT.DOWN/*|SWT.NO_FOCUS*/);
> button.addMouseTrackListener(new MouseTrackAdapter() {
> @Override
> public void mouseEnter(MouseEvent e) {
> bt1.removeFocusListener(listener);
> bt2.removeFocusListener(listener);
> getControl().removeFocusListener(listener);
> bt1.setFocus();
> }
> @Override
> public void mouseExit(MouseEvent e) {
> bt1.removeFocusListener(listener);
> bt1.addFocusListener(listener);
> }
> });
> final Button bt2 = new Button(editor, SWT.DOWN);
> button.addMouseTrackListener(new MouseTrackAdapter() {
> @Override
> public void mouseEnter(MouseEvent e) {
> bt1.removeFocusListener(listener);
> bt2.removeFocusListener(listener);
> getControl().removeFocusListener(listener);
> bt2.setFocus();
> }
> @Override
> public void mouseExit(MouseEvent e) {
> bt2.removeFocusListener(listener);
> bt2.addFocusListener(listener);
> }
> });
> return editor;
> }
>
> Let me get it straight: Suppose we have a composite which is being
> focus. All of its children *are not focusable*. My question is: Should
> mouse events, keyboard events or any kind of events occur within its
> children really need to trigger a focusLost event on the parent
> composite? Stupid focusLost event in that case anyway!
|
|
|
Goto Forum:
Current Time: Thu Mar 28 18:28:38 GMT 2024
Powered by FUDForum. Page generated in 0.02021 seconds
|