/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.forms; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Layout; import org.eclipse.ui.forms.FormColors; import org.eclipse.ui.forms.widgets.FormToolkit; import org.jboss.tools.common.model.ui.ModelUIImages; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; import org.jboss.tools.common.model.ui.widgets.WhiteSettings; public class DefaultFormPage implements IFormPage, PaintListener { public static final String IMG_FORM_BANNER = "form_banner.gif"; //$NON-NLS-1$ private ISelectionProvider selectionProvider; protected IWidgetSettings settings; private int HEADER_H_GAP = 10; private int HEADER_V_GAP = 5; protected Color headingBackground; protected Color headingForeground = Display.getDefault().getSystemColor(SWT.COLOR_BLUE); protected IForm form; protected Control control; protected Image image; protected Font titleFont; protected String label; protected String title; public DefaultFormPage() { image = ModelUIImages.getImage(IMG_FORM_BANNER); } public DefaultFormPage(IForm form) { this.form = form; image = ModelUIImages.getImage(IMG_FORM_BANNER); } public String getLabel() { if (label!=null) return label; if (form!=null) return form.getHeadingText(); return "Null"; } public String getTitle() { if (title!=null) return title; if (form!=null) return form.getHeadingText(); return "Null"; } public boolean becomesInvisible(IFormPage newPage) { return true; } public void becomesVisible(IFormPage previousPage) { } public Control createFormControl(Composite parent, IWidgetSettings settings) { Control control; if (form==null) { control = new Composite(parent, SWT.NONE); settings.setupControl(control); } else { control = form.createControl(parent, settings); } return control; } public Control createControl(Composite parent) { settings = WhiteSettings.getWhite(); titleFont = settings.getFont("Label.Font.Title"); //$NON-NLS-1$ Composite composite = new Composite(parent, SWT.NONE); settings.setupControl(composite); composite.addPaintListener(this); composite.setLayout(new FormLayout()); composite.setMenu(parent.getMenu()); Control formControl = createFormControl(composite, settings); GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); formControl.setLayoutData(gd); control = composite; return control; } public Control getControl() { return control; } public boolean isSource() { return false; } public boolean isVisible() { return false; } public void setLabel(String label) { this.label = label; } public void setTitle(String title) { this.title = title; } private int getTitleHeight() { int imageHeight = 0; if (image != null && SWT.getPlatform().equals("motif") == false) { //$NON-NLS-1$ imageHeight = image.getBounds().height; } int height = getFontHeight() + 2 * HEADER_V_GAP; return Math.max(height, imageHeight); } private int getFontHeight() { GC gc = new GC(control); FontMetrics fm = gc.getFontMetrics(); int fontHeight = fm.getHeight(); gc.dispose(); return fontHeight; } private void paint(Control form, GC gc) { if (image != null) { paintWithImage(form, gc); } else { gc.setBackground(settings.getColor("Composite.Background")); //$NON-NLS-1$ gc.setForeground(settings.getColor("Composite.Foreground")); //$NON-NLS-1$ } gc.setFont(titleFont); gc.drawText(getTitle(), HEADER_H_GAP, HEADER_V_GAP, true); } private void paintWithImage(Control form, GC gc) { Rectangle bounds = form.getBounds(); if (headingBackground != null) { gc.setBackground(headingBackground); gc.fillRectangle(0, 0, bounds.width, getTitleHeight()); } if (!SWT.getPlatform().equals("motif")) { //$NON-NLS-1$ // gc.drawImage(image, 0, 0); } Color fg = (headingForeground != null) ? headingForeground : settings.getColor("Composite.Foreground"); //$NON-NLS-1$ FormToolkit t = settings.getToolkit(form.getDisplay()); if(t != null && t.getColors().getColor(FormColors.TITLE) != null) { fg = t.getColors().getColor(FormColors.TITLE); } gc.setForeground(fg); } public final void paintControl(PaintEvent event) { paint((Control) event.widget, event.gc); } private int widthHint = SWT.DEFAULT; private int heightHint = SWT.DEFAULT; class FormLayout extends Layout { protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) return new Point(wHint, hHint); Control client = composite.getChildren()[0]; Point csize = client.computeSize(widthHint, heightHint, flushCache); csize.y += getTitleHeight(); return csize; } protected void layout(Composite composite, boolean flushCache) { Rectangle r = composite.getClientArea(); int th = getTitleHeight(); composite.getChildren()[0].setBounds(r.x, r.y + th, r.width, r.height - th); } } public void initialize(Object model) { } public void commitChanges(boolean onSave) { } public void expandTo(Object object) { } public void update() { } public ISelectionProvider getSelectionProvider() { return selectionProvider; } public void setSelectionProvider(ISelectionProvider provider) { selectionProvider = provider; } public void dispose() { if (this.control!=null) this.control.dispose(); this.control = null; } }