Java tutorial
/******************************************************************************* * Copyright (c) 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.examples.presentation.baretittle; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; import org.eclipse.ui.presentations.*; public class BareTitleStackPresentation extends StackPresentation { private static final String PART_DATA = "part"; private static final int TITLE_HEIGHT = 22; private boolean activeFocus = false; /** * Main widget for the presentation */ private Composite presentationControl; private Composite titleArea; private Composite contentArea; /** * Currently selected part */ private IPresentablePart current; /** * close button */ private ToolItem close; /** * View menu button */ private ToolItem viewMenu; /** * Minimize button */ private ToolItem minView; private MouseListener mouseListener = new MouseAdapter() { // If we single-click on an empty space on the toolbar, move focus to the // active control public void mouseDown(MouseEvent e) { if (current != null) { current.setFocus(); } } }; /** * Drag listener for regions outside the toolbar */ Listener dragListener = new Listener() { public void handleEvent(Event event) { Point loc = new Point(event.x, event.y); Control ctrl = (Control) event.widget; getSite().dragStart(ctrl.toDisplay(loc), false); } }; public BareTitleStackPresentation(Composite parent, IStackPresentationSite stackSite) { super(stackSite); // Create a top-level control for the presentation. presentationControl = new Composite(parent, SWT.NONE); titleArea = new Composite(presentationControl, SWT.NONE); contentArea = new Composite(presentationControl, SWT.NONE); titleArea.addMouseListener(mouseListener); PresentationUtil.addDragListener(titleArea, dragListener); // Add a dispose listener. This will call the presentationDisposed() // method when the widget is destroyed. presentationControl.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { presentationDisposed(); } }); presentationControl.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { Rectangle clientArea = presentationControl.getClientArea(); e.gc.setLineWidth(1); e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_DARK_GRAY)); e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width - 1, clientArea.height - 1); Rectangle contentAreaBounds = contentArea.getBounds(); int ypos = contentAreaBounds.y - 1; e.gc.drawLine(clientArea.x, ypos, clientArea.x + clientArea.width - 1, ypos); } }); titleArea.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { Rectangle titleRect = titleArea.getClientArea(); GC gc = e.gc; e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_GRAY)); if (activeFocus) e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLUE)); else e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE)); e.gc.fillGradientRectangle(titleRect.x, titleRect.y, titleRect.x + titleRect.width, titleRect.y + titleRect.height, true); if (current != null) { int textWidth = titleRect.width - 1; if (textWidth > 0) { Font gcFont = gc.getFont(); gc.setFont(presentationControl.getFont()); String text = current.getTitle(); Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC); int textY = titleRect.y + (titleRect.height - extent.y) / 2; if (activeFocus) gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE)); else gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLACK)); gc.setFont(JFaceResources.getBannerFont()); gc.drawText(text, titleRect.x + 3, textY, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC); } } } }); layout(); } protected void presentationDisposed() { // Remove any listeners that were attached to any // global Eclipse resources. This is necessary in order to prevent // memory leaks. } protected int getBorderWidth() { return 1; } public void layout() { // Determine the inner bounds of the presentation Rectangle presentationClientArea = presentationControl.getClientArea(); presentationClientArea.x += getBorderWidth(); presentationClientArea.width -= getBorderWidth() * 2; presentationClientArea.y += getBorderWidth(); presentationClientArea.height -= getBorderWidth() * 2; titleArea.setBounds(presentationClientArea.x, presentationClientArea.y, presentationClientArea.width, presentationClientArea.y + TITLE_HEIGHT); int yy = TITLE_HEIGHT + 2; contentArea.setBounds(presentationClientArea.x, presentationClientArea.y + yy, presentationClientArea.width, presentationClientArea.height - yy); titleArea.setBackground(titleArea.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN)); contentArea.setBackground(titleArea.getDisplay().getSystemColor(SWT.COLOR_DARK_RED)); // Position the view's widgets if (current != null) { Rectangle clientRectangle = contentArea.getBounds(); Point clientAreaStart = presentationControl.getParent() .toControl(presentationControl.toDisplay(clientRectangle.x, clientRectangle.y)); // current isn't parented by this widget hierarchy, the coordinates must be // relative to the workbench window. The workbench window parents every // part. current.setBounds(new Rectangle(clientAreaStart.x, clientAreaStart.y, clientRectangle.width, clientRectangle.height)); } } public void setBounds(Rectangle bounds) { presentationControl.setBounds(bounds); layout(); } public void dispose() { } public void setActive(int newState) { activeFocus = (newState == AS_ACTIVE_FOCUS); titleArea.redraw(); } public void setVisible(boolean isVisible) { } public void setState(int state) { } public Control getControl() { return presentationControl; } public void addPart(IPresentablePart newPart, Object cookie) { newPart.setBounds(contentArea.getBounds()); this.current = newPart; layout(); } public void removePart(IPresentablePart oldPart) { } public void selectPart(IPresentablePart toSelect) { } public StackDropResult dragOver(Control currentControl, Point location) { return null; } public void showSystemMenu() { } public void showPaneMenu() { } public Control[] getTabList(IPresentablePart part) { if (current != null) { return new Control[] { current.getControl() }; } else { return new Control[0]; } } }