Project: milton
/*
* 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 
* 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. 
*/
 
/*
 * BradsWebdavClientView.java 
 */
 
package bradswebdavclient; 
 
import java.awt.event.MouseEvent; 
import org.jdesktop.application.Action; 
import org.jdesktop.application.ResourceMap; 
import org.jdesktop.application.SingleFrameApplication; 
import org.jdesktop.application.FrameView; 
import org.jdesktop.application.TaskMonitor; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseListener; 
import javax.swing.Timer; 
import javax.swing.Icon; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTree; 
import javax.swing.tree.TreePath; 
 
/**
 * The application's main frame. 
 */
 
public class BradsWebdavClientView extends FrameView { 
 
    public BradsWebdavClientView( SingleFrameApplication app ) { 
        super( app ); 
 
        initComponents(); 
 
        // status bar initialization - message timeout, idle icon and busy animation, etc 
        ResourceMap resourceMap = getResourceMap(); 
        int messageTimeout = resourceMap.getInteger( "StatusBar.messageTimeout" ); 
        messageTimer = new Timer( messageTimeout, new ActionListener() { 
 
            public void actionPerformed( ActionEvent e ) { 
                statusMessageLabel.setText( "" ); 
            } 
        } ); 
        messageTimer.setRepeats( false ); 
        int busyAnimationRate = resourceMap.getInteger( "StatusBar.busyAnimationRate" ); 
        forint i = 0; i < busyIcons.length; i++ ) { 
            busyIcons[i] = resourceMap.getIcon( "StatusBar.busyIcons[" + i + "]" ); 
        } 
        busyIconTimer = new Timer( busyAnimationRate, new ActionListener() { 
 
            public void actionPerformed( ActionEvent e ) { 
                busyIconIndex = ( busyIconIndex + 1 ) % busyIcons.length; 
                statusAnimationLabel.setIcon( busyIcons[busyIconIndex] ); 
            } 
        } ); 
        idleIcon = resourceMap.getIcon( "StatusBar.idleIcon" ); 
        statusAnimationLabel.setIcon( idleIcon ); 
        progressBar.setVisible( false ); 
 
        // connecting action tasks to status bar via TaskMonitor 
        TaskMonitor taskMonitor = new TaskMonitor( getApplication().getContext() ); 
        taskMonitor.addPropertyChangeListener( new java.beans.PropertyChangeListener() { 
 
            public void propertyChange( java.beans.PropertyChangeEvent evt ) { 
                String propertyName = evt.getPropertyName(); 
                if"started".equals( propertyName ) ) { 
                    if( !busyIconTimer.isRunning() ) { 
                        statusAnimationLabel.setIcon( busyIcons[0] ); 
                        busyIconIndex = 0
                        busyIconTimer.start(); 
                    } 
                    progressBar.setVisible( true ); 
                    progressBar.setIndeterminate( true ); 
                } else if"done".equals( propertyName ) ) { 
                    busyIconTimer.stop(); 
                    statusAnimationLabel.setIcon( idleIcon ); 
                    progressBar.setVisible( false ); 
                    progressBar.setValue( 0 ); 
                } else if"message".equals( propertyName ) ) { 
                    String text = (String) ( evt.getNewValue() ); 
                    statusMessageLabel.setText( ( text == null ) ? "" : text ); 
                    messageTimer.restart(); 
                } else if"progress".equals( propertyName ) ) { 
                    int value = (Integer) ( evt.getNewValue() ); 
                    progressBar.setVisible( true ); 
                    progressBar.setIndeterminate( false ); 
                    progressBar.setValue( value ); 
                } 
            } 
        } ); 
 
        initTree(); 
 
 
    } 
 
    @Action 
    public void showAboutBox() { 
        if( aboutBox == null ) { 
            JFrame mainFrame = BradsWebdavClientApp.getApplication().getMainFrame(); 
            aboutBox = new BradsWebdavClientAboutBox( mainFrame ); 
            aboutBox.setLocationRelativeTo( mainFrame ); 
        } 
        BradsWebdavClientApp.getApplication().show( aboutBox ); 
    } 
 
    void status( String msg ) { 
        this.statusMessageLabel.setText( msg ); 
    } 
 
    private void gotoHref( String s ) { 
        ResourceTreeModel model = (ResourceTreeModel) this.tree().getModel(); 
        model.select( s ); 
    } 
 
    /** This method is called from within the constructor to
     * initialize the form. 
     * WARNING: Do NOT modify this code. The content of this method is 
     * always regenerated by the Form Editor. 
     */
 
  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents 
  private void initComponents() { 
    java.awt.GridBagConstraints gridBagConstraints; 
 
    mainPanel = new javax.swing.JPanel(); 
    jSplitPane1 = new javax.swing.JSplitPane(); 
    jScrollPane1 = new javax.swing.JScrollPane(); 
    tree = new javax.swing.JTree(); 
    details = new javax.swing.JPanel(); 
    addressBar = new javax.swing.JPanel(); 
    addressText = new javax.swing.JTextField(); 
    menuBar = new javax.swing.JMenuBar(); 
    javax.swing.JMenu fileMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); 
    javax.swing.JMenu helpMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); 
    bookmarksMenu = new javax.swing.JMenu(); 
    bookmarkThisMenuItem = new javax.swing.JMenuItem(); 
    jSeparator1 = new javax.swing.JSeparator(); 
    statusPanel = new javax.swing.JPanel(); 
    javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator(); 
    statusMessageLabel = new javax.swing.JLabel(); 
    statusAnimationLabel = new javax.swing.JLabel(); 
    progressBar = new javax.swing.JProgressBar(); 
    popupMenu = new javax.swing.JPopupMenu(); 
 
    mainPanel.setName("mainPanel"); // NOI18N 
    mainPanel.setLayout(new java.awt.GridBagLayout()); 
 
    jSplitPane1.setDividerLocation(250); 
    jSplitPane1.setMinimumSize(new java.awt.Dimension(300200)); 
    jSplitPane1.setName("jSplitPane1"); // NOI18N 
    jSplitPane1.setPreferredSize(new java.awt.Dimension(400300)); 
 
    jScrollPane1.setName("jScrollPane1"); // NOI18N 
 
    tree.setEditable(true); 
    tree.setName("tree"); // NOI18N 
    tree.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
        treeMouseClicked(evt); 
      } 
    }); 
    tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { 
      public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { 
        treeValueChanged(evt); 
      } 
    }); 
    tree.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseDragged(java.awt.event.MouseEvent evt) { 
        treeMouseDragged(evt); 
      } 
    }); 
    tree.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyReleased(java.awt.event.KeyEvent evt) { 
        treeKeyReleased(evt); 
      } 
    }); 
    jScrollPane1.setViewportView(tree); 
 
    jSplitPane1.setLeftComponent(jScrollPane1); 
 
    details.setAlignmentY(0.0F); 
    details.setName("details"); // NOI18N 
    details.setLayout(new javax.swing.BoxLayout(details, javax.swing.BoxLayout.Y_AXIS)); 
    jSplitPane1.setRightComponent(details); 
 
    gridBagConstraints = new java.awt.GridBagConstraints(); 
    gridBagConstraints.gridx = 0
    gridBagConstraints.gridy = 1
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
    gridBagConstraints.weightx = 1.0
    gridBagConstraints.weighty = 1.0
    mainPanel.add(jSplitPane1, gridBagConstraints); 
 
    addressBar.setMaximumSize(new java.awt.Dimension(3276720)); 
    addressBar.setMinimumSize(new java.awt.Dimension(020)); 
    addressBar.setName("addressBar"); // NOI18N 
    addressBar.setPreferredSize(new java.awt.Dimension(10020)); 
    addressBar.setLayout(new java.awt.BorderLayout()); 
 
    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(bradswebdavclient.BradsWebdavClientApp.class).getContext().getResourceMap(BradsWebdavClientView.class); 
    addressText.setText(resourceMap.getString("addressText.text")); // NOI18N 
    addressText.setName("addressText"); // NOI18N 
    addressText.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
        addressTextKeyTyped(evt); 
      } 
    }); 
    addressBar.add(addressText, java.awt.BorderLayout.CENTER); 
 
    gridBagConstraints = new java.awt.GridBagConstraints(); 
    gridBagConstraints.gridx = 0
    gridBagConstraints.gridy = 0
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 
    gridBagConstraints.weightx = 1.0
    mainPanel.add(addressBar, gridBagConstraints); 
 
    menuBar.setName("menuBar"); // NOI18N 
 
    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N 
    fileMenu.setName("fileMenu"); // NOI18N 
 
    javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(bradswebdavclient.BradsWebdavClientApp.class).getContext().getActionMap(BradsWebdavClientView.classthis); 
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N 
    exitMenuItem.setName("exitMenuItem"); // NOI18N 
    fileMenu.add(exitMenuItem); 
 
    menuBar.add(fileMenu); 
 
    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N 
    helpMenu.setName("helpMenu"); // NOI18N 
 
    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N 
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N 
    helpMenu.add(aboutMenuItem); 
 
    menuBar.add(helpMenu); 
 
    bookmarksMenu.setText(resourceMap.getString("bookmarksMenu.text")); // NOI18N 
    bookmarksMenu.setName("bookmarksMenu"); // NOI18N 
 
    bookmarkThisMenuItem.setText(resourceMap.getString("bookmarkThisMenuItem.text")); // NOI18N 
    bookmarkThisMenuItem.setName("bookmarkThisMenuItem"); // NOI18N 
    bookmarkThisMenuItem.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
        bookmarkThisMenuItemMouseClicked(evt); 
      } 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
        bookmarkThisMenuItemMousePressed(evt); 
      } 
    }); 
    bookmarksMenu.add(bookmarkThisMenuItem); 
 
    jSeparator1.setName("jSeparator1"); // NOI18N 
    bookmarksMenu.add(jSeparator1); 
 
    menuBar.add(bookmarksMenu); 
 
    statusPanel.setName("statusPanel"); // NOI18N 
 
    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N 
 
    statusMessageLabel.setName("statusMessageLabel"); // NOI18N 
 
    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N 
 
    progressBar.setValue(50); 
    progressBar.setName("progressBar"); // NOI18N 
    progressBar.setStringPainted(true); 
 
    org.jdesktop.layout.GroupLayout statusPanelLayout = new org.jdesktop.layout.GroupLayout(statusPanel); 
    statusPanel.setLayout(statusPanelLayout); 
    statusPanelLayout.setHorizontalGroup( 
      statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 663, Short.MAX_VALUE) 
      .add(statusPanelLayout.createSequentialGroup() 
        .addContainerGap() 
        .add(statusMessageLabel) 
        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 479, Short.MAX_VALUE) 
        .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 
        .add(statusAnimationLabel) 
        .addContainerGap()) 
    ); 
    statusPanelLayout.setVerticalGroup( 
      statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(statusPanelLayout.createSequentialGroup() 
        .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 
          .add(statusMessageLabel) 
          .add(statusAnimationLabel) 
          .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) 
        .add(333)) 
    ); 
 
    popupMenu.setName("popupMenu"); // NOI18N 
 
    setComponent(mainPanel); 
    setMenuBar(menuBar); 
    setStatusBar(statusPanel); 
  }// </editor-fold>//GEN-END:initComponents 
  private void treeMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_treeMouseDragged 
  }//GEN-LAST:event_treeMouseDragged 
 
  private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeValueChanged 
  }//GEN-LAST:event_treeValueChanged 
 
  private void treeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_treeMouseClicked 
      final int clicks = evt.getClickCount(); 
      TreePath tp = tree.getSelectionPath(); 
      if( tp != null ) { 
          if( clicks == 1 ) { 
              selectNode( tp ); 
          } else if( clicks == 2 ) { 
              selectNode( tp ); 
          } 
      } 
  }//GEN-LAST:event_treeMouseClicked 
 
  private void addressTextKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_addressTextKeyTyped 
      System.out.println( "key text: " + (int) evt.getKeyChar() ); 
      if( (int) evt.getKeyChar() == 10 ) { 
          String s = addressText.getText(); 
          gotoHref( s ); 
      } 
  }//GEN-LAST:event_addressTextKeyTyped 
 
  private void treeKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_treeKeyReleased 
      if( !ResourceUtils.isDeleteKey( evt.getKeyChar() ) ) return
 
      TreePath tp = tree.getSelectionPath(); 
      AbstractTreeNode tn = (AbstractTreeNode) tp.getLastPathComponent(); 
      if( tn == null ) return
      if( tn instanceof DeletableNode ) { 
          ( (DeletableNode) tn ).delete(); 
      } 
  }//GEN-LAST:event_treeKeyReleased 
 
  private void bookmarkThisMenuItemMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_bookmarkThisMenuItemMouseClicked 
      System.out.println( "bookmarkThisMenuItemMouseClicked" ); 
 
}//GEN-LAST:event_bookmarkThisMenuItemMouseClicked 
 
  private void bookmarkThisMenuItemMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_bookmarkThisMenuItemMousePressed 
      System.out.println( "mouse pressed" ); 
      if( currentDetails == null ) return
      if( currentDetails instanceof Addressable ) { 
          System.out.println( "  is add" ); 
          Addressable add = (Addressable) currentDetails; 
          String href = add.getHref(); 
          JMenuItem item = new JMenuItem( href ); 
          item.addMouseListener( new BookmarkListener( href ) ); 
          bookmarksMenu.add( item ); 
          System.out.println( "  done" ); 
      } 
  }//GEN-LAST:event_bookmarkThisMenuItemMousePressed 
 
    private void selectNode( TreePath tp ) { 
        AbstractTreeNode tn = (AbstractTreeNode) tp.getLastPathComponent(); 
        JPanel selectedDetails = tn.createDetails(); 
        if( selectedDetails != null ) { 
            showDetails( selectedDetails ); 
        } 
    } 
 
    public void showDetails( JPanel panel ) { 
        if( currentDetails != null ) { 
            if( currentDetails instanceof Unloadable ) { 
                ( (Unloadable) currentDetails ).unload(); 
            } 
        } 
        details.removeAll(); 
        details.add( new JPanel() ); 
        details.validate(); 
 
        if( panel != null ) { 
            if( panel instanceof Addressable ) { 
                Addressable add = (Addressable) panel; 
                addressText.setText( add.getHref() ); 
            } 
            details.add( panel ); 
            panel.setVisible( true ); 
            details.validate(); 
            currentDetails = panel; 
        } 
    } 
 
    private void initTree() { 
        ResourceTreeModel model = ResourceTreeModel.create( this ); 
        tree.setModel( model ); 
        tree.setCellRenderer( new MyCellRenderer() ); 
 
        tree.addMouseListener( new MouseListener() { 
 
            public void mouseClicked( MouseEvent e ) { 
                checkPopup( e ); 
            } 
 
            public void mousePressed( MouseEvent e ) { 
                checkPopup( e ); 
            } 
 
            public void mouseReleased( MouseEvent e ) { 
                checkPopup( e ); 
            } 
 
            public void mouseEntered( MouseEvent e ) { 
            } 
 
            public void mouseExited( MouseEvent e ) { 
            } 
 
            void checkPopup( MouseEvent e ) { 
                if( e.isPopupTrigger() ) { 
                    JTree tree = (JTree) e.getSource(); 
                    int row = tree.getRowForLocation( e.getX(), e.getY() ); 
                    TreePath path = tree.getPathForLocation( e.getX(), e.getY() ); 
                    if( path != null ) { 
                        AbstractTreeNode node = (AbstractTreeNode) path.getLastPathComponent(); 
                        if( node != null ) { 
                            node.updatePopupMenu( popupMenu ); 
                            popupMenu.show( tree, e.getX(), e.getY() ); 
                        } 
                    } 
                } 
            } 
        } ); 
 
        treeHandler = new TreeResourceTransferHandler( tree ); 
    } 
 
    JTree tree() { 
        return tree; 
    } 
 
    class BookmarkListener implements MouseListener { 
 
        final String href; 
 
        public BookmarkListener( String href ) { 
            this.href = href; 
        } 
 
        public void mouseClicked( MouseEvent e ) { 
        } 
 
        public void mousePressed( MouseEvent e ) { 
            gotoHref( href ); 
        } 
 
        public void mouseReleased( MouseEvent e ) { 
        } 
 
        public void mouseEntered( MouseEvent e ) { 
        } 
 
        public void mouseExited( MouseEvent e ) { 
        } 
    } 
  // Variables declaration - do not modify//GEN-BEGIN:variables 
  private javax.swing.JPanel addressBar; 
  private javax.swing.JTextField addressText; 
  private javax.swing.JMenuItem bookmarkThisMenuItem; 
  private javax.swing.JMenu bookmarksMenu; 
  private javax.swing.JPanel details; 
  private javax.swing.JScrollPane jScrollPane1; 
  private javax.swing.JSeparator jSeparator1; 
  private javax.swing.JSplitPane jSplitPane1; 
  private javax.swing.JPanel mainPanel; 
  private javax.swing.JMenuBar menuBar; 
  private javax.swing.JPopupMenu popupMenu; 
  private javax.swing.JProgressBar progressBar; 
  private javax.swing.JLabel statusAnimationLabel; 
  private javax.swing.JLabel statusMessageLabel; 
  private javax.swing.JPanel statusPanel; 
  private javax.swing.JTree tree; 
  // End of variables declaration//GEN-END:variables 
    private final Timer messageTimer; 
    private final Timer busyIconTimer; 
    private final Icon idleIcon; 
    private final Icon[] busyIcons = new Icon[15]; 
    private int busyIconIndex = 0
    private JDialog aboutBox; 
    private JPanel currentDetails; 
    TreeResourceTransferHandler treeHandler; 
}