[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
|
[news.eclipse.platform.swt] Re: Titlebar, toolbar, menu in ViewForm
|
Unfortunately, there really isn't anything simple about it. Here is what I
came up with.
I'm still pretty new to SWT, and haven't been doing UI for a while, so
there are possible pitfalls here. No guarantees that this is production
level code...
/* LabelViewForm.java */
package com.cormier.tools.swt;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ViewForm;
public class LabelViewForm extends ViewForm {
private static Color[] gradient;
private static Color foreground;
private static Color[] inactiveGradient;
private static Color inactiveForeground;
private static Image X = null;
private static Image V = null;
private static int[] gradPercent;
private CLabel label = null;
private ToolBar bar = null;
private ToolItem menuItem = null;
private ToolItem closeItem = null;
private boolean labelOwner = false;
private EventAdapter eventAdapter = new EventAdapter();
private Control content = null;
public LabelViewForm(Composite parent, String title, int style) {
super(parent, style);
if(gradient == null) {
Display display = parent.getDisplay();
gradient = new Color[]
{display.getSystemColor(SWT.COLOR_TITLE_BACKGROUND),
display.getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT), null};
foreground = display.getSystemColor(SWT.COLOR_TITLE_FOREGROUND);
inactiveGradient = new Color[]
{display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND),
display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT),
null};
inactiveForeground = display.getSystemColor(SWT.COLOR_TITLE_FOREGROUND);
gradPercent = new int[] {75,100};
V = new Image(display, 15, 15);
GC gc = new GC(V);
gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
gc.fillRectangle(V.getBounds());
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
gc.fillPolygon(new int[]{2,5,12,5,7,10});
gc.dispose();
X = new Image(display, 15, 15);
gc = new GC(X);
gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
gc.fillRectangle(V.getBounds());
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawLine(5,4,11,10);
gc.drawLine(5,10,11,4);
gc.drawLine(6,4,12,10);
gc.drawLine(6,10,12,4);
gc.dispose();
}
CLabel label = new CLabel(this, SWT.NONE);
label.setText(title);
label.setBackground(inactiveGradient, gradPercent);
label.setForeground(inactiveForeground);
bar = new ToolBar(this, SWT.FLAT | SWT.HORIZONTAL);
menuItem = new ToolItem(bar, SWT.PUSH);
menuItem.setImage(V);
menuItem.setToolTipText("Menu");
menuItem.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent se) {}
public void widgetSelected(SelectionEvent se) {
if(getMenu() != null)
getMenu().setVisible(true);
}
});
closeItem = new ToolItem(bar, SWT.PUSH);
closeItem.setImage(X);
closeItem.setToolTipText("Close");
closeItem.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent se) {}
public void widgetSelected(SelectionEvent se) {dispose();}
});
setTopLeft(label);
labelOwner = true;
setTopRight(bar);
}
public void dispose() {
Composite parent = getParent();
setVisible(false);
parent.layout(true);
if(menuItem != null)
menuItem.dispose();
if(closeItem != null)
closeItem.dispose();
if(bar != null)
bar.dispose();
if(labelOwner)
label.dispose();
super.dispose();
}
public void setContent(Control part) {
if(content != null)
content.removeFocusListener(eventAdapter);
if(part!=null) {
part.addFocusListener(eventAdapter);
}
content = part;
super.setContent(content);
}
public void setImage(Image image) {
if(label != null)
label.setImage(image);
}
public void setText(String text) {
if(label != null)
label.setText(text);
}
public void setTopLeft(Control part) {
if(!(part instanceof CLabel))
return;
if(label != null) {
label.removeMouseListener(eventAdapter);
if(labelOwner) {
label.dispose();
labelOwner = false;
}
}
if(part != null) {
part.addMouseListener(eventAdapter);
}
label = (CLabel)part;
super.setTopLeft(label);
}
private class EventAdapter extends MouseAdapter implements FocusListener {
/* MouseAdapter method */
public void mouseUp(MouseEvent me)
{if(content!=null)content.forceFocus();}
/* FocusListener methods */
public void focusGained(FocusEvent e) {
if(label == null)
return;
label.setBackground(gradient, gradPercent);
label.setForeground(foreground);
label.redraw();
}
public void focusLost(FocusEvent e) {
if(label == null)
return;
label.setBackground(inactiveGradient, gradPercent);
label.setForeground(inactiveForeground);
label.redraw();
}
}
public static void main(String[] args) {
Display display = new Display ();
org.eclipse.swt.widgets.Shell shell = new
org.eclipse.swt.widgets.Shell(display);
shell.setLayout(new org.eclipse.swt.layout.FillLayout());
org.eclipse.swt.custom.SashForm sf = new
org.eclipse.swt.custom.SashForm(shell, SWT.HORIZONTAL);
LabelViewForm lvf1 = new LabelViewForm(sf, "ViewForm 1",
SWT.DIALOG_TRIM);
lvf1.setContent(new org.eclipse.swt.widgets.Text(lvf1, SWT.NONE));
LabelViewForm lvf2 = new LabelViewForm(sf, "ViewForm 2",
SWT.DIALOG_TRIM);
lvf2.setContent(new org.eclipse.swt.widgets.Text(lvf2, SWT.NONE));
LabelViewForm lvf3 = new LabelViewForm(sf, "ViewForm 3",
SWT.DIALOG_TRIM);
lvf3.setContent(new org.eclipse.swt.widgets.Text(lvf3, SWT.NONE));
Menu menu = new Menu(lvf2);
MenuItem item1 = new MenuItem(menu, SWT.NONE);
item1.setText("Menu One");
MenuItem item2 = new MenuItem(menu, SWT.NONE);
item2.setText("Menu Two");
lvf2.setMenu(menu);
shell.open ();
lvf1.getContent().forceFocus();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
Joakim Eriksson wrote:
> Does somebody have a simple example for how to make ViewForms where the
> labels, toolbars and menus behave and look like they do in the Eclipse
> views?
> /Joakim