001package jmri.jmrit.display; 002 003import java.awt.Component; 004import java.awt.Dimension; 005import java.awt.GridBagConstraints; 006import java.awt.GridBagLayout; 007import java.awt.event.ActionEvent; 008import java.awt.event.WindowEvent; 009import java.text.MessageFormat; 010 011import javax.swing.AbstractAction; 012import javax.swing.JButton; 013import javax.swing.JComponent; 014import javax.swing.JLabel; 015import javax.swing.JSpinner; 016import javax.swing.JTextField; 017import javax.swing.SpinnerNumberModel; 018import javax.swing.event.ChangeListener; 019 020import jmri.util.JmriJFrame; 021import jmri.util.swing.JmriJOptionPane; 022 023/** 024 * Displays and allows user to modify {@literal x & y} coordinates of 025 * positionable labels This class has been generalized to provide popup edit 026 * dialogs for positionable item properties when TextFields are needed to input 027 * data. 028 * <p> 029 * The class name no longer identifies the full purpose of the class, However 030 * the name is retained because coordinate editing was the genesis. The current 031 * list of properties served for editing is: 032 * <ul> 033 * <li>modify {@literal x & y} coordinates modify level modify tooltip modify 034 * border size</li> 035 * <li>modify margin size modify fixed size modify rotation degrees modify 036 * scaling</li> 037 * <li>modify text labels modify zoom scaling modify panel name</li> 038 * </ul> 039 * To use, write a static method that provides the dialog frame. Then write an 040 * initX method that customizes the dialog for the property. 041 * 042 * @author Dan Boudreau Copyright (C) 2007 043 * @author Pete Cressman Copyright (C) 2010 044 */ 045public class CoordinateEdit extends JmriJFrame { 046 047 Positionable pl; // positional label tracked by this frame 048 int oldX; 049 int oldY; 050 double oldD; 051 String oldStr; 052 053 // member declarations 054 JLabel nameText = new JLabel(); 055 JLabel textX; 056 JLabel textY; 057 058 // buttons 059 JButton okButton = new JButton(); 060 JButton cancelButton = new JButton(); 061 062 // text field 063 JTextField xTextField; 064 JTextField yTextField; 065 066 //SpinnerNumberModel _spinModel; 067 JSpinner spinX; 068 JSpinner spinY; 069 070 public static AbstractAction getCoordinateEditAction(final Positionable pos) { 071 return new AbstractAction() { 072 @Override 073 public void actionPerformed(ActionEvent e) { 074 CoordinateEdit f = new CoordinateEdit(); 075 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 076 f.init(Bundle.getMessage("SetXY", ""), pos, true); // use property without ellipsis in variable 077 f.initSetXY(); 078 f.setVisible(true); 079 f.setLocationRelativeTo((Component) pos); 080 } 081 }; 082 } 083 ////////////////////////////////////////////////////////////// 084 085 public static AbstractAction getLevelEditAction(final Positionable pos) { 086 return new AbstractAction(Bundle.getMessage("SetLevel", "...")) { 087 @Override 088 public void actionPerformed(ActionEvent e) { 089 CoordinateEdit f = new CoordinateEdit(); 090 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 091 f.init(Bundle.getMessage("SetLevel", ""), pos, true); // use property without ellipsis in variable 092 f.initSetLevel(); 093 f.setVisible(true); 094 f.setLocationRelativeTo((Component) pos); 095 } 096 }; 097 } 098 ////////////////////////////////////////////////////////////// 099 100 public static AbstractAction getToolTipEditAction(final Positionable pos) { 101 return new AbstractAction(Bundle.getMessage("SetCustomTooltip", "...")) { 102 @Override 103 public void actionPerformed(ActionEvent e) { 104 CoordinateEdit f = new CoordinateEdit(); 105 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 106 f.init(Bundle.getMessage("SetTooltip", ""), pos, true); // use property without ellipsis in variable 107 f.initSetTip(); 108 f.setVisible(true); 109 f.setLocationRelativeTo((Component) pos); 110 } 111 }; 112 } 113 ////////////////////////////////////////////////////////////// 114 115 public static AbstractAction getBorderEditAction(final Positionable pos) { 116 return new AbstractAction(Bundle.getMessage("SetBorderSize", "...")) { 117 118 @Override 119 public void actionPerformed(ActionEvent e) { 120 CoordinateEdit f = new CoordinateEdit(); 121 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 122 f.init(Bundle.getMessage("SetBorderSize", ""), pos, true); 123 f.initBorder(); 124 f.setVisible(true); 125 f.setLocationRelativeTo((Component) pos); 126 } 127 }; 128 } 129 ////////////////////////////////////////////////////////////// 130 131 public static AbstractAction getMarginEditAction(final Positionable pos) { 132 return new AbstractAction(Bundle.getMessage("SetMarginSize", "...")) { 133 @Override 134 public void actionPerformed(ActionEvent e) { 135 CoordinateEdit f = new CoordinateEdit(); 136 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 137 f.init(Bundle.getMessage("SetMarginSize", ""), pos, true); 138 f.initMargin(); 139 f.setVisible(true); 140 f.setLocationRelativeTo((Component) pos); 141 } 142 }; 143 } 144 ////////////////////////////////////////////////////////////// 145 146 public static AbstractAction getFixedSizeEditAction(final Positionable pos) { 147 return new AbstractAction(Bundle.getMessage("SetFixedSize", "...")) { 148 149 @Override 150 public void actionPerformed(ActionEvent e) { 151 CoordinateEdit f = new CoordinateEdit(); 152 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 153 f.init(Bundle.getMessage("SetFixedSize", ""), pos, true); 154 f.initFixedSize(); 155 f.setVisible(true); 156 f.setLocationRelativeTo((Component) pos); 157 } 158 }; 159 } 160 ////////////////////////////////////////////////////////////// 161 162 public static AbstractAction getRotateEditAction(final Positionable pos) { 163 return new AbstractAction(Bundle.getMessage("RotateSign", pos.getDegrees())) { // Bundle property includes degree symbol 164 165 @Override 166 public void actionPerformed(ActionEvent e) { 167 CoordinateEdit f = new CoordinateEdit(); 168 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 169 f.init(Bundle.getMessage("Rotate", ""), pos, true); 170 f.initRotate(); 171 f.setVisible(true); 172 f.setLocationRelativeTo((Component) pos); 173 } 174 }; 175 } 176 ////////////////////////////////////////////////////////////// 177 178 public static AbstractAction getScaleEditAction(final Positionable pos) { 179 return new AbstractAction(Bundle.getMessage("Rescale", "...")) { 180 181 @Override 182 public void actionPerformed(ActionEvent e) { 183 CoordinateEdit f = new CoordinateEdit(); 184 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 185 f.init(Bundle.getMessage("Rescale", ""), pos, true); 186 f.initScale(); 187 f.setVisible(true); 188 f.setLocationRelativeTo((Component) pos); 189 } 190 }; 191 } 192 ////////////////////////////////////////////////////////////// 193 194 public static AbstractAction getIdEditAction( 195 final Positionable pos, final String title, final Editor editor) { 196 197 return new AbstractAction(Bundle.getMessage(title) + "...") { 198 199 @Override 200 public void actionPerformed(ActionEvent e) { 201 CoordinateEdit f = new CoordinateEdit(); 202 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 203 f.init(Bundle.getMessage(title), pos, false); 204 f.initId(editor); 205 f.setVisible(true); 206 f.setLocationRelativeTo((Component) pos); 207 } 208 }; 209 } 210 ////////////////////////////////////////////////////////////// 211 212 public static AbstractAction getClassesEditAction( 213 final Positionable pos, final String title, final Editor editor) { 214 215 return new AbstractAction(Bundle.getMessage(title) + "...") { 216 217 @Override 218 public void actionPerformed(ActionEvent e) { 219 CoordinateEdit f = new CoordinateEdit(); 220 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 221 f.init(Bundle.getMessage(title), pos, false); 222 f.initClasses(editor); 223 f.setVisible(true); 224 f.setLocationRelativeTo((Component) pos); 225 } 226 }; 227 } 228 ////////////////////////////////////////////////////////////// 229 230 public static AbstractAction getTextEditAction(final Positionable pos, final String title) { 231 return new AbstractAction(Bundle.getMessage(title) + "...") { 232 233 @Override 234 public void actionPerformed(ActionEvent e) { 235 CoordinateEdit f = new CoordinateEdit(); 236 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 237 f.init(Bundle.getMessage(title), pos, false); 238 f.initText(); 239 f.setVisible(true); 240 f.setLocationRelativeTo((Component) pos); 241 } 242 }; 243 } 244 ////////////////////////////////////////////////////////////// 245 246 public static AbstractAction getLinkEditAction(final Positionable pos, final String title) { 247 return new AbstractAction(Bundle.getMessage(title) + "...") { 248 249 @Override 250 public void actionPerformed(ActionEvent e) { 251 CoordinateEdit f = new CoordinateEdit(); 252 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 253 f.init(Bundle.getMessage(title), pos, false); 254 f.initLink(); 255 f.setVisible(true); 256 f.setLocationRelativeTo((Component) pos); 257 } 258 }; 259 } 260 ////////////////////////////////////////////////////////////// 261 262 public static AbstractAction getZoomEditAction(final Positionable pos) { 263 return new AbstractAction(Bundle.getMessage("Zoom", "...")) { 264 265 @Override 266 public void actionPerformed(ActionEvent e) { 267 CoordinateEdit f = new CoordinateEdit(); 268 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 269 f.init(Bundle.getMessage("Zoom", ""), pos, false); 270 f.initZoom(); 271 f.setVisible(true); 272 //f.setLocation(100,100); 273 f.setLocationRelativeTo(pos.getEditor().getTargetPanel()); 274 } 275 }; 276 } 277 ////////////////////////////////////////////////////////////// 278 279 public static AbstractAction getNameEditAction(final Positionable pos) { 280 return new AbstractAction(Bundle.getMessage("renamePanelMenu", "...")) { 281 282 @Override 283 public void actionPerformed(ActionEvent e) { 284 CoordinateEdit f = new CoordinateEdit(); 285 f.addHelpMenu("package.jmri.jmrit.display.CoordinateEdit", true); 286 f.init(Bundle.getMessage("renamePanelMenu", ""), pos, false); 287 f.initSetName(); 288 f.setVisible(true); 289 //f.setLocation(100,100); 290 f.setLocationRelativeTo(pos.getEditor().getTargetPanel()); 291 } 292 }; 293 } 294 ////////////////////////////////////////////////////////////// 295 296 public CoordinateEdit() { 297 super(false, false); 298 } 299 300 @Override 301 public void windowClosed(WindowEvent e) { 302 super.windowClosed(e); 303 } 304 305 public void init(String title, Positionable pos, boolean showName) { 306 pl = pos; 307 if (showName) { 308 nameText.setText(MessageFormat.format(Bundle.getMessage("namelabel"), pos.getNameString())); 309 nameText.setVisible(true); 310 } 311 okButton.setText(Bundle.getMessage("ButtonOK")); 312 okButton.setVisible(true); 313 314 cancelButton.setText(Bundle.getMessage("ButtonCancel")); 315 cancelButton.setVisible(true); 316 317 Dimension dim = (new JButton("XXXXXXXX")).getPreferredSize(); 318 okButton.setMinimumSize(dim); 319 cancelButton.setMinimumSize(dim); 320 setTitle(title); 321 //setLocation(pl.getLocation()); 322 } 323 324 public void initSetXY() { 325 oldX = pl.getX(); 326 oldY = pl.getY(); 327 328 textX = new JLabel(); 329 textX.setText("X: " + pl.getX()); 330 textX.setVisible(true); 331 textY = new JLabel(); 332 textY.setText("Y: " + pl.getY()); 333 textY.setVisible(true); 334 335 SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 10000, 1); 336 ChangeListener listener = e -> { 337 int x = ((Number) spinX.getValue()).intValue(); 338 int y = ((Number) spinY.getValue()).intValue(); 339 pl.setLocation(x, y); 340 textX.setText("X: " + pl.getX()); 341 textY.setText("Y: " + pl.getY()); 342 }; 343 spinX = new JSpinner(model); 344 spinX.setValue(pl.getX()); 345 spinX.setToolTipText(Bundle.getMessage("EnterXcoord")); 346 spinX.setMaximumSize(new Dimension( 347 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 348 spinX.addChangeListener(listener); 349 model = new SpinnerNumberModel(0, 0, 10000, 1); 350 spinY = new JSpinner(model); 351 spinY.setValue(pl.getY()); 352 spinY.setToolTipText(Bundle.getMessage("EnterYcoord")); 353 spinY.setMaximumSize(new Dimension( 354 spinY.getMaximumSize().width, spinY.getPreferredSize().height)); 355 spinY.addChangeListener(listener); 356 357 getContentPane().setLayout(new GridBagLayout()); 358 359 addSpinItems(true); 360 361 okButton.addActionListener(e -> { 362 int x = ((Number) spinX.getValue()).intValue(); 363 int y = ((Number) spinY.getValue()).intValue(); 364 pl.setLocation(x, y); 365 textX.setText("X: " + pl.getX()); 366 textY.setText("Y: " + pl.getY()); 367 dispose(); 368 }); 369 okButton.getRootPane().setDefaultButton(okButton); 370 371 cancelButton.addActionListener(e -> { 372 pl.setLocation(oldX, oldY); 373 dispose(); 374 }); 375 // make large enough to easily move 376 setMinimumSize(new Dimension(250, 175)); 377 pack(); 378 } 379 380 public void initSetLevel() { 381 oldX = pl.getDisplayLevel(); 382 textX = new JLabel(); 383 textX.setText(Bundle.getMessage("Level") + ": " + pl.getDisplayLevel()); 384 textX.setVisible(true); 385 386 SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 10, 1); 387 spinX = new JSpinner(model); 388 spinX.setValue(pl.getDisplayLevel()); 389 spinX.setToolTipText(Bundle.getMessage("EnterLevel")); 390 spinX.setMaximumSize(new Dimension( 391 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 392 393 getContentPane().setLayout(new GridBagLayout()); 394 395 addSpinItems(false); 396 397 okButton.addActionListener(e -> { 398 int l = ((Number) spinX.getValue()).intValue(); 399 pl.getEditor().setSelectionsDisplayLevel(l, pl); 400 textX.setText(Bundle.getMessage("Level") + ": " + l); 401 dispose(); 402 }); 403 okButton.getRootPane().setDefaultButton(okButton); 404 cancelButton.addActionListener(e -> { 405 pl.getEditor().setSelectionsDisplayLevel(oldX, pl); 406 dispose(); 407 }); 408 setMinimumSize(new Dimension(250, 175)); 409 pack(); 410 } 411 412 public void initSetTip() { 413 oldStr = pl.getToolTip().getText(); 414 textX = new JLabel(); 415 textX.setText(Bundle.getMessage("TooltipLabel") + ": "); 416 textX.setVisible(true); 417 418 xTextField = new JTextField(15); 419 xTextField.setText(pl.getToolTip().getText()); 420 xTextField.setToolTipText(Bundle.getMessage("EnterTooltip")); 421// xTextField.setMaximumSize(new Dimension( 422// xTextField.getMaximumSize().width+100, xTextField.getPreferredSize().height)); 423 424 getContentPane().setLayout(new GridBagLayout()); 425 426 addTextItems(); 427 428 okButton.addActionListener(e -> { 429 pl.getToolTip().setText(xTextField.getText()); // is fetched from pane OK but not stored in icon pl 430 dispose(); 431 }); 432 okButton.getRootPane().setDefaultButton(okButton); 433 cancelButton.addActionListener(e -> { 434 pl.getToolTip().setText(oldStr); 435 dispose(); 436 }); 437 pack(); 438 } 439 440 public void initBorder() { 441 PositionablePopupUtil util = pl.getPopupUtility(); 442 oldX = util.getBorderSize(); 443 444 textX = new JLabel(); 445 textX.setText(Bundle.getMessage("Border") + ": " + util.getBorderSize()); 446 textX.setVisible(true); 447 448 SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 1000, 1); 449 spinX = new JSpinner(model); 450 spinX.setValue(util.getBorderSize()); 451 spinX.setToolTipText("Enter border size"); 452 spinX.setMaximumSize(new Dimension( 453 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 454 455 getContentPane().setLayout(new GridBagLayout()); 456 457 addSpinItems(false); 458 459 okButton.addActionListener(e -> { 460 int l = ((Number) spinX.getValue()).intValue(); 461 PositionablePopupUtil util1 = pl.getPopupUtility(); 462 util1.setBorderSize(l); 463 pl.getEditor().setAttributes(util1, pl); 464 textX.setText(Bundle.getMessage("Border") + ": " + l); 465 dispose(); 466 }); 467 okButton.getRootPane().setDefaultButton(okButton); 468 cancelButton.addActionListener(e -> { 469 pl.getPopupUtility().setBorderSize(oldX); 470 dispose(); 471 }); 472 pack(); 473 } 474 475 public void initMargin() { 476 PositionablePopupUtil util = pl.getPopupUtility(); 477 oldX = util.getMargin(); 478 479 textX = new JLabel(); 480 textX.setText(Bundle.getMessage("Margin") + ": " + util.getMargin()); 481 textX.setVisible(true); 482 483 SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 1000, 1); 484 spinX = new JSpinner(model); 485 spinX.setValue(util.getMargin()); 486 spinX.setToolTipText("Enter margin size"); 487 spinX.setMaximumSize(new Dimension( 488 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 489 490 getContentPane().setLayout(new GridBagLayout()); 491 492 addSpinItems(false); 493 494 okButton.addActionListener(e -> { 495 int l = ((Number) spinX.getValue()).intValue(); 496 PositionablePopupUtil util1 = pl.getPopupUtility(); 497 pl.getPopupUtility().setMargin(l); 498 pl.getEditor().setAttributes(util1, pl); 499 textX.setText(Bundle.getMessage("Margin") + ": " + l); 500 dispose(); 501 }); 502 okButton.getRootPane().setDefaultButton(okButton); 503 cancelButton.addActionListener(e -> { 504 pl.getPopupUtility().setMargin(oldX); 505 dispose(); 506 }); 507 pack(); 508 } 509 510 public void initFixedSize() { 511 PositionablePopupUtil util = pl.getPopupUtility(); 512 oldX = util.getFixedHeight(); 513 oldY = util.getFixedWidth(); 514 515 textX = new JLabel(); 516 textX.setText("Height = " + util.getFixedHeight()); 517 textX.setVisible(true); 518 textY = new JLabel(); 519 textY.setText("Width = " + util.getFixedWidth()); 520 textY.setVisible(true); 521 522 SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 1000, 1); 523 spinX = new JSpinner(model); 524 spinX.setValue(util.getFixedHeight()); 525 spinX.setToolTipText(Bundle.getMessage("FixedSizeHeight")); 526 spinX.setMaximumSize(new Dimension( 527 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 528 model = new SpinnerNumberModel(0, 0, 1000, 1); 529 spinY = new JSpinner(model); 530 spinY.setValue(util.getFixedWidth()); 531 spinY.setToolTipText(Bundle.getMessage("FixedSizeWidth")); 532 spinY.setMaximumSize(new Dimension( 533 spinY.getMaximumSize().width, spinY.getPreferredSize().height)); 534 535 getContentPane().setLayout(new GridBagLayout()); 536 537 addSpinItems(true); 538 539 okButton.addActionListener(e -> { 540 int height = ((Number) spinX.getValue()).intValue(); 541 int width = ((Number) spinY.getValue()).intValue(); 542 PositionablePopupUtil util1 = pl.getPopupUtility(); 543 util1.setFixedSize(width, height); 544 pl.getEditor().setAttributes(util1, pl); 545 textX.setText("Height: " + util1.getFixedHeight()); 546 textY.setText("Width: " + util1.getFixedWidth()); 547 dispose(); 548 }); 549 okButton.getRootPane().setDefaultButton(okButton); 550 cancelButton.addActionListener(e -> { 551 pl.getPopupUtility().setFixedSize(oldY, oldX); 552 dispose(); 553 }); 554 pack(); 555 } 556 557 public void initRotate() { 558 oldX = pl.getDegrees(); 559 560 textX = new JLabel(); 561 int deg = oldX; 562 textX.setText(MessageFormat.format(Bundle.getMessage("Angle"), deg)); 563 textX.setVisible(true); 564 565 SpinnerNumberModel model = new SpinnerNumberModel(0, -360, 360, 1); 566 spinX = new JSpinner(model); 567// spinX.setValue(Integer.valueOf(((NamedIcon)pLabel.getIcon()).getDegrees())); 568 spinX.setValue(deg); 569 spinX.setToolTipText(Bundle.getMessage("enterDegrees")); 570 spinX.setMaximumSize(new Dimension( 571 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 572 573 getContentPane().setLayout(new GridBagLayout()); 574 575 addSpinItems(false); 576 577 okButton.addActionListener(e -> { 578 int k = ((Number) spinX.getValue()).intValue(); 579 pl.getEditor().setSelectionsRotation(k, pl); 580 textX.setText(MessageFormat.format(Bundle.getMessage("Angle"), k)); 581 dispose(); 582 }); 583 okButton.getRootPane().setDefaultButton(okButton); 584 cancelButton.addActionListener(e -> dispose()); 585 pack(); 586 } 587 588 public void initScale() { 589 //int scale = (int)Math.round(pl.getScale()*100); 590 oldD = pl.getScale(); 591 log.debug("initScale oldD = {}", oldD); 592 log.trace(" pl = {}", pl); 593 textX = new JLabel(); 594 textX.setText(MessageFormat.format(Bundle.getMessage("Scale"), oldD * 100)); 595 textX.setVisible(true); 596 597 SpinnerNumberModel model = new SpinnerNumberModel(100.0d, 10.0d, 5000.0d, 1.0d); 598 spinX = new JSpinner(model); 599 log.debug("scale%= {}", (int) Math.round(oldD * 100)); 600 spinX.setValue((double) Math.round(oldD * 100)); 601 spinX.setToolTipText(Bundle.getMessage("enterScale")); 602 spinX.setMaximumSize(new Dimension( 603 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 604 605 getContentPane().setLayout(new GridBagLayout()); 606 607 addSpinItems(false); 608 609 okButton.addActionListener(e -> { 610 double s = ((Number) spinX.getValue()).doubleValue() / 100 * pl.getScale(); 611 pl.getEditor().setSelectionsScale(s, pl); 612 textX.setText(MessageFormat.format(Bundle.getMessage("Scale"), pl.getScale() * 100)); 613 dispose(); 614 }); 615 okButton.getRootPane().setDefaultButton(okButton); 616 cancelButton.addActionListener(e -> dispose()); 617 pack(); 618 } 619 620 public void initId(final Editor editor) { 621 oldStr = pl.getId(); 622 textX = new JLabel(); 623 textX.setText(Bundle.getMessage("EnterId") + ":"); 624 textX.setVisible(true); 625 626 xTextField = new JTextField(15); 627 xTextField.setText(pl.getId()); 628 xTextField.setToolTipText(Bundle.getMessage("TooltipEnterId")); 629 630 getContentPane().setLayout(new GridBagLayout()); 631 addTextItems(); 632 633 okButton.addActionListener(e -> { 634 String t = xTextField.getText(); 635 boolean hasText = (t != null && t.length() > 0); 636 if (hasText) { 637 try { 638 pl.setId(t); 639 pl.updateSize(); 640 dispose(); 641 } catch (Positionable.DuplicateIdException ignore) { 642 JmriJOptionPane.showMessageDialog(editor, 643 Bundle.getMessage("ErrorIdNotUnique"), 644 Bundle.getMessage("ErrorDialog"), 645 JmriJOptionPane.ERROR_MESSAGE); 646 } 647 } else { 648 try { 649 pl.setId(null); 650 pl.updateSize(); 651 dispose(); 652 } catch (Positionable.DuplicateIdException ex) { 653 // This should never happen 654 log.error("Positionable.setId(null) has thrown DuplicateIdException", ex); 655 } 656 } 657 }); 658 okButton.getRootPane().setDefaultButton(okButton); 659 cancelButton.addActionListener(e -> { 660 PositionableLabel pp = (PositionableLabel) pl; 661// pp.setId(oldStr); 662 pp.updateSize(); 663 dispose(); 664 }); 665 pack(); 666 } 667 668 public void initClasses(final Editor editor) { 669 PositionableLabel pLabel = (PositionableLabel) pl; 670 oldStr = String.join(",", pLabel.getClasses()); 671 textX = new JLabel(); 672 textX.setText(Bundle.getMessage("EnterClasses") + ":"); 673 textX.setVisible(true); 674 675 xTextField = new JTextField(15); 676 xTextField.setText(oldStr); 677 xTextField.setToolTipText(Bundle.getMessage("TooltipEnterClasses")); 678 679 getContentPane().setLayout(new GridBagLayout()); 680 addTextItems(); 681 682 okButton.addActionListener(e -> { 683 PositionableLabel pp = (PositionableLabel) pl; 684 pp.removeAllClasses(); 685 String t = xTextField.getText(); 686 if (t != null && t.length() > 0) { 687 for (String className : t.split(",")) { 688 if (!className.isBlank()) { 689 pp.addClass(className.trim()); 690 } 691 } 692 } 693 pp.updateSize(); 694 dispose(); 695 }); 696 okButton.getRootPane().setDefaultButton(okButton); 697 cancelButton.addActionListener(e -> { 698 PositionableLabel pp = (PositionableLabel) pl; 699 pp.updateSize(); 700 dispose(); 701 }); 702 pack(); 703 } 704 705 public void initText() { 706 PositionableLabel pLabel = (PositionableLabel) pl; 707 oldStr = pLabel.getUnRotatedText(); 708 textX = new JLabel(); 709 textX.setText(Bundle.getMessage("TextLabel") + ":"); 710 textX.setVisible(true); 711 712 xTextField = new JTextField(15); 713 xTextField.setText(pLabel.getUnRotatedText()); 714 xTextField.setToolTipText(Bundle.getMessage("TooltipEnterText")); 715 716 getContentPane().setLayout(new GridBagLayout()); 717 addTextItems(); 718 719 okButton.addActionListener(e -> { 720 PositionableLabel pp = (PositionableLabel) pl; 721 String t = xTextField.getText(); 722 boolean hasText = (t != null && t.length() > 0); 723 if (pp.isIcon() || hasText) { 724 pp._text = hasText; 725 if (pp instanceof SensorIcon) { 726 ((SensorIcon) pp).setOriginalText(t); 727 } 728 pp.setText(t); 729 pp.updateSize(); 730 dispose(); 731 } else { 732 xTextField.setText(Bundle.getMessage("warningNullText")); 733 } 734 }); 735 okButton.getRootPane().setDefaultButton(okButton); 736 cancelButton.addActionListener(e -> { 737 PositionableLabel pp = (PositionableLabel) pl; 738 pp.setText(oldStr); 739 pp.updateSize(); 740 dispose(); 741 }); 742 pack(); 743 } 744 745 public void initLink() { 746 LinkingObject pLabel = (LinkingObject) pl; 747 oldStr = pLabel.getURL(); 748 textX = new JLabel(); 749 textX.setText(Bundle.getMessage("LinkEqual")); 750 textX.setVisible(true); 751 752 xTextField = new JTextField(15); 753 xTextField.setText(pLabel.getURL()); 754 xTextField.setToolTipText(Bundle.getMessage("EnterLink")); 755 756 getContentPane().setLayout(new GridBagLayout()); 757 addTextItems(); 758 oldX = 0; // counter for warning 759 760 okButton.addActionListener(e -> { 761 LinkingObject pp = (LinkingObject) pl; 762 String t = xTextField.getText(); 763 boolean hasText = (t != null && t.length() > 0); 764 if (hasText || oldX > 0) { 765 pp.setULRL(t); 766 pp.updateSize(); 767 dispose(); 768 } else { 769 xTextField.setText("Link disappears with null text!"); 770 oldX++; 771 } 772 }); 773 okButton.getRootPane().setDefaultButton(okButton); 774 cancelButton.addActionListener(e -> { 775 LinkingObject pp = (LinkingObject) pl; 776 pp.setULRL(oldStr); 777 pp.updateSize(); 778 dispose(); 779 }); 780 pack(); 781 } 782 783 public void initZoom() { 784 oldD = pl.getScale(); 785 log.debug("initZoom oldD = {}", oldD); 786 log.trace(" pl = {}", pl); 787 788 textX = new JLabel(); 789 textX.setText(MessageFormat.format(Bundle.getMessage("Scale"), oldD * 100)); 790 textX.setVisible(true); 791 792 SpinnerNumberModel model = new SpinnerNumberModel(100.0, 1.0, 5000.0, 1.0); 793 spinX = new JSpinner(model); 794 if (log.isDebugEnabled()) { 795 log.debug("scale%= {}", (int) Math.round(oldD * 100)); 796 } 797 spinX.setToolTipText(Bundle.getMessage("enterZoom")); 798 spinX.setMaximumSize(new Dimension( 799 spinX.getMaximumSize().width, spinX.getPreferredSize().height)); 800 801 getContentPane().setLayout(new GridBagLayout()); 802 803 addSpinItems(false); 804 805 okButton.addActionListener(e -> { 806 double s = ((Number) spinX.getValue()).doubleValue() / 100; 807 pl.setScale(s); 808 pl.getEditor().setPaintScale(s); 809 textX.setText(MessageFormat.format(Bundle.getMessage("Scale"), pl.getScale() * 100)); 810 dispose(); 811 }); 812 okButton.getRootPane().setDefaultButton(okButton); 813 cancelButton.addActionListener(e -> dispose()); 814 pack(); 815 } 816 817 public void initSetName() { 818 oldStr = pl.getEditor().getName(); 819 820 textX = new JLabel(); 821 textX.setText(MessageFormat.format(Bundle.getMessage("namelabel"), oldStr)); 822 textX.setVisible(true); 823 824 xTextField = new JTextField(15); 825 xTextField.setText(oldStr); 826 xTextField.setToolTipText(Bundle.getMessage("PromptNewName")); 827// xTextField.setMaximumSize(new Dimension(1000, xTextField.getPreferredSize().height)); 828// xTextField.getMaximumSize().width+100, xTextField.getPreferredSize().height)); 829 830 getContentPane().setLayout(new GridBagLayout()); 831 832 addTextItems(); 833 834 okButton.addActionListener(e -> { 835 String t = xTextField.getText(); 836 Editor ed = pl.getEditor(); 837 ed.setName(t); 838 ed.setTitle(); 839 textX.setText(MessageFormat.format(Bundle.getMessage("namelabel"), t)); 840 dispose(); 841 }); 842 okButton.getRootPane().setDefaultButton(okButton); 843 cancelButton.addActionListener(e -> { 844 pl.getEditor().setName(oldStr); 845 dispose(); 846 }); 847 pack(); 848 } 849 850 protected void addSpinItems(boolean addY) { 851 addItem(nameText, 0, 0, 2, true); 852 addItem(textX, 0, 1, 1, true); 853 addItem(spinX, 1, 1, 1, false); 854 if (addY) { 855 addItem(textY, 0, 2, 1, true); 856 addItem(spinY, 1, 2, 1, false); 857 addItem(cancelButton, 0, 3, 1, false); 858 addItem(okButton, 1, 3, 1, false); 859 } else { 860 addItem(cancelButton, 0, 2, 1, false); 861 addItem(okButton, 1, 2, 1, false); 862 } 863 validate(); 864 } 865 866 private void addTextItems() { 867 addItem(nameText, 0, 0, 2, true); 868 addItem(textX, 0, 1, 1, true); 869 addItem(xTextField, 1, 1, 1, true); 870 addItem(cancelButton, 0, 2, 1, false); 871 addItem(okButton, 1, 2, 1, false); 872 validate(); 873 } 874 875 private void addItem(JComponent c, int x, int y, int w, boolean horzExpand) { 876 GridBagConstraints gc = new GridBagConstraints(); 877 gc.gridx = x; 878 gc.gridy = y; 879 gc.gridwidth = w; 880 gc.weightx = 100.0; 881 gc.weighty = 100.0; 882 gc.anchor = GridBagConstraints.CENTER; 883 if (horzExpand) { 884 gc.fill = GridBagConstraints.HORIZONTAL; // text field will expand 885 } 886 getContentPane().add(c, gc); 887 } 888 889 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CoordinateEdit.class); 890 891}