Hallo,
ich habe ein Problem, dass ich nicht gelöst bekomme.
Undzwar will ich eine Shell haben, die ähnlich aussieht wie der Tooltip von Eclipse. Sprich ohne Titlebar, ohne Rahmen, nix. Dafür käme für mich SWT.Tool und SWT.NO_TRIM in frage. Ich hatte mich wegen des ansehnlichen Schattens für SWT.TOOL entschieden. Leider kann man dann aber die Shell nciht mehr Resizen. SWT.RESIZE dazuzupacken möchte ich auch nicht, denn dann hat die Shell wieder so einen hässlichen Rahmen.
Also muss ich das ganze selbst implementieren.
Kurze Erklärung: Die Shell wird über ein Klickevent aufgerufen und wird ihrerseits auf die aufrufende Shell gelegt. Die entsprechende Methode ist createResizeIcon() in Zeile 105. Jedoch funktioniert das nicht so richtig, beim Resizen flackert das wie verrückt, was daran liegt, dass die Shell nicht linear kleiner oder größer gemacht wird, sondern irgendwie teilweise mit ganz komischen Werten verändert wird. Es liegt wahrscheinlich an falschen Event koordinaten, das event liefert nämlich beim ersten Feuern die Koordinaten vom Label, nicht von der Shell. Die Koordinaten von der Shell liefert er interessanterweise dann beim zweiten Feuern. Er resized also zuerst auf die Koordinaten vom Label, also irgendwie 8,10 oder so und danach erst auf die "richtigen" Koordinaten. Wer weiß rat? toDisplay() und toControl() schon versucht.
Das ist meine Klasse:
ich habe ein Problem, dass ich nicht gelöst bekomme.
Undzwar will ich eine Shell haben, die ähnlich aussieht wie der Tooltip von Eclipse. Sprich ohne Titlebar, ohne Rahmen, nix. Dafür käme für mich SWT.Tool und SWT.NO_TRIM in frage. Ich hatte mich wegen des ansehnlichen Schattens für SWT.TOOL entschieden. Leider kann man dann aber die Shell nciht mehr Resizen. SWT.RESIZE dazuzupacken möchte ich auch nicht, denn dann hat die Shell wieder so einen hässlichen Rahmen.
Also muss ich das ganze selbst implementieren.
Kurze Erklärung: Die Shell wird über ein Klickevent aufgerufen und wird ihrerseits auf die aufrufende Shell gelegt. Die entsprechende Methode ist createResizeIcon() in Zeile 105. Jedoch funktioniert das nicht so richtig, beim Resizen flackert das wie verrückt, was daran liegt, dass die Shell nicht linear kleiner oder größer gemacht wird, sondern irgendwie teilweise mit ganz komischen Werten verändert wird. Es liegt wahrscheinlich an falschen Event koordinaten, das event liefert nämlich beim ersten Feuern die Koordinaten vom Label, nicht von der Shell. Die Koordinaten von der Shell liefert er interessanterweise dann beim zweiten Feuern. Er resized also zuerst auf die Koordinaten vom Label, also irgendwie 8,10 oder so und danach erst auf die "richtigen" Koordinaten. Wer weiß rat? toDisplay() und toControl() schon versucht.
Das ist meine Klasse:
Java:
public class OlderVersionsStatusPopUp extends Shell {
private TopicTranslationData translationData;
private Listener dragListener;
private Point offset;
private final Color BACKGROUND;
private Image resizeImg;
private TreeItem item;
private Map<ObjectId, Boolean> popUpStati;
private Listener resizeListener;
private boolean pressed;
public OlderVersionsStatusPopUp(Shell shell, TopicTranslationData data,
Event e, Control parentControl, TreeItem item,
final Map<ObjectId, Boolean> popUpStati) {
super(shell, SWT.TOOL);
this.translationData = data;
this.item = item;
this.popUpStati = popUpStati;
BACKGROUND = new Color(getDisplay(), 255, 255, 174);
Point bounds = parentControl.getLocation();
Point control = parentControl.toControl(bounds.x, bounds.y);
int x = -control.x + e.x + 20;
int y = -control.y + e.y;
setBounds(x, y, 350, 250);
GridLayout shellLayout = new GridLayout(1, false);
shellLayout.marginHeight = 0;
shellLayout.marginWidth = 0;
setLayout(shellLayout);
setBackground(BACKGROUND);
setBackgroundMode(SWT.INHERIT_DEFAULT);
Composite mainComp = new Composite(getShell(), SWT.NONE);
GridLayout mainLayout = new GridLayout(2, false);
mainLayout.marginHeight = 0;
mainLayout.verticalSpacing = 0;
mainLayout.marginTop = 0;
mainLayout.marginWidth = 0;
mainLayout.horizontalSpacing = 0;
mainComp.setLayout(mainLayout);
GridDataFactory.fillDefaults().grab(true, true).applyTo(mainComp);
Composite contentComp = new Composite(mainComp, SWT.NONE);
GridLayout contentLayout = new GridLayout(2, false);
contentComp.setLayout(contentLayout);
GridDataFactory.fillDefaults().grab(true, true)
.span(mainLayout.numColumns, 1).applyTo(contentComp);
createTitle(item, contentComp);
createResizeIcon();
dragListener = new Listener() {
public void handleEvent(Event event) {
switch (event.type) {
case SWT.MouseDown:
offset = new Point(event.x, event.y);
break;
case SWT.MouseMove:
if (offset != null) {
Point location = toDisplay(event.x, event.y);
setLocation(location.x - offset.x, location.y
- offset.y);
}
break;
case SWT.MouseUp:
if ((event.stateMask & SWT.BUTTON3) != 0) {
popUpStati.put(
translationData.getTopic().getObjectId(),
Boolean.valueOf(true));
OlderVersionsStatusPopUp.this.dispose();
}
offset = null;
break;
}
}
};
addListener(SWT.MouseDown, dragListener);
addListener(SWT.MouseUp, dragListener);
addListener(SWT.MouseMove, dragListener);
open();
}
/**
* @param item
* @param contentComp
*/
public void createTitle(TreeItem item, Composite contentComp) {
CLabel titleLabel = new CLabel(contentComp, SWT.NONE);
titleLabel.setImage(item.getImage());
titleLabel.setText(translationData.getTopic().getTitle());
}
/**
*
*/
public void createResizeIcon() {
CLabel resizeLabel = new CLabel(getShell(), SWT.NONE);
resizeImg = TMPlugin.getInstance().getImageDescriptor("RESIZE_PNG")
.createImage();
resizeLabel.setImage(resizeImg);
pressed = false;
resizeListener = new Listener() {
public void handleEvent(Event e) {
switch (e.type) {
case SWT.MouseEnter:
setCursor(getShell().getDisplay().getSystemCursor(
SWT.CURSOR_SIZESE));
break;
case SWT.MouseExit:
setCursor(getShell().getDisplay().getSystemCursor(
SWT.CURSOR_ARROW));
break;
case SWT.MouseDown:
pressed = true;
break;
case SWT.MouseMove:
if (pressed) {
Rectangle rect = getBounds();
setSize(rect.width - (rect.width - e.x), rect.height
- (rect.height - e.y));
}
break;
case SWT.MouseUp:
pressed = false;
break;
}
}
};
resizeLabel.addListener(SWT.MouseEnter, resizeListener);
resizeLabel.addListener(SWT.MouseExit, resizeListener);
resizeLabel.addListener(SWT.MouseDown, resizeListener);
resizeLabel.addListener(SWT.MouseMove, resizeListener);
resizeLabel.addListener(SWT.MouseUp, resizeListener);
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.BOTTOM)
.applyTo(resizeLabel);
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
public TopicTranslationData getTopicTranslationData() {
return translationData;
}
@Override
public void dispose() {
super.dispose();
if (BACKGROUND != null && !BACKGROUND.isDisposed()) {
BACKGROUND.dispose();
}
if (resizeImg != null && !resizeImg.isDisposed()) {
resizeImg.dispose();
}
}
}