/* * Copyright 2012 Anchialas. * * 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.kenai.redminenb.query; import com.kenai.redminenb.util.ListListModel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.*; /** * GUI-Bindings for Parameter Values * * @author Anchialas <anchialas@gmail.com> */ public abstract class RedmineQueryParameter { static final ParameterValue[] EMPTY_PARAMETER_VALUE = new ParameterValue[]{new ParameterValue(" ", "")}; // NOI18N // private final String parameter; protected boolean alwaysDisabled = false; public RedmineQueryParameter(String parameter) { this.parameter = parameter; } public String getParameter() { return parameter; } abstract void setValues(ParameterValue[] values); abstract ParameterValue[] getValues(); // abstract void setValues(ParameterValue[] pvs); public abstract boolean isEmpty(); abstract void setEnabled(boolean b); void setAlwaysDisabled(boolean bl) { this.alwaysDisabled = bl; setEnabled(false); // true or false, who cares. this is only to trigger the state change } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); // NOI18N sb.append("["); // NOI18N sb.append(parameter); sb.append("="); sb.append(ParameterValue.flattenList(getValues())); sb.append("]"); // NOI18N return sb.toString(); } static class ComboParameter extends RedmineQueryParameter { private final JComboBox combo; public ComboParameter(JComboBox combo, String parameter) { super(parameter); this.combo = combo; combo.setModel(new DefaultComboBoxModel(EMPTY_PARAMETER_VALUE)); } @Override public void setValues(ParameterValue[] values) { Object value = null; if(values.length > 0) { value = values[0]; } combo.setSelectedItem(value); } @Override public ParameterValue[] getValues() { ParameterValue value = (ParameterValue)combo.getSelectedItem(); return value != null ? new ParameterValue[]{value} : EMPTY_PARAMETER_VALUE; } public final void setParameterValues(ParameterValue[] values) { combo.setModel(new DefaultComboBoxModel(values)); } public final void setParameterValues(List<ParameterValue> values) { combo.setModel(new DefaultComboBoxModel(values.toArray(new ParameterValue[values.size()]))); } @Override void setEnabled(boolean b) { combo.setEnabled(alwaysDisabled ? false : b); } @Override public boolean isEmpty() { return combo.getModel().getSize() == 0; } } static class ListParameter extends RedmineQueryParameter { private final JList list; public ListParameter(JList list, String parameter) { super(parameter); this.list = list; //list.setModel(new DefaultListModel()); } @Override public void setValues(ParameterValue[] values) { List<Integer> indices = new ArrayList<>(); ListModel lm = list.getModel(); int itemCount = lm.getSize(); OUTER: for(int i = 0; i < itemCount; i++) { for(ParameterValue pv: values) { if(lm.getElementAt(i).equals(pv)) { indices.add(i); continue OUTER; } } } int[] indicesArray = new int[indices.size()]; for(int i = 0; i < indicesArray.length; i++) { indicesArray[i] = indices.get(i); } list.setSelectedIndices(indicesArray); } @Override public ParameterValue[] getValues() { Object[] values = list.getSelectedValues(); if (values == null || values.length == 0) { return EMPTY_PARAMETER_VALUE; } ParameterValue[] ret = new ParameterValue[values.length]; for (int i = 0; i < values.length; i++) { ret[i] = (ParameterValue)values[i]; } return ret; } public void setParameterValues(List<ParameterValue> values) { if (values.isEmpty()) { list.setModel(new DefaultListModel()); list.setPrototypeCellValue(" "); } else { list.setModel(new ListListModel<>(values)); list.setPrototypeCellValue(null); } } @Override void setEnabled(boolean b) { list.setEnabled(alwaysDisabled ? false : b); } @Override public boolean isEmpty() { return list.getModel().getSize() == 0; } } static class TextFieldParameter extends RedmineQueryParameter { private final JTextField txt; public TextFieldParameter(JTextField txt, String parameter) { super(parameter); this.txt = txt; } @Override public void setValues(ParameterValue[] values) { if(values.length > 0 && values[0] != null) { txt.setText(values[0].getValue()); } } @Override public ParameterValue[] getValues() { String value = txt.getText(); if (value == null || value.equals("")) { // NOI18N return EMPTY_PARAMETER_VALUE; } // String[] split = value.split(" "); // NOI18N // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < split.length; i++) { // String s = split[i]; // sb.append(s); // if (i < split.length - 1) { // sb.append("+"); // NOI18N // } // } // String v = sb.toString(); // return new ParameterValue[]{new ParameterValue(v, v)}; return new ParameterValue[]{new ParameterValue(value)}; } @Override void setEnabled(boolean b) { txt.setEnabled(alwaysDisabled ? false : b); } @Override public boolean isEmpty() { return false; } } static class CheckBoxParameter extends RedmineQueryParameter { private static final ParameterValue[] SELECTED_VALUE = new ParameterValue[]{new ParameterValue("1")}; // NOI18N // private final JCheckBox chk; public CheckBoxParameter(JCheckBox chk, String parameter) { super(parameter); this.chk = chk; } @Override void setValues(ParameterValue[] values) { if(values.length > 0 && values[0] != null && values[0].equals(SELECTED_VALUE[0])) { this.chk.setSelected(true); } else { this.chk.setSelected(false); } } @Override public ParameterValue[] getValues() { return chk.isSelected() ? SELECTED_VALUE : EMPTY_PARAMETER_VALUE; } @Override void setEnabled(boolean b) { chk.setEnabled(alwaysDisabled ? false : b); } @Override public boolean isEmpty() { return false; } } public static class SimpleQueryParameter extends RedmineQueryParameter { private String[] values; public SimpleQueryParameter(String parameter, String[] values) { super(parameter); this.values = new String[values.length]; System.arraycopy(values, 0, this.values, 0, values.length); } @Override void setValues(ParameterValue[] values) { if(! Arrays.equals(values, EMPTY_PARAMETER_VALUE)) { this.values = new String[values.length]; for(int i = 0; i < values.length; i++) { this.values[i] = values[i].getValue(); } } else { this.values = new String[0]; } } @Override ParameterValue[] getValues() { if (values == null || values.length == 0) { return EMPTY_PARAMETER_VALUE; } ParameterValue[] ret = new ParameterValue[values.length]; for (int i = 0; i < values.length; i++) { ret[i] = new ParameterValue(values[i]); } return ret; } @Override void setEnabled(boolean b) { // interested } @Override public boolean isEmpty() { return values == null || values.length == 0; } } }