/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2004 Joerg Mueller, Daniel Polansky, Christian Foltin and others.
*
*See COPYING for Details
*
*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, write to the Free Software
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Created on 02.05.2004
*/
/*$Id: EditNodeBase.java,v 1.1.4.2.12.14 2008/12/16 21:57:01 christianfoltin Exp $*/
package freemind.view.mindmapview;
import java.awt.BorderLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.AbstractAction;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.text.JTextComponent;
import freemind.controller.Controller;
import freemind.main.FreeMindCommon;
import freemind.main.FreeMindMain;
import freemind.main.Resources;
import freemind.main.Tools;
import freemind.modes.ModeController;
/**
* @author foltin
*
*/
public class EditNodeBase {
protected static boolean checkSpelling = Resources.getInstance().
getBoolProperty(FreeMindCommon.CHECK_SPELLING);;
protected static final int BUTTON_OK = 0;
protected static final int BUTTON_CANCEL = 1;
protected static final int BUTTON_SPLIT = 2;
protected NodeView node;
private EditControl editControl;
private ModeController controller;
protected String text;
// this enables from outside close the edit mode
protected FocusListener textFieldListener = null;
EditNodeBase(final NodeView node, final String text,
ModeController controller, EditControl editControl)
{
this.controller = controller;
this.editControl = editControl;
this.node = node;
this.text = text;
}
abstract static class EditDialog extends JDialog {
private static final long serialVersionUID = 6064679828160694117L;
private EditNodeBase base;
class DialogWindowListener extends WindowAdapter {
/*
* (non-Javadoc)
*
* @see
* java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent
* )
*/
public void windowClosing(WindowEvent e) {
if (isVisible()) {
confirmedSubmit();
}
}
}
class SubmitAction extends AbstractAction {
private static final long serialVersionUID = -859458051986869388L;
public void actionPerformed(ActionEvent e) {
submit();
}
}
class SplitAction extends AbstractAction {
private static final long serialVersionUID = 6876147686811246433L;
public void actionPerformed(ActionEvent e) {
split();
}
}
class CancelAction extends AbstractAction {
private static final long serialVersionUID = -6277471363654329607L;
public void actionPerformed(ActionEvent e) {
confirmedCancel();
}
}
EditDialog(EditNodeBase base) {
super((JFrame) base.getFrame(), base.getText("edit_long_node"),
/*modal = */ true);
getContentPane().setLayout(new BorderLayout());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
DialogWindowListener dfl = new DialogWindowListener();
addWindowListener(dfl);
this.base = base;
}
protected void confirmedSubmit() {
if (isChanged()) {
final int action = JOptionPane.showConfirmDialog(this,
base.getText("long_node_changed_submit"), "",
JOptionPane.YES_NO_CANCEL_OPTION);
if (action == JOptionPane.CANCEL_OPTION)
return;
if (action == JOptionPane.YES_OPTION) {
submit();
return;
}
}
cancel();
}
protected void confirmedCancel() {
if (isChanged()) {
final int action = JOptionPane.showConfirmDialog(this,
base.getText("long_node_changed_cancel"), "",
JOptionPane.OK_CANCEL_OPTION);
if (action == JOptionPane.CANCEL_OPTION)
return;
}
cancel();
}
protected void submit() {
setVisible(false);
}
protected void cancel() {
setVisible(false);
}
protected void split() {
setVisible(false);
}
abstract protected boolean isChanged();
/**
* @param base
* The base to set.
*/
void setBase(EditNodeBase base) {
this.base = base;
}
/**
* @return Returns the base.
*/
EditNodeBase getBase() {
return base;
}
}
public interface EditControl {
void cancel();
void ok(String newText);
void split(String newText, int position);
}
protected MapView getView() {
return controller.getView();
}
protected ModeController getModeController() {
return controller;
}
protected Controller getController() {
return controller.getController();
}
protected String getText(String string) {
return controller.getText(string);
}
protected FreeMindMain getFrame() {
return controller.getFrame();
}
protected boolean binOptionIsTrue(String option) {
return Resources.getInstance().getBoolProperty(option);
}
protected class EditCopyAction extends AbstractAction {
private static final long serialVersionUID = 5104219263806454592L;
private JTextComponent textComponent;
public EditCopyAction(JTextComponent textComponent) {
super(getText("copy"));
this.textComponent = textComponent;
}
public void actionPerformed(ActionEvent e) {
String selection = textComponent.getSelectedText();
if (selection != null) {
getClipboard().setContents(new StringSelection(selection), null);
}
}
}
protected class EditPopupMenu extends JPopupMenu {
private static final long serialVersionUID = -6667980271052571216L;
public EditPopupMenu(JTextComponent textComponent) {
EditCopyAction editCopyAction = new EditCopyAction(textComponent);
String selectedText = textComponent.getSelectedText();
if (selectedText == null || selectedText.equals("")) {
editCopyAction.setEnabled(false);
}
this.add(editCopyAction);
}
}
public void closeEdit() {
if (textFieldListener != null) {
textFieldListener.focusLost(null); // hack to close the edit
}
}
protected String getText() {
return text;
}
public Clipboard getClipboard() {
return Tools.getClipboard();
}
public EditControl getEditControl() {
return editControl;
}
public NodeView getNode() {
return node;
}
public FocusListener getTextFieldListener() {
return textFieldListener;
}
public void setText(String string) {
text = string;
}
public void setTextFieldListener(FocusListener listener) {
textFieldListener = listener;
}
protected void redispatchKeyEvents(final JTextComponent textComponent,
KeyEvent firstKeyEvent)
{
if (textComponent.hasFocus()) {
return;
}
final KeyboardFocusManager currentKeyboardFocusManager =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
class KeyEventQueue implements KeyEventDispatcher, FocusListener {
LinkedList events = new LinkedList();
public boolean dispatchKeyEvent(KeyEvent e) {
events.add(e);
return true;
}
public void focusGained(FocusEvent e) {
e.getComponent().removeFocusListener(this);
currentKeyboardFocusManager.removeKeyEventDispatcher(this);
final Iterator iterator = events.iterator();
while (iterator.hasNext()) {
final KeyEvent ke = (KeyEvent) iterator.next();
ke.setSource(textComponent);
textComponent.dispatchEvent(ke);
}
}
public void focusLost(FocusEvent e) {
}
};
final KeyEventQueue keyEventDispatcher = new KeyEventQueue();
currentKeyboardFocusManager.addKeyEventDispatcher(keyEventDispatcher);
textComponent.addFocusListener(keyEventDispatcher);
if (firstKeyEvent == null) {
return;
}
if (firstKeyEvent.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
switch (firstKeyEvent.getKeyCode()) {
case KeyEvent.VK_HOME:
textComponent.setCaretPosition(0);
break;
case KeyEvent.VK_END:
textComponent.setCaretPosition(textComponent.getDocument()
.getLength());
break;
}
} else {
textComponent.selectAll(); // to enable overwrite
// redispath all key events
textComponent.dispatchEvent(firstKeyEvent);
}
}
}