/*
* Copyright (c) 2013 David Boissier
*
* 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 org.codinjutsu.tools.jenkins.view.action;
//import com.intellij.icons.AllIcons;
//import com.intellij.ide.DataManager;
//import com.intellij.openapi.actionSystem.*;
//import com.intellij.openapi.actionSystem.ex.CustomComponentAction;
//import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
//import com.intellij.openapi.project.DumbAwareAction;
//import com.intellij.openapi.project.Project;
//import com.intellij.openapi.ui.popup.JBPopup;
//import com.intellij.openapi.ui.popup.JBPopupFactory;
//import com.intellij.openapi.ui.popup.PopupChooserBuilder;
//import com.intellij.ui.ClickListener;
//import com.intellij.ui.awt.RelativePoint;
//import com.intellij.ui.components.JBList;
//import com.intellij.util.Consumer;
//import com.intellij.util.ui.UIUtil;
//import org.codinjutsu.tools.jenkins.logic.BrowserLogic;
//import org.codinjutsu.tools.jenkins.model.View;
//import org.codinjutsu.tools.jenkins.view.JenkinsViewComboRenderer;
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.event.MouseAdapter;
//import java.awt.event.MouseEvent;
//import java.util.List;
//
//public class SelectViewAction extends DumbAwareAction implements CustomComponentAction {
//
//
// private final BrowserLogic browserLogic;
//
// private JPanel myPanel;
//
// private JLabel viewLabel;
//
// public SelectViewAction(BrowserLogic browserLogic) {
// this.browserLogic = browserLogic;
//
// myPanel = new JPanel(new BorderLayout());
// viewLabel = new JLabel();
// myPanel.add(viewLabel, BorderLayout.CENTER);
//
// }
//
// @Override
// public void update(AnActionEvent e) {
// View currentSelectedView = browserLogic.getCurrentSelectedView();
// if (currentSelectedView != null) {
// viewLabel.setText(currentSelectedView.getName());
// }
// }
//
// @Override
// public void actionPerformed(AnActionEvent e) {
// List<View> views = browserLogic.getJenkins().getViews();
// if (views.isEmpty()) {
// return;
// }
//
// final JBList viewList = new JBList(views);
// viewList.setCellRenderer(new JenkinsViewComboRenderer());
// new PopupChooserBuilder(viewList)
// .setMovable(false)
// .setCancelKeyEnabled(true)
// .setItemChoosenCallback(new Runnable() {
// public void run() {
// final View view = (View) viewList.getSelectedValue();
// if (view == null) return;
//
// browserLogic.loadView(view);
// }
// })
// .createPopup()
// .show(JBPopupFactory.getInstance().guessBestPopupLocation(e.getDataContext()));
// }
//
// @Override
// public JComponent createCustomComponent(Presentation presentation) {
// return myPanel;
// }
//}
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.actionSystem.ex.CustomComponentAction;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBList;
import org.codinjutsu.tools.jenkins.model.FavoriteView;
import org.codinjutsu.tools.jenkins.model.View;
import org.codinjutsu.tools.jenkins.util.GuiUtil;
import org.codinjutsu.tools.jenkins.view.BrowserPanel;
import org.codinjutsu.tools.jenkins.view.JenkinsNestedViewComboRenderer;
import org.codinjutsu.tools.jenkins.view.JenkinsViewComboRenderer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.List;
/**
* Note: Inspiration from git4idea.history.wholeTree.BasePopupAction (git4idea plugin)
*/
public class SelectViewAction extends DumbAwareAction implements CustomComponentAction {
private static final Icon ARROWS_ICON = GuiUtil.loadIcon("/ide/", "statusbar_arrows.png");
protected final JLabel myLabel;
protected final JPanel myPanel;
private final BrowserPanel browserPanel;
public SelectViewAction(final BrowserPanel browserPanel) {
this.browserPanel = browserPanel;
myPanel = new JPanel();
final BoxLayout layout = new BoxLayout(myPanel, BoxLayout.X_AXIS);
myPanel.setLayout(layout);
myLabel = new JLabel();
final JLabel show = new JLabel("View:");
show.setBorder(BorderFactory.createEmptyBorder(1, 2, 1, 2));
myPanel.add(show);
myPanel.add(myLabel);
myPanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 3));
final JLabel iconLabel = new JLabel(ARROWS_ICON);
iconLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2));
myPanel.add(iconLabel, myLabel);
myPanel.addMouseListener(new MyMouseAdapter());
}
private JBList buildViewList(List<View> views, BrowserPanel browserPanel) {
List<View> unflattenViews = flatViewList(views);
if (browserPanel.hasFavoriteJobs()) {
unflattenViews.add(FavoriteView.create());
}
final JBList viewList = new JBList(unflattenViews);
if (hasNestedViews(unflattenViews)) {
viewList.setCellRenderer(new JenkinsNestedViewComboRenderer());
} else {
viewList.setCellRenderer(new JenkinsViewComboRenderer());
}
return viewList;
}
@Override
public void update(AnActionEvent e) {
View currentSelectedView = browserPanel.getCurrentSelectedView();
if (currentSelectedView != null) {
myLabel.setText(currentSelectedView.getName());
} else {
myLabel.setText("");
}
}
@Override
public JComponent createCustomComponent(Presentation presentation) {
return myPanel;
}
@Override
public void actionPerformed(AnActionEvent e) {
}
private static List<View> flatViewList(List<View> views) {
List<View> flattenViewList = new LinkedList<View>();
for (View view : views) {
flattenViewList.add(view);
if (view.hasNestedView()) {
for (View subView : view.getSubViews()) {
flattenViewList.add(subView);
}
}
}
return flattenViewList;
}
private static boolean hasNestedViews(List<View> views) {
for (View view : views) {
if (view.hasNestedView()) return true;
}
return false;
}
private class MyMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
List<View> views = browserPanel.getJenkins().getViews();
if (views.isEmpty()) {
return;
}
final JBList viewList = buildViewList(views, browserPanel);
JBPopup popup = new PopupChooserBuilder(viewList)
.setMovable(false)
.setCancelKeyEnabled(true)
.setItemChoosenCallback(new Runnable() {
public void run() {
final View view = (View) viewList.getSelectedValue();
if (view == null || view.hasNestedView()) return;
browserPanel.loadView(view);
}
})
.createPopup();
if (e != null) {
popup.show(new RelativePoint(e));
} else {
final Dimension dimension = popup.getContent().getPreferredSize();
final Point at = new Point(-dimension.width / 2, -dimension.height);
popup.show(new RelativePoint(myLabel, at));
}
}
}
}