/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.EventListener;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.JTextComponent;
import org.apache.commons.lang.StringUtils;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.resources.WindowConfigurationStorage;
import org.freeplane.core.ui.UIBuilder;
import org.freeplane.core.ui.components.BlindIcon;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.HtmlUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.clipboard.ClipboardController;
import org.freeplane.features.map.IMapChangeListener;
import org.freeplane.features.map.IMapSelectionListener;
import org.freeplane.features.map.INodeChangeListener;
import org.freeplane.features.map.MapChangeEvent;
import org.freeplane.features.map.MapController;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeChangeEvent;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.mode.mindmapmode.MModeController;
import org.freeplane.features.text.TextController;
import org.freeplane.features.ui.IMapViewManager;
import org.freeplane.features.url.mindmapmode.MFileManager;
import org.freeplane.view.swing.features.time.mindmapmode.ReminderExtension;
/**
* @author foltin
*/
public class NodeList {
private final class MapChangeListener implements IMapChangeListener, INodeChangeListener, IMapSelectionListener {
public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
disposeDialog();
}
public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
disposeDialog();
}
public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
disposeDialog();
}
public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
disposeDialog();
}
public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
disposeDialog();
}
public void mapChanged(MapChangeEvent event) {
disposeDialog();
}
public void nodeChanged(NodeChangeEvent event) {
if(event.getProperty().equals(NodeModel.NODE_TEXT)){
disposeDialog();
}
}
public void afterMapChange(MapModel oldMap, MapModel newMap) {
}
public void beforeMapChange(MapModel oldMap, MapModel newMap) {
disposeDialog();
}
}
final private class FilterTextDocumentListener implements DocumentListener, ChangeListener, ActionListener {
private Timer mTypeDelayTimer = null;
private synchronized void delayedChange() {
stopTimer();
mTypeDelayTimer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent e) {
change();
}
});
mTypeDelayTimer.start();
}
public void stopTimer() {
if (mTypeDelayTimer != null) {
mTypeDelayTimer.stop();
mTypeDelayTimer = null;
}
}
public void changedUpdate(final DocumentEvent event) {
delayedChange();
}
public void insertUpdate(final DocumentEvent event) {
delayedChange();
}
public void removeUpdate(final DocumentEvent event) {
delayedChange();
}
private synchronized void change() {
stopTimer();
final Object selectedItem = mFilterTextSearchField.getEditor().getItem();
mFlatNodeTableFilterModel.setFilter((String) selectedItem, matchCase.isSelected(),
useRegexInFind.isSelected());
}
public void stateChanged(ChangeEvent e) {
change();
}
public void actionPerformed(ActionEvent e) {
change();
}
}
final private class FlatNodeTable extends JTable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public TableCellRenderer getCellRenderer(final int row, final int column) {
final Object object = getModel().getValueAt(row, column);
if (object instanceof Date) {
return dateRenderer;
}
if (object instanceof TextHolder) {
return textRenderer;
}
if (object instanceof IconsHolder) {
return iconsRenderer;
}
return super.getCellRenderer(row, column);
}
@Override
public boolean isCellEditable(final int rowIndex, final int vColIndex) {
return false;
}
@Override
protected void processKeyEvent(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
final EventListener[] el = super.getListeners(KeyListener.class);
if (e.getID() != KeyEvent.KEY_RELEASED) {
return;
}
for (int i = 0; i < el.length; i++) {
final KeyListener kl = (KeyListener) el[i];
kl.keyReleased(e);
}
return;
}
super.processKeyEvent(e);
}
}
final private class FlatNodeTableKeyListener implements KeyListener {
public void keyPressed(final KeyEvent arg0) {
}
public void keyReleased(final KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE) {
disposeDialog();
}
if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
selectSelectedRows();
disposeDialog();
}
}
public void keyTyped(final KeyEvent arg0) {
}
}
final private class FlatNodeTableMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) {
final Point p = e.getPoint();
final int row = tableView.rowAtPoint(p);
gotoNodesAndClose(row, new int[] { row });
}
}
}
private class HolderAccessor{
final private boolean selectedOnly;
private HolderAccessor(boolean selectedOnly) {
super();
this.selectedOnly = selectedOnly;
}
public void changeString(final TextHolder textHolder, final String newText) {
textHolder.setText(newText);
}
public int getLength() {
return mFlatNodeTableFilterModel.getRowCount();
}
public TextHolder[] getNodeHoldersAt(final int row) {
return selectedOnly ? getSelectedNodeHoldersAt(row):getAnyNodeHoldersAt(row);
}
public TextHolder[] getAnyNodeHoldersAt(final int i) {
return new TextHolder[]{
(TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_TEXT_COLUMN),
(TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_DETAILS_COLUMN),
(TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_NOTES_COLUMN)
};
}
public TextHolder[] getSelectedNodeHoldersAt(final int i) {
return new TextHolder[]{(TextHolder) sorter.getValueAt(tableView.getSelectedRows()[i], NodeList.NODE_TEXT_COLUMN)};
}
}
private static String COLUMN_CREATED = "Created";
private static String COLUMN_DATE = "Date";
private static String COLUMN_ICONS = "Icons";
private static String COLUMN_MODIFIED = "Modified";
private static String COLUMN_NOTES = "Notes";
private static String COLUMN_TEXT = "Text";
private static String COLUMN_DETAILS = "Details";
private static final int DATE_COLUMN = 0;
protected static final int NODE_CREATED_COLUMN = 3;
protected static final int NODE_ICON_COLUMN = 2;
protected static final int NODE_MODIFIED_COLUMN = 4;
protected static final int NODE_DETAILS_COLUMN = 5;
protected static final int NODE_NOTES_COLUMN = 6;
public static final int NODE_TEXT_COLUMN = 1;
private static final String PLUGINS_TIME_LIST_XML_CREATED = "plugins/TimeList.xml_Created";
private static final String PLUGINS_TIME_LIST_XML_DATE = "plugins/TimeList.xml_Date";
private static final String PLUGINS_TIME_LIST_XML_ICONS = "plugins/TimeList.xml_Icons";
private static final String PLUGINS_TIME_LIST_XML_MODIFIED = "plugins/TimeList.xml_Modified";
private static final String PLUGINS_TIME_LIST_XML_NOTES = "plugins/TimeList.xml_Notes";
private static final String PLUGINS_TIME_LIST_XML_DETAILS = "plugins/TimeList.xml_Details";
private static final String PLUGINS_TIME_LIST_XML_TEXT = "plugins/TimeList.xml_Text";
private static final String PLUGINS_TIME_MANAGEMENT_XML_CLOSE = "plugins/TimeManagement.xml_closeButton";
private static final String PLUGINS_TIME_MANAGEMENT_XML_FIND = "plugins/TimeManagement.xml_Find";
private static final String PLUGINS_TIME_MANAGEMENT_XML_REPLACE = "plugins/TimeManagement.xml_Replace";
// private static final String PLUGINS_TIME_MANAGEMENT_XML_SELECT = "plugins/TimeManagement.xml_Select";
private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE = "plugins/TimeManagement.xml_WindowTitle";
private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES = "plugins/TimeManagement.xml_WindowTitle_All_Nodes";
private static final String WINDOW_PREFERENCE_STORAGE_PROPERTY = NodeList.class.getName() + "_properties";
private static String replace(final Pattern p, String input, final String replacement) {
final String result = HtmlUtils.getReplaceResult(p, input, replacement);
return result;
}
// // final private Controller controller;
private DateRenderer dateRenderer;
private JDialog dialog;
private IconsRenderer iconsRenderer;
final private JComboBox mFilterTextReplaceField;
final private JComboBox mFilterTextSearchField;
private FlatNodeTableFilterModel mFlatNodeTableFilterModel;
// final private ModeController modeController;
private JLabel mTreeLabel;
private TextRenderer textRenderer;
private boolean showAllNodes = false;
private org.freeplane.view.swing.features.time.mindmapmode.nodelist.TableSorter sorter;
private JTable tableView;
private DefaultTableModel tableModel;
private final boolean searchInAllMaps;
private final JCheckBox useRegexInReplace;
private final JCheckBox useRegexInFind;
private final JCheckBox matchCase;
final private boolean modal;
public NodeList( final boolean showAllNodes, final boolean searchInAllMaps) {
this(false, showAllNodes, searchInAllMaps);
}
public NodeList( final boolean modal, final boolean showAllNodes, final boolean searchInAllMaps) {
// this.modeController = modeController;
// controller = modeController.getController();
this.modal = modal;
this.showAllNodes = showAllNodes;
this.searchInAllMaps = searchInAllMaps;
mFilterTextSearchField = new JComboBox();
mFilterTextSearchField.setEditable(true);
final FilterTextDocumentListener listener = new FilterTextDocumentListener();
mFilterTextSearchField.addActionListener(listener);
final JTextComponent editorComponent = (JTextComponent) mFilterTextSearchField.getEditor().getEditorComponent();
editorComponent.getDocument().addDocumentListener(listener);
mFilterTextSearchField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent pEvent) {
if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
mFilterTextReplaceField.requestFocusInWindow();
}
}
});
mFilterTextReplaceField = new JComboBox();
mFilterTextReplaceField.setEditable(true);
mFilterTextReplaceField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent pEvent) {
if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
tableView.requestFocusInWindow();
}
else if (pEvent.getKeyCode() == KeyEvent.VK_UP) {
mFilterTextSearchField.requestFocusInWindow();
}
}
});
useRegexInReplace = new JCheckBox();
useRegexInFind = new JCheckBox();
useRegexInFind.addChangeListener(listener);
matchCase = new JCheckBox();
matchCase.addChangeListener(listener);
final MapChangeListener mapChangeListener = new MapChangeListener();
final ModeController modeController = Controller.getCurrentModeController();
final MapController mapController = modeController.getMapController();
mapController.addMapChangeListener(mapChangeListener);
mapController.addNodeChangeListener(mapChangeListener);
Controller.getCurrentController().getMapViewManager().addMapSelectionListener(mapChangeListener);
}
/**
*
*/
private void disposeDialog() {
if(dialog == null || !dialog.isVisible()){
return;
}
final TimeWindowConfigurationStorage storage = new TimeWindowConfigurationStorage();
for (int i = 0; i < tableView.getColumnCount(); i++) {
final TimeWindowColumnSetting setting = new TimeWindowColumnSetting();
setting.setColumnWidth(tableView.getColumnModel().getColumn(i).getWidth());
setting.setColumnSorting(sorter.getSortingStatus(i));
storage.addTimeWindowColumnSetting(setting);
}
storage.storeDialogPositions(dialog, NodeList.WINDOW_PREFERENCE_STORAGE_PROPERTY);
dialog.setVisible(false);
dialog.dispose();
dialog = null;
}
protected void exportSelectedRowsAndClose() {
final int[] selectedRows = tableView.getSelectedRows();
final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
for (int i = 0; i < selectedRows.length; i++) {
final int row = selectedRows[i];
selectedNodes.add(getMindMapNode(row));
}
final ModeController mindMapController = Controller.getCurrentModeController();
MFileManager.getController(mindMapController).newMapFromDefaultTemplate();
final MapModel newMap = Controller.getCurrentController().getMap();
for (final NodeModel node : selectedNodes) {
final NodeModel copy = ClipboardController.getController().duplicate(node, false);
if (copy != null) {
mindMapController.getMapController().insertNodeIntoWithoutUndo(copy, newMap.getRootNode());
}
}
disposeDialog();
}
/**
*/
private NodeModel getMindMapNode(final int focussedRow) {
final NodeModel selectedNode = ((TextHolder) tableView.getModel().getValueAt(focussedRow,
NodeList.NODE_TEXT_COLUMN)).getNode();
return selectedNode;
}
private void gotoNodesAndClose(final int focussedRow, final int[] selectedRows) {
selectNodes(focussedRow, selectedRows);
disposeDialog();
}
private void replace(final HolderAccessor holderAccessor) {
final String searchString = (String) mFilterTextSearchField.getSelectedItem();
if(searchString == null)
return;
final String replaceString = (String) mFilterTextReplaceField.getSelectedItem();
Pattern p;
try {
p = Pattern.compile(useRegexInFind.isSelected() ? searchString : Pattern.quote(searchString),
matchCase.isSelected() ? 0 : Pattern.CASE_INSENSITIVE);
}
catch (final PatternSyntaxException e) {
UITools.errorMessage(TextUtils.format("wrong_regexp", searchString, e.getMessage()));
return;
}
final String replacement = replaceString == null ? "" : replaceString;
final int length = holderAccessor.getLength();
for (int i = 0; i < length; i++) {
TextHolder[] textHolders = holderAccessor.getNodeHoldersAt(i);
for(final TextHolder textHolder:textHolders){
final String text = textHolder.getText();
final String replaceResult;
final String literalReplacement = useRegexInReplace.isSelected() ? replacement : Matcher.quoteReplacement(replacement);
try {
if (HtmlUtils.isHtmlNode(text)) {
replaceResult = NodeList.replace(p, text,literalReplacement);
}
else {
replaceResult = p.matcher(text).replaceAll(literalReplacement);
}
}
catch (Exception e) {
UITools.errorMessage(TextUtils.format("wrong_regexp", replacement, e.getMessage()));
return;
}
if (!StringUtils.equals(text, replaceResult)) {
holderAccessor.changeString(textHolder, replaceResult);
}
}
}
tableModel.fireTableDataChanged();
mFlatNodeTableFilterModel.resetFilter();
mFilterTextSearchField.insertItemAt(mFilterTextSearchField.getSelectedItem(), 0);
mFilterTextReplaceField.insertItemAt(mFilterTextReplaceField.getSelectedItem(), 0);
mFilterTextSearchField.setSelectedItem("");
}
private void selectNodes(final int focussedRow, final int[] selectedRows) {
if (focussedRow >= 0) {
final NodeModel focussedNode = getMindMapNode(focussedRow);
final MapModel map = focussedNode.getMap();
final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
for (final int row : selectedRows) {
final NodeModel node = getMindMapNode(row);
if (!node.getMap().equals(map)) {
continue;
}
selectedNodes.add(node);
}
selectMap(map);
Controller.getCurrentModeController().getMapController().selectMultipleNodes(focussedNode, selectedNodes);
}
}
private void selectMap(final MapModel map) {
if (map.equals(Controller.getCurrentController().getMap())) {
return;
}
final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
final Map<String, MapModel> maps = mapViewManager.getMaps(MModeController.MODENAME);
for (final Map.Entry<String, MapModel> entry : maps.entrySet()) {
if (map.equals(entry.getValue())) {
mapViewManager.tryToChangeToMapView(entry.getKey());
}
}
}
private void selectSelectedRows() {
selectNodes(tableView.getSelectedRow(), tableView.getSelectedRows());
}
public void startup() {
if(dialog != null){
dialog.toFront();
return;
}
NodeList.COLUMN_MODIFIED = TextUtils.getText(PLUGINS_TIME_LIST_XML_MODIFIED);
NodeList.COLUMN_CREATED = TextUtils.getText(PLUGINS_TIME_LIST_XML_CREATED);
NodeList.COLUMN_ICONS = TextUtils.getText(PLUGINS_TIME_LIST_XML_ICONS);
NodeList.COLUMN_TEXT = TextUtils.getText(PLUGINS_TIME_LIST_XML_TEXT);
NodeList.COLUMN_DETAILS= TextUtils.getText(PLUGINS_TIME_LIST_XML_DETAILS);
NodeList.COLUMN_DATE = TextUtils.getText(PLUGINS_TIME_LIST_XML_DATE);
NodeList.COLUMN_NOTES = TextUtils.getText(PLUGINS_TIME_LIST_XML_NOTES);
dialog = new JDialog(Controller.getCurrentController().getViewController().getFrame(), modal /* modal */);
String windowTitle;
if (showAllNodes) {
windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES;
}
else {
windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE;
}
dialog.setTitle(TextUtils.getText(windowTitle));
dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
final WindowAdapter windowListener = new WindowAdapter() {
@Override
public void windowGainedFocus(WindowEvent e) {
mFilterTextSearchField.getEditor().selectAll();
}
@Override
public void windowClosing(final WindowEvent event) {
disposeDialog();
}
};
dialog.addWindowListener(windowListener);
dialog.addWindowFocusListener(windowListener);
UITools.addEscapeActionToDialog(dialog, new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
disposeDialog();
}
});
final Container contentPane = dialog.getContentPane();
final GridBagLayout gbl = new GridBagLayout();
contentPane.setLayout(gbl);
final GridBagConstraints layoutConstraints = new GridBagConstraints();
layoutConstraints.gridx = 0;
layoutConstraints.gridy = 0;
layoutConstraints.gridwidth = 1;
layoutConstraints.gridheight = 1;
layoutConstraints.weightx = 0.0;
layoutConstraints.weighty = 0.0;
layoutConstraints.anchor = GridBagConstraints.WEST;
layoutConstraints.fill = GridBagConstraints.HORIZONTAL;
contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_FIND)), layoutConstraints);
layoutConstraints.gridwidth = 1;
layoutConstraints.gridx++;
contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(new JLabel(TextUtils.getText("filter_match_case")), layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(matchCase, layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(useRegexInFind, layoutConstraints);
layoutConstraints.gridx = 0;
layoutConstraints.weightx = 1.0;
layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
layoutConstraints.gridy++;
contentPane.add(/* new JScrollPane */(mFilterTextSearchField), layoutConstraints);
layoutConstraints.gridy++;
layoutConstraints.weightx = 0.0;
layoutConstraints.gridwidth = 1;
contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_REPLACE)), layoutConstraints);
layoutConstraints.gridx = 5;
contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
layoutConstraints.gridx++;
contentPane.add(useRegexInReplace, layoutConstraints);
layoutConstraints.gridx = 0;
layoutConstraints.weightx = 1.0;
layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
layoutConstraints.gridy++;
contentPane.add(/* new JScrollPane */(mFilterTextReplaceField), layoutConstraints);
dateRenderer = new DateRenderer();
textRenderer = new TextRenderer();
iconsRenderer = new IconsRenderer();
tableView = new FlatNodeTable();
tableView.addKeyListener(new FlatNodeTableKeyListener());
tableView.addMouseListener(new FlatNodeTableMouseAdapter());
tableView.getTableHeader().setReorderingAllowed(false);
tableModel = updateModel();
mFlatNodeTableFilterModel = new FlatNodeTableFilterModel(tableModel,
new int[]{NodeList.NODE_TEXT_COLUMN, NodeList.NODE_DETAILS_COLUMN, NodeList.NODE_NOTES_COLUMN}
);
sorter = new TableSorter(mFlatNodeTableFilterModel);
tableView.setModel(sorter);
sorter.setTableHeader(tableView.getTableHeader());
sorter.setColumnComparator(Date.class, TableSorter.COMPARABLE_COMPARATOR);
sorter.setColumnComparator(NodeModel.class, TableSorter.LEXICAL_COMPARATOR);
sorter.setColumnComparator(IconsHolder.class, TableSorter.COMPARABLE_COMPARATOR);
sorter.setSortingStatus(NodeList.DATE_COLUMN, TableSorter.ASCENDING);
final JScrollPane pane = new JScrollPane(tableView);
UITools.setScrollbarIncrement(pane);
layoutConstraints.gridy++;
GridBagConstraints tableConstraints = (GridBagConstraints) layoutConstraints.clone();
tableConstraints.weightx = 1;
tableConstraints.weighty = 10;
tableConstraints.fill = GridBagConstraints.BOTH;
contentPane.add(pane, tableConstraints);
mTreeLabel = new JLabel();
layoutConstraints.gridy++;
GridBagConstraints treeConstraints = (GridBagConstraints) layoutConstraints.clone();
treeConstraints.fill = GridBagConstraints.BOTH;
@SuppressWarnings("serial")
JScrollPane scrollPane = new JScrollPane(mTreeLabel){
@Override
public boolean isValidateRoot() {
return false;
}
};
contentPane.add(scrollPane, treeConstraints);
final AbstractAction exportAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Export")) {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
exportSelectedRowsAndClose();
}
};
final JButton exportButton = new JButton(exportAction);
final AbstractAction replaceAllAction = new AbstractAction(TextUtils
.getText("plugins/TimeManagement.xml_Replace_All")) {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
replace(new HolderAccessor(false));
}
};
final JButton replaceAllButton = new JButton(replaceAllAction);
final AbstractAction replaceSelectedAction = new AbstractAction(TextUtils
.getText("plugins/TimeManagement.xml_Replace_Selected")) {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
replace(new HolderAccessor(true));
}
};
final JButton replaceSelectedButton = new JButton(replaceSelectedAction);
final AbstractAction gotoAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Goto")) {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
selectSelectedRows();
}
};
final JButton gotoButton = new JButton(gotoAction);
final AbstractAction disposeAction = new AbstractAction(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_CLOSE)) {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
disposeDialog();
}
};
final JButton cancelButton = new JButton(disposeAction);
/* Initial State */
gotoAction.setEnabled(false);
exportAction.setEnabled(false);
replaceSelectedAction.setEnabled(false);
final Box bar = Box.createHorizontalBox();
bar.add(Box.createHorizontalGlue());
bar.add(cancelButton);
bar.add(exportButton);
bar.add(replaceAllButton);
bar.add(replaceSelectedButton);
bar.add(gotoButton);
bar.add(Box.createHorizontalGlue());
layoutConstraints.gridy++;
contentPane.add(/* new JScrollPane */(bar), layoutConstraints);
final JMenuBar menuBar = new JMenuBar();
final JMenu menu = new JMenu(TextUtils.getText("plugins/TimeManagement.xml_menu_actions"));
final AbstractAction[] actionList = new AbstractAction[] { gotoAction, replaceSelectedAction,
replaceAllAction, exportAction, disposeAction };
for (int i = 0; i < actionList.length; i++) {
final AbstractAction action = actionList[i];
final JMenuItem item = menu.add(action);
item.setIcon(new BlindIcon(UIBuilder.ICON_SIZE));
}
menuBar.add(menu);
dialog.setJMenuBar(menuBar);
final ListSelectionModel rowSM = tableView.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(final ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
final boolean enable = !(lsm.isSelectionEmpty());
replaceSelectedAction.setEnabled(enable);
gotoAction.setEnabled(enable);
exportAction.setEnabled(enable);
}
});
rowSM.addListSelectionListener(new ListSelectionListener() {
String getNodeText(final NodeModel node) {
return TextController.getController().getShortText(node) + ((node.isRoot()) ? "" : (" <- " + getNodeText(node.getParentNode())));
}
public void valueChanged(final ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (lsm.isSelectionEmpty()) {
mTreeLabel.setText("");
return;
}
final int selectedRow = lsm.getLeadSelectionIndex();
final NodeModel mindMapNode = getMindMapNode(selectedRow);
mTreeLabel.setText(getNodeText(mindMapNode));
}
});
final String marshalled = ResourceController.getResourceController().getProperty(
NodeList.WINDOW_PREFERENCE_STORAGE_PROPERTY);
final WindowConfigurationStorage result = TimeWindowConfigurationStorage.decorateDialog(marshalled, dialog);
final WindowConfigurationStorage storage = result;
if (storage != null) {
tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
int column = 0;
for (final TimeWindowColumnSetting setting : ((TimeWindowConfigurationStorage) storage)
.getListTimeWindowColumnSettingList()) {
tableView.getColumnModel().getColumn(column).setPreferredWidth(setting.getColumnWidth());
sorter.setSortingStatus(column, setting.getColumnSorting());
column++;
}
}
mFlatNodeTableFilterModel.setFilter((String)mFilterTextSearchField.getSelectedItem(),
matchCase.isSelected(), useRegexInFind.isSelected());
dialog.setVisible(true);
}
/**
* Creates a table model for the new table and returns it.
*/
private DefaultTableModel updateModel() {
final DefaultTableModel model = new DefaultTableModel() {
/**
*
*/
private static final long serialVersionUID = 1L;
/*
* (non-Javadoc)
* @see javax.swing.table.AbstractTableModel#getColumnClass(int)
*/
@Override
public Class<?> getColumnClass(final int arg0) {
switch (arg0) {
case DATE_COLUMN:
case NODE_CREATED_COLUMN:
case NODE_MODIFIED_COLUMN:
return Date.class;
case NODE_TEXT_COLUMN:
case NODE_NOTES_COLUMN:
case NODE_DETAILS_COLUMN:
return TextHolder.class;
case NODE_ICON_COLUMN:
return IconsHolder.class;
default:
return Object.class;
}
}
};
model.addColumn(NodeList.COLUMN_DATE);
model.addColumn(NodeList.COLUMN_TEXT);
model.addColumn(NodeList.COLUMN_ICONS);
model.addColumn(NodeList.COLUMN_CREATED);
model.addColumn(NodeList.COLUMN_MODIFIED);
model.addColumn(NodeList.COLUMN_DETAILS);
model.addColumn(NodeList.COLUMN_NOTES);
if (searchInAllMaps == false) {
final NodeModel node = Controller.getCurrentController().getMap().getRootNode();
updateModel(model, node);
}
else {
final Map<String, MapModel> maps = Controller.getCurrentController().getMapViewManager().getMaps(MModeController.MODENAME);
for (final MapModel map : maps.values()) {
final NodeModel node = map.getRootNode();
updateModel(model, node);
}
}
return model;
}
private void updateModel(final DefaultTableModel model, final NodeModel node) {
final ReminderExtension hook = ReminderExtension.getExtension(node);
Date date = null;
if (hook != null) {
date = new Date(hook.getRemindUserAt());
}
if (showAllNodes && node.isVisible() || hook != null) {
model.addRow(new Object[] {
date,
new TextHolder(new CoreTextAccessor(node)),
new IconsHolder(node),
node.getHistoryInformation().getCreatedAt(),
node.getHistoryInformation().getLastModifiedAt(),
new TextHolder(new DetailTextAccessor(node)) ,
new TextHolder(new NoteTextAccessor(node)) });
}
for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
updateModel(model, child);
}
}
}