@Override
    public boolean mouseUp(Component component, Mouse.Button button, int x, int y) {
      boolean consumed = super.mouseUp(component, button, x, y);

      if (button == Mouse.Button.LEFT && Mouse.getCapturer() == component) {
        Mouse.release();
      }

      return consumed;
    }
    @Override
    public boolean mouseMove(Component component, int x, int y) {
      boolean consumed = super.mouseMove(component, x, y);

      if (Mouse.getCapturer() == component) {
        ScrollBar scrollBar = (ScrollBar) TerraScrollBarSkin.this.getComponent();
        Orientation orientation = scrollBar.getOrientation();

        // Calculate the new scroll bar value
        int pixelValue;
        if (orientation == Orientation.HORIZONTAL) {
          pixelValue = component.getX() - scrollUpButton.getWidth() + x - dragOffset;
        } else {
          pixelValue = component.getY() - scrollUpButton.getHeight() + y - dragOffset;
        }

        int realValue = (int) (pixelValue / getValueScale());

        // Bound the value
        int end = scrollBar.getEnd();
        int extent = scrollBar.getExtent();
        realValue = Math.min(Math.max(realValue, 0), end - extent);

        // Update the scroll bar
        scrollBar.setValue(realValue);
      }

      return consumed;
    }
    @Override
    public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
      boolean consumed = super.mouseDown(component, button, x, y);

      if (button == Mouse.Button.LEFT) {
        ScrollBar scrollBar = (ScrollBar) TerraScrollBarSkin.this.getComponent();
        Orientation orientation = scrollBar.getOrientation();

        dragOffset = (orientation == Orientation.HORIZONTAL ? x : y);
        Mouse.capture(component);
        consumed = true;
      }

      return consumed;
    }