Home » Eclipse Projects » Eclipse Platform » HyperLink, setEnabled and it's visual response
HyperLink, setEnabled and it's visual response [message #333846] |
Thu, 08 January 2009 14:31  |
Eclipse User |
|
|
|
Hi,
when disabling an eclipse forms HyperLink the only visible response i get
is that the hoover icon for the mousepointer stops to appear ( so
basically the funcionality is gone). Though there does not seem to happen
some other way of coloring to make clear that this link is disabled and
not just "broken". Since all other widgets have some sort of feedback when
disabling them (e.g. buttons and combos becoming grayish) i wonder if
there has to be something additional done which i overlook. Adding it to a
Hyperlinkgroup does not help :).
Of course there is the possibility to set a foreground color by hand when
disabling, but i wonder which one should be used to make sure one does not
get strange look and feels on other platforms/themes. The SWT and JFace
constants don't seem to offer a suitable Color here.
Any help very much appreciated!
Thanks,
Philipp
|
|
| | |
Re: HyperLink, setEnabled and it's visual response [message #333858 is a reply to message #333856] |
Fri, 09 January 2009 15:13   |
Eclipse User |
|
|
|
Hi,
i did some checks on how text disabled rendering is usually done on other
widgets ( on gtk winxp and win2k and normal + high contrast) and all these
cases it's paint text in white one pixel right and down and paint text in
dark gray on normal location. Therefore my current solution is something
like this:
link = new ImageHyperlink(parent, SWT.WRAP){
@Override
protected void paintText(GC gc, Rectangle bounds) {
if(!getEnabled()){
gc.setForeground(Display.getCurrent().getSystemColor(SWT.COL OR_WHITE));
gc.drawText(getText(), bounds.x+1, bounds.y +1);
link.setForeground(Display.getCurrent().getSystemColor(SWT.C OLOR_DARK_GRAY));
}
super.paintText(gc, bounds);
}
};
Seems to work reasonably though on white background the result is of
course only gray. I wonder if a feature enhancement request for the
Hyperlink class would make sense, or if the missing disabled behaviour is
in there by design.
Thanks,
Philipp
|
|
|
Re: HyperLink, setEnabled and it's visual response [message #333879 is a reply to message #333858] |
Mon, 12 January 2009 08:56   |
Eclipse User |
|
|
|
Originally posted by: eclipse-news.rizzoweb.com
On 1/9/2009 3:13 PM, Philipp Simon wrote:
> Hi,
>
> i did some checks on how text disabled rendering is usually done on
> other widgets ( on gtk winxp and win2k and normal + high contrast) and
> all these cases it's paint text in white one pixel right and down and
> paint text in dark gray on normal location. Therefore my current
> solution is something like this:
>
> link = new ImageHyperlink(parent, SWT.WRAP){
> @Override
> protected void paintText(GC gc, Rectangle bounds) {
> if(!getEnabled()){
> gc.setForeground(Display.getCurrent().getSystemColor(SWT.COL OR_WHITE));
> gc.drawText(getText(), bounds.x+1, bounds.y +1);
> link.setForeground(Display.getCurrent().getSystemColor(SWT.C OLOR_DARK_GRAY));
>
> }
> super.paintText(gc, bounds);
> }
> };
>
> Seems to work reasonably though on white background the result is of
> course only gray. I wonder if a feature enhancement request for the
> Hyperlink class would make sense, or if the missing disabled behaviour
> is in there by design.
I'd suggest you enter a bug report against Eclipse > Platform > User
Assistance component and attach your code. Best would be to get the
latest code from CVS and create a patch to Hyperlink with your change
added to it.
Hope this helps,
Eric
|
|
|
Re: HyperLink, setEnabled and it's visual response [message #489949 is a reply to message #333858] |
Tue, 06 October 2009 11:08   |
Eclipse User |
|
|
|
I expanded on the code above (thanks!) to better update dynamically when setEnabled() is called. It also now uses the Hyperlink's Display instead of the "current" Display . . . I don't really know whether this makes any difference in practice, but it feels better ("buy local").
I also make decisions based on isEnabled(), which according to the docs takes into consideration the enablement of the whole hierarchy, rather than getEnabled(), which according to the docs is a setting just for this control. Again, I don't know whether this is important. Also, the code seems slightly inaccurate in that we only call redraw() when this control's setEnabled() is called (and not, presumably, when a parent control's enablement changes). But I didn't see a suitable "enablement listener" that I could add.
Hyperlink hyperlink = new Hyperlink(composite, SWT.NONE) {
@Override
public Color getForeground() {
return isEnabled() ? super.getForeground() : getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
}
@Override
protected void paintText(GC gc, Rectangle bounds) {
if (!isEnabled()) {
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
gc.drawText(getText(), bounds.x + 1, bounds.y + 1);
}
super.paintText(gc, bounds);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
redraw();
}
};
I should indicate I'm using Eclipse RCP version 3.2.2 on Windows XP Professional Version 2002 SP 3, in case that matters. This rendering technique looks fine for my hyperlinks, which are in a view (grey background) and are added to a HyperlinkGroup.
Woody
[Updated on: Tue, 06 October 2009 11:10] by Moderator
|
|
| |
Re: HyperLink, setEnabled and it's visual response [message #538471 is a reply to message #333846] |
Mon, 07 June 2010 12:56  |
Eclipse User |
|
|
|
Got one solution that works for images (could be of course merged with the previously listed solution for the text foreground), didn't test it too much though.
Do you see any problems?
new ImageHyperlink(hyperlinkParent, style) {
private Image enabledImage;
private DisposeListener disposeListener;
@Override
public void setEnabled(boolean enabled) {
if (enabled != getEnabled()) {
setEnabledImage(enabled);
}
super.setEnabled(enabled);
redraw();
}
@Override
public void setImage(Image image) {
enabledImage = image;
setEnabledImage(isEnabled());
}
private void setEnabledImage(boolean enabled) {
if (enabledImage != null) {
if (enabled) {
// image previously disabled --> enable it
if (disposeListener != null) {
removeDisposeListener(disposeListener);
}
if (getImage() != null && !getImage().isDisposed()) {
getImage().dispose();
}
super.setImage(enabledImage);
} else {
// image previously enabled --> disable it
final Image[] disabledImage = new Image[1];
disabledImage[0] = new Image(enabledImage.getDevice(), enabledImage, SWT.IMAGE_DISABLE);
disposeListener = new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (disabledImage[0] != null && !disabledImage[0].isDisposed()) {
disabledImage[0].dispose();
}
}
};
addDisposeListener(disposeListener);
super.setImage(disabledImage[0]);
}
}
}
};
return hyperlink;
}
}
[Updated on: Mon, 07 June 2010 12:59] by Moderator
|
|
|
Goto Forum:
Current Time: Thu May 08 17:52:18 EDT 2025
Powered by FUDForum. Page generated in 0.07666 seconds
|