content: package mods.eln.gui;
  
  import mods.eln.misc.Utils;
  import net.minecraft.client.Minecraft;
  import net.minecraft.client.gui.Gui;
  
  import java.util.ArrayList;
  
  public class GuiVerticalTrackBar extends Gui implements IGuiObject {
  
      public boolean sliderDrawEnable = true;
      public int width, height, xPosition, yPosition;
  
      public boolean enable = false, visible = true;
      boolean drag = false;
  
      public float min = 0f, max = 1.0f;
      int stepId = 0, stepIdMax = 10;
  
      IGuiObjectObserver observer;
      GuiHelper helper;
  
      public void setVisible(boolean visible) {
          this.visible = visible;
          if (!visible) drag = false;
      }
  
      @Override
      public int getYMax() {
          return yPosition + height;
      }
  
      public void setObserver(IGuiObjectObserver observer) {
          this.observer = observer;
      }
  
      public GuiVerticalTrackBar(int xPosition, int yPosition, int width, int height, GuiHelper helper) {
          this.width = width;
          this.height = height;
          this.xPosition = xPosition;
          this.yPosition = yPosition;
          enable = true;
          this.helper = helper;
      }
  
      public void setEnable(boolean enable) {
          this.enable = enable;
          if (!enable || !visible) drag = false;
      }
  
      void stepLimit() {
          if (stepId < 0) stepId = 0;
          if (stepId > stepIdMax) stepId = stepIdMax;
      }
  
      public void setStepIdMax(int stepIdMax) {
          this.stepIdMax = stepIdMax;
          stepLimit();
      }
  
      public void setStepId(int stepId) {
          this.stepId = stepId;
          stepLimit();
      }
  
      public void setValue(float value) {
          if (!drag) {
              this.stepId = (int) ((value - min) / (max - min) * stepIdMax + 0.5);
              stepLimit();
          }
      }
  
      public float getValue() {
          return min + (max - min) * stepId / stepIdMax;
      }
  
      public boolean mouseClicked(int x, int y, int which) {
          if (enable && visible && which == 0 && x > xPosition && y > yPosition && x < xPosition + width && y < yPosition + height) {
              //Utils.println("mouseClicked");
              drag = true;
              return true;
          }
          return false;
      }
  
      /**
       * Called when the mouse is moved or a mouse button is released.  Signature: (mouseX, mouseY, which) which==-1 is
       * mouseMove, which==0 or which==1 is mouseUp
       */
      public boolean mouseMovedOrUp(int x, int y, int which) {
          //Utils.println("mouseMovedOrUp "+ x + " " + y + " " + which);
          if (enable && visible && drag && which == 0) {
              mouseMove(x, y);
              if (observer != null) observer.guiObjectEvent(this);
              Utils.println("New Value : " + getValue());
              drag = false;
              return true;
          }
          return false;
      }
  
      public void setRange(float min, float max) {
          this.min = min;
          this.max = max;
          stepLimit();
      }
  
      public void mouseMove(int x, int y) {
          if (drag) {
              stepId = (int) ((1.0 - (double) (y - yPosition) / height + 1.0 / stepIdMax / 2.0) * stepIdMax);
  
              stepLimit();
          }
      }
  
      public void imouseMove(int x, int y) {
          mouseMove(x, y);
      }
  
      public int getCursorPosition() {
          return (int) (yPosition + height - 1.0 * stepId / stepIdMax * height);
      }
  
      public int getCursorPositionForValue(float value) {
          value -= min;
          int yCalc = (int) (yPosition + height - (value / (max - min)) * height);
          if (yCalc < yPosition) yCalc = yPosition;
          if (yCalc > yPosition + height) yCalc = yPosition + height;
          return yCalc;
      }
  
      public void drawBase(float par1, int x, int y) {
          if (!visible) return;
  
          drawRect(xPosition, yPosition - 2, xPosition + width, yPosition + height + 2, 0xFF404040);
          drawRect(xPosition + 1, yPosition - 1, xPosition + width - 1, yPosition + height + 1, 0xFF606060);
          drawRect(xPosition + 2, yPosition, xPosition + width - 2, yPosition + height, 0xFF808080);
      }
  
      public void drawBare(float par1, int x, int y) {
          if (!visible) return;
          if (!sliderDrawEnable) return;
  
          drawRect(xPosition - 2, getCursorPosition() - 2, xPosition + width + 2, getCursorPosition() + 2, 0xFF202020);
          drawRect(xPosition - 1, getCursorPosition() - 1, xPosition + width + 1, getCursorPosition() + 1, 0xFF606060);
      }
  
      ArrayList<String> comment = new ArrayList<String>();
  
      public void setComment(String[] comment) {
          this.comment.clear();
          for (String str : comment) {
              this.comment.add(str);
          }
      }
  
      public void setComment(int line, String comment) {
          if (this.comment.size() < line + 1)
              this.comment.add(line, comment);
          else
              this.comment.set(line, comment);
      }
  
      @Override
      public void idraw(int x, int y, float f) {
          drawBase(f, x, y);
          drawBare(f, x, y);
      }
  
      @Override
      public boolean ikeyTyped(char key, int code) {
          return false;
      }
  
      @Override
      public void imouseClicked(int x, int y, int code) {
          if (mouseClicked(x, y, code)) {
          }
      }
  
      @Override
      public void imouseMovedOrUp(int x, int y, int witch) {
          mouseMovedOrUp(x, y, witch);
      }
  
      @Override
      public void idraw2(int x, int y) {
          if (visible && (x >= xPosition && y >= yPosition && x < xPosition + width && y < yPosition + height) || drag) {
              int px, py;
              px = xPosition - helper.getHoveringTextWidth(comment, Minecraft.getMinecraft().fontRenderer) / 2;
              py = yPosition + height + 20/* - helper.getHoveringTextHeight(comment,Minecraft.getMinecraft().fontRenderer)*/;
              helper.drawHoveringText(comment, px, py, Minecraft.getMinecraft().fontRenderer);
          }
      }
  
      @Override
      public void translate(int x, int y) {
          this.xPosition += x;
          this.yPosition += y;
      }
  
      public float getStepId() {
          return stepId;
      }
  }
  