com.bdaum.zoom.ui.internal.dialogs.OutputTargetGroup.java Source code

Java tutorial

Introduction

Here is the source code for com.bdaum.zoom.ui.internal.dialogs.OutputTargetGroup.java

Source

/*
 * This file is part of the ZoRa project: http://www.photozora.org.
 *
 * ZoRa is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * ZoRa 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ZoRa; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * (c) 2009 Berthold Daum  
 */

package com.bdaum.zoom.ui.internal.dialogs;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;

import com.bdaum.zoom.cat.model.meta.Meta;
import com.bdaum.zoom.core.Constants;
import com.bdaum.zoom.core.Core;
import com.bdaum.zoom.net.core.ftp.FtpAccount;
import com.bdaum.zoom.ui.internal.UiUtilities;
import com.bdaum.zoom.ui.internal.widgets.CheckboxButton;
import com.bdaum.zoom.ui.internal.widgets.WidgetFactory;
import com.bdaum.zoom.ui.widgets.CGroup;

public class OutputTargetGroup {
    public static final String SUBFOLDER = "subfolder"; //$NON-NLS-1$
    public static final String SETTINGS = "settings"; //$NON-NLS-1$
    public static final String FTP = "ftp"; //$NON-NLS-1$
    public static final String FILE = "file"; //$NON-NLS-1$
    private static final String SELECTED_ACCOUNT = "selectedAccount"; //$NON-NLS-1$
    private static final String LOCAL_FOLDER = "localFolder"; //$NON-NLS-1$
    private static final String OUTPUT_TARGET = "outputTarget"; //$NON-NLS-1$
    private static final String LOCAL_FOLDERS = "localFolders"; //$NON-NLS-1$
    private static final String SUBFOLDERS = "subFolders"; //$NON-NLS-1$
    private static final String[] EMPTYITEMS = new String[0];
    private static final String OPTIONS = "options"; //$NON-NLS-1$
    private Combo folderField;
    private Button fileButton;
    private Button ftpButton;
    private ComboViewer ftpViewer;
    private List<FtpAccount> ftpAccounts;
    private Button editButton;
    private Button browseButton;
    private CGroup group;
    private ComboViewer subfolderViewer;
    private String subfolderoption;
    private CheckboxButton settingsOption;

    /**
     * @param parent
     *            - parent composite
     * @param gridData
     *            - layout data
     * @param listener
     *            - is informed about all changes except changes in the subfolder
     *            option
     * @param subfolders
     *            - true if the subfolder option shall be shown
     * @param ftp
     *            - true if FTP targets are supported
     * @param showSettingsOption
     *            - true if target specific options can be selected
     */
    @SuppressWarnings("unused")
    public OutputTargetGroup(final Composite parent, GridData gridData, final Listener listener, boolean subfolders,
            boolean ftp, boolean showSettingsOption) {
        ftpAccounts = FtpAccount.getAllAccounts();
        ftpAccounts.add(0, new FtpAccount());
        group = new CGroup(parent, SWT.NONE);
        group.setText(Messages.OutputTargetGroup_output_target);
        group.setLayoutData(gridData);
        group.setLayout(new GridLayout(ftp ? 4 : 3, false));
        if (ftp) {
            fileButton = new Button(group, SWT.RADIO);
            fileButton.addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    updateFields();
                    notifyListener(listener, event, FILE);
                    browseButton.setEnabled(true);
                }
            });
        }
        final Label folderLabel = new Label(group, SWT.NONE);
        folderLabel.setText(Messages.OutputTargetGroup_local_folder);
        folderField = new Combo(group, SWT.BORDER | SWT.READ_ONLY);
        GridData data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
        data.widthHint = 300;
        folderField.setLayoutData(data);
        if (listener != null)
            folderField.addListener(SWT.Modify, listener);
        browseButton = new Button(group, SWT.PUSH);
        browseButton.setText(Messages.WebGalleryEditDialog_browse);
        browseButton.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.OPEN);
                dialog.setText(Messages.OutputTargetGroup_output_folder);
                dialog.setMessage(Messages.OutputTargetGroup_select_output_folder);
                String path = folderField.getText();
                if (!path.isEmpty())
                    dialog.setFilterPath(path);
                String dir = dialog.open();
                if (dir != null) {
                    folderField.setItems(UiUtilities.addToHistoryList(folderField.getItems(), dir));
                    folderField.setText(dir);
                    notifyListener(listener, event, FILE);
                }
            }
        });
        if (ftp) {
            ftpButton = new Button(group, SWT.RADIO);
            ftpButton.addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    updateFields();
                    notifyListener(listener, event, FTP);
                    browseButton.setEnabled(false);
                }
            });
            final Label ftpLabel = new Label(group, SWT.NONE);
            ftpLabel.setText(Messages.OutputTargetGroup_ftp_directory);
            ftpViewer = new ComboViewer(group, SWT.BORDER | SWT.READ_ONLY);
            ftpViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
            ftpViewer.setContentProvider(ArrayContentProvider.getInstance());
            ftpViewer.setLabelProvider(new LabelProvider() {
                @Override
                public String getText(Object element) {
                    if (element instanceof FtpAccount) {
                        String name = ((FtpAccount) element).getName();
                        return name == null ? Messages.OutputTargetGroup_create_new_account : name;
                    }
                    return super.getText(element);
                }
            });
            editButton = new Button(group, SWT.PUSH);
            editButton.setText(Messages.OutputTargetGroup_edit);
            editButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    Object el = ftpViewer.getStructuredSelection().getFirstElement();
                    if (el instanceof FtpAccount) {
                        FtpAccount account = (FtpAccount) el;
                        boolean createNew = account.getName() == null;
                        EditFtpDialog dialog = new EditFtpDialog(editButton.getShell(), account, false, null);
                        if (dialog.open() == Window.OK) {
                            FtpAccount result = dialog.getResult();
                            if (createNew) {
                                ftpAccounts.add(0, new FtpAccount());
                                ftpViewer.setInput(ftpAccounts);
                                ftpViewer.setSelection(new StructuredSelection(result));
                            } else
                                ftpViewer.update(result, null);
                            FtpAccount.saveAccounts(ftpAccounts);
                        }
                    }
                }
            });
            ftpViewer.setInput(ftpAccounts);
            if (ftpAccounts.size() == 1)
                ftpViewer.setSelection(new StructuredSelection(ftpAccounts.get(0)));
            ftpViewer.getCombo().addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    updateFields();
                    notifyListener(listener, event, FTP);
                }
            });
        }
        if (subfolders) {
            Meta meta = Core.getCore().getDbManager().getMeta(true);
            String timelinemode = meta.getTimeline();
            final String[] subfolderoptions = Meta.timeline_no.equals(timelinemode)
                    ? new String[] { Constants.BY_NONE, Constants.BY_RATING, Constants.BY_CATEGORY,
                            Constants.BY_STATE, Constants.BY_JOB, Constants.BY_EVENT, Constants.BY_DATE,
                            Constants.BY_TIME }
                    : new String[] { Constants.BY_NONE, Constants.BY_TIMELINE, Constants.BY_NUM_TIMELINE,
                            Constants.BY_RATING, Constants.BY_CATEGORY, Constants.BY_STATE, Constants.BY_JOB,
                            Constants.BY_EVENT, Constants.BY_DATE, Constants.BY_TIME };
            final String[] OPTIONLABELS = Meta.timeline_no.equals(timelinemode)
                    ? new String[] { Messages.OutputTargetGroup_none, Messages.OutputTargetGroup_rating,
                            Messages.OutputTargetGroup_category, Messages.OutputTargetGroup_state,
                            Messages.OutputTargetGroup_job_id, Messages.OutputTargetGroup_event,
                            Messages.OutputTargetGroup_export_date, Messages.OutputTargetGroup_export_time }
                    : new String[] { Messages.OutputTargetGroup_none, Messages.OutputTargetGroup_timeline,
                            Messages.OutputTargetGroup_timeline_num, Messages.OutputTargetGroup_rating,
                            Messages.OutputTargetGroup_category, Messages.OutputTargetGroup_state,
                            Messages.OutputTargetGroup_job_id, Messages.OutputTargetGroup_event,
                            Messages.OutputTargetGroup_export_date, Messages.OutputTargetGroup_export_time };
            new Label(group, SWT.NONE);
            new Label(group, SWT.NONE).setText(Messages.OutputTargetGroup_group_by);
            subfolderViewer = new ComboViewer(group);
            subfolderViewer.setContentProvider(ArrayContentProvider.getInstance());
            subfolderViewer.setLabelProvider(new LabelProvider() {
                @Override
                public String getText(Object element) {
                    for (int i = 0; i < subfolderoptions.length; i++)
                        if (subfolderoptions[i].equals(element))
                            return OPTIONLABELS[i];
                    return super.getText(element);
                }
            });
            subfolderViewer.getCombo().addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    subfolderoption = ((String) subfolderViewer.getStructuredSelection().getFirstElement());
                    notifyListener(listener, event, SUBFOLDER);
                }
            });
            subfolderViewer.setInput(subfolderoptions);
        }
        if (showSettingsOption) {
            settingsOption = WidgetFactory.createCheckButton(group, Messages.OutputTargetGroup_target_specific,
                    null, Messages.OutputTargetGroup_target_specific_tooltip);
            settingsOption.addListener(new Listener() {
                @Override
                public void handleEvent(Event event) {
                    notifyListener(listener, event, SETTINGS);
                }
            });
        }
    }

    public IDialogSettings getTargetSection(IDialogSettings settings, boolean save) {
        if (getSettingsOption()) {
            String key;
            if (getTarget() == Constants.FTP) {
                FtpAccount ftpDir = getFtpDir();
                key = ftpDir == null ? null : ftpDir.getUrl();
            } else
                key = getLocalFolder();
            if (key != null) {
                IDialogSettings section = settings.getSection(key);
                if (section == null && save)
                    section = settings.addNewSection(key);
                return section;
            }
        }
        return null;
    }

    protected void updateFields() {
        boolean ftp = ftpButton != null && ftpButton.getSelection();
        folderField.setEnabled(!ftp);
        browseButton.setEnabled(!ftp);
        if (ftpViewer != null) {
            ftpViewer.getControl().setEnabled(ftp);
            editButton.setEnabled(ftp && !ftpViewer.getSelection().isEmpty());
        }
        if (ftp)
            ftpViewer.getControl().setFocus();
        else
            folderField.setFocus();
    }

    public void setLocalFolder(String outputFolder) {
        if (outputFolder != null) {
            folderField.setItems(UiUtilities.addToHistoryList(folderField.getItems(), outputFolder));
            folderField.setText(outputFolder);
        }
    }

    public void setFtpDir(String ftpDir) {
        if (ftpDir != null && ftpViewer != null)
            for (FtpAccount acc : ftpAccounts)
                if (ftpDir.equals(acc.getName())) {
                    ftpViewer.setSelection(new StructuredSelection(acc));
                    break;
                }
    }

    public void setTarget(int target) {
        if (target == Constants.FTP) {
            if (ftpButton != null)
                ftpButton.setSelection(true);
            browseButton.setEnabled(false);
        } else {
            if (fileButton != null)
                fileButton.setSelection(true);
            browseButton.setEnabled(true);
        }
        updateFields();
    }

    public String validate() {
        if (ftpButton != null && ftpButton.getSelection()) {
            FtpAccount acc = (FtpAccount) ftpViewer.getStructuredSelection().getFirstElement();
            if (acc == null || acc.getName() == null)
                return Messages.OutputTargetGroup_select_ftp_dir;
        } else {
            String folder = folderField.getText();
            if (folder.isEmpty())
                return Messages.OutputTargetGroup_select_target_folder;
            if (!new File(folder).exists())
                return Messages.OutputTargetGroup_selected_folder_does_not_exist;
        }
        return null;
    }

    public String getLocalFolder() {
        return folderField.getText();
    }

    public int getTarget() {
        return (ftpButton != null && ftpButton.getSelection()) ? Constants.FTP : Constants.FILE;
    }

    public FtpAccount getFtpDir() {
        return ftpViewer == null ? null : (FtpAccount) ftpViewer.getStructuredSelection().getFirstElement();
    }

    public boolean getSettingsOption() {
        return settingsOption == null ? false : settingsOption.getSelection();
    }

    public void initValues(IDialogSettings settings) {
        try {
            setTarget(settings.getInt(OUTPUT_TARGET));
        } catch (NumberFormatException e) {
            setTarget(Constants.FILE);
        }
        String[] localFolders = settings.getArray(LOCAL_FOLDERS);
        if (localFolders != null) {
            List<String> validItems = new ArrayList<String>(localFolders.length);
            for (String folder : localFolders)
                if (new File(folder).exists())
                    validItems.add(folder);
            folderField.setItems(validItems.toArray(new String[validItems.size()]));
            String s = settings.get(LOCAL_FOLDER);
            if (s != null)
                for (int i = 0; i < localFolders.length; i++)
                    if (s.equals(localFolders[i])) {
                        folderField.select(i);
                        folderField.setText(s);
                        break;
                    }
        } else
            folderField.setItems(EMPTYITEMS);
        String ftp = settings.get(SELECTED_ACCOUNT);
        if (ftp != null && ftpViewer != null)
            for (FtpAccount acc : ftpAccounts)
                if (ftp.equals(acc.getName())) {
                    ftpViewer.setSelection(new StructuredSelection(acc));
                    break;
                }
        if (settingsOption != null)
            settingsOption.setSelection(settings.getBoolean(OPTIONS));
        updateSubfolderOption(settings);
        updateFields();
    }

    public void updateSubfolderOption(IDialogSettings settings) {
        if (subfolderViewer != null) {
            String option = settings.get(SUBFOLDERS);
            subfolderViewer.setSelection(
                    new StructuredSelection(subfolderoption = (option != null ? option : Constants.BY_NONE)));
        }
    }

    public void saveValues(IDialogSettings settings) {
        settings.put(OUTPUT_TARGET, getTarget());
        String text = folderField.getText();
        settings.put(LOCAL_FOLDERS, folderField.getItems());
        settings.put(LOCAL_FOLDER, text);
        Object firstElement = ftpViewer.getStructuredSelection().getFirstElement();
        if (firstElement instanceof FtpAccount)
            settings.put(SELECTED_ACCOUNT, ((FtpAccount) firstElement).getName());
        if (subfolderoption != null)
            settings.put(SUBFOLDERS, subfolderoption);
        if (settingsOption != null)
            settings.put(OPTIONS, settingsOption.getSelection());
    }

    private static void notifyListener(final Listener listener, Event event, Object data) {
        if (listener != null) {
            event.data = data;
            listener.handleEvent(event);
        }
    }

    /**
     * @return subfolderoption
     */
    public String getSubfolderoption() {
        return subfolderoption;
    }

}