/******************************************************************************* * Mission Control Technologies, Copyright (c) 2009-2012, United States Government * as represented by the Administrator of the National Aeronautics and Space * Administration. All rights reserved. * * The MCT platform is licensed under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * MCT includes source code licensed under additional open source licenses. See * the MCT Open Source Licenses file included with this distribution or the About * MCT Licenses dialog available at runtime from the MCT Help menu for additional * information. *******************************************************************************/ package gov.nasa.arc.mct.graphics.component; import gov.nasa.arc.mct.components.AbstractComponent; import gov.nasa.arc.mct.services.component.ComponentRegistry; import gov.nasa.arc.mct.services.component.CreateWizardUI; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.net.URI; import java.util.ResourceBundle; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.filechooser.FileFilter; public class GraphicalComponentWizardUI extends CreateWizardUI { private static ResourceBundle bundle = ResourceBundle.getBundle("GraphicsResourceBundle"); private String componentName; private URI graphicURI; private FileFilter filter = new GraphicalFileFilter(); private boolean updateFromFile(File f, JButton create) { boolean valid = f.exists() && filter.accept(f); if (valid) { componentName = f.getName(); graphicURI = f.toURI(); } create.setEnabled(valid); return valid; } @Override public JComponent getUI(final JButton create) { create.setEnabled(false); JPanel panel = new JPanel(); panel.setLayout(new GridBagLayout()); JLabel label = new JLabel(); label.setText(bundle.getString("Filename_Label")); final JTextField fileField = new JTextField(); fileField.setText(""); fileField.setColumns(60); fileField.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent arg0) { } @Override public void keyReleased(KeyEvent arg0) { File f = new File(fileField.getText()); updateFromFile(f, create); } @Override public void keyTyped(KeyEvent arg0) { File f = new File(fileField.getText()); updateFromFile(f, create); } }); final JButton button = new JButton(); button.setText(bundle.getString("Chooser_Button")); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser chooser = new JFileChooser(); chooser.addChoosableFileFilter(filter); if (chooser.showOpenDialog(button) == JFileChooser.APPROVE_OPTION) { updateFromFile(chooser.getSelectedFile(), create); fileField.setText(chooser.getSelectedFile().getAbsolutePath()); } } }); create.addFocusListener( new FocusListener() { @Override public void focusGained(FocusEvent arg0) { File f = new File(fileField.getText()); updateFromFile(f, create); } @Override public void focusLost(FocusEvent arg0) { } }); JLabel warning = new JLabel(bundle.getString("Wizard_Warning")); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.weightx = 0.01; c.fill = GridBagConstraints.HORIZONTAL; c.insets = new Insets(15, 12, 12, 0); panel.add(label, c); c.gridx = 1; c.gridy = 0; c.weightx = 0.99; c.fill = GridBagConstraints.HORIZONTAL; c.insets = new Insets(15, 5, 12, 5); panel.add(fileField, c); c.gridx = 2; c.gridy = 0; c.weightx = 0.01; c.insets = new Insets(12, 0, 12, 11); panel.add(button, c); c.gridx = 1; c.gridy = 1; c.gridwidth = 1; c.weightx = 1.0; c.insets = new Insets(0, 5, 17, 0); panel.add(warning, c); return panel; } @Override public AbstractComponent createComp(ComponentRegistry registry, AbstractComponent parentComp) { GraphicalComponent graphicalComponent = registry.newInstance(GraphicalComponent.class, parentComp); graphicalComponent.setDisplayName(componentName); GraphicalModel model = graphicalComponent.getModelRole(); model.setGraphicURI(graphicURI.toString()); graphicalComponent.save(); return graphicalComponent; } private class GraphicalFileFilter extends FileFilter { @Override public boolean accept(File f) { if (f.isDirectory()) return true; boolean valid = false; for (String suffix : ImageIO.getReaderFileSuffixes()) { valid |= f.getName().toLowerCase().endsWith("." + suffix.toLowerCase()); } valid |= f.getName().toLowerCase().endsWith(".svg"); // We also support SVG return valid; } @Override public String getDescription() { return bundle.getString("Wizard_Filter_Description"); } } }