content: /*****************************************************************
   *   Licensed to the Apache Software Foundation (ASF) under one
   *  or more contributor license agreements.  See the NOTICE file
   *  distributed with this work for additional information
   *  regarding copyright ownership.  The ASF licenses this file
   *  to you 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
   *
   *    https://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.
   ****************************************************************/
  
  package org.apache.cayenne.modeler.dialog.pref;
  
  import java.awt.Component;
  import java.util.Map;
  
  import javax.swing.JOptionPane;
  
  import org.apache.cayenne.modeler.pref.DBConnectionInfo;
  import org.apache.cayenne.modeler.util.CayenneController;
  import org.apache.cayenne.swing.BindingBuilder;
  
  /**
   */
  public class DataSourceDuplicator extends CayenneController {
  
      protected DataSourceDuplicatorView view;
      protected boolean canceled;
      protected Map dataSources;
      protected String prototypeKey;
  
      public DataSourceDuplicator(DataSourcePreferences parent, String prototypeKey) {
          super(parent);
          this.view = new DataSourceDuplicatorView("Create a copy of \""
                  + prototypeKey
                  + "\"");
          this.dataSources = parent.getDataSources();
          this.prototypeKey = prototypeKey;
  
          String suggestion = prototypeKey + "0";
          for (int i = 1; i <= dataSources.size(); i++) {
              suggestion = prototypeKey + i;
              if (!dataSources.containsKey(suggestion)) {
                  break;
              }
          }
  
          this.view.getDataSourceName().setText(suggestion);
          initBindings();
      }
  
      public Component getView() {
          return view;
      }
  
      protected void initBindings() {
          BindingBuilder builder = new BindingBuilder(
                  getApplication().getBindingFactory(),
                  this);
          builder.bindToAction(view.getCancelButton(), "cancelAction()");
          builder.bindToAction(view.getOkButton(), "okAction()");
      }
  
      public void okAction() {
          if (getName() == null) {
              JOptionPane.showMessageDialog(
                      view,
                      "Enter DataSource Name",
                      null,
                      JOptionPane.WARNING_MESSAGE);
          }
          else if (dataSources.containsKey(getName())) {
              JOptionPane.showMessageDialog(
                      view,
                      "'" + getName() + "' is already in use, enter a different name",
                      null,
                      JOptionPane.WARNING_MESSAGE);
          }
          else {
              canceled = false;
              view.dispose();
          }
      }
  
      public void cancelAction() {
          canceled = true;
          view.dispose();
      }
  
      /**
       * Pops up a dialog and blocks current thread until the dialog is closed.
       */
      public DBConnectionInfo startupAction() {
          // this should handle closing via ESC
          canceled = true;
  
          view.setModal(true);
          view.pack();
          view.setResizable(false);
          makeCloseableOnEscape();
          centerView();
  
          view.setVisible(true);
          return createDataSource();
      }
  
      public String getName() {
          String name = view.getDataSourceName().getText();
          return (name.length() > 0) ? name : null;
      }
  
      protected DBConnectionInfo createDataSource() {
          if (canceled) {
              return null;
          }
  
          DBConnectionInfo prototype = (DBConnectionInfo) dataSources.get(prototypeKey);
          DBConnectionInfo dataSource = (DBConnectionInfo) getApplication()
                  .getCayenneProjectPreferences()
                  .getDetailObject(DBConnectionInfo.class)
                  .create(getName());
  
          prototype.copyTo(dataSource);
          return dataSource;
      }
  
  }
  