Package com.cubusmail.gwtui.client.panels

Source Code of com.cubusmail.gwtui.client.panels.MailfolderPanel$MailTreePanelListener

/* MailfolderPanel.java

   Copyright (c) 2009 Juergen Schlierf, All Rights Reserved
  
   This file is part of Cubusmail (http://code.google.com/p/cubusmail/).
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 3 of the License, or (at your option) any later version.
 
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
 
   You should have received a copy of the GNU Lesser General Public
   License along with Cubusmail. If not, see <http://www.gnu.org/licenses/>.
  
*/
package com.cubusmail.gwtui.client.panels;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.menu.Menu;
import com.gwtext.client.widgets.menu.MenuItem;
import com.gwtext.client.widgets.tree.TreeNode;
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;

import com.cubusmail.gwtui.client.actions.ActionRegistry;
import com.cubusmail.gwtui.client.actions.GWTFolderAction;
import com.cubusmail.gwtui.client.events.EventBroker;
import com.cubusmail.gwtui.client.events.FoldersReloadListener;
import com.cubusmail.gwtui.client.events.MessagesChangedListener;
import com.cubusmail.gwtui.client.exceptions.GWTExceptionHandler;
import com.cubusmail.gwtui.client.model.GWTMailFolder;
import com.cubusmail.gwtui.client.model.IGWTFolder;
import com.cubusmail.gwtui.client.services.GWTSessionManager;
import com.cubusmail.gwtui.client.services.ServiceProvider;
import com.cubusmail.gwtui.client.util.TextProvider;
import com.cubusmail.gwtui.client.util.UIFactory;

/**
* Panel for mail folder.
*
* @author Juergen Schlierf
*/
public class MailfolderPanel extends Panel implements AsyncCallback<GWTMailFolder[]>, FoldersReloadListener,
    MessagesChangedListener {

  private MailFolderTreePanel treePanel;
  private TreeNode currentTreeNode;

  // Toolbar items
  private ToolbarButton refreshFolderButton;
  private ToolbarButton newFolderButton;
  private ToolbarButton moveFolderButton;
  private ToolbarButton renameFolderButton;
  private ToolbarButton deleteFolderButton;
  private ToolbarButton emptyFolderButton;

  // Context menu items
  private MenuItem newFolderItem;
  private MenuItem moveFolderItem;
  private MenuItem renameFolderItem;
  private MenuItem deleteFolderItem;
  private MenuItem emptyFolderItem;

  // context menu
  private Menu contextMenu;

  /**
   *
   */
  public MailfolderPanel() {

    super();

    setBorder( false );
    setTitle( TextProvider.get().common_mailbox() );
    setLayout( new FitLayout() );
    setCollapsible( true );
    setIconCls( "mailfolder-icon" );

    this.treePanel = new MailFolderTreePanel();
    this.treePanel.addListener( new MailTreePanelListener() );
    add( this.treePanel );

    createActions();
    createToolbar();
    createContextMenu();

    addListener( new PanelListenerAdapter() {

      @Override
      public void onExpand( Panel panel ) {

        ListDetailsPanel listDetailsPanel = (ListDetailsPanel) PanelRegistry.LIST_DETAILS_PANEL.get();
        listDetailsPanel.setMessagesPanelActive();
      }
    } );

    EventBroker.get().addFoldersReloadListener( this );
    EventBroker.get().addMessagesChangedListener( this );
  }

  @Override
  protected void afterRender() {

    super.afterRender();

    EventBroker.get().fireFoldersReload();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.cubusmail.gwtui.client.events.FolderChangedListener#onFolderChanged()
   */
  public void onFoldersReload() {

    PanelRegistry.LEFT_PANEL.mask();
    this.currentTreeNode = null;
    changeToolbarButtonStatus( null );
    ServiceProvider.getMailboxService().retrieveFolderTree( this );
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.cubusmail.gwtui.client.events.MessagesChangedListener#onMessagesChanged
   * ()
   */
  public void onMessagesChanged() {

    if ( this.currentTreeNode != null ) {
      final TreeNode selectedNode = this.currentTreeNode;
      ServiceProvider.getMailboxService().getFormattedMessageCount(
          ((GWTMailFolder) selectedNode.getUserObject()).getId(), new AsyncCallback<String>() {

            public void onFailure( Throwable caught ) {

              GWTExceptionHandler.handleException( caught );
            }

            public void onSuccess( String result ) {

              selectedNode.setText( result );
            }

          } );
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.google.gwt.user.client.rpc.AsyncCallback#onFailure(java.lang.Throwable
   * )
   */
  public void onFailure( Throwable caught ) {

    PanelRegistry.LEFT_PANEL.unmask();
    GWTExceptionHandler.handleException( caught );
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.google.gwt.user.client.rpc.AsyncCallback#onSuccess(java.lang.Object)
   */
  public void onSuccess( GWTMailFolder[] result ) {

    PanelRegistry.LEFT_PANEL.unmask();
    GWTSessionManager.get().getMailbox().setMailFolders( result );
    if ( result != null ) {
      this.treePanel.buildTree( GWTSessionManager.get().getMailbox() );
      this.currentTreeNode = this.treePanel.getInboxTreeNode();
      GWTSessionManager.get().setCurrentMailFolder( (GWTMailFolder) this.currentTreeNode.getUserObject() );
      EventBroker.get().fireFolderSelected( (GWTMailFolder) this.currentTreeNode.getUserObject() );
      EventBroker.get().fireMessagesChanged();
    }
  }

  /**
   * Add a new folder
   *
   * @param newMailFolder
   */
  public void appenChild( GWTMailFolder newMailFolder ) {

    if ( this.currentTreeNode != null ) {
      this.treePanel.appenChild( this.currentTreeNode, newMailFolder );
    }
  }

  private void createActions() {

    this.treePanel.addListener( ((GWTFolderAction) ActionRegistry.NEW_FOLDER.get()).getTreePanelListener() );
    this.treePanel.addListener( ((GWTFolderAction) ActionRegistry.MOVE_FOLDER.get()).getTreePanelListener() );
    this.treePanel.addListener( ((GWTFolderAction) ActionRegistry.RENAME_FOLDER.get()).getTreePanelListener() );
    this.treePanel.addListener( ((GWTFolderAction) ActionRegistry.DELETE_FOLDER.get()).getTreePanelListener() );
    this.treePanel.addListener( ((GWTFolderAction) ActionRegistry.EMPTY_FOLDER.get()).getTreePanelListener() );
    this.treePanel.addListener( new MailDragAndDropListener() );
  }

  /**
   * create all toolbar buttons.
   */
  private void createToolbar() {

    Toolbar toolbar = new Toolbar();
    toolbar.addFill();
    this.refreshFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.REFRESH_FOLDER.get() );
    toolbar.addButton( this.refreshFolderButton );

    this.newFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.NEW_FOLDER.get() );
    toolbar.addButton( this.newFolderButton );

    this.moveFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.MOVE_FOLDER.get() );
    toolbar.addButton( this.moveFolderButton );

    this.renameFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.RENAME_FOLDER.get() );
    toolbar.addButton( this.renameFolderButton );

    this.deleteFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.DELETE_FOLDER.get() );
    toolbar.addButton( this.deleteFolderButton );

    this.emptyFolderButton = UIFactory.createToolbarImageButton( ActionRegistry.EMPTY_FOLDER.get() );
    toolbar.addButton( this.emptyFolderButton );

    setTopToolbar( toolbar );
  }

  /**
   * create all context menu items
   */
  private void createContextMenu() {

    this.contextMenu = new Menu();

    this.newFolderItem = UIFactory.createMenuItem( ActionRegistry.NEW_FOLDER.get() );
    this.contextMenu.addItem( this.newFolderItem );

    this.moveFolderItem = UIFactory.createMenuItem( ActionRegistry.MOVE_FOLDER.get() );
    this.contextMenu.addItem( this.moveFolderItem );

    this.renameFolderItem = UIFactory.createMenuItem( ActionRegistry.RENAME_FOLDER.get() );
    this.contextMenu.addItem( this.renameFolderItem );

    this.deleteFolderItem = UIFactory.createMenuItem( ActionRegistry.DELETE_FOLDER.get() );
    this.contextMenu.addItem( deleteFolderItem );

    this.emptyFolderItem = UIFactory.createMenuItem( ActionRegistry.EMPTY_FOLDER.get() );
    this.contextMenu.addItem( this.emptyFolderItem );
  }

  /**
   * Disable or enable toolbar buttons. If mailfolder is null all buttons get
   * disabled.
   */
  private void changeToolbarButtonStatus( IGWTFolder mailFolder ) {

    this.newFolderButton.setDisabled( mailFolder != null ? !mailFolder.isCreateSubfolderSupported() : true );
    this.moveFolderButton.setDisabled( mailFolder != null ? !mailFolder.isMoveSupported() : true );
    this.renameFolderButton.setDisabled( mailFolder != null ? !mailFolder.isRenameSupported() : true );
    this.deleteFolderButton.setDisabled( mailFolder != null ? !mailFolder.isDeleteSupported() : true );
    this.emptyFolderButton.setDisabled( mailFolder != null ? !mailFolder.isEmptySupported() : true );
  }

  /**
   * Disable or enable context menu items. If mailfolder is null all buttons
   * get disabled.
   */
  private void changeContextMenuStatus( IGWTFolder mailFolder ) {

    this.newFolderItem.setDisabled( mailFolder != null ? !mailFolder.isCreateSubfolderSupported() : true );
    this.moveFolderItem.setDisabled( mailFolder != null ? !mailFolder.isMoveSupported() : true );
    this.renameFolderItem.setDisabled( mailFolder != null ? !mailFolder.isRenameSupported() : true );
    this.deleteFolderItem.setDisabled( mailFolder != null ? !mailFolder.isDeleteSupported() : true );
    this.emptyFolderItem.setDisabled( mailFolder != null ? !mailFolder.isEmptySupported() : true );
  }

  /**
   * @return
   */
  public TreeNode getCurrentTreeNode() {

    return this.currentTreeNode;
  }

  /**
   *
   * @author Juergen Schlierf
   */
  private class MailTreePanelListener extends TreePanelListenerAdapter {

    /*
     * (non-Javadoc)
     *
     * @see
     * com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter#onClick
     * (com.gwtext.client.widgets.tree.TreeNode,
     * com.gwtext.client.core.EventObject)
     */
    public void onClick( TreeNode node, EventObject e ) {

      IGWTFolder mailFolder = (IGWTFolder) node.getUserObject();
      if ( !node.equals( currentTreeNode ) ) {
        currentTreeNode = node;
        changeToolbarButtonStatus( mailFolder );
        if ( mailFolder instanceof GWTMailFolder ) {
          GWTSessionManager.get().setCurrentMailFolder( (GWTMailFolder) mailFolder );
          EventBroker.get().fireFolderSelected( (GWTMailFolder) mailFolder );
        }
      }
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.gwtext.client.widgets.tree.event.TreePanelListenerAdapter#
     * onContextMenu(com.gwtext.client.widgets.tree.TreeNode,
     * com.gwtext.client.core.EventObject)
     */
    public void onContextMenu( TreeNode node, EventObject e ) {

      IGWTFolder mailFolder = (IGWTFolder) node.getUserObject();
      changeContextMenuStatus( mailFolder );

      contextMenu.showAt( e.getXY() );
    }
  }
}
TOP

Related Classes of com.cubusmail.gwtui.client.panels.MailfolderPanel$MailTreePanelListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.