/*
* $Id$
*
* Copyright 2007 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jdesktop.swingx;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.SortedSet;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.calendar.CalendarUtils;
import org.jdesktop.swingx.calendar.DateSelectionModel.SelectionMode;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
/**
* Cross-component selection support.
*
*
*
* @author Jeanette Winzenburg
*/
public class SelectionIssues extends InteractiveTestCase {
@SuppressWarnings("unused")
private static final Logger LOG = Logger.getLogger(SelectionIssues.class
.getName());
public static void main(String[] args) {
setSystemLF(true);
SelectionIssues test = new SelectionIssues();
try {
test.runInteractiveTests();
// test.runInteractiveTests("interactive.*Locale.*");
// test.runInteractiveTests("interactive.*AutoScroll.*");
// test.runInteractiveTests("interactive.*UpdateUI.*");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
@SuppressWarnings("unused")
private Calendar calendar;
/**
* #703-swingx: set date to first of next doesn't update the view.
* #712-swingx: support optional auto-scroll on selection.
* Behaviour is consistent with core components. Except that it is doing
* too much: revalidate most probably shouldn't change the scrolling state?
*
*/
public void interactiveAutoScrollOnSelectionMonthView() {
final JXMonthView us = new JXMonthView();
us.setSelectionMode(SelectionMode.SINGLE_INTERVAL_SELECTION);
final Calendar today = Calendar.getInstance();
CalendarUtils.endOfMonth(today);
today.add(Calendar.DAY_OF_MONTH, 1);
us.setSelectionDate(today.getTime());
JXFrame frame = wrapInFrame(us, "first day of next month");
Action nextMonthInterval = new AbstractActionExt("next month interval") {
public void actionPerformed(ActionEvent e) {
if (us.isSelectionEmpty()) return;
today.setTime(us.getSelectionDate());
today.add(Calendar.DAY_OF_MONTH, -20);
Date start = today.getTime();
today.add(Calendar.DAY_OF_MONTH, +40);
us.setSelectionInterval(start, today.getTime());
// shouldn't effect scrolling state
us.revalidate();
// client code must trigger
// us.ensureDateVisible(start.getTime());
}
};
addAction(frame, nextMonthInterval);
Action next = new AbstractActionExt("next month") {
public void actionPerformed(ActionEvent e) {
if (us.isSelectionEmpty()) return;
if (!CalendarUtils.isEndOfMonth(today)) {
CalendarUtils.endOfMonth(today);
}
today.add(Calendar.DAY_OF_MONTH, 1);
us.setSelectionDate(today.getTime());
LOG.info("firstDisplayed before: " + us.getFirstDisplayedDay());
// shouldn't effect scrolling state
us.revalidate();
LOG.info("firstDisplayed: " + us.getFirstDisplayedDay());
}
};
addAction(frame, next);
frame.pack();
frame.setVisible(true);
}
/**
* #703-swingx: select date doesn't ensure visibility of selected.
* #712-swingx: support optional auto-scroll on selection.
*
* compare with core list: doesn't scroll as well.
*
*/
public void interactiveAutoScrollOnSelectionList() {
// add hoc model
SortedSet<Date> dates = getDates();
final JXList us = new JXList(new ListComboBoxModel<Date>(new ArrayList<Date>(dates)));
us.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JXFrame frame = wrapWithScrollingInFrame(us, "list - autoscroll on selection");
Action next = new AbstractActionExt("select last + 1") {
public void actionPerformed(ActionEvent e) {
int last = us.getLastVisibleIndex();
us.setSelectedIndex(last + 1);
// shouldn't effect scrolling state
us.revalidate();
// client code must trigger
// us.ensureIndexIsVisible(last+1);
}
};
addAction(frame, next);
frame.pack();
frame.setVisible(true);
}
/**
* #703-swingx: set date to first of next doesn't "scroll".
* #712-swingx: support optional auto-scroll on selection.
*
* compare with core tree: doesn't scroll as well.
*
*/
public void interactiveAutoScrollOnSelectionTree() {
// add hoc model
SortedSet<Date> dates = getDates();
DefaultMutableTreeNode root = new DefaultMutableTreeNode("dates");
for (Date date : dates) {
root.add(new DefaultMutableTreeNode(date));
}
final JXTree us = new JXTree(root);
JXFrame frame = wrapWithScrollingInFrame(us, "tree - autoscroll on selection");
Action next = new AbstractActionExt("select last + 1") {
public void actionPerformed(ActionEvent e) {
int last = us.getLeadSelectionRow();
us.setSelectionRow(last + 1);
// shouldn't effect scrolling state
us.revalidate();
// client code must trigger
// us.scrollRowToVisible(last + 1);
}
};
addAction(frame, next);
frame.pack();
frame.setVisible(true);
}
/**
* #703-swingx: set date to first of next doesn't "scroll".
* #712-swingx: support optional auto-scroll on selection.
*
* compare with core tree: doesn't scroll as well.
*
*/
public void interactiveAutoScrollOnSelectionTable() {
// add hoc model
SortedSet<Date> dates = getDates();
DefaultTableModel model = new DefaultTableModel(0, 1);
for (Date date : dates) {
model.addRow(new Object[] {date});
}
final JXTable us = new JXTable(model);
JXFrame frame = wrapWithScrollingInFrame(us, "table - autoscroll on selection");
Action next = new AbstractActionExt("select last + 1") {
public void actionPerformed(ActionEvent e) {
int last = us.getSelectedRow();
us.setRowSelectionInterval(last + 1, last + 1);
// shouldn't effect scrolling state
us.revalidate();
// client code must trigger
// us.scrollRowToVisible(last + 1);
}
};
addAction(frame, next);
frame.pack();
frame.setVisible(true);
}
/**
* Convenience to get a bunch of dates.
*
* @return
*/
private SortedSet<Date> getDates() {
JXMonthView source = new JXMonthView();
source.setSelectionMode(SelectionMode.SINGLE_INTERVAL_SELECTION);
final Calendar today = Calendar.getInstance();
Date start = today.getTime();
today.add(Calendar.DAY_OF_MONTH, +40);
source.setSelectionInterval(start, today.getTime());
SortedSet<Date> dates = source.getSelection();
return dates;
}
/**
* Keep test runner happy.
*/
public void testDummy() {
}
}