return "Click left mouse button while holding <ctrl> and <alt> to display a save dialog.";
return "Click left mouse button while holding <alt> and <shift> to display a save dialog.";
  public String getToolTipText(MouseEvent ev) {        if(m_as!=null && m_as.nominalCounts!=null) { //if current attrib is nominal            float intervalWidth = this.getWidth() / (float)m_as.nominalCounts.length;      float heightRatio;            int barWidth, x=0, y=0;            //if intervalWidth is at least six then bar width is 80% of intervalwidth      if(intervalWidth>5) //the rest is padding        barWidth = (int)Math.floor(intervalWidth*0.8F);      else        barWidth = 1;  //Otherwise barwidth is 1 & padding would be at least 1.            //initializing x to maximum of 1 or 10% of interval width (i.e. half of       //the padding which is 20% of interval width, as there is 10% on each       //side of the bar) so that it points to the start of the 1st bar      x = x + (int)( (Math.floor(intervalWidth*0.1F))<1 ?                      1:(Math.floor(intervalWidth*0.1F)) );      //Adding to x the appropriate value so that it points to the 1st bar of       //our "centered" barplot. If subtracting barplots width from panel width       //gives <=2 then the barplot is not centered.      if(this.getWidth() - (m_as.nominalCounts.length*barWidth+                           (int)( (Math.floor(intervalWidth*0.2F))<1 ?                                    1:(Math.floor(intervalWidth*0.2F)) ) *                            m_as.nominalCounts.length) > 2 ) {                //The following amounts to adding to x the half of the area left after        //subtracting from the components width the width of the whole barplot        //(i.e. width of all the bars plus the width of all the bar paddings,         //thereby equaling to the whole barplot), since our barplot is centered.        x += ( this.getWidth() - (m_as.nominalCounts.length*barWidth +                                  (int)( (Math.floor(intervalWidth*0.2F))<1 ?                                         1:(Math.floor(intervalWidth*0.2F)) ) *                                  m_as.nominalCounts.length) ) / 2;      }              for(int i=0; i<m_as.nominalCounts.length; i++) {                heightRatio = (this.getHeight()-(float)m_fm.getHeight())/m_maxValue;        //initializing y to point to (from top) the start of the bar        y = this.getHeight()-Math.round(m_as.nominalCounts[i]*heightRatio);                //if our mouse is on a bar then return the count of this bar in our        //barplot         if(ev.getX() >= x && ev.getX()<=x+barWidth &&            ev.getY() >= this.getHeight() -                         Math.round(m_as.nominalCounts[i]*heightRatio) )          return(m_data.attribute(m_attribIndex).value(i)+                 " ["+m_as.nominalCounts[i]+"]");        //otherwise advance x to next bar and check that. Add barwidth to x         //and padding which is max(1, 20% of interval width)        x = x+barWidth+(int)( (Math.floor(intervalWidth*0.2F))<1 ?                               1:(Math.floor(intervalWidth*0.2F)) );      }    }    else if(m_threadRun==false &&     //if attrib is numeric            (m_histBarCounts!=null || m_histBarClassCounts!=null)) {      float heightRatio, intervalWidth;      int x=0, y=0,  barWidth;      double bar = m_as.numericStats.min;            //if the class attribute is set and it is nominal       if((m_classIndex >= 0) && (m_data.attribute(m_classIndex).isNominal())) {        //there is 3 pixels of padding on each side of the histogram        //the barwidth is 1 if after removing the padding its width is less        //then the displayable width        barWidth = ((this.getWidth()-6)/m_histBarClassCounts.length)<1 ?                    1:((this.getWidth()-6)/m_histBarClassCounts.length);                //initializing x to 3 adding appropriate value to make it point to the         //start of the 1st bar of our "centered" histogram.        x = 3;        if( (this.getWidth() - (x + m_histBarClassCounts.length*barWidth)) > 5 )          x += (this.getWidth() - (x + m_histBarClassCounts.length*barWidth))/2;                heightRatio = (this.getHeight()-(float)m_fm.getHeight())/m_maxValue;                if( ev.getX()-x >= 0) {          //The temp holds the index of the current interval that we are looking          //at          int temp = (int)((ev.getX()-x)/(barWidth+0.0000000001));          if(temp == 0){  //handle the special case temp==0. see footnote 1            int sum=0;            for(int k=0; k<m_histBarClassCounts[0].length; k++)              sum += m_histBarClassCounts[0][k];            //return the count of the interval mouse is pointing to plus             //the range of values that fall into this interval            return ("<html><center><font face=Dialog size=-1>"+sum+"<br>"+                    "["+Utils.doubleToString(bar+m_barRange*temp,3)+                    ", "+Utils.doubleToString((bar+m_barRange*(temp+1)),3)+                    "]"+"</font></center></html>");          }          else if( temp < m_histBarClassCounts.length ) { //handle case temp!=0            int sum=0;            for(int k=0; k<m_histBarClassCounts[temp].length; k++)              sum+=m_histBarClassCounts[temp][k];            //return the count of the interval mouse is pointing to plus             //the range of values that fall into this interval            return ("<html><center><font face=Dialog size=-1>"+sum+"<br>("+                    Utils.doubleToString(bar+m_barRange*temp,3)+", "+                    Utils.doubleToString((bar+m_barRange*(temp+1)),3)+                    "]</font></center></html>");          }        }      }      else {  //else if the class attribute is not set or is numeric        barWidth = ((this.getWidth()-6)/m_histBarCounts.length) < 1 ?                    1 : ((this.getWidth()-6)/m_histBarCounts.length);                //initializing x to 3 adding appropriate value to make it point to the         //start of the 1st bar of our "centered" histogram.        x = 3;        if( (this.getWidth() - (x + m_histBarCounts.length*barWidth)) > 5 )          x += (this.getWidth() - (x + m_histBarCounts.length*barWidth))/2;                heightRatio = (this.getHeight()-(float)m_fm.getHeight())/m_maxValue;                if( ev.getX()-x >= 0) {          //Temp holds the index of the current bar we are looking at.          int temp = (int)((ev.getX()-x)/(barWidth+0.0000000001));                    //return interval count as well as its range          if(temp == 0) //handle special case temp==0. see footnote 1.            return ("<html><center><font face=Dialog size=-1>"+                    m_histBarCounts[0]+"<br>"+                    "["+Utils.doubleToString(bar+m_barRange*temp,3)+", "+                    Utils.doubleToString((bar+m_barRange*(temp+1)),3)+                    "]"+                    "</font></center></html>");          else if(temp < m_histBarCounts.length) //handle case temp!=0            return ("<html><center><font face=Dialog size=-1>"+                    m_histBarCounts[temp]+"<br>"+                    "("+Utils.doubleToString(bar+m_barRange*temp,3)+", "+                    Utils.doubleToString((bar+m_barRange*(temp+1)),3)+                    "]"+                    "</font></center></html>");        }      }    }    return "Click left mouse button while holding <ctrl> and <alt> to display a save dialog.";  }