/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2006 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: EditNodeDialog.java,v 1.1.4.1.16.20 2009/06/24 20:40:19 christianfoltin Exp $*/
package freemind.view.mindmapview;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import com.inet.jortho.SpellChecker;
import freemind.main.Tools;
import freemind.modes.ModeController;
/**
* @author foltin
*
*/
public class EditNodeDialog extends EditNodeBase {
private KeyEvent firstEvent;
/** Private variable to hold the last value of the "Enter confirms" state. */
private static Tools.BooleanHolder booleanHolderForConfirmState;
public EditNodeDialog(final NodeView node, final String text,
final KeyEvent firstEvent, ModeController controller,
EditControl editControl) {
super(node, text, controller, editControl);
this.firstEvent = firstEvent;
}
class LongNodeDialog extends EditDialog {
private static final long serialVersionUID = 6185443281994675732L;
private JTextArea textArea;
LongNodeDialog() {
super(EditNodeDialog.this);
textArea = new JTextArea(getText());
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
// wish from
// https://sourceforge.net/forum/message.php?msg_id=5923410
// textArea.setTabSize(4);
// wrap around words rather than characters
final JScrollPane editorScrollPane = new JScrollPane(textArea);
editorScrollPane
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// int preferredHeight = new
// Integer(getFrame().getProperty("el__default_window_height")).intValue();
int preferredHeight = getNode().getHeight();
preferredHeight = Math.max(
preferredHeight,
Integer.parseInt(getFrame().getProperty(
"el__min_default_window_height")));
preferredHeight = Math.min(
preferredHeight,
Integer.parseInt(getFrame().getProperty(
"el__max_default_window_height")));
int preferredWidth = getNode().getWidth();
preferredWidth = Math.max(
preferredWidth,
Integer.parseInt(getFrame().getProperty(
"el__min_default_window_width")));
preferredWidth = Math.min(
preferredWidth,
Integer.parseInt(getFrame().getProperty(
"el__max_default_window_width")));
editorScrollPane.setPreferredSize(new Dimension(preferredWidth,
preferredHeight));
// textArea.setPreferredSize(new Dimension(500, 160));
final JPanel panel = new JPanel();
// String performedAction;
final JButton okButton = new JButton();
final JButton cancelButton = new JButton();
final JButton splitButton = new JButton();
final JCheckBox enterConfirms = new JCheckBox("",
binOptionIsTrue("el__enter_confirms_by_default"));
Tools.setLabelAndMnemonic(okButton, getText("ok"));
Tools.setLabelAndMnemonic(cancelButton, getText("cancel"));
Tools.setLabelAndMnemonic(splitButton, getText("split"));
Tools.setLabelAndMnemonic(enterConfirms, getText("enter_confirms"));
if (booleanHolderForConfirmState == null) {
booleanHolderForConfirmState = new Tools.BooleanHolder();
booleanHolderForConfirmState.setValue(enterConfirms
.isSelected());
} else {
enterConfirms.setSelected(booleanHolderForConfirmState
.getValue());
}
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// next try to avoid bug 1159: focus jumps to file-menu after closing html-editing-window
EventQueue.invokeLater(new Runnable() {
public void run() {
submit();
}
});
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cancel();
}
});
splitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
split();
}
});
enterConfirms.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.requestFocus();
booleanHolderForConfirmState.setValue(enterConfirms
.isSelected());
}
});
// On Enter act as if OK button was pressed
textArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
// escape key in long text editor (PN)
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
e.consume();
confirmedCancel();
} else if (e.getKeyCode() == KeyEvent.VK_ENTER) {
if (enterConfirms.isSelected()
&& (e.getModifiers() & KeyEvent.SHIFT_MASK) != 0) {
e.consume();
textArea.insert("\n", textArea.getCaretPosition());
} else if (enterConfirms.isSelected()
|| ((e.getModifiers() & KeyEvent.ALT_MASK) != 0)) {
e.consume();
submit();
} else {
e.consume();
textArea.insert("\n", textArea.getCaretPosition());
}
}
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
});
textArea.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
conditionallyShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
conditionallyShowPopup(e);
}
private void conditionallyShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
JPopupMenu popupMenu = new EditPopupMenu(textArea);
if (checkSpelling) {
popupMenu.add(SpellChecker.createCheckerMenu());
popupMenu.add(SpellChecker.createLanguagesMenu());
}
popupMenu.show(e.getComponent(), e.getX(), e.getY());
e.consume();
}
}
});
Font font = getNode().getTextFont();
font = Tools.updateFontSize(font, getView().getZoom(),
font.getSize());
textArea.setFont(font);
final Color nodeTextColor = getNode().getTextColor();
textArea.setForeground(nodeTextColor);
final Color nodeTextBackground = getNode().getTextBackground();
textArea.setBackground(nodeTextBackground);
textArea.setCaretColor(nodeTextColor);
// panel.setPreferredSize(new Dimension(500, 160));
// editorScrollPane.setPreferredSize(new Dimension(500, 160));
JPanel buttonPane = new JPanel();
buttonPane.add(enterConfirms);
buttonPane.add(okButton);
buttonPane.add(cancelButton);
buttonPane.add(splitButton);
buttonPane.setMaximumSize(new Dimension(1000, 20));
if (getFrame().getProperty("el__buttons_position").equals("above")) {
panel.add(buttonPane);
panel.add(editorScrollPane);
} else {
panel.add(editorScrollPane);
panel.add(buttonPane);
}
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
setContentPane(panel);
if (firstEvent instanceof KeyEvent) {
redispatchKeyEvents(textArea, firstEvent);
} // 1st key event defined
else {
textArea.setCaretPosition(getText().length());
}
if (checkSpelling) {
SpellChecker.register(textArea, false, true, true, true);
}
}
public void show() {
textArea.requestFocus();
super.show();
}
/*
* (non-Javadoc)
*
* @see freemind.view.mindmapview.EditNodeBase.Dialog#cancel()
*/
protected void cancel() {
getEditControl().cancel();
super.cancel();
}
/*
* (non-Javadoc)
*
* @see freemind.view.mindmapview.EditNodeBase.Dialog#split()
*/
protected void split() {
getEditControl().split(textArea.getText(),
textArea.getCaretPosition());
super.split();
}
/*
* (non-Javadoc)
*
* @see freemind.view.mindmapview.EditNodeBase.Dialog#submit()
*/
protected void submit() {
getEditControl().ok(textArea.getText());
super.submit();
}
/*
* (non-Javadoc)
*
* @see freemind.view.mindmapview.EditNodeBase.Dialog#isChanged()
*/
protected boolean isChanged() {
return !getText().equals(textArea.getText());
}
public Component getMostRecentFocusOwner() {
if (isFocused()) {
return getFocusOwner();
} else {
return textArea;
}
}
}
public void show() {
final EditDialog dialog = new LongNodeDialog();
dialog.pack(); // calculate the size
// set position
getView().scrollNodeToVisible(getNode(), 0);
Tools.setDialogLocationRelativeTo(dialog, getNode());
dialog.show();
}
}