/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * 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.
 */

package com.android.ide.eclipse.ddms.views;

import com.android.ddmlib.Client;
import com.android.ddmlib.IDevice;
import com.android.ddmuilib.ImageLoader;
import com.android.ddmuilib.explorer.DeviceExplorer;
import com.android.ide.eclipse.ddms.CommonAction;
import com.android.ide.eclipse.ddms.DdmsPlugin;
import com.android.ide.eclipse.ddms.DdmsPlugin.ISelectionListener;
import com.android.ide.eclipse.ddms.i18n.Messages;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

public class FileExplorerView extends ViewPart implements ISelectionListener {

    public static final String ID = "com.android.ide.eclipse.ddms.views.FileExplorerView"; //$NON-NLS-1$

    private final static String COLUMN_NAME =
            DdmsPlugin.PLUGIN_ID + ".explorer.name"; //$NON-NLS-1S
    private final static String COLUMN_SIZE =
            DdmsPlugin.PLUGIN_ID + ".explorer.size"; //$NON-NLS-1S
    private final static String COLUMN_DATE =
            DdmsPlugin.PLUGIN_ID + ".explorer.data"; //$NON-NLS-1S
    private final static String COLUMN_TIME =
            DdmsPlugin.PLUGIN_ID + ".explorer.time"; //$NON-NLS-1S
    private final static String COLUMN_PERMISSIONS =
            DdmsPlugin.PLUGIN_ID + ".explorer.permissions"; //$NON-NLS-1S
    private final static String COLUMN_INFO =
            DdmsPlugin.PLUGIN_ID + ".explorer.info"; //$NON-NLS-1$

    private DeviceExplorer mExplorer;

    public FileExplorerView() {
    }

    @Override
    public void createPartControl(Composite parent) {
        ImageLoader loader = ImageLoader.getDdmUiLibLoader();

        DeviceExplorer.COLUMN_NAME = COLUMN_NAME;
        DeviceExplorer.COLUMN_SIZE = COLUMN_SIZE;
        DeviceExplorer.COLUMN_DATE = COLUMN_DATE;
        DeviceExplorer.COLUMN_TIME = COLUMN_TIME;
        DeviceExplorer.COLUMN_PERMISSIONS = COLUMN_PERMISSIONS;
        DeviceExplorer.COLUMN_INFO = COLUMN_INFO;

        // device explorer
        mExplorer = new DeviceExplorer();

        mExplorer.setCustomImages(
                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE),
                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER),
                null /* apk image */,
                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT)
                );

        // creates the actions
        CommonAction pushAction = new CommonAction(Messages.FileExplorerView_Push_File) {
            @Override
            public void run() {
                mExplorer.pushIntoSelection();
            }
        };
        pushAction.setToolTipText(Messages.FileExplorerView_Push_File_Onto_Device);
        pushAction.setImageDescriptor(loader.loadDescriptor("push.png")); //$NON-NLS-1$
        pushAction.setEnabled(false);

        CommonAction pullAction = new CommonAction(Messages.FileExplorerView_Pull_File) {
            @Override
            public void run() {
                mExplorer.pullSelection();
            }
        };
        pullAction.setToolTipText(Messages.FileExplorerView_Pull_File_From_File);
        pullAction.setImageDescriptor(loader.loadDescriptor("pull.png")); //$NON-NLS-1$
        pullAction.setEnabled(false);

        CommonAction deleteAction = new CommonAction(Messages.FileExplorerView_Delete) {
            @Override
            public void run() {
                mExplorer.deleteSelection();
            }
        };
        deleteAction.setToolTipText(Messages.FileExplorerView_Delete_The_Selection);
        deleteAction.setImageDescriptor(loader.loadDescriptor("delete.png")); //$NON-NLS-1$
        deleteAction.setEnabled(false);

        CommonAction createNewFolderAction = new CommonAction("New Folder") {
            @Override
            public void run() {
                mExplorer.createNewFolderInSelection();
            }
        };
        createNewFolderAction.setToolTipText("New Folder");
        createNewFolderAction.setImageDescriptor(loader.loadDescriptor("add.png")); //$NON-NLS-1$
        createNewFolderAction.setEnabled(false);

        // set up the actions in the explorer
        mExplorer.setActions(pushAction, pullAction, deleteAction, createNewFolderAction);

        // and in the ui
        IActionBars actionBars = getViewSite().getActionBars();
        IMenuManager menuManager = actionBars.getMenuManager();
        IToolBarManager toolBarManager = actionBars.getToolBarManager();

        menuManager.add(pullAction);
        menuManager.add(pushAction);
        menuManager.add(new Separator());
        menuManager.add(deleteAction);
        menuManager.add(new Separator());
        menuManager.add(createNewFolderAction);

        toolBarManager.add(pullAction);
        toolBarManager.add(pushAction);
        toolBarManager.add(new Separator());
        toolBarManager.add(deleteAction);
        toolBarManager.add(new Separator());
        toolBarManager.add(createNewFolderAction);

        mExplorer.createPanel(parent);

        DdmsPlugin.getDefault().addSelectionListener(this);
    }

    @Override
    public void setFocus() {
        mExplorer.setFocus();
    }

    /**
     * Sent when a new {@link Client} is selected.
     *
     * @param selectedClient The selected client.
     */
    @Override
    public void selectionChanged(Client selectedClient) {
        // pass
    }

    /**
     * Sent when a new {@link Device} is selected.
     *
     * @param selectedDevice the selected device.
     */
    @Override
    public void selectionChanged(IDevice selectedDevice) {
        mExplorer.switchDevice(selectedDevice);
    }

    /**
     * Sent when there is no current selection.
     */
    public void selectionRemoved() {

    }

}
