Package org.rstudio.studio.client.workbench.views.plots.ui.manipulator

Source Code of org.rstudio.studio.client.workbench.views.plots.ui.manipulator.ManipulatorManager

/*
* ManipulatorManager.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.plots.ui.manipulator;

import org.rstudio.core.client.widget.ProgressImage;
import org.rstudio.core.client.widget.ToolbarButton;
import org.rstudio.studio.client.workbench.commands.Commands;
import org.rstudio.studio.client.workbench.views.plots.model.Manipulator;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;

public class ManipulatorManager
{
   public ManipulatorManager(Panel plotsSurface,
                             Commands commands,
                             ManipulatorChangedHandler changedHandler,
                             final ClickHandler plotsClickHandler)
   {
      ManipulatorResources resources = ManipulatorResources.INSTANCE;
      ManipulatorStyles styles = ManipulatorStyles.INSTANCE;
     
      // references
      plotsSurface_ = plotsSurface;
     
      // no manipulator to start
      manipulator_ = null;
      manipulatorPopup_ = null;
     
      // create manipulator button
      manipulatorButton_ = new ToolbarButton(
            resources.manipulateButton(),
            new ClickHandler() {
               public void onClick(ClickEvent event)
               {
                  showManipulatorPopup();
               }
            });
      manipulatorButton_.addStyleName(styles.manipulateButton());
      manipulatorButton_.setTitle(commands.showManipulator().getTooltip());
      plotsSurface_.add(manipulatorButton_);
      manipulatorButton_.setVisible(false);
      manipulatorProgress_ = new ProgressImage(resources.manipulateProgress());
      manipulatorProgress_.addStyleName(styles.manipulateProgress());
      plotsSurface_.add(manipulatorProgress_);
      manipulatorProgress_.setVisible(false);
     
      // create manipulator popup panel
      manipulatorPopup_ = new ManipulatorPopupPanel(changedHandler);
      manipulatorPopup_.addAutoHidePartner(plotsSurface_.getElement());
     
      // forward click event to caller
      plotsSurface_.addDomHandler(new ClickHandler() {
         @Override
         public void onClick(ClickEvent event)
         {
            if (manipulator_ != null)
               plotsClickHandler.onClick(event);  
         }
        
      }, ClickEvent.getType());
   }
  
  
  
  
   public void setManipulator(Manipulator manipulator, boolean show)
   {
      if (isNewManipulatorState(manipulator))
      {
         // set active manipulator
         manipulator_ = manipulator;
            
         // set visibility of manipulator button
         manipulatorButton_.setVisible(manipulator_ != null);
        
         // update UI
         manipulatorPopup_.update(manipulator_);
        
         // if we have a manipulator then show if requested, otherwise hide
         if (manipulator_ != null)
         {
            // show if requested and there are controls
            if (show && manipulator_.hasControls())
               showManipulatorPopup()
         }
         else
         {
            manipulatorPopup_.hide();
         }
      }
   }
  
   public void showManipulator()
   {
      if (manipulator_ != null)
         showManipulatorPopup();
   }
  
   public void setProgress(boolean showProgress)
   {
      if (showProgress)
      {
         manipulatorButton_.setVisible(false);
         manipulatorProgress_.show(true);
      }
      else
      {
         manipulatorProgress_.show(false);
         manipulatorButton_.setVisible(manipulator_ != null);
      }
   }
  
   private boolean isNewManipulatorState(Manipulator manipulator)
   {
      if (manipulator_ == null && manipulator == null)
         return false;
      if (manipulator_ == null && manipulator != null)
         return true;
      else if (manipulator == null && manipulator_ != null)
         return true;
      else if (!manipulator_.getID().equals(manipulator.getID()))
         return true;
      else
         return false;
   }
  
   private void showManipulatorPopup()
   {
      // show it if necessary
      if (!manipulatorPopup_.isShowing())
      {
         // don't do it if the plots tab is currently hidden
         // NOTE: in this case we should really post back to show the
         // manipulator after the plots tab finishes animating to full
         // visibility. this fix at least gets us out of the bizzaro UI
         // state of the manipulator existing below the workbench
         if (plotsSurface_.getOffsetHeight() == 0)
            return;
   
         manipulatorPopup_.recordPreviouslyFocusedElement();
        
         manipulatorPopup_.setPopupPositionAndShow(new PositionCallback(){
            @Override
            public void setPosition(int offsetWidth, int offsetHeight)
            {
               // position the manipulator to the right if necessary
               int xPos = plotsSurface_.getAbsoluteLeft() - offsetWidth + 20;
               if (xPos < 0)
               {
                  xPos = plotsSurface_.getAbsoluteLeft()
                         plotsSurface_.getOffsetWidth() - 20;
               }
              
               manipulatorPopup_.setPopupPosition(
                                          xPos,
                                          plotsSurface_.getAbsoluteTop() - 6);
              
               manipulatorPopup_.focusFirstControl();
            }
           
         }) ;
        
        
      }
   }
  
  
   private final Panel plotsSurface_;
   private Manipulator manipulator_;
   private ToolbarButton manipulatorButton_;
   private ProgressImage manipulatorProgress_;
   private ManipulatorPopupPanel manipulatorPopup_;
 
}
TOP

Related Classes of org.rstudio.studio.client.workbench.views.plots.ui.manipulator.ManipulatorManager

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.