diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/theme/Theme.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/theme/Theme.java index e8f62c907e..4b7d586433 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/theme/Theme.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/theme/Theme.java @@ -875,6 +875,13 @@ public interface Theme { */ String getMainMenuBkgColor(); + /** + * Delimiter background color of main menu + * + * @return the color + */ + String mainMenuDelimiterBackground(); + /** * Background color of selected menu items * diff --git a/ide/che-core-ide-api/src/main/resources/org/eclipse/che/ide/api/ui/style.css b/ide/che-core-ide-api/src/main/resources/org/eclipse/che/ide/api/ui/style.css index 5d7f700ce9..393860308c 100644 --- a/ide/che-core-ide-api/src/main/resources/org/eclipse/che/ide/api/ui/style.css +++ b/ide/che-core-ide-api/src/main/resources/org/eclipse/che/ide/api/ui/style.css @@ -211,6 +211,7 @@ /*Main Menu*/ @eval mainMenuBkgColor org.eclipse.che.ide.api.theme.Style.getMainMenuBkgColor(); +@eval mainMenuDelimiterBackground org.eclipse.che.ide.api.theme.Style.theme.mainMenuDelimiterBackground(); @eval mainMenuSelectedBkgColor org.eclipse.che.ide.api.theme.Style.getMainMenuSelectedBkgColor(); @eval mainMenuSelectedBorderColor org.eclipse.che.ide.api.theme.Style.getMainMenuSelectedBorderColor(); @eval mainMenuFontColor org.eclipse.che.ide.api.theme.Style.getMainMenuFontColor(); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/controller/ToolbarControllerViewImpl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/controller/ToolbarControllerViewImpl.java index 596f0aa318..b1f4a8f7f2 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/controller/ToolbarControllerViewImpl.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/controller/ToolbarControllerViewImpl.java @@ -50,8 +50,8 @@ public class ToolbarControllerViewImpl extends Composite implements ToolbarContr * @return element left position */ private native int getAbsoluteLeft(JavaScriptObject element) /*-{ - return element.getBoundingClientRect().left; - }-*/; + return element.getBoundingClientRect().left; + }-*/; /** * Returns absolute top position of the element. @@ -60,8 +60,8 @@ public class ToolbarControllerViewImpl extends Composite implements ToolbarContr * @return element top position */ private native int getAbsoluteTop(JavaScriptObject element) /*-{ - return element.getBoundingClientRect().top; - }-*/; + return element.getBoundingClientRect().top; + }-*/; @Override public void setDelegate(ActionDelegate delegate) { diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorApiModule.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorApiModule.java index acbf40b834..75d2927f96 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorApiModule.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/editor/EditorApiModule.java @@ -44,6 +44,7 @@ import org.eclipse.che.ide.editor.synchronization.workingCopy.EditorWorkingCopyS import org.eclipse.che.ide.editor.synchronization.workingCopy.EditorWorkingCopySynchronizerImpl; import org.eclipse.che.ide.editor.texteditor.TextEditorPartViewImpl; import org.eclipse.che.ide.editor.texteditor.infopanel.InfoPanel; +import org.eclipse.che.ide.part.editor.AddEditorTabMenuFactory; import org.eclipse.che.ide.part.editor.EditorPartStackView; import org.eclipse.che.ide.part.editor.EditorTabContextMenuFactory; import org.eclipse.che.ide.part.editor.recent.RecentFileActionFactory; @@ -115,6 +116,7 @@ public class EditorApiModule extends AbstractGinModule { install(new GinFactoryModuleBuilder().build(QuickAssistWidgetFactory.class)); install(new GinFactoryModuleBuilder().build(EditorTabContextMenuFactory.class)); + install(new GinFactoryModuleBuilder().build(AddEditorTabMenuFactory.class)); install(new GinFactoryModuleBuilder().build(RecentFileActionFactory.class)); bind(RecentFileList.class).to(RecentFileStore.class).in(Singleton.class); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java index 816535ed37..b57a6f8fb8 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java @@ -44,9 +44,9 @@ import org.eclipse.che.ide.ui.toolbar.PresentationFactory; @Singleton public class ContextMenu implements CloseMenuHandler, ActionSelectedHandler { - private final ActionManager actionManager; - private final KeyBindingAgent keyBindingAgent; - private final Provider managerProvider; + protected final ActionManager actionManager; + protected final KeyBindingAgent keyBindingAgent; + protected final Provider managerProvider; private PopupMenu popupMenu; private MenuLockLayer lockLayer; diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenu.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenu.java new file mode 100644 index 0000000000..095bc587c0 --- /dev/null +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenu.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.part.editor; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.eclipse.che.ide.api.action.Action; +import org.eclipse.che.ide.api.action.ActionGroup; +import org.eclipse.che.ide.api.action.ActionManager; +import org.eclipse.che.ide.api.action.DefaultActionGroup; +import org.eclipse.che.ide.api.action.IdeActions; +import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; +import org.eclipse.che.ide.api.parts.PerspectiveManager; +import org.eclipse.che.ide.menu.ContextMenu; + +/** Menu appeared after clicking on Add editor tab button. */ +public class AddEditorTabMenu extends ContextMenu { + + @Inject + public AddEditorTabMenu( + ActionManager actionManager, + KeyBindingAgent keyBindingAgent, + Provider managerProvider) { + super(actionManager, keyBindingAgent, managerProvider); + } + + protected ActionGroup updateActions() { + DefaultActionGroup defaultGroup = new DefaultActionGroup(actionManager); + + final ActionGroup actionGroup = + (ActionGroup) actionManager.getAction(IdeActions.GROUP_FILE_NEW); + + for (Action action : actionGroup.getChildren(null)) { + defaultGroup.add(action); + } + + return defaultGroup; + } +} diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenuFactory.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenuFactory.java new file mode 100644 index 0000000000..3df0e83828 --- /dev/null +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/AddEditorTabMenuFactory.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.part.editor; + +/** Factory for creating instances of {@link AddEditorTabMenu} */ +public interface AddEditorTabMenuFactory { + + /** + * Creates new Add editor tab menu. + * + * @return editor tab menu + */ + AddEditorTabMenu newAddEditorTabMenu(); +} diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java index 2054df30a2..f5c03043ba 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java @@ -84,7 +84,9 @@ public class EditorPartStackPresenter extends PartStackPresenter implements EditorPartStack, EditorTab.ActionDelegate, CloseNonPinnedEditorsHandler, - ResourceChangedHandler { + ResourceChangedHandler, + EditorPartStackView.AddTabButtonClickListener { + private final PresentationFactory presentationFactory; private final AppContext appContext; private final EditorPaneMenuItemFactory editorPaneMenuItemFactory; @@ -95,6 +97,7 @@ public class EditorPartStackPresenter extends PartStackPresenter private final CloseAllTabsPaneAction closeAllTabsPaneAction; private final EditorAgent editorAgent; private final Map items; + private final AddEditorTabMenuFactory addEditorTabMenuFactory; //this list need to save order of added parts private final LinkedList partsOrder; @@ -121,7 +124,8 @@ public class EditorPartStackPresenter extends PartStackPresenter ActionManager actionManager, ClosePaneAction closePaneAction, CloseAllTabsPaneAction closeAllTabsPaneAction, - EditorAgent editorAgent) { + EditorAgent editorAgent, + AddEditorTabMenuFactory addEditorTabMenuFactory) { super(eventBus, partMenu, partStackEventHandler, tabItemFactory, partsComparator, view, null); this.appContext = appContext; this.editorPaneMenuItemFactory = editorPaneMenuItemFactory; @@ -136,7 +140,9 @@ public class EditorPartStackPresenter extends PartStackPresenter this.items = new HashMap<>(); this.partsOrder = new LinkedList<>(); this.closedParts = new LinkedList<>(); + this.addEditorTabMenuFactory = addEditorTabMenuFactory; + view.setAddTabButtonClickListener(this); initializePaneMenu(); view.addPaneMenuButton(editorPaneMenu); } @@ -322,6 +328,18 @@ public class EditorPartStackPresenter extends PartStackPresenter eventBus.fireEvent(new MaximizePartEvent(parts.get(tab))); } + @Override + public void onAddTabButtonClicked(final int mouseX, final int mouseY) { + Scheduler.get() + .scheduleDeferred( + new Scheduler.ScheduledCommand() { + @Override + public void execute() { + addEditorTabMenuFactory.newAddEditorTabMenu().show(mouseX, mouseY); + } + }); + } + /** {@inheritDoc} */ @Override public void removePart(PartPresenter part) { diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java index b9faf60c08..2098064661 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java @@ -11,16 +11,18 @@ package org.eclipse.che.ide.part.editor; import static com.google.gwt.dom.client.Style.Display.BLOCK; -import static com.google.gwt.dom.client.Style.Display.NONE; import static com.google.gwt.dom.client.Style.Unit.PCT; import com.google.gwt.core.client.GWT; -import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.Style; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.DeckLayoutPanel; import com.google.gwt.user.client.ui.DockLayoutPanel; @@ -33,6 +35,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.validation.constraints.NotNull; +import org.eclipse.che.ide.FontAwesome; import org.eclipse.che.ide.api.editor.texteditor.TextEditor; import org.eclipse.che.ide.api.parts.PartPresenter; import org.eclipse.che.ide.api.parts.PartStackView; @@ -48,21 +51,42 @@ public class EditorPartStackView extends ResizeComposite interface PartStackUiBinder extends UiBinder {} + /** Listener to handle clicking on Add tab button. */ + interface AddTabButtonClickListener { + + /** + * Called when clicking on Add tab button. + * + * @param mouseX absolute mouse left + * @param mouseY absolute mouse top + */ + void onAddTabButtonClicked(int mouseX, int mouseY); + } + private static final PartStackUiBinder UI_BINDER = GWT.create(PartStackUiBinder.class); + private static final int POPUP_OFFSET = 15; + @UiField DockLayoutPanel parent; @UiField FlowPanel tabsPanel; + @UiField FlowPanel plusPanel; + @UiField DeckLayoutPanel contentPanel; + @UiField FlowPanel menuPanel; + private final Map tabs; private final AcceptsOneWidget partViewContainer; private final LinkedList contents; + private int tabsPanelWidth = 0; + private ActionDelegate delegate; private EditorPaneMenu editorPaneMenu; private TabItem activeTab; + private AddTabButtonClickListener addTabButtonClickListener; public EditorPartStackView() { this.tabs = new HashMap<>(); @@ -70,6 +94,20 @@ public class EditorPartStackView extends ResizeComposite initWidget(UI_BINDER.createAndBindUi(this)); + plusPanel.getElement().setInnerHTML(FontAwesome.PLUS); + plusPanel.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent clickEvent) { + if (addTabButtonClickListener != null) { + addTabButtonClickListener.onAddTabButtonClicked( + getAbsoluteLeft(plusPanel.getElement()) + POPUP_OFFSET, + getAbsoluteTop(plusPanel.getElement()) + POPUP_OFFSET); + } + } + }, + ClickEvent.getType()); + partViewContainer = new AcceptsOneWidget() { @Override @@ -83,6 +121,30 @@ public class EditorPartStackView extends ResizeComposite setMaximized(false); } + /** + * Returns absolute left position of the element. + * + * @param element element + * @return element left position + */ + private native int getAbsoluteLeft(JavaScriptObject element) /*-{ + return element.getBoundingClientRect().left; + }-*/; + + /** + * Returns absolute top position of the element. + * + * @param element element + * @return element top position + */ + private native int getAbsoluteTop(JavaScriptObject element) /*-{ + return element.getBoundingClientRect().top; + }-*/; + + public void setAddTabButtonClickListener(AddTabButtonClickListener listener) { + addTabButtonClickListener = listener; + } + /** {@inheritDoc} */ @Override protected void onAttach() { @@ -124,7 +186,7 @@ public class EditorPartStackView extends ResizeComposite } /** Add editor tab to tab panel */ - tabsPanel.add(tabItem.getView()); + tabsPanel.insert(tabItem.getView(), tabsPanel.getWidgetIndex(plusPanel)); /** Process added editor tab */ tabs.put(partPresenter, tabItem); @@ -132,30 +194,106 @@ public class EditorPartStackView extends ResizeComposite partPresenter.go(partViewContainer); } - /** Makes active tab visible. */ + /** Ensures active tab and plus button are visible. */ private void ensureActiveTabVisible() { + // do nothing if selected tab is null if (activeTab == null) { return; } - for (int i = 0; i < tabsPanel.getWidgetCount(); i++) { - if (editorPaneMenu != null && editorPaneMenu != tabsPanel.getWidget(i)) { - tabsPanel.getWidget(i).setVisible(true); - } + // do nothing if selected tab is visible and plus button is visible + if (getAbsoluteTop(activeTab.getView().asWidget().getElement()) + == getAbsoluteTop(tabsPanel.getElement()) + && getAbsoluteTop(plusPanel.getElement()) == getAbsoluteTop(tabsPanel.getElement()) + && tabsPanelWidth == tabsPanel.getOffsetWidth()) { + return; } + tabsPanelWidth = tabsPanel.getOffsetWidth(); + + // determine whether all widgets are visible + boolean allWidgetVisible = true; for (int i = 0; i < tabsPanel.getWidgetCount(); i++) { - Widget currentWidget = tabsPanel.getWidget(i); - Widget activeTabWidget = activeTab.getView().asWidget(); - if (editorPaneMenu != null && editorPaneMenu == currentWidget) { + Widget w = tabsPanel.getWidget(i); + if (plusPanel == w) { continue; } - if (activeTabWidget.getAbsoluteTop() > tabsPanel.getAbsoluteTop() - && activeTabWidget != currentWidget) { - currentWidget.setVisible(false); + if (!w.isVisible()) { + allWidgetVisible = false; + break; } } + + // do nothing if all widgets are visible and sum of children width less then panel width + if (allWidgetVisible) { + int childrenWidth = 0; + for (int i = 0; i < tabsPanel.getWidgetCount(); i++) { + Widget w = tabsPanel.getWidget(i); + childrenWidth += w.getOffsetWidth(); + } + + if (childrenWidth < tabsPanelWidth) { + return; + } + } + + // hide all widgets except plus button + for (int i = 0; i < tabsPanel.getWidgetCount(); i++) { + Widget w = tabsPanel.getWidget(i); + if (plusPanel == w) { + continue; + } + + w.setVisible(false); + } + + // determine selected tab index + int selectedTabIndex = tabsPanel.getWidgetIndex(activeTab.getView().asWidget()); + + // show all possible tabs before selected tab + for (int i = selectedTabIndex; i >= 0; i--) { + Widget w = tabsPanel.getWidget(i); + + // skip for plus button + if (plusPanel == w) { + continue; + } + + // set tab visible + w.setVisible(true); + + // continue cycle if plus button visible + if (getAbsoluteTop(plusPanel.getElement()) == getAbsoluteTop(tabsPanel.getElement())) { + continue; + } + + // otherwise hide tab and break + w.setVisible(false); + break; + } + + // show all possible tabs after selected tab + for (int i = selectedTabIndex + 1; i < tabsPanel.getWidgetCount(); i++) { + Widget w = tabsPanel.getWidget(i); + + // skip for plus button + if (plusPanel == w) { + continue; + } + + // set tab visible + w.setVisible(true); + + // continue cycle if plus button visible + if (getAbsoluteTop(plusPanel.getElement()) == getAbsoluteTop(tabsPanel.getElement())) { + continue; + } + + // otherwise hide tab and break + w.setVisible(false); + break; + } } /** {@inheritDoc} */ @@ -171,11 +309,6 @@ public class EditorPartStackView extends ResizeComposite if (!contents.isEmpty()) { selectTab(contents.getLast()); } - - //this hack need to force redraw dom element to apply correct styles - tabsPanel.getElement().getStyle().setDisplay(NONE); - tabsPanel.getElement().getOffsetHeight(); - tabsPanel.getElement().getStyle().setDisplay(BLOCK); } /** {@inheritDoc} */ @@ -221,7 +354,9 @@ public class EditorPartStackView extends ResizeComposite delegate.onRequestFocus(); - Scheduler.get().scheduleDeferred(this::ensureActiveTabVisible); + // reset timer and schedule it again + ensureActiveTabVisibleTimer.cancel(); + ensureActiveTabVisibleTimer.schedule(200); } /** {@inheritDoc} */ @@ -260,13 +395,21 @@ public class EditorPartStackView extends ResizeComposite @Override public void onResize() { super.onResize(); - Scheduler.get() - .scheduleDeferred( - new Scheduler.ScheduledCommand() { - @Override - public void execute() { - ensureActiveTabVisible(); - } - }); + + // reset timer and schedule it again + ensureActiveTabVisibleTimer.cancel(); + ensureActiveTabVisibleTimer.schedule(200); } + + /** + * Timer to prevent updating tabs visibility while resizing. It needs to update tabs once when + * resizing has stopped. + */ + private Timer ensureActiveTabVisibleTimer = + new Timer() { + @Override + public void run() { + ensureActiveTabVisible(); + } + }; } diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.ui.xml b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.ui.xml index f8f92e3d2f..615bae79d0 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.ui.xml +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.ui.xml @@ -14,25 +14,70 @@ - + - @eval editorPanelBackgroundColor org.eclipse.che.ide.api.theme.Style.theme.editorPanelBackgroundColor(); - @eval editorPanelBorderColor org.eclipse.che.ide.api.theme.Style.theme.editorPanelBorderColor(); - - .tabsPanel { + .topPanel { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; - background-color: editorPanelBackgroundColor; border-bottom: 1px solid editorPanelBorderColor; overflow: hidden; + background-color: editorPanelBackgroundColor; + } + + .tabsPanel { + position: absolute; + top: 0px; + height: 23px; + left: 0px; + right: 34px; + overflow: hidden; + } + + .tabsPanel > div { + max-width: 300px; + } + + .plusPanel { + float: left; + width: 23px; + height: 23px; + cursor: pointer; + overflow: hidden; + line-height: 23px; + text-align: center; + font-size: 10px; + opacity: 0.6; + color: editorTabIconColor; + } + + .plusPanel:HOVER { + opacity: 1; + } + + .menuPanel { + position: absolute; + top: 0px; + height: 23px; + right: 0px; + width: 32px; + } + + .menuPanel > div { + position: absolute; + } - + + + + + + diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/ProcessesGinModule.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/ProcessesGinModule.java index 74d4e86deb..47347ace35 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/ProcessesGinModule.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/ProcessesGinModule.java @@ -18,6 +18,7 @@ import com.google.gwt.inject.client.AbstractGinModule; import com.google.gwt.inject.client.assistedinject.GinFactoryModuleBuilder; import com.google.gwt.inject.client.multibindings.GinMapBinder; import com.google.inject.Singleton; +import org.eclipse.che.ide.processes.actions.AddTabMenuFactory; import org.eclipse.che.ide.processes.actions.ConsoleTreeContextMenuFactory; import org.eclipse.che.ide.processes.panel.ProcessesPanelView; import org.eclipse.che.ide.processes.panel.ProcessesPanelViewImpl; @@ -28,6 +29,7 @@ public class ProcessesGinModule extends AbstractGinModule { protected void configure() { bind(ProcessesPanelView.class).to(ProcessesPanelViewImpl.class).in(Singleton.class); install(new GinFactoryModuleBuilder().build(ConsoleTreeContextMenuFactory.class)); + install(new GinFactoryModuleBuilder().build(AddTabMenuFactory.class)); GinMapBinder.newMapBinder(binder(), String.class, ProcessTreeNodeRenderStrategy.class) .addBinding(COMMAND_NODE.getStringValue()) diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenu.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenu.java new file mode 100644 index 0000000000..c910e926de --- /dev/null +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenu.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.processes.actions; + +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_SSH_REFERENCE; +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_TERMINAL_REFERENCE; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.Map; +import org.eclipse.che.ide.CoreLocalizationConstant; +import org.eclipse.che.ide.FontAwesome; +import org.eclipse.che.ide.api.action.Action; +import org.eclipse.che.ide.api.action.ActionEvent; +import org.eclipse.che.ide.api.action.ActionGroup; +import org.eclipse.che.ide.api.action.ActionManager; +import org.eclipse.che.ide.api.action.DefaultActionGroup; +import org.eclipse.che.ide.api.action.IdeActions; +import org.eclipse.che.ide.api.action.Separator; +import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; +import org.eclipse.che.ide.api.parts.PerspectiveManager; +import org.eclipse.che.ide.api.workspace.model.MachineImpl; +import org.eclipse.che.ide.machine.MachineResources; +import org.eclipse.che.ide.menu.ContextMenu; +import org.eclipse.che.ide.processes.panel.ProcessesPanelPresenter; + +/** + * Menu for adding new tab in processes panel. + * + * @author Vitaliy Guliy + */ +public class AddTabMenu extends ContextMenu { + + private AppContext appContext; + + private ProcessesPanelPresenter processesPanelPresenter; + + private CoreLocalizationConstant coreLocalizationConstant; + private MachineResources machineResources; + + @Inject + public AddTabMenu( + ActionManager actionManager, + KeyBindingAgent keyBindingAgent, + Provider managerProvider, + AppContext appContext, + ProcessesPanelPresenter processesPanelPresenter, + CoreLocalizationConstant coreLocalizationConstant, + MachineResources machineResources) { + super(actionManager, keyBindingAgent, managerProvider); + + this.appContext = appContext; + this.processesPanelPresenter = processesPanelPresenter; + this.coreLocalizationConstant = coreLocalizationConstant; + this.machineResources = machineResources; + } + + /** {@inheritDoc} */ + @Override + protected String getGroupMenu() { + return IdeActions.GROUP_CONSOLES_TREE_CONTEXT_MENU; + } + + @Override + protected ActionGroup updateActions() { + final DefaultActionGroup actionGroup = new DefaultActionGroup(actionManager); + + Map machines = appContext.getWorkspace().getRuntime().getMachines(); + for (MachineImpl machine : machines.values()) { + Separator separ = new Separator(machine.getName() + ":"); + actionGroup.add(separ); + + if (machine.getServerByName(SERVER_TERMINAL_REFERENCE).isPresent()) { + NewTerminalMenuAction newTerminalMenuAction = + new NewTerminalMenuAction( + coreLocalizationConstant, machineResources, machine.getName()); + actionGroup.add(newTerminalMenuAction); + } + + if (machine.getServerByName(SERVER_SSH_REFERENCE).isPresent()) { + AddSSHMenuAction addSSHMenuAction = new AddSSHMenuAction(machine.getName()); + actionGroup.add(addSSHMenuAction); + } + } + + return actionGroup; + } + + /** Action to add new Terminal tab. */ + public class NewTerminalMenuAction extends Action { + + private String machineName; + + public NewTerminalMenuAction( + CoreLocalizationConstant locale, MachineResources machineResources, String machineName) { + super( + locale.newTerminal(), + locale.newTerminalDescription(), + null, + machineResources.addTerminalIcon()); + this.machineName = machineName; + } + + @Override + public void actionPerformed(ActionEvent e) { + processesPanelPresenter.onAddTerminal(machineName, this); + } + } + + /** Action to add new SSH tab. */ + public class AddSSHMenuAction extends Action { + + private String machineName; + + public AddSSHMenuAction(String machineName) { + super("SSH", "SSH", null, null, FontAwesome.RETWEET); + this.machineName = machineName; + } + + @Override + public void actionPerformed(ActionEvent e) { + processesPanelPresenter.onPreviewSsh(machineName); + } + } +} diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenuFactory.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenuFactory.java new file mode 100644 index 0000000000..10cc1175e8 --- /dev/null +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/actions/AddTabMenuFactory.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.processes.actions; + +/** Factory to create menu for adding new tab */ +public interface AddTabMenuFactory { + + /** + * Creates new menu for adding new tab in processes panel. + * + * @return menu + */ + AddTabMenu newAddTabMenu(); +} diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java index 1343235be4..e0bd0397e1 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java @@ -90,6 +90,7 @@ import org.eclipse.che.ide.console.DefaultOutputConsole; import org.eclipse.che.ide.machine.MachineResources; import org.eclipse.che.ide.processes.ProcessTreeNode; import org.eclipse.che.ide.processes.ProcessTreeNodeSelectedEvent; +import org.eclipse.che.ide.processes.actions.AddTabMenuFactory; import org.eclipse.che.ide.processes.actions.ConsoleTreeContextMenu; import org.eclipse.che.ide.processes.actions.ConsoleTreeContextMenuFactory; import org.eclipse.che.ide.terminal.TerminalFactory; @@ -136,6 +137,7 @@ public class ProcessesPanelPresenter extends BasePresenter private final CommandConsoleFactory commandConsoleFactory; private final DialogFactory dialogFactory; private final ConsoleTreeContextMenuFactory consoleTreeContextMenuFactory; + private final AddTabMenuFactory addTabMenuFactory; private final CommandTypeRegistry commandTypeRegistry; private final ExecAgentCommandManager execAgentCommandManager; private final Provider macroProcessorProvider; @@ -158,6 +160,7 @@ public class ProcessesPanelPresenter extends BasePresenter CommandConsoleFactory commandConsoleFactory, DialogFactory dialogFactory, ConsoleTreeContextMenuFactory consoleTreeContextMenuFactory, + AddTabMenuFactory addTabMenuFactory, CommandManager commandManager, CommandTypeRegistry commandTypeRegistry, SshServiceClient sshServiceClient, @@ -175,6 +178,7 @@ public class ProcessesPanelPresenter extends BasePresenter this.commandConsoleFactory = commandConsoleFactory; this.dialogFactory = dialogFactory; this.consoleTreeContextMenuFactory = consoleTreeContextMenuFactory; + this.addTabMenuFactory = addTabMenuFactory; this.eventBus = eventBus; this.commandTypeRegistry = commandTypeRegistry; this.execAgentCommandManager = execAgentCommandManager; @@ -1283,6 +1287,18 @@ public class ProcessesPanelPresenter extends BasePresenter }); } + @Override + public void onAddTabButtonClicked(final int mouseX, final int mouseY) { + Scheduler.get() + .scheduleDeferred( + new Scheduler.ScheduledCommand() { + @Override + public void execute() { + addTabMenuFactory.newAddTabMenu().show(mouseX, mouseY); + } + }); + } + @Override public void onDownloadWorkspaceOutput(DownloadWorkspaceOutputEvent event) { WorkspaceImpl workspace = appContext.getWorkspace(); @@ -1324,15 +1340,15 @@ public class ProcessesPanelPresenter extends BasePresenter * @param text file content */ private native void download(String fileName, String text) /*-{ - var element = $doc.createElement('a'); - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); - element.setAttribute('download', fileName); + var element = $doc.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', fileName); - element.style.display = 'none'; - $doc.body.appendChild(element); + element.style.display = 'none'; + $doc.body.appendChild(element); - element.click(); + element.click(); - $doc.body.removeChild(element); - }-*/; + $doc.body.removeChild(element); + }-*/; } diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelView.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelView.java index ee6a5e5b54..a525a50240 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelView.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelView.java @@ -141,10 +141,16 @@ public interface ProcessesPanelView extends View .innerPanel { - width: 12px; - height: 12px; - float: left; - cursor: pointer; - margin-top: 3px; + width: 12px; + height: 12px; + float: left; + cursor: pointer; + margin-top: 3px; } .innerPanel:active { - opacity: 0.4; + opacity: 0.4; } .outerPanel { - position: relative; - width: 18px; - height: 18px; - margin: 6px 0 6px 3px; + position: relative; + width: 18px; + height: 18px; + margin: 6px 0 6px 3px; } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/SubPanel.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/SubPanel.java index ccd77842e6..866457ab5b 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/SubPanel.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/SubPanel.java @@ -78,28 +78,32 @@ public interface SubPanel { */ void setDoubleClickListener(DoubleClickListener listener); - interface WidgetRemovingListener { + /** Set the listener to be notified when Add Tab button has been clicked. */ + void setAddTabButtonClickListener(AddTabButtonClickListener listener); + interface WidgetRemovingListener { /** Invoked when a widget is going to be removed. */ void onWidgetRemoving(RemoveCallback removeCallback); } /** Callback that may be used for actual removing widget. */ interface RemoveCallback { - /** Tells panel to remove widget. */ void remove(); } interface FocusListener { - /** Invoked when a {@code widget} on a {@code panel} gains the focus. */ void focusGained(SubPanel panel, IsWidget widget); } interface DoubleClickListener { - /** Invoked when a {@code widget} on a {@code panel} has been double clicked. */ void onDoubleClicked(SubPanel panel, IsWidget widget); } + + interface AddTabButtonClickListener { + /** Invoked when `Add Tab` button has been clicked. */ + void onAddTabButtonClicked(int mouseX, int mouseY); + } } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelPresenter.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelPresenter.java index 71322f4857..9e2c115294 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelPresenter.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelPresenter.java @@ -40,6 +40,7 @@ public class SubPanelPresenter implements SubPanel, SubPanelView.ActionDelegate private FocusListener focusListener; private DoubleClickListener doubleClickListener; + private AddTabButtonClickListener addTabButtonClickListener; @AssistedInject public SubPanelPresenter( @@ -147,6 +148,11 @@ public class SubPanelPresenter implements SubPanel, SubPanelView.ActionDelegate doubleClickListener = listener; } + @Override + public void setAddTabButtonClickListener(AddTabButtonClickListener listener) { + addTabButtonClickListener = listener; + } + @Override public void onWidgetFocused(IsWidget widget) { focusListener.focusGained(this, widget); @@ -164,4 +170,11 @@ public class SubPanelPresenter implements SubPanel, SubPanelView.ActionDelegate listener.onWidgetRemoving(removeCallback); } } + + @Override + public void onAddTabButtonClicked(int mouseX, int mouseY) { + if (addTabButtonClickListener != null) { + addTabButtonClickListener.onAddTabButtonClicked(mouseX, mouseY); + } + } } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelView.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelView.java index d5ed9aea70..83780a86c2 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelView.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelView.java @@ -68,5 +68,8 @@ public interface SubPanelView extends View { /** Called when the {@code widget} is going to be removed from the panel. */ void onWidgetRemoving(IsWidget widget, SubPanel.RemoveCallback removeCallback); + + /** Called when the `Add Tab` button has been clicked. */ + void onAddTabButtonClicked(int mouseX, int mouseY); } } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.java index 433bcb0c01..fd0ca3832d 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.java @@ -12,9 +12,12 @@ package org.eclipse.che.ide.ui.multisplitpanel.panel; import static com.google.gwt.user.client.ui.DockLayoutPanel.Direction.CENTER; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DeckLayoutPanel; import com.google.gwt.user.client.ui.DockLayoutPanel; @@ -30,6 +33,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.che.commons.annotation.Nullable; +import org.eclipse.che.ide.FontAwesome; import org.eclipse.che.ide.api.action.Action; import org.eclipse.che.ide.ui.multisplitpanel.SubPanel; import org.eclipse.che.ide.ui.multisplitpanel.WidgetToShow; @@ -52,6 +56,10 @@ import org.eclipse.che.ide.ui.multisplitpanel.tab.TabItemFactory; public class SubPanelViewImpl extends Composite implements SubPanelView, Menu.ActionDelegate, Tab.ActionDelegate, RequiresResize { + interface SubPanelViewImplUiBinder extends UiBinder {} + + private static final int POPUP_OFFSET = 15; + private final TabItemFactory tabItemFactory; private final Menu menu; private final Map tabs2Widgets; @@ -66,6 +74,10 @@ public class SubPanelViewImpl extends Composite @UiField FlowPanel tabsPanel; + @UiField FlowPanel plusPanel; + + @UiField FlowPanel menuPanel; + @UiField DeckLayoutPanel widgetsPanel; private ActionDelegate delegate; @@ -73,6 +85,9 @@ public class SubPanelViewImpl extends Composite private List eastSubPanels; private List southSubPanels; + private Tab selectedTab; + private int tabsPanelWidth = 0; + @Inject public SubPanelViewImpl( SubPanelViewImplUiBinder uiBinder, @@ -103,13 +118,45 @@ public class SubPanelViewImpl extends Composite initWidget(uiBinder.createAndBindUi(this)); - tabsPanel.add(menu); + menuPanel.add(menu); + + plusPanel.getElement().setInnerHTML(FontAwesome.PLUS); + plusPanel.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent clickEvent) { + delegate.onAddTabButtonClicked( + getAbsoluteLeft(plusPanel.getElement()) + POPUP_OFFSET, + getAbsoluteTop(plusPanel.getElement()) + POPUP_OFFSET); + } + }, + ClickEvent.getType()); widgetsPanel.ensureDebugId("process-output-panel-holder"); widgetsPanel.addDomHandler( event -> delegate.onWidgetFocused(widgetsPanel.getVisibleWidget()), ClickEvent.getType()); } + /** + * Returns absolute left position of the element. + * + * @param element element + * @return element left position + */ + private native int getAbsoluteLeft(JavaScriptObject element) /*-{ + return element.getBoundingClientRect().left; + }-*/; + + /** + * Returns absolute top position of the element. + * + * @param element element + * @return element top position + */ + private native int getAbsoluteTop(JavaScriptObject element) /*-{ + return element.getBoundingClientRect().top; + }-*/; + @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; @@ -149,7 +196,7 @@ public class SubPanelViewImpl extends Composite tabs2Widgets.put(tab, widget); widgets2Tabs.put(widget, tab); - tabsPanel.add(tab); + tabsPanel.insert(tab, tabsPanel.getWidgetIndex(plusPanel)); widgetsPanel.setWidget(widget.getWidget()); // add item to drop-down menu @@ -325,6 +372,9 @@ public class SubPanelViewImpl extends Composite } tab.select(); + + selectedTab = tab; + ensureActiveTabVisible(); } @Override @@ -339,7 +389,96 @@ public class SubPanelViewImpl extends Composite ((RequiresResize) widgetToShow.getWidget()).onResize(); } } + + // reset timer and schedule it again + ensureActiveTabVisibleTimer.cancel(); + ensureActiveTabVisibleTimer.schedule(200); } - interface SubPanelViewImplUiBinder extends UiBinder {} + /** + * Timer to prevent updating tabs visibility while resizing. It needs to update tabs once when + * resizing has stopped. + */ + private Timer ensureActiveTabVisibleTimer = + new Timer() { + @Override + public void run() { + ensureActiveTabVisible(); + } + }; + + /** Ensures active tab and plus button are visible */ + private void ensureActiveTabVisible() { + // do nothing if selected tab is null + if (selectedTab == null) { + return; + } + + // do nothing if selected tab is visible and plus button is visible + if (selectedTab.asWidget().getElement().getAbsoluteTop() + == tabsPanel.getElement().getAbsoluteTop() + && plusPanel.getElement().getAbsoluteTop() == tabsPanel.getElement().getAbsoluteTop() + && tabsPanelWidth == tabsPanel.getOffsetWidth()) { + return; + } + + tabsPanelWidth = tabsPanel.getOffsetWidth(); + + // hide all widgets except plus button + for (int i = 0; i < tabsPanel.getWidgetCount(); i++) { + Widget w = tabsPanel.getWidget(i); + if (plusPanel == w) { + continue; + } + + w.setVisible(false); + } + + // determine selected tab index + int selectedTabIndex = tabsPanel.getWidgetIndex(selectedTab.asWidget()); + + // show all possible tabs before selected tab + for (int i = selectedTabIndex; i >= 0; i--) { + Widget w = tabsPanel.getWidget(i); + + // skip for plus button + if (plusPanel == w) { + continue; + } + + // set tab visible + w.setVisible(true); + + // continue cycle if plus button visible + if (plusPanel.getElement().getAbsoluteTop() == tabsPanel.getElement().getAbsoluteTop()) { + continue; + } + + // otherwise hide tab and break + w.setVisible(false); + break; + } + + // show all possible tabs after selected tab + for (int i = selectedTabIndex + 1; i < tabsPanel.getWidgetCount(); i++) { + Widget w = tabsPanel.getWidget(i); + + // skip for plus button + if (plusPanel == w) { + continue; + } + + // set tab visible + w.setVisible(true); + + // continue cycle if plus button visible + if (plusPanel.getElement().getAbsoluteTop() == tabsPanel.getElement().getAbsoluteTop()) { + continue; + } + + // otherwise hide tab and break + w.setVisible(false); + break; + } + } } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.ui.xml b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.ui.xml index c3aeb10e0c..481b18db3c 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.ui.xml +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/multisplitpanel/panel/SubPanelViewImpl.ui.xml @@ -14,17 +14,54 @@ - - @eval editorPanelBackgroundColor org.eclipse.che.ide.api.theme.Style.theme.editorPanelBackgroundColor(); - @eval editorPanelBorderColor org.eclipse.che.ide.api.theme.Style.theme.editorPanelBorderColor(); + - .tabsPanel { + .topPanel { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; - background-color: editorPanelBackgroundColor; border-bottom: 1px solid editorPanelBorderColor; overflow: hidden; + background-color: editorPanelBackgroundColor; + } + + .tabsPanel { + position: absolute; + top: 0px; + height: 23px; + left: 0px; + right: 34px; + overflow: hidden; + } + + .plusPanel { + float: left; + width: 23px; + height: 23px; + cursor: pointer; + overflow: hidden; + line-height: 23px; + text-align: center; + font-size: 10px; + opacity: 0.6; + color: editorTabIconColor; + } + + .plusPanel:HOVER { + opacity: 1; + } + + .menuPanel { + position: absolute; + top: 0px; + height: 23px; + right: 0px; + width: 32px; + } + + .menuPanel > div { + position: absolute; + } @@ -33,7 +70,12 @@ - + + + + + + diff --git a/ide/che-core-ide-ui/src/main/resources/org/eclipse/che/ide/ui/toolbar/popup-menu.css b/ide/che-core-ide-ui/src/main/resources/org/eclipse/che/ide/ui/toolbar/popup-menu.css index 6ad5dfcc47..806f905ad8 100644 --- a/ide/che-core-ide-ui/src/main/resources/org/eclipse/che/ide/ui/toolbar/popup-menu.css +++ b/ide/che-core-ide-ui/src/main/resources/org/eclipse/che/ide/ui/toolbar/popup-menu.css @@ -70,13 +70,14 @@ } .popupMenuTextDelimiter { - background: editorPanelBackgroundColor; + background: mainMenuDelimiterBackground; + font-weight: bold; } .popupMenuTextDelimiter > div { display: inline-block; line-height: 20px; - margin-left: 14px; + margin-left: 5px; margin-bottom: 0; } diff --git a/ide/commons-gwt/src/main/java/org/eclipse/che/ide/FontAwesome.java b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/FontAwesome.java index 7c730d50f0..ea758b47e2 100644 --- a/ide/commons-gwt/src/main/java/org/eclipse/che/ide/FontAwesome.java +++ b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/FontAwesome.java @@ -60,11 +60,17 @@ public class FontAwesome { public static final String MINUS = ""; /** http://fortawesome.github.io/Font-Awesome/icon/plus-circle/ */ - public static final String PLUS = ""; + public static final String PLUS_CIRCLE = ""; + + /** http://fortawesome.github.io/Font-Awesome/icon/plus/ */ + public static final String PLUS = ""; /** http://fortawesome.github.io/Font-Awesome/icon/refresh/ */ public static final String REFRESH = ""; + /** http://fortawesome.github.io/Font-Awesome/icon/retweet/ */ + public static final String RETWEET = ""; + /** http://fortawesome.github.io/Font-Awesome/icon/exchange/ */ public static final String EXCHANGE = ""; diff --git a/plugins/plugin-git/che-plugin-git-ext-git/src/main/java/org/eclipse/che/ide/ext/git/client/action/AddToIndexAction.java b/plugins/plugin-git/che-plugin-git-ext-git/src/main/java/org/eclipse/che/ide/ext/git/client/action/AddToIndexAction.java index 1e417b41e2..67156167e7 100644 --- a/plugins/plugin-git/che-plugin-git-ext-git/src/main/java/org/eclipse/che/ide/ext/git/client/action/AddToIndexAction.java +++ b/plugins/plugin-git/che-plugin-git-ext-git/src/main/java/org/eclipse/che/ide/ext/git/client/action/AddToIndexAction.java @@ -55,7 +55,11 @@ public class AddToIndexAction extends GitAction { ProcessesPanelPresenter consolesPanelPresenter, GitServiceClient service, NotificationManager notificationManager) { - super(constant.addToIndexTitle(), constant.addToIndexTitle(), FontAwesome.PLUS, appContext); + super( + constant.addToIndexTitle(), + constant.addToIndexTitle(), + FontAwesome.PLUS_CIRCLE, + appContext); this.presenter = presenter; this.constant = constant; this.gitOutputConsoleFactory = gitOutputConsoleFactory; diff --git a/plugins/plugin-pullrequest-parent/che-plugin-pullrequest-ide/src/main/java/org/eclipse/che/plugin/pullrequest/client/workflow/ChainExecutor.java b/plugins/plugin-pullrequest-parent/che-plugin-pullrequest-ide/src/main/java/org/eclipse/che/plugin/pullrequest/client/workflow/ChainExecutor.java index e00853dbb0..b499393cbc 100644 --- a/plugins/plugin-pullrequest-parent/che-plugin-pullrequest-ide/src/main/java/org/eclipse/che/plugin/pullrequest/client/workflow/ChainExecutor.java +++ b/plugins/plugin-pullrequest-parent/che-plugin-pullrequest-ide/src/main/java/org/eclipse/che/plugin/pullrequest/client/workflow/ChainExecutor.java @@ -43,7 +43,7 @@ public final class ChainExecutor { public void execute(final WorkflowExecutor workflow, final Context context) { if (chainIt.hasNext()) { currentStep = chainIt.next(); - Log.info( + Log.debug( getClass(), "Executing :: " + context.getProject().getName() + " :: => " + currentStep.getClass()); currentStep.execute(workflow, context);