/* * Copyright 2013-2014 Grzegorz Ligas <ligasgr@gmail.com> and other contributors * (see the CONTRIBUTORS file). * * 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.intellij.xquery.runner.ui.datasources.details; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.AnActionButton; import com.intellij.ui.AnActionButtonRunnable; import com.intellij.ui.ListUtil; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBList; import com.intellij.util.Consumer; import org.intellij.xquery.runner.state.datasources.XQueryDataSourceConfiguration; import org.intellij.xquery.runner.ui.datasources.ConfigurationChangeListener; import javax.swing.DefaultListModel; import javax.swing.JPanel; import javax.swing.ListSelectionModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; /** * User: ligasgr * Date: 06/10/13 * Time: 19:05 */ public class UserDefinedLibraryPanel { public static final String USER_DEFINED_LIBRARY_ENABLED_FIELD_NAME = "userDefinedLibraryEnabled"; public static final String PATH_LIST_NAME = "pathList"; private final FileChooserDescriptor jarsOnlyFileChooserDescriptor = new FileChooserDescriptor(false, false, true, true, false, true); private JPanel mainPanel; private JBCheckBox userDefinedLibraryEnabled; private JPanel pathsPanel; private DefaultListModel pathListModel; private JBList pathList; private final ToolbarDecorator toolbarDecorator; public UserDefinedLibraryPanel() { pathListModel = new DefaultListModel(); pathList = preparePathList(pathListModel); toolbarDecorator = prepareToolbarDecorator(pathList); pathsPanel.add(toolbarDecorator.createPanel()); userDefinedLibraryEnabled.addActionListener(getUserDefinedLibraryEnabledListener()); } public void init(XQueryDataSourceConfiguration cfg, DataSourceConfigurationAggregatingPanel aggregatingPanel, ConfigurationChangeListener listener) { this.userDefinedLibraryEnabled.setSelected(cfg.USER_DEFINED_LIBRARY_ENABLED); populatePathList(cfg.USER_DEFINED_LIBRARY_PATHS); userDefinedLibraryEnabledChanged(); setUpChangeListeners(aggregatingPanel, listener); } public List<String> getUserDefinedLibraryPaths() { List<String> currentPaths = new ArrayList<String>(); for (int i = 0; i < pathListModel.getSize(); i++) { currentPaths.add(((String) pathListModel.getElementAt(i))); } return currentPaths; } public JPanel getMainPanel() { return mainPanel; } public ToolbarDecorator getToolbarDecorator() { return toolbarDecorator; } public boolean isUserDefinedLibraryEnabled() { return userDefinedLibraryEnabled.isSelected(); } private ToolbarDecorator prepareToolbarDecorator(final JBList pathList) { return ToolbarDecorator.createDecorator(pathList) .setAddAction(new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { showAddPathPopup(); } }) .setRemoveAction(new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { ListUtil.removeSelectedItems(pathList); pathList.repaint(); } }); } private void showAddPathPopup() { chooseFilesWithFileChooser(jarsOnlyFileChooserDescriptor, new Consumer<List<VirtualFile>>() { @Override public void consume(List<VirtualFile> files) { for (VirtualFile file : files) { onFileChosen(file); } } }); } protected void chooseFilesWithFileChooser(FileChooserDescriptor descriptor, Consumer<List<VirtualFile>> consumer) { FileChooser.chooseFiles(descriptor, null, null, consumer); } public void onFileChosen(VirtualFile chosenFile) { pathListModel.addElement(chosenFile.getPresentableUrl()); } public JBList getPathList() { return pathList; } private void populatePathList(List<String> userDefinedLibraryPaths) { pathListModel.removeAllElements(); for (String userDefinedLibraryPath : userDefinedLibraryPaths) { pathListModel.addElement(userDefinedLibraryPath); } } private void userDefinedLibraryEnabledChanged() { pathList.setEnabled(userDefinedLibraryEnabled.isSelected()); } private JBList preparePathList(DefaultListModel pathListModel) { final JBList pathList = new JBList(pathListModel); pathList.getEmptyText().setText("No classpath entries defined"); pathList.setDragEnabled(false); pathList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); pathList.setName(PATH_LIST_NAME); return pathList; } private ActionListener getUserDefinedLibraryEnabledListener() { return new ActionListener() { public void actionPerformed(ActionEvent e) { userDefinedLibraryEnabledChanged(); } }; } public void updateConfigurationWithChanges(XQueryDataSourceConfiguration currentConfiguration) { currentConfiguration.USER_DEFINED_LIBRARY_ENABLED = isUserDefinedLibraryEnabled(); currentConfiguration.USER_DEFINED_LIBRARY_PATHS = getUserDefinedLibraryPaths(); } public void setUpChangeListeners(final DataSourceConfigurationAggregatingPanel aggregatingPanel, final ConfigurationChangeListener listener) { userDefinedLibraryEnabled.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { listener.changeApplied(aggregatingPanel .getCurrentConfigurationState()); } }); pathListModel.addListDataListener(new ListDataListener() { @Override public void intervalAdded(ListDataEvent e) { listener.changeApplied(aggregatingPanel.getCurrentConfigurationState()); } @Override public void intervalRemoved(ListDataEvent e) { listener.changeApplied(aggregatingPanel.getCurrentConfigurationState()); } @Override public void contentsChanged(ListDataEvent e) { // do nothing (can't happen - we only support adding and removing) } }); } }