Java tutorial
/* * Copyright 2013 Hewlett-Packard Development Company, L.P * * 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.hp.alm.ali.idea.ui.tasks; import com.hp.alm.ali.idea.entity.FilterListener; import com.hp.alm.ali.idea.tasks.TaskConfig; import com.hp.alm.ali.idea.ui.ComboItem; import com.hp.alm.ali.idea.model.Entity; import com.hp.alm.ali.idea.entity.EntityQuery; import com.hp.alm.ali.idea.ui.chooser.EntityChooser; import com.hp.alm.ali.idea.ui.chooser.HierarchicalChooser; import com.hp.alm.ali.idea.services.FavoritesService; import com.hp.alm.ali.idea.rest.RestListener; import com.hp.alm.ali.idea.rest.RestService; import com.hp.alm.ali.idea.entity.tree.FavoritesModel; import com.hp.alm.ali.idea.ui.entity.query.EntityQueryPicker; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import javax.swing.*; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; public class TaskConfigPanel extends JPanel implements RestListener { private FavoritesService favoritesService; private String entityType; private TaskConfig config; private JComboBox queryCombo; public TaskConfigPanel(final Project project, String title, final TaskConfig config, String entityType, final ItemListener itemListener) { super(new GridBagLayout()); this.favoritesService = project.getComponent(FavoritesService.class); this.entityType = entityType; this.config = config; project.getComponent(RestService.class).addListener(this); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.WEST; c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 0; final JCheckBox mainCheck = new JCheckBox(title, config.isEnabled()); add(mainCheck, c); c.gridy++; c.insets = new Insets(0, 10, 0, 0); final JRadioButton customQuery = new JRadioButton("Use Custom Query", config.isCustomSelected()); customQuery.setEnabled(mainCheck.isSelected()); add(customQuery, c); c.gridy++; c.insets = new Insets(0, 32, 0, 0); // config.customFilter doesn't have entityType set EntityQuery entityQuery = new EntityQuery(entityType); entityQuery.copyFrom(config.getCustomFilter()); final EntityQueryPicker queryField = new EntityQueryPicker(project, entityQuery, entityType); queryField.addListener(new FilterListener<EntityQuery>() { @Override public void filterChanged(EntityQuery query) { config.getCustomFilter().copyFrom(query); } }); queryField.setEnabled(mainCheck.isSelected() && config.isCustomSelected()); add(queryField, c); c.gridy++; c.insets = new Insets(0, 10, 0, 0); final JRadioButton storedQuery = new JRadioButton("Use Stored Query", !config.isCustomSelected()); storedQuery.setEnabled(mainCheck.isSelected()); add(storedQuery, c); c.gridy++; c.insets = new Insets(0, 32, 0, 0); queryCombo = new JComboBox(); reloadFavorites(); if (!"".equals(config.getStoredQuery())) { // try to reselect stored value select(queryCombo, new ComboItem(config.getStoredQuery())); } enableQueryCombo(mainCheck.isSelected() && storedQuery.isSelected()); add(queryCombo, c); c.gridy++; c.fill = GridBagConstraints.BOTH; c.weighty = 1; add(new JPanel(), c); ButtonGroup group = new ButtonGroup(); group.add(customQuery); group.add(storedQuery); mainCheck.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { boolean selected = mainCheck.isSelected(); config.setEnabled(selected); customQuery.setEnabled(selected); queryField.setEnabled(selected && customQuery.isSelected()); storedQuery.setEnabled(selected); enableQueryCombo(selected && storedQuery.isSelected()); if (selected && !storedQuery.isSelected()) { customQuery.setSelected(true); } itemListener.itemStateChanged(itemEvent); } }); customQuery.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { boolean selected = customQuery.isSelected(); config.setCustomSelected(selected); queryField.setEnabled(selected); } }); storedQuery.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { boolean selected = storedQuery.isSelected(); config.setCustomSelected(!selected); enableQueryCombo(selected); } }); queryCombo.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { if (itemEvent.getStateChange() == ItemEvent.SELECTED) { if (itemEvent.getItem() instanceof ServerFavorites) { RestService restService = project.getComponent(RestService.class); if (!restService.getServerTypeIfAvailable().isConnected()) { Messages.showDialog("Not connected to HP ALM, server favorites are not available.", "Not Connected", new String[] { "Continue" }, 0, Messages.getErrorIcon()); revert(); return; } FavoritesModel favoritesModel = new FavoritesModel(project, TaskConfigPanel.this.entityType); EntityChooser popup = new HierarchicalChooser(project, "favorite", true, false, true, false, favoritesModel); popup.setVisible(true); String selectedValue = popup.getSelectedValue(); if (!selectedValue.isEmpty()) { Entity favorite = favoritesModel .getEntityNode(Integer.valueOf(selectedValue), "favorite").getEntity(); String favoriteName = favorite.getId() + ": " + favorite.getPropertyValue("name") + " (ALM)"; config.setStoredQuery(favoriteName); ComboItem comboItem = new ComboItem(favoriteName); queryCombo.setSelectedItem(comboItem); if (!comboItem.equals(queryCombo.getSelectedItem())) { queryCombo.addItem(comboItem); queryCombo.setSelectedIndex(queryCombo.getItemCount() - 1); } } else { revert(); } } else { config.setStoredQuery(((ComboItem) itemEvent.getItem()).getDisplayValue()); } } } }); } private void revert() { // return to previous choice for (int i = 0; i < queryCombo.getItemCount(); i++) { ComboItem item = (ComboItem) queryCombo.getItemAt(i); if (item.getDisplayValue().equals(config.getStoredQuery())) { queryCombo.setSelectedItem(item); break; } } } private void enableQueryCombo(boolean enable) { queryCombo.setEnabled(enable); if (enable) { ComboItem item = (ComboItem) queryCombo.getSelectedItem(); // store selected value into config if (item != null) { config.setStoredQuery(item.getDisplayValue()); } } } private void reloadFavorites() { List<EntityQuery> list = favoritesService.getAvailableQueries(entityType); ComboItem selectedItem = (ComboItem) queryCombo.getSelectedItem(); queryCombo.removeAllItems(); for (EntityQuery filter : list) { queryCombo.addItem(new ComboItem(filter.getName())); } addServerItem(); if (selectedItem != null) { select(queryCombo, selectedItem); } } private void select(JComboBox comboBox, ComboItem item) { comboBox.setSelectedItem(item); if (!item.equals(comboBox.getSelectedItem())) { if (item.getDisplayValue().endsWith("(ALM)")) { comboBox.addItem(item); } else { comboBox.addItem(new NotFound(item.getDisplayValue())); } comboBox.setSelectedIndex(comboBox.getItemCount() - 1); removeEmptyItem(comboBox); } } private void addServerItem() { if (queryCombo.getItemCount() == 0) { // server favorites triggers popup, it must not be selected, insert dummy item queryCombo.addItem(new ComboItem("")); } queryCombo.addItem(new ServerFavorites()); } private void removeEmptyItem(JComboBox comboBox) { for (int i = 0; i < comboBox.getItemCount(); i++) { if (comboBox.getItemAt(i).toString().isEmpty()) { comboBox.removeItemAt(i); } } } public void restConfigurationChanged() { ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { reloadFavorites(); } }); } private static class NotFound extends ComboItem { NotFound(String value) { super(value); } public String toString() { return "Not found: " + super.toString(); } } private static class ServerFavorites extends ComboItem { ServerFavorites() { super("Server Favorites..."); } } }