1 /*
2  * HistoryTableWithToolbar.java
3  *
4  * Copyright (C) 2021 by RStudio, PBC
5  *
6  * Unless you have received this program directly from RStudio pursuant
7  * to the terms of a commercial license agreement with RStudio, then
8  * this program is licensed to you under the terms of version 3 of the
9  * GNU Affero General Public License. This program is distributed WITHOUT
10  * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12  * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13  *
14  */
15 package org.rstudio.studio.client.workbench.views.history.view;
16 
17 import com.google.gwt.dom.client.Element;
18 import com.google.gwt.dom.client.Style.Unit;
19 import com.google.gwt.event.dom.client.HasAllKeyHandlers;
20 import com.google.gwt.event.dom.client.KeyDownHandler;
21 import com.google.gwt.event.dom.client.KeyPressHandler;
22 import com.google.gwt.event.dom.client.KeyUpHandler;
23 import com.google.gwt.event.shared.HandlerRegistration;
24 import com.google.gwt.user.client.ui.Composite;
25 import com.google.gwt.user.client.ui.DockLayoutPanel;
26 import com.google.gwt.user.client.ui.ScrollPanel;
27 import com.google.gwt.user.client.ui.Widget;
28 import org.rstudio.core.client.Rectangle;
29 import org.rstudio.studio.client.workbench.views.history.HasHistory;
30 import org.rstudio.studio.client.workbench.views.history.model.HistoryEntry;
31 
32 import java.util.ArrayList;
33 
34 public class HistoryTableWithToolbar extends Composite
35    implements HasHistory, HasAllKeyHandlers
36 {
HistoryTableWithToolbar(HistoryTable table, Widget[] leftWidgets, Widget[] rightWidgets)37    public HistoryTableWithToolbar(HistoryTable table,
38                                   Widget[] leftWidgets,
39                                   Widget[] rightWidgets)
40    {
41       DockLayoutPanel panel = new DockLayoutPanel(Unit.PX);
42 
43       Shelf toolbar = new Shelf();
44       toolbar.setWidth("100%");
45 
46       if (leftWidgets != null)
47       {
48          for (int i = 0; i < leftWidgets.length; i++)
49          {
50             toolbar.addLeftWidget(leftWidgets[i]);
51          }
52       }
53       if (rightWidgets != null)
54       {
55          for (int i = 0; i < rightWidgets.length; i++)
56          {
57             toolbar.addRightWidget(rightWidgets[i]);
58          }
59       }
60       panel.addNorth(toolbar, toolbar.getHeight());
61 
62       historyTable_ = table;
63       scrollPanel_ = new ScrollPanel(historyTable_);
64       scrollPanel_.getElement().getStyle().setProperty("overflowX", "hidden");
65       scrollPanel_.setSize("100%", "100%");
66       panel.add(scrollPanel_);
67 
68       historyTable_.setOwningScrollPanel(scrollPanel_);
69 
70       initWidget(panel);
71    }
72 
clear()73    public void clear()
74    {
75       historyTable_.clear();
76    }
77 
addItems(ArrayList<HistoryEntry> entries, boolean top)78    public void addItems(ArrayList<HistoryEntry> entries, boolean top)
79    {
80       historyTable_.addItems(entries, top);
81    }
82 
getSelectedValues()83    public ArrayList<String> getSelectedValues()
84    {
85       return historyTable_.getSelectedValues();
86    }
87 
getSelectedCommandIndexes()88    public ArrayList<Long> getSelectedCommandIndexes()
89    {
90       return historyTable_.getSelectedValues2();
91    }
92 
moveSelectionUp()93    public boolean moveSelectionUp()
94    {
95       return historyTable_.moveSelectionUp();
96    }
97 
moveSelectionDown()98    public boolean moveSelectionDown()
99    {
100       return historyTable_.moveSelectionDown();
101    }
102 
getKeyTarget()103    public HasAllKeyHandlers getKeyTarget()
104    {
105       return historyTable_;
106    }
107 
highlightRows(int offset, int length)108    public void highlightRows(int offset, int length)
109    {
110       historyTable_.clearSelection();
111       historyTable_.setSelected(offset, length, true);
112 
113       Rectangle rect = historyTable_.getSelectionRect();
114       if (rect == null)
115          return;
116       int height = scrollPanel_.getOffsetHeight();
117       if (rect.getHeight() > height)
118          scrollPanel_.setVerticalScrollPosition(rect.getTop());
119       else
120          scrollPanel_.setVerticalScrollPosition(
121                rect.getTop() - (height - rect.getHeight())/2);
122    }
123 
addKeyUpHandler(KeyUpHandler handler)124    public HandlerRegistration addKeyUpHandler(KeyUpHandler handler)
125    {
126       return historyTable_.addKeyUpHandler(handler);
127    }
128 
addKeyDownHandler(KeyDownHandler handler)129    public HandlerRegistration addKeyDownHandler(KeyDownHandler handler)
130    {
131       return historyTable_.addKeyDownHandler(handler);
132    }
133 
addKeyPressHandler(KeyPressHandler handler)134    public HandlerRegistration addKeyPressHandler(KeyPressHandler handler)
135    {
136       return historyTable_.addKeyPressHandler(handler);
137    }
138 
getFocusTarget()139    public Element getFocusTarget()
140    {
141       return historyTable_.getElement();
142    }
143 
144    private final HistoryTable historyTable_;
145    private ScrollPanel scrollPanel_;
146 }
147