⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 titlebar.java

📁 Novocode的 SWT 控件框架 丰富了MDI功能
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
          {
            timerTask.cancel();
            timerTask = null;
          }
          long now = System.currentTimeMillis();
          if(lastUpdate + UPDATE_DELAY < now)
          {
            performMove(event);
            lastUpdate = now;
          }
          else
          {
            timerTask = new TimerTask()
            {
              public void run()
              {
                final TimerTask executingTask = this;
                event.display.asyncExec(new Runnable()
                {
                  public void run()
                  {
                    if(executingTask != timerTask) return;
                    performMove(event);
                  }
                });
              }
            };
            timer.schedule(timerTask, UPDATE_DELAY);
          }
        }
      }
    });
    
    addListener(SWT.MouseUp, new Listener()
    {
      public void handleEvent(Event event)
      {
        if(ishell.getMaximized()) return;
        if(image == null || event.x >= LEFT_PADDING + IMAGE_SIZE)
        {
          if(timerTask != null)
          {
            timerTask.cancel();
            timerTask = null;
          }
          if(!cancelled && (event.stateMask & SWT.BUTTON1) != 0)
          {
            performMove(event);
          }
        }
      }
    });

    final Listener activateListener = new Listener()
    {
      public void handleEvent(Event event)
      {
        redraw();
      }
    };
    final Listener deactivateListener = new Listener()
    {
      public void handleEvent(Event event)
      {
        redraw();
      }
    };
    shell.addListener(SWT.Activate, activateListener);
    shell.addListener(SWT.Deactivate, deactivateListener);
    
    addListener(SWT.Dispose, new Listener()
    {
      public void handleEvent(Event event)
      {
        timer.cancel();
        shell.removeListener(SWT.Activate, activateListener);
        shell.removeListener(SWT.Deactivate, deactivateListener);
        closeImage.dispose();
        maximizeImage.dispose();
        restoreImage.dispose();
        minimizeImage.dispose();
        defaultPopup.dispose();
      }
    });
  }


  private void performMove(Event event)
  {
    Point p = ishell.getLocation();
    int newX = p.x + event.x - mouseDownOffsetX;
    int newY = p.y + event.y - mouseDownOffsetY;

    // Make sure that the minimum grab area stays visible
    Rectangle deskCA = desktop.getClientArea();
    Rectangle bounds = getBounds();
    newX = Math.min(Math.max(newX, deskCA.x-bounds.x-bounds.width+MINIMUM_GRAB_AREA), deskCA.x-bounds.x+deskCA.width-minGrabSize.x);
    newY = Math.min(Math.max(newY, deskCA.y-bounds.y-bounds.height+MINIMUM_GRAB_AREA), deskCA.y-bounds.y+deskCA.height-MINIMUM_GRAB_AREA);

    if(newX != p.x || newY != p.y) ishell.setLocation(newX, newY);
  }
  
  
  public Point getMinGrabSize()
  {
    return minGrabSize;
  }


  public Point computeSize(int wHint, int hHint, boolean changed)
  {
    checkWidget();
    if(wHint == SWT.DEFAULT) wHint = 50;
    if(hHint == SWT.DEFAULT)
    {
      GC gc = new GC(this);
      hHint = gc.getFontMetrics().getHeight();
      hHint = Math.max(hHint, styleTool ?  TOOL_SIZE : IMAGE_SIZE);
      hHint += TOP_PADDING + BOTTOM_PADDING;
      gc.dispose();
    }
    return new Point(wHint, hHint);
  }


  private static int checkStyle(int style)
  {
    //int mask = SWT.SHADOW_IN | SWT.FLAT;
    //style &= mask;
    style = SWT.NO_FOCUS;
    return style;
  }


  public boolean setFocus()
  {
    checkWidget();
    return false;
  }


  public boolean isReparentable ()
  {
    checkWidget();
    return false;
  }
  
  
  public void setText(String text)
  {
    checkWidget();
    this.text = text;
    redraw();
  }
  
  
  public String getText() { return text; }
  
  
  public void setImage(Image image)
  {
    checkWidget();
    if(styleTool) return;
    this.image = image;
    minGrabSize.x = MINIMUM_GRAB_AREA;
    if(image != null) minGrabSize.x += LEFT_PADDING + IMAGE_SIZE;
    redraw();
  }
  
  
  public Image getImage() { return image; }


  private Font createTitleFont(Font f, boolean tool)
  {
    FontData[] fds = f.getFontData();
    for(FontData fd: fds)
    {
      fd.setStyle(fd.getStyle() | SWT.BOLD);
      if(tool) fd.setHeight((int)(fd.getHeight()*0.9));
    }
    return new Font(getDisplay(), fds);
  }
  
  
  private void instrumentDefaultPopup(boolean onImage)
  {
    restoreItem.setEnabled(styleMax && ishell.getMaximized());
    maximizeItem.setEnabled(styleMax && !ishell.getMaximized());
    MenuItem def = null;
    if(onImage)
    {
      if(styleClose) def = closeItem;
    }
    else if(styleMax)
    {
      def = ishell.getMaximized() ? restoreItem : maximizeItem;
    }
    defaultPopup.setDefaultItem(def);
  }
  
  
  private static final int IMAGE_TYPE_CLOSE    = 1;
  private static final int IMAGE_TYPE_MAXIMIZE = 2;
  private static final int IMAGE_TYPE_RESTORE  = 3;
  private static final int IMAGE_TYPE_MINIMIZE = 4;


  private Image createMenuImage(int type, int height)
  {
    final Point size = new Point(height, height);
    final int imgWidth = height + height/2;
    final Color fg = getForeground();
    final Color white = getDisplay().getSystemColor(SWT.COLOR_WHITE);
    final RGB blackRGB = new RGB(0,0,0);
    
    ImageData id = new ImageData(imgWidth, size.y, 1, new PaletteData(new RGB[] { blackRGB, fg.getRGB() }));
    ImageData maskid = new ImageData(imgWidth, size.y, 1, new PaletteData(new RGB[] { blackRGB, white.getRGB() }));

    Image img = new Image(getDisplay(), id);
    GC gc = new GC(img);
    gc.setForeground(fg);
    drawMenuImage(gc, size, type);
    gc.dispose();
    
    Image maskimg = new Image(getDisplay(), maskid);
    gc = new GC(maskimg);
    gc.setForeground(white);
    drawMenuImage(gc, size, type);
    gc.dispose();

    Image transp = new Image(getDisplay(), img.getImageData(), maskimg.getImageData());
    img.dispose();
    maskimg.dispose();
    return transp;
  }


  private void drawMenuImage(GC gc, Point size, int type)
  {
    switch(type)
    {
      case IMAGE_TYPE_CLOSE:
        gc.drawLine(1, 1, size.x-2, size.y-2);
        gc.drawLine(2, 1, size.x-2, size.y-3);
        gc.drawLine(1, 2, size.x-3, size.y-2);
        gc.drawLine(1, size.y-2, size.x-2, 1);
        gc.drawLine(1, size.y-3, size.x-3, 1);
        gc.drawLine(2, size.y-2, size.x-2, 2);
        break;

      case IMAGE_TYPE_RESTORE:
        gc.drawRectangle(0, 4, size.x-4, size.y-6);
        gc.drawLine(1, 5, size.x-5, 5);
        gc.drawLine(2, 1, size.x-2, 1);
        gc.drawLine(2, 2, size.x-2, 2);
        gc.drawPoint(2, 3);
        gc.drawLine(size.x-2, 3, size.x-2, size.y-5);
        gc.drawPoint(size.x-3, size.y-5);
        break;

      case IMAGE_TYPE_MAXIMIZE:
        gc.drawRectangle(0, 0, size.x-2, size.y-2);
        gc.drawLine(1, 1, size.x-3, 1);
        break;

      case IMAGE_TYPE_MINIMIZE:
        gc.drawLine(1, size.y-2, size.x-4, size.y-2);
        gc.drawLine(1, size.y-3, size.x-4, size.y-3);
        break;
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -