/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.client.tool;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import com.jeta.forms.components.colors.JETAColorWell;
import com.t3.client.AppStyle;
import com.t3.client.ScreenPoint;
import com.t3.client.TabletopTool;
import com.t3.client.swing.AbeillePanel;
import com.t3.client.ui.zone.ZoneOverlay;
import com.t3.client.ui.zone.ZoneRenderer;
import com.t3.image.ImageUtil;
import com.t3.language.I18N;
import com.t3.model.Label;
import com.t3.model.ZonePoint;
import com.t3.swing.SwingUtil;
/**
*/
public class TextTool extends DefaultTool implements ZoneOverlay {
private static final long serialVersionUID = -8944323545051996907L;
private Label selectedLabel;
private int dragOffsetX;
private int dragOffsetY;
private boolean isDragging;
private boolean selectedNewLabel;
public TextTool() {
try {
setIcon(new ImageIcon(ImageUtil.getImage("com/t3/client/image/tool/text-blue.png")));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Override
protected void attachTo(ZoneRenderer renderer) {
renderer.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
super.attachTo(renderer);
selectedLabel = null;
}
@Override
protected void detachFrom(ZoneRenderer renderer) {
renderer.setCursor(Cursor.getDefaultCursor());
super.detachFrom(renderer);
}
@Override
public String getTooltip() {
return "tool.label.tooltip";
}
@Override
public String getInstructions() {
return "tool.label.instructions";
}
@Override
public void paintOverlay(ZoneRenderer renderer, Graphics2D g) {
if (selectedLabel != null && renderer.getLabelBounds(selectedLabel) != null) {
AppStyle.selectedBorder.paintWithin(g, renderer.getLabelBounds(selectedLabel));
}
}
@Override
protected void installKeystrokes(Map<KeyStroke, Action> actionMap) {
super.installKeystrokes(actionMap);
actionMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedLabel != null) {
renderer.getZone().removeLabel(selectedLabel.getId());
TabletopTool.serverCommand().removeLabel(renderer.getZone().getId(), selectedLabel.getId());
selectedLabel = null;
repaint();
}
}
});
}
////
// MOUSE
@Override
public void mousePressed(MouseEvent e) {
Label label = renderer.getLabelAt(e.getX(), e.getY());
if (label != selectedLabel) {
selectedNewLabel = true;
renderer.repaint();
} else {
selectedNewLabel = false;
}
if (label != null) {
ScreenPoint sp = ScreenPoint.fromZonePoint(renderer, label.getX(), label.getY());
dragOffsetX = (int) (e.getX() - sp.x);
dragOffsetY = (int) (e.getY() - sp.y);
}
super.mousePressed(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (!isDragging) {
Label label = renderer.getLabelAt(e.getX(), e.getY());
if (label == null) {
if (selectedLabel == null) {
ZonePoint zp = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
label = new Label("", zp.x, zp.y);
selectedLabel = label;
} else {
selectedLabel = null;
renderer.repaint();
return;
}
} else {
if (selectedNewLabel) {
selectedLabel = label;
renderer.repaint();
return;
}
}
EditLabelDialog dialog = new EditLabelDialog(label);
dialog.setVisible(true);
if (!dialog.isAccepted()) {
return;
}
renderer.getZone().putLabel(label);
}
if (selectedLabel != null) {
TabletopTool.serverCommand().putLabel(renderer.getZone().getId(), selectedLabel);
renderer.repaint();
}
}
isDragging = false;
super.mouseReleased(e);
}
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
if (!isDragging) {
// Setup
Label label = renderer.getLabelAt(e.getX(), e.getY());
if (selectedLabel == null || selectedLabel != label) {
selectedLabel = label;
}
if (selectedLabel == null || SwingUtilities.isRightMouseButton(e)) {
return;
}
}
isDragging = true;
ZonePoint zp = new ScreenPoint(e.getX() - dragOffsetX, e.getY() - dragOffsetY).convertToZone(renderer);
selectedLabel.setX(zp.x);
selectedLabel.setY(zp.y);
renderer.repaint();
}
public class EditLabelDialog extends JDialog {
private static final long serialVersionUID = 7621373725343873527L;
private boolean accepted;
public EditLabelDialog(Label label) {
super(TabletopTool.getFrame(), I18N.getText("tool.label.dialogtitle"), true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
EditLabelPanel panel = new EditLabelPanel(this);
panel.bind(label);
add(panel);
getRootPane().setDefaultButton(panel.getOKButton());
pack();
}
public boolean isAccepted() {
return accepted;
}
@Override
public void setVisible(boolean b) {
if (b) {
SwingUtil.centerOver(this, getOwner());
}
super.setVisible(b);
}
}
public class EditLabelPanel extends AbeillePanel<Label> {
private static final long serialVersionUID = 3307411310513003924L;
private final EditLabelDialog dialog;
public EditLabelPanel(EditLabelDialog dialog) {
super("com/t3/client/ui/forms/editLabelDialog.xml");
this.dialog = dialog;
panelInit();
getLabelTextField().setSelectionStart(0);
getLabelTextField().setSelectionEnd(getLabelTextField().getText().length());
getLabelTextField().setCaretPosition(getLabelTextField().getText().length());
}
@Override
public void bind(Label model) {
getColorWell().setColor(model.getForegroundColor());
super.bind(model);
}
@Override
public boolean commit() {
getModel().setForegroundColor(getColorWell().getColor());
return super.commit();
}
public JETAColorWell getColorWell() {
return (JETAColorWell) getComponent("foregroundColor");
}
public JTextField getLabelTextField() {
return (JTextField) getComponent("@label");
}
public JButton getOKButton() {
return (JButton) getComponent("okButton");
}
public void initOKButton() {
getOKButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.accepted = true;
commit();
close();
}
});
}
public void initCancelButton() {
((JButton) getComponent("cancelButton")).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close();
}
});
}
private void close() {
dialog.setVisible(false);
}
}
}