/* * 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); } } }