Package org.sf.feeling.swt.win32.extension.widgets

Source Code of org.sf.feeling.swt.win32.extension.widgets.Window

/*******************************************************************************
* Copyright (c) 2007 cnfree.
* 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:
*  cnfree  - initial API and implementation
*******************************************************************************/
package org.sf.feeling.swt.win32.extension.widgets;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.sf.feeling.swt.win32.extension.Win32;
import org.sf.feeling.swt.win32.extension.graphics.ImageRegion;
import org.sf.feeling.swt.win32.extension.shell.ShellIcon;
import org.sf.feeling.swt.win32.extension.shell.SystemMenuManager;
import org.sf.feeling.swt.win32.extension.shell.Windows;
import org.sf.feeling.swt.win32.extension.shell.listener.WindowMoveListener;
import org.sf.feeling.swt.win32.internal.extension.Extension;
import org.sf.feeling.swt.win32.internal.extension.util.ColorCache;
import org.sf.feeling.swt.win32.internal.extension.widgets.BorderCanvas;
import org.sf.feeling.swt.win32.internal.extension.widgets.ButtonCanvas;
import org.sf.feeling.swt.win32.internal.extension.widgets.IContainer;
import org.sf.feeling.swt.win32.internal.extension.widgets.ISkinable;
import org.sf.feeling.swt.win32.internal.extension.widgets.IWindow;
import org.sf.feeling.swt.win32.internal.extension.widgets.ImageSkin;
import org.sf.feeling.swt.win32.internal.extension.widgets.MouseResizeListener;
import org.sf.feeling.swt.win32.internal.extension.widgets.SkinableWidget;
import org.sf.feeling.swt.win32.internal.extension.widgets.UIManager;
import org.sf.feeling.swt.win32.internal.extension.widgets.WindowResizeHook;

/**
* A Window can wrap a shell with specified custom style.
*
* @author <a href="mailto:cnfree2000@hotmail.com">cnfree</a>
*
*/
public class Window extends SkinableWidget implements IWindow
{

  protected Shell shell;

  private Composite titleArea;

  private Composite buttonArea;

  private Map buttons;

  private ControlAdapter resizeListener;

  private ShellAdapter shellListener;

  private WindowResizeHook resizeHook;

  private SystemMenuManager menuManager;

  private String theme = ThemeConstants.STYLE_OFFICE2007;

  Window()
  {
    super();
  }

  public Window(int style)
  {
    super(null, style);
    initWindow(style);
  }

  public Window(Shell shell)
  {
    super(shell, SWT.NONE);
    initWindow(SWT.PRIMARY_MODAL);
  }

  public Window(Shell shell, int style)
  {
    super(shell, style);
    initWindow(style);
  }

  public Window(Shell shell, int style, String theme)
  {
    super(shell, style);
    initWindow(style);
    this.theme = theme;
  }

  public Shell getShell()
  {
    return shell;
  }

  public Composite getClientArea()
  {
    return super.getClientArea();
  }

  public ISkinable getButtonSkin(int button)
  {
    return ((ButtonCanvas) buttons.get(new Integer(button))).getDrawable();
  }

  public void setButtonSkin(int button, ISkinable drawable)
  {
    ButtonCanvas canvse = ((ButtonCanvas) buttons.get(new Integer(button)));
    canvse.setDrawable(drawable);
    UIManager.transformWindowsButtonLayoutData(canvse, theme);
    buttonArea.layout();
    getBorder(IContainer.BORDER_N).layout();
  }

  public Image getImage()
  {
    return shell.getImage();
  }

  public void setImage(Image image)
  {
    shell.setImage(image);

    Label windowImage = (Label) titleArea.getData("image");
    GridData layoutData = (GridData) windowImage.getLayoutData();
    layoutData.widthHint = image.getBounds().width;
    layoutData.heightHint = image.getBounds().height;
    windowImage.setLayoutData(layoutData);
    windowImage.setBackgroundImage(image);

    titleArea.layout();
  }

  public String getText()
  {
    return shell.getText();
  }

  public void setText(String text)
  {
    shell.setText(text);
    Composite windowTitle = (Composite) titleArea.getData("title");
    windowTitle.redraw();
    windowTitle.update();
  }

  public void setBounds(Rectangle bounds)
  {
    shell.setBounds(bounds);
  }

  public void setBounds(int x, int y, int width, int height)
  {
    shell.setBounds(x, y, width, height);
  }

  public Rectangle getBounds()
  {
    return shell.getBounds();
  }

  public void setLocation(Point location)
  {
    shell.setLocation(location);
  }

  public void setLocation(int x, int y)
  {
    shell.setLocation(x, y);
  }

  public Point getLocation()
  {
    return shell.getLocation();
  }

  public void setSize(Point size)
  {
    shell.setSize(size);
  }

  public void setSize(int width, int height)
  {
    shell.setSize(width, height);
  }

  public Point getSize()
  {
    return shell.getSize();
  }

  public void setEnabled(int type, boolean enabled)
  {
    BorderCanvas border = (BorderCanvas) getBorder(IContainer.BORDER_N);
    ButtonCanvas button = (ButtonCanvas) buttons.get(new Integer(type));

    {
      GridData gridData = (GridData) button.getLayoutData();
      gridData.exclude = !enabled;
      button.setLayoutData(gridData);
      button.setVisible(enabled);
    }

    switch (type)
    {
    case ThemeConstants.BUTTON_MAX:
      ButtonCanvas revButton = (ButtonCanvas) buttons.get(new Integer(
          ThemeConstants.BUTTON_REV));
      GridData revData = (GridData) revButton.getLayoutData();
      revData.exclude = !enabled;
      revButton.setLayoutData(revData);
      revButton.setVisible(enabled);
      break;
    case ThemeConstants.BUTTON_REV:
      ButtonCanvas maxButton = (ButtonCanvas) buttons.get(new Integer(
          ThemeConstants.BUTTON_REV));
      GridData maxData = (GridData) maxButton.getLayoutData();
      maxData.exclude = !enabled;
      maxButton.setLayoutData(maxData);
      maxButton.setVisible(enabled);
      break;
    }
    border.layout();
  }

  public boolean getEnabled(int type)
  {
    ButtonCanvas button = (ButtonCanvas) buttons.get(new Integer(type));
    return button.getVisible();
  }

  public void layout()
  {
    if (menubar != null && !menubar.getControl().isDisposed())
    {
      GridData gd = (GridData) menubar.getControl().getLayoutData();
      gd.exclude = (menubar.getMenu() == null || menubar.getMenu().getItemCount() == 0);
      menubar.getControl().setLayoutData(gd);
      gd = (GridData) separator.getLayoutData();
      gd.exclude = (menubar.getMenu() == null || menubar.getMenu().getItemCount() == 0);
      separator.setLayoutData(gd);
    }
    getBorderContainer().layout();
    shell.layout();
    redrawShell();
  }

  public MenuBar getMenuBar()
  {
    return menubar;
  }

  public void open()
  {
    if (!UIManager.isInstall(this))
    {
      if (theme != null) UIManager.installTheme(theme, this);
      else
        UIManager.installTheme(this);
    }
    Display display = shell.getDisplay();
    layout();
    hookShellUI();
    shell.open();
    while (!shell.isDisposed())
    {
      if (!display.readAndDispatch()) display.sleep();
    }
  }

  public void close()
  {
    shell.close();
  }

  public Display getDisplay()
  {
    return shell.getDisplay();
  }

  public void setCenter()
  {
    Rectangle shellRect = shell.getBounds();
    Rectangle displayRect = shell.getDisplay().getBounds();
    int x = (displayRect.width - shellRect.width) / 2;
    int y = (displayRect.height - shellRect.height) / 2;
    shell.setLocation(x, y);
  }

  public void help(Event event)
  {
  }

  protected Composite createContents(Composite parent, int style)
  {
    if (parent != null && style != SWT.NONE)
    {
      if (parent instanceof Shell)
      {
        shell = new Shell((Shell) parent, createShellStyle(style));
      }
      else
      {
        shell = new Shell(parent.getShell(), createShellStyle(style));
      }
    }
    else if (parent != null)
    {
      if (parent instanceof Shell)
      {
        shell = new Shell((Shell) parent);
      }
      else
      {
        shell = new Shell(parent.getShell());
      }
    }
    else if (style != SWT.NONE)
    {
      shell = new Shell(createShellStyle(style));
    }
    else
    {
      shell = new Shell();
    }
    return shell;
  }

  protected void hookShellUI()
  {
    resizeListener = new ControlAdapter()
    {
      public void controlResized(ControlEvent e)
      {
        if (getClientArea() == null || getClientArea().isDisposed()) return;
        if (shell.getMaximized())
        {
          setShellMax();
        }
        else if (!shell.getMinimized())
        {
          restoreShell();
        }
        redrawShell();

      }
    };
    shell.addControlListener(resizeListener);
    shellListener = new ShellAdapter()
    {
      public void shellActivated(ShellEvent e)
      {
        if (getClientArea() == null || getClientArea().isDisposed()) return;
        redrawShell();
      }
    };
    shell.addShellListener(shellListener);
    Windows.hideTitleBar(shell.handle);
    Windows.setBorderThick(shell.handle, false);
    Windows.setWindowAsDialogModel(shell.handle, false);
    if (resizeHook == null) resizeHook = new WindowResizeHook(this);
    resizeHook.installHook();
    if (menuManager == null) menuManager = new SystemMenuManager(shell);
  }

  protected void unHookShellUI()
  {
    unHookShellUI(true);
  }

  protected void unHookShellUI(boolean forceRestore)
  {
    shell.removeControlListener(resizeListener);
    shell.removeShellListener(shellListener);
    if (UIManager.isInstall(this)) UIManager.unInstallTheme(this);
    if (forceRestore)
    {
      Display.getDefault().asyncExec(new Runnable()
      {
        public void run()
        {
          if (shell.isDisposed()) return;
          Windows.setWindowAsDialogModel(shell.handle,
              (shell.getStyle() & SWT.BORDER) != 0);
          Windows.showTitleBar(shell.handle);
          Windows.setBorderThick(shell.handle, true);
        }
      });
    }
  }

  private int createShellStyle(int style)
  {
    style |= SWT.NO_BACKGROUND;
    if ((style & SWT.TITLE) == 0)
    {
      style = style | SWT.TITLE | SWT.CLOSE;
    }
    if ((style & SWT.BORDER) != 0)
    {
      style = style & ~SWT.BORDER;
    }
    return style;
  }

  protected void initWindow(int style)
  {
    if ((style & SWT.TITLE) == 0) return;
    Canvas northBorder = getBorder(IContainer.BORDER_N);
    {
      GridLayout gridLayout = new GridLayout();
      gridLayout.numColumns = 2;
      gridLayout.horizontalSpacing = 0;
      gridLayout.verticalSpacing = 0;
      gridLayout.marginHeight = 0;
      gridLayout.marginWidth = 0;
      northBorder.setLayout(gridLayout);
    }

    {
      titleArea = new Composite(northBorder, SWT.NONE);
      GridData taData = new GridData(SWT.FILL, SWT.FILL, true, true);
      taData.verticalIndent = 3;
      titleArea.setLayoutData(taData);
      GridLayout taLayout = new GridLayout();
      taLayout.numColumns = 3;
      taLayout.horizontalSpacing = 0;
      taLayout.verticalSpacing = 0;
      taLayout.marginHeight = 0;
      taLayout.marginWidth = 0;
      titleArea.setLayout(taLayout);

      createWindowImage(titleArea);

      createWindowTitle(titleArea);
    }

    {
      createButtons(northBorder);
    }
    boolean resizable = (style & SWT.RESIZE) != 0;

    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_N, (BorderCanvas) getBorder(IContainer.BORDER_N),
          resizable);
      getBorder(IContainer.BORDER_N).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_N).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_N).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_E, (BorderCanvas) getBorder(IContainer.BORDER_E),
          resizable);
      getBorder(IContainer.BORDER_E).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_E).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_E).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_S, (BorderCanvas) getBorder(IContainer.BORDER_S),
          resizable);
      getBorder(IContainer.BORDER_S).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_S).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_S).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_W, (BorderCanvas) getBorder(IContainer.BORDER_W),
          resizable);
      getBorder(IContainer.BORDER_W).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_W).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_W).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_NE, (BorderCanvas) getBorder(IContainer.BORDER_NE),
          resizable);
      getBorder(IContainer.BORDER_NE).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_NE).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_NE).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_NW, (BorderCanvas) getBorder(IContainer.BORDER_NW),
          resizable);
      getBorder(IContainer.BORDER_NW).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_NW).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_NW).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_SE, (BorderCanvas) getBorder(IContainer.BORDER_SE),
          resizable);
      getBorder(IContainer.BORDER_SE).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_SE).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_SE).addListener(SWT.MouseExit, mouseResizeListener);
    }
    {
      final MouseResizeListener mouseResizeListener = new MouseResizeListener(
          IContainer.BORDER_SW, (BorderCanvas) getBorder(IContainer.BORDER_SW),
          resizable);
      getBorder(IContainer.BORDER_SW).addListener(SWT.MouseDown, mouseResizeListener);
      getBorder(IContainer.BORDER_SW).addListener(SWT.MouseMove, mouseResizeListener);
      getBorder(IContainer.BORDER_SW).addListener(SWT.MouseExit, mouseResizeListener);
    }

    {
      final WindowMoveListener mouseMoveListener = new WindowMoveListener(shell, true);
      titleArea.addListener(SWT.MouseDown, mouseMoveListener);
      titleArea.addListener(SWT.MouseMove, mouseMoveListener);
      titleArea.addListener(SWT.MouseUp, mouseMoveListener);

      Composite windowTitle = (Composite) titleArea.getData("title");
      windowTitle.addListener(SWT.MouseDown, mouseMoveListener);
      windowTitle.addListener(SWT.MouseMove, mouseMoveListener);
      windowTitle.addListener(SWT.MouseUp, mouseMoveListener);
    }

    {
      setEnabled(ThemeConstants.BUTTON_HELP, false);

      if ((style & SWT.MAX) != 0)
      {
        setEnabled(ThemeConstants.BUTTON_MAX, true);
      }
      else
      {
        setEnabled(ThemeConstants.BUTTON_MAX, false);
      }

      if ((style & SWT.MIN) != 0)
      {
        setEnabled(ThemeConstants.BUTTON_MIN, true);
      }
      else
      {
        setEnabled(ThemeConstants.BUTTON_MIN, false);
      }

      if ((style & SWT.CLOSE) != 0)
      {
        setEnabled(ThemeConstants.BUTTON_CLOSE, true);
      }
      else
      {
        setEnabled(ThemeConstants.BUTTON_CLOSE, false);
      }

      buttonArea.layout();
    }

    checkButtonStatus();
  }

  private void createButtons(final Composite parent)
  {

    buttonArea = new Composite(parent, SWT.NONE);

    buttonArea.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false));
    GridLayout bcLayout = new GridLayout();
    bcLayout.numColumns = 5;
    bcLayout.horizontalSpacing = 0;
    bcLayout.verticalSpacing = 0;
    bcLayout.marginHeight = 0;
    bcLayout.marginWidth = 0;
    buttonArea.setLayout(bcLayout);

    buttons = new HashMap(5);

    int buttonType = 0;
    for (buttonType = 0; buttonType < 5; buttonType++)
    {
      final ButtonCanvas buttonCanvas = new ButtonCanvas(buttonArea, buttonType);
      buttonCanvas
          .setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));

      switch (buttonType)
      {
      case ThemeConstants.BUTTON_MAX:
        buttonCanvas.addListener(SWT.MouseUp, new Listener()
        {
          public void handleEvent(Event event)
          {
            if (event.button != 1) return;
            Rectangle rect = new Rectangle(0, 0, buttonCanvas.getBounds().width,
                buttonCanvas.getBounds().height);
            if (!rect.contains(event.x, event.y)) return;
            shell.setMaximized(true);
          }
        });
        break;
      case ThemeConstants.BUTTON_REV:
        buttonCanvas.addListener(SWT.MouseUp, new Listener()
        {
          public void handleEvent(Event event)
          {
            if (event.button != 1) return;
            Rectangle rect = new Rectangle(0, 0, buttonCanvas.getBounds().width,
                buttonCanvas.getBounds().height);
            if (!rect.contains(event.x, event.y)) return;
            shell.setMaximized(false);
          }
        });
        break;
      case ThemeConstants.BUTTON_MIN:
        buttonCanvas.addListener(SWT.MouseUp, new Listener()
        {
          public void handleEvent(Event event)
          {
            if (event.button != 1) return;
            Rectangle rect = new Rectangle(0, 0, buttonCanvas.getBounds().width,
                buttonCanvas.getBounds().height);
            if (!rect.contains(event.x, event.y)) return;
            shell.setMinimized(true);
          }
        });
        break;
      case ThemeConstants.BUTTON_CLOSE:
        buttonCanvas.addListener(SWT.MouseUp, new Listener()
        {
          public void handleEvent(Event event)
          {
            if (event.button != 1) return;
            Rectangle rect = new Rectangle(0, 0, buttonCanvas.getBounds().width,
                buttonCanvas.getBounds().height);
            if (!rect.contains(event.x, event.y)) return;
            shell.close();
          }
        });
        break;
      case ThemeConstants.BUTTON_HELP:
        buttonCanvas.addListener(SWT.MouseUp, new Listener()
        {
          public void handleEvent(Event event)
          {
            if (event.button != 1) return;
            Rectangle rect = new Rectangle(0, 0, buttonCanvas.getBounds().width,
                buttonCanvas.getBounds().height);
            if (!rect.contains(event.x, event.y)) return;
            help(event);
          }
        });
        break;
      }

      buttons.put(new Integer(buttonType), buttonCanvas);
    }
  }

  protected Composite getBorderContainer()
  {
    return shell;
  }

  protected void hiddenBorders(boolean isHidden)
  {
    Composite composite = getBorderContainer();
    if (composite == null) return;
    GridLayout layout = (GridLayout) composite.getLayout();
    if (layout == null) return;
    if (isHidden)
    {
      layout.numColumns = 1;
    }
    else
    {
      layout.numColumns = 3;
    }
    hiddenControl(getBorder(IContainer.BORDER_NW), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_NE), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_W), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_E), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_SW), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_S), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_SE), isHidden);
    hiddenControl(getBorder(IContainer.BORDER_S).getParent(), isHidden);
    composite.layout();
  }

  private void hiddenControl(Control control, boolean isHidden)
  {
    GridData gd = (GridData) control.getLayoutData();
    gd.exclude = isHidden;
    control.setLayoutData(gd);
    control.setVisible(!isHidden);
  }

  private void createWindowImage(Composite parent)
  {
    Label windowImage = new Label(parent, SWT.NONE);
    GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
    gd.horizontalIndent = 1;
    windowImage.setLayoutData(gd);
    windowImage.setAlignment(SWT.CENTER);
    Image image = null;
    try
    {
      Class cl = Class.forName("org.eclipse.swt.widgets.Decorations");
      Field f = cl.getDeclaredField("smallImage");
      f.setAccessible(true);
      image = (Image) f.get(shell);
      if (image == null && shell.getImages() != null)
      {
        if (shell.getImages().length > 0) image = shell.getImages()[0];
      }
      if (image == null && shell.getImage() != null)
      {
        image = shell.getImage();
      }
      if (image == null)
      {
        image = ShellIcon.getSystemIcons(2, Win32.ICON_SMALL)[0];
        shell.setImage(image);
      }
      windowImage.setImage(image);
    } catch (Exception e)
    {
    }
    windowImage.addListener(SWT.MouseDown, new Listener()
    {

      public void handleEvent(Event event)
      {
        if (!menuManager.isMenuVisiable()) menuManager.showMenu(getClientArea()
            .getParent().toDisplay(new Point(0, 0)));
      }

    });

    windowImage.addListener(SWT.MouseDoubleClick, new Listener()
    {

      public void handleEvent(Event event)
      {
        shell.close();
      }

    });

    parent.setData("image", windowImage);
  }

  private void createWindowTitle(Composite parent)
  {
    final Composite windowTitle = new Composite(parent, SWT.NONE);
    GridData wtData = new GridData(GridData.FILL, GridData.FILL, true, true);
    wtData.horizontalIndent = 5;
    windowTitle.setLayoutData(wtData);
    Listener listener = new Listener()
    {
      public void handleEvent(Event e)
      {
        switch (e.type)
        {
        case SWT.Paint:
          FontData tFontData = e.gc.getFont().getFontData()[0];
          tFontData.setStyle(UIManager.getTitleBarFontStyle(theme));
          Font tFont = new Font(getDisplay(), tFontData);
          e.gc.setFont(tFont);

          int fontHeight = e.gc.getFontMetrics().getHeight();
          int areaHeight = titleArea.getBounds().height;

          Color foreground = getBorder(IContainer.BORDER_N).getForeground();

          {
            if (UIManager.isTitleUsedShadow(theme))
            {
              RGB fRGB = foreground.getRGB();
              RGB nfRGB = new RGB(255 - fRGB.red, 255 - fRGB.green,
                  255 - fRGB.blue);
              Color eForeground = ColorCache.getInstance().getColor(nfRGB);
              e.gc.setForeground(eForeground);
              e.gc.drawText(shell.getText(), 1,
                  (areaHeight - fontHeight) / 2 + 1, true);
            }
          }

          e.gc.setForeground(foreground);
          e.gc.drawText(shell.getText(), 0, (areaHeight - fontHeight) / 2, true);
          tFont.dispose();

          break;
        case SWT.MouseDoubleClick:
          if (getEnabled(ThemeConstants.BUTTON_MAX)
              || getEnabled(ThemeConstants.BUTTON_REV))
          {
            if (shell.getMaximized())
            {
              shell.setMaximized(false);
            }
            else
            {
              shell.setMaximized(true);
            }
          }
          break;
        }
      }
    };
    windowTitle.addListener(SWT.Paint, listener);
    windowTitle.addListener(SWT.MouseDoubleClick, listener);
    windowTitle.addListener(SWT.MenuDetect, new Listener()
    {
      public void handleEvent(Event event)
      {
        menuManager.showMenu();
      }

    });
    parent.setData("title", windowTitle);
  }

  public void redrawShell()
  {
    if (!UIManager.isInstall(this))
    {
      Extension.SetWindowRgn(shell.handle, 0, true);
      return;
    }
    Region region = new Region();
    Rectangle rect = shell.getClientArea();
    region.add(rect);
    if (!shell.getMaximized())
    {
      ImageData data = ((ImageSkin) Window.this.getSkin(IContainer.BORDER_NW))
          .getImage().getImageData();
      Region opaqueRegion = ImageRegion.calculateOpaquePath(data, data.transparentPixel);
      region.subtract(opaqueRegion);
      opaqueRegion.dispose();

      data = ((ImageSkin) Window.this.getSkin(IContainer.BORDER_NE)).getImage()
          .getImageData();
      opaqueRegion = ImageRegion.calculateOpaquePath(data, data.transparentPixel,
          rect.width - data.width, 0);
      region.subtract(opaqueRegion);
      opaqueRegion.dispose();
      data = ((ImageSkin) Window.this.getSkin(IContainer.BORDER_SW)).getImage()
          .getImageData();
      opaqueRegion = ImageRegion.calculateOpaquePath(data, data.transparentPixel, 0,
          rect.height - data.height);
      region.subtract(opaqueRegion);
      opaqueRegion.dispose();

      data = ((ImageSkin) Window.this.getSkin(IContainer.BORDER_SE)).getImage()
          .getImageData();
      opaqueRegion = ImageRegion.calculateOpaquePath(data, data.transparentPixel,
          rect.width - data.width, rect.height - data.height);
      region.subtract(opaqueRegion);
      opaqueRegion.dispose();
    }

    int hRegion = 0;
    hRegion = Extension.CreateRectRgn(0, 0, 0, 0);
    Extension.CombineRgn(hRegion, region.handle, hRegion, Win32.RGN_OR);
    Extension.SetWindowRgn(shell.handle, hRegion, true);
    Extension.DeleteObject(hRegion);
    region.dispose();
  }

  protected void setShellMax()
  {
    hiddenBorders(true);
    checkButtonStatus(true);
  }

  protected void restoreShell()
  {
    hiddenBorders(false);
    checkButtonStatus(false);
  }

  private void checkButtonStatus(boolean maximized)
  {
    if (getClientArea() == null || getClientArea().isDisposed()) return;
    if (!getEnabled(ThemeConstants.BUTTON_MAX) && !getEnabled(ThemeConstants.BUTTON_REV))
    {
      return;
    }

    ButtonCanvas max = (ButtonCanvas) buttons.get(new Integer(ThemeConstants.BUTTON_MAX));
    hiddenControl(max, maximized);

    ButtonCanvas rev = (ButtonCanvas) buttons.get(new Integer(ThemeConstants.BUTTON_REV));
    hiddenControl(rev, !maximized);

    buttonArea.layout();
    getBorder(IContainer.BORDER_N).layout();
  }

  private void checkButtonStatus()
  {
    if (getClientArea() == null || getClientArea().isDisposed()) return;
    if (!getEnabled(ThemeConstants.BUTTON_MAX) && !getEnabled(ThemeConstants.BUTTON_REV))
    {
      return;
    }

    boolean maximized = shell.getMaximized();
    checkButtonStatus(maximized);
  }

  public boolean isThemeInstalled()
  {
    return UIManager.isInstall(this);
  }

  public String getTheme()
  {
    return theme;
  }

  public void setTheme(String theme)
  {
    this.theme = theme;
  }
}
TOP

Related Classes of org.sf.feeling.swt.win32.extension.widgets.Window

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.