/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. and others. * * All rights reserved. This program and the accompanying materials * are 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.preference; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.draw2d.FrameBorder; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.SchemeBorder; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Composite; /** * A frame border for a tabbed window * */ /* package */final class TabbedWindowBorder extends FrameBorder { private boolean isVisible = true; // CR392586: resource leaks private static MySchemeBorder normalBorder = new MySchemeBorder( new MySchemeBorder.MyScheme(new Color[] { ColorConstants.button, ColorConstants.buttonLightest, ColorConstants.button }, new Color[] { ColorConstants.buttonDarkest, ColorConstants.buttonDarker, ColorConstants.button })); // CR392586: resource leaks private static MySchemeBorder highlightBorder = new MySchemeBorder( new MySchemeBorder.MyScheme(new Color[] { FigureUtilities.lighter(ColorConstants.titleBackground), ColorConstants.titleBackground, FigureUtilities.darker(ColorConstants.titleBackground) }, new Color[] { FigureUtilities .darker(ColorConstants.titleGradient), ColorConstants.titleGradient, FigureUtilities .lighter(ColorConstants.titleGradient) })); /** * A border scheme * */ private static class MySchemeBorder extends SchemeBorder { private static class MyScheme extends SchemeBorder.Scheme { /** * @param highlight * @param shadow */ public MyScheme(final Color[] highlight, final Color[] shadow) { super(highlight, shadow); } @Override public Color[] getHighlight() { return super.getHighlight(); } @Override public Color[] getShadow() { return super.getHighlight(); } } MySchemeBorder(final MyScheme scheme) { super(scheme); } /** * @return the scheme */ public MyScheme getMyScheme() { return (MyScheme) super.getScheme(); } /** * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets) * @param comp * @param gc * @param insets */ public void paint(final Composite comp, final GC gc, final Insets insets) { final Color[] tl = getMyScheme().getHighlight(); final Color[] br = getMyScheme().getShadow(); paint(comp, gc, insets, tl, br); } /** * Paints the border using the information in the set Scheme and the * inputs given. Side widths are determined by the number of colors in * the Scheme for each side. * * @param comp * the composit whose rect should be used for the inset * bounds * @param gc * the graphics object * @param insets * the insets * @param tl * the highlight (top/left) colors * @param br * the shadow (bottom/right) colors */ protected void paint(final Composite comp, final GC gc, final Insets insets, final Color[] tl, final Color[] br) { final org.eclipse.swt.graphics.Rectangle rect = comp.getBounds(); gc.setLineWidth(1); gc.setLineStyle(SWT.LINE_SOLID); final int top = rect.y - insets.top; final int left = rect.x - insets.left; int bottom = rect.y + rect.height + insets.bottom; int right = rect.x + rect.width + insets.right; gc.setClipping(new org.eclipse.swt.graphics.Rectangle(left, top, right - left, bottom - top)); final Color color = ColorConstants.red; gc.setForeground(color); gc.drawLine(left, top, right, bottom); for (int i = 0; i < br.length; i++) { // color = br[i]; gc.setForeground(color); gc.drawLine(right - i, bottom - i, right - i, top + i); gc.drawLine(right - i, bottom - i, left + i, bottom - i); } right--; bottom--; for (int i = 0; i < tl.length; i++) { // color = tl[i]; gc.setForeground(color); gc.drawLine(left + i, top + i, right - i, top + i); gc.drawLine(left + i, top + i, left + i, bottom - i); } color.dispose(); } } /** * @param parent */ public TabbedWindowBorder(final IFigure parent) { // apparently paint() gets called before createBorders() has had // a chance to create the borders, so we just create them here inner = new TabbedTitleBarBorder(parent); outer = normalBorder; } /** * @param flag */ public void setVisible(final boolean flag) { if (isVisible != flag) { isVisible = flag; ((TabbedTitleBarBorder) inner).setVisible(flag); if (flag) { ((TabbedTitleBarBorder) inner).getParent().repaint(); } } } /** * @param flag */ public void setHighlight(final boolean flag) { if (flag) { outer = highlightBorder; } else { outer = normalBorder; } ((TabbedTitleBarBorder) inner).getParent().repaint(); } @Override protected void createBorders() { // TODO: NOTE: this is overriding default border creation } @Override public void paint(final IFigure figure, final Graphics g, final Insets insets) { if (isVisible) { if (comp != null) { final GC gc = new GC(comp); paint(comp, gc, insets); gc.dispose(); } else { super.paint(figure, g, insets); } } } private Composite comp; /** * @param comp_ * @param gc * @param insets */ public void paint(final Composite comp_, final GC gc, final Insets insets) { this.comp = comp_; if (isVisible) { ((MySchemeBorder) outer).paint(comp_, gc, insets); } } }