[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