blob: 563c614efa5ccc6aa4722b5cf2b6f29d712b012d [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* 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.intellij.xdebugger.impl.breakpoints.ui;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.popup.util.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
public class BreakpointChooser {
private DetailView myDetailViewDelegate;
private Delegate myDelegate;
private final ComboBox myComboBox;
private DetailController myDetailController;
private final List<BreakpointItem> myBreakpointItems;
private BreakpointChooser.MyDetailView myDetailView;
public void setDetailView(DetailView detailView) {
myDetailViewDelegate = detailView;
myDetailView = new MyDetailView(myDetailViewDelegate.getEditorState());
myDetailController.setDetailView(myDetailView);
}
public Object getSelectedBreakpoint() {
return ((BreakpointItem)myComboBox.getSelectedItem()).getBreakpoint();
}
private void pop(DetailView.PreviewEditorState pushed) {
if (pushed.getFile() != null) {
myDetailViewDelegate
.navigateInPreviewEditor(
new DetailView.PreviewEditorState(pushed.getFile(), pushed.getNavigate(), pushed.getAttributes()));
}
else {
myDetailViewDelegate.clearEditor();
}
}
public void setSelectesBreakpoint(Object breakpoint) {
myComboBox.setSelectedItem(findItem(breakpoint, myBreakpointItems));
}
public interface Delegate {
void breakpointChosen(Project project, BreakpointItem breakpointItem);
}
public BreakpointChooser(final Project project, Delegate delegate, Object baseBreakpoint, List<BreakpointItem> breakpointItems) {
myDelegate = delegate;
myBreakpointItems = breakpointItems;
BreakpointItem breakpointItem = findItem(baseBreakpoint, myBreakpointItems);
final Ref<Object> hackedSelection = Ref.create();
myDetailController = new DetailController(new MasterController() {
JLabel fake = new JLabel();
@Override
public ItemWrapper[] getSelectedItems() {
if (hackedSelection.get() == null) {
return new ItemWrapper[0];
}
return new ItemWrapper[]{((BreakpointItem) hackedSelection.get())};
}
@Override
public JLabel getPathLabel() {
return fake;
}
});
ComboBoxModel model = new CollectionComboBoxModel(myBreakpointItems, breakpointItem);
myComboBox = new ComboBox(model);
myComboBox.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
if (myDetailView != null) {
myDetailView.clearEditor();
}
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
if (myDetailView != null) {
myDetailView.clearEditor();
}
}
});
myComboBox.setRenderer(new ItemWrapperListRenderer(project, null) {
@Override
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
super.customizeCellRenderer(list, value, index, selected, hasFocus);
if (selected) {
if (hackedSelection.get() != value) {
hackedSelection.set(value);
myDetailController.updateDetailView();
}
}
}
});
myComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent event) {
myDelegate.breakpointChosen(project, ((BreakpointItem)myComboBox.getSelectedItem()));
}
});
}
@Nullable
private static BreakpointItem findItem(Object baseBreakpoint, List<BreakpointItem> breakpointItems) {
BreakpointItem breakpointItem = null;
for (BreakpointItem item : breakpointItems) {
if (item.getBreakpoint() == baseBreakpoint) {
breakpointItem = item;
break;
}
}
return breakpointItem;
}
public JComponent getComponent() {
return myComboBox;
}
private class MyDetailView implements DetailView {
private final PreviewEditorState myPushed;
private ItemWrapper myCurrentItem;
public MyDetailView(PreviewEditorState pushed) {
myPushed = pushed;
putUserData(BreakpointItem.EDITOR_ONLY, Boolean.TRUE);
}
@Override
public Editor getEditor() {
return myDetailViewDelegate.getEditor();
}
@Override
public void navigateInPreviewEditor(PreviewEditorState editorState) {
if (myDetailViewDelegate != null) {
myDetailViewDelegate.navigateInPreviewEditor(editorState);
}
}
@Override
public JPanel getPropertiesPanel() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void setPropertiesPanel(@Nullable JPanel panel) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void clearEditor() {
pop(myPushed);
}
@Override
public PreviewEditorState getEditorState() {
return myDetailViewDelegate.getEditorState();
}
public void setCurrentItem(ItemWrapper currentItem) {
myCurrentItem = currentItem;
}
@Override
public ItemWrapper getCurrentItem() {
return myCurrentItem;
}
@Override
public boolean hasEditorOnly() {
return true;
}
UserDataHolderBase myDataHolderBase = new UserDataHolderBase();
@Override
public <T> T getUserData(@NotNull Key<T> key) {
return myDataHolderBase.getUserData(key);
}
@Override
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
myDataHolderBase.putUserData(key, value);
}
}
}