| // Copyright (C) 2011 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.client.ui; |
| |
| import com.google.gwt.event.logical.shared.SelectionEvent; |
| import com.google.gwt.event.logical.shared.SelectionHandler; |
| import com.google.gwt.user.client.ui.TabPanel; |
| import com.google.gwt.user.client.ui.Widget; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * A TabPanel which allows entries to be hidden. This class is not yet designed to handle removes or |
| * any other add methods than the one overridden here. It is also not designed to handle anything |
| * other than text for the tab. |
| */ |
| public class MorphingTabPanel extends TabPanel { |
| // Keep track of the order the widgets/texts should be in when not hidden. |
| private List<Widget> widgets = new ArrayList<>(); |
| private List<String> texts = new ArrayList<>(); |
| |
| // currently visible widgets |
| private List<Widget> visibles = new ArrayList<>(); |
| |
| private int selection; |
| |
| public MorphingTabPanel() { |
| addSelectionHandler( |
| new SelectionHandler<Integer>() { |
| @Override |
| public void onSelection(SelectionEvent<Integer> ev) { |
| selection = ev.getSelectedItem(); |
| } |
| }); |
| } |
| |
| public int getSelectedIndex() { |
| return selection; |
| } |
| |
| public Widget getSelectedWidget() { |
| return getWidget(getSelectedIndex()); |
| } |
| |
| @Override |
| public void clear() { |
| super.clear(); |
| widgets.clear(); |
| texts.clear(); |
| visibles.clear(); |
| } |
| |
| @Override |
| public void add(Widget w, String tabText) { |
| addInvisible(w, tabText); |
| visibles.add(w); |
| super.add(w, tabText); |
| } |
| |
| public void addInvisible(Widget w, String tabText) { |
| widgets.add(w); |
| texts.add(tabText); |
| } |
| |
| public void setVisible(Widget w, boolean visible) { |
| if (visible) { |
| if (!visibles.contains(w)) { |
| int origPos = widgets.indexOf(w); |
| |
| /* Re-insert the widget right after the first visible widget found |
| when scanning backwards from the current widget */ |
| for (int pos = origPos - 1; pos >= 0; pos--) { |
| int visiblePos = visibles.indexOf(widgets.get(pos)); |
| if (visiblePos != -1) { |
| visibles.add(visiblePos + 1, w); |
| insert(w, texts.get(origPos), visiblePos + 1); |
| break; |
| } |
| } |
| } |
| } else { |
| int i = visibles.indexOf(w); |
| if (i != -1) { |
| visibles.remove(i); |
| remove(i); |
| } |
| } |
| } |
| } |