com.siteview.mde.internal.ui.nls.InternationalizeWizardLocalePage.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.nls.InternationalizeWizardLocalePage.java

Source

/*******************************************************************************
 * Copyright (c) 2008 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package com.siteview.mde.internal.ui.nls;

import java.util.*;
import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.osgi.util.NLS;
import com.siteview.mde.core.IModelProviderEvent;
import com.siteview.mde.core.IModelProviderListener;
import com.siteview.mde.internal.core.MDECore;
import com.siteview.mde.internal.ui.MDEPlugin;
import com.siteview.mde.internal.ui.MDEUIMessages;
import com.siteview.mde.internal.ui.elements.DefaultContentProvider;
import com.siteview.mde.internal.ui.util.SWTUtil;
import com.siteview.mde.internal.ui.wizards.ListUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.progress.WorkbenchJob;

public class InternationalizeWizardLocalePage extends InternationalizationWizardPage
        implements IModelProviderListener {

    public static final String PAGE_NAME = "InternationalizeWizardLocalePage"; //$NON-NLS-1$

    protected Locale[] fModels = new Locale[0];
    private String fLocation;

    protected TableViewer fSelectedListViewer;
    private boolean fRefreshNeeded = true;

    private Label fCountLabel;
    private TableViewer fAvailableListViewer;

    // this job is used to delay the full filter refresh for 200 milliseconds in case the user is still typing
    private WorkbenchJob fFilterJob;
    private Text fFilterText;
    private AvailableFilter fFilter;

    // fSelected is used to track the selection in a HashMap so we can efficiently
    // filter selected items out of the available item list
    private HashMap fSelected;
    // used to block the selection listeners from updating button enablement when programatically removing items
    private boolean fBlockSelectionListeners;
    private Button fAddButton;
    private Button fAddAllButton;
    private Button fRemoveButton;
    private Button fRemoveAllButton;

    private InternationalizeModelTable fInternationalizeModelTable;

    private ILabelProvider fLabelProvider = MDEPlugin.getDefault().getLabelProvider();

    private class ContentProvider extends DefaultContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object inputElement) {
            return ((InternationalizeModelTable) inputElement).getModels();
        }
    }

    public InternationalizeWizardLocalePage(InternationalizeModelTable modelTable, String pageName) {
        super(pageName);
        setTitle(MDEUIMessages.InternationalizeWizard_LocalePage_pageTitle);
        setDescription(MDEUIMessages.InternationalizeWizard_LocalePage_pageDescription);

        MDEPlugin.getDefault().getLabelProvider().connect(this);
        MDECore.getDefault().getModelManager().getExternalModelManager().addModelProviderListener(this);

        fInternationalizeModelTable = modelTable;
        fSelected = new HashMap();

        IWizardContainer container = getContainer();
        if (container != null)
            container.updateButtons();
    }

    private void addFilter() {
        fFilter = new AvailableFilter(fSelected, fLabelProvider);
        fAvailableListViewer.addFilter(fFilter);
        fFilterJob = new WorkbenchJob("FilterJob") { //$NON-NLS-1$
            public IStatus runInUIThread(IProgressMonitor monitor) {
                handleFilter();
                return Status.OK_STATUS;
            }
        };
        fFilterJob.setSystem(true);
    }

    private void handleFilter() {
        boolean changed = false;
        String newFilter;
        if (fFilterText == null || (newFilter = fFilterText.getText().trim()).length() == 0)
            newFilter = AvailableFilter.WILDCARD;
        changed = fFilter.setPattern(newFilter);
        if (changed) {
            fAvailableListViewer.getTable().setRedraw(false);
            fAvailableListViewer.refresh();
            fAvailableListViewer.getTable().setRedraw(true);
            updateButtonEnablement(false, false);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.makeColumnsEqualWidth = false;
        layout.horizontalSpacing = 5;
        layout.verticalSpacing = 20;
        container.setLayout(layout);

        createScrollArea(container);
        createAvailableList(container).setLayoutData(new GridData(GridData.FILL_BOTH));
        createButtonArea(container);
        createLocaleList(container).setLayoutData(new GridData(GridData.FILL_BOTH));
        updateCount();

        addViewerListeners();
        addFilter();

        initialize();
        setControl(container);
        Dialog.applyDialogFont(container);
    }

    protected Composite createLocaleList(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        Label label = new Label(container, SWT.NONE);
        label.setText(MDEUIMessages.InternationalizeWizard_LocalePage_internationalizeList);

        Table table = new Table(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 225;
        table.setLayoutData(gd);

        fSelectedListViewer = new TableViewer(table);
        fSelectedListViewer.setLabelProvider(fLabelProvider);
        fSelectedListViewer.setContentProvider(new ContentProvider());
        fSelectedListViewer.setComparator(ListUtil.NAME_COMPARATOR);
        return container;
    }

    protected boolean isRefreshNeeded() {
        if (fRefreshNeeded) {
            fRefreshNeeded = false;
            return true;
        }
        if (fLocation == null) {
            return true;
        }
        return false;
    }

    protected void addLocale(Locale model, ArrayList selected) {
        if (!selected.contains(model)) {
            selected.add(model);
        }
    }

    public List getLocalesForInternationalization() {
        TableItem[] items = fSelectedListViewer.getTable().getItems();
        List result = new ArrayList();
        for (int i = 0; i < items.length; i++) {
            result.add(items[i].getData());
        }
        return result;
    }

    public void storeSettings() {
        // TODO
    }

    /* (non-Javadoc)
     * @see org.eclipse.pde.core.IModelProviderListener#modelsChanged(org.eclipse.pde.core.IModelProviderEvent)
     */
    public void modelsChanged(IModelProviderEvent event) {
        fRefreshNeeded = true;
    }

    private void initialize() {
        updateButtonEnablement(true, true);
        setPageComplete(false);
    }

    private void addViewerListeners() {
        fAvailableListViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                handleAdd();
            }
        });

        fSelectedListViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                handleRemove();
            }
        });

        fAvailableListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (!fBlockSelectionListeners)
                    updateSelectionBasedEnablement(event.getSelection(), true);
            }
        });

        fSelectedListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (!fBlockSelectionListeners)
                    updateSelectionBasedEnablement(event.getSelection(), false);
            }
        });

        fFilterText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                fFilterJob.cancel();
                fFilterJob.schedule(200);
            }
        });

    }

    private Composite createAvailableList(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        container.setLayout(layout);
        container.setLayoutData(new GridData());

        Label label = new Label(container, SWT.NONE);
        label.setText(MDEUIMessages.InternationalizeWizard_LocalePage_availableList);

        Table table = new Table(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 225;
        gd.heightHint = 400;
        table.setLayoutData(gd);

        fAvailableListViewer = new TableViewer(table);
        fAvailableListViewer.setLabelProvider(fLabelProvider);
        fAvailableListViewer.setContentProvider(new ContentProvider());
        fAvailableListViewer.setInput(fInternationalizeModelTable);
        fAvailableListViewer.setComparator(ListUtil.NAME_COMPARATOR);

        return container;
    }

    private Composite createButtonArea(Composite parent) {
        ScrolledComposite comp = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
        GridLayout layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;
        comp.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        Composite container = new Composite(comp, SWT.NONE);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginTop = 50;
        container.setLayout(layout);
        GridData gd = new GridData(GridData.FILL_VERTICAL);
        gd.verticalIndent = 15;
        container.setLayoutData(gd);

        fAddButton = new Button(container, SWT.PUSH);
        fAddButton.setText(MDEUIMessages.ImportWizard_DetailedPage_add);
        fAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fAddButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleAdd();
            }
        });
        SWTUtil.setButtonDimensionHint(fAddButton);

        fAddAllButton = new Button(container, SWT.PUSH);
        fAddAllButton.setText(MDEUIMessages.ImportWizard_DetailedPage_addAll);
        fAddAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fAddAllButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleAddAll();
            }
        });
        SWTUtil.setButtonDimensionHint(fAddAllButton);

        fRemoveButton = new Button(container, SWT.PUSH);
        fRemoveButton.setText(MDEUIMessages.ImportWizard_DetailedPage_remove);
        fRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fRemoveButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleRemove();
            }
        });
        SWTUtil.setButtonDimensionHint(fRemoveButton);

        fRemoveAllButton = new Button(container, SWT.PUSH);
        fRemoveAllButton.setText(MDEUIMessages.ImportWizard_DetailedPage_removeAll);
        fRemoveAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fRemoveAllButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleRemoveAll();
            }
        });
        SWTUtil.setButtonDimensionHint(fRemoveAllButton);

        fCountLabel = new Label(container, SWT.NONE);
        fCountLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
        comp.setContent(container);
        comp.setMinHeight(250);
        comp.setExpandHorizontal(true);
        comp.setExpandVertical(true);
        return container;
    }

    private Composite createScrollArea(Composite parent) {
        Group container = createFilterContainer(parent, MDEUIMessages.InternationalizeWizard_LocalePage_filter,
                MDEUIMessages.ImportWizard_DetailedPage_search);
        fFilterText = createFilterText(container, ""); //$NON-NLS-1$
        return container;
    }

    protected void refreshPage() {
        fSelectedListViewer.getTable().removeAll();
        fSelected = new HashMap();
        fAvailableListViewer.refresh();
        pageChanged();
    }

    protected void pageChanged() {
        pageChanged(false, false);
    }

    protected void pageChanged(boolean doAddEnablement, boolean doRemoveEnablement) {
        if (fSelectedListViewer.getTable().getItemCount() == 0) {
            setErrorMessage(MDEUIMessages.InternationalizeWizard_LocalePage_selectionError);
        } else {
            setErrorMessage(null);
        }

        updateCount();
        updateButtonEnablement(doAddEnablement, doRemoveEnablement);
        setPageComplete(fSelectedListViewer.getTable().getItemCount() > 0);
    }

    private void updateCount() {
        fCountLabel.setText(NLS.bind(MDEUIMessages.ImportWizard_DetailedPage_count,
                (new String[] { new Integer(fSelectedListViewer.getTable().getItemCount()).toString(),
                        new Integer(fAvailableListViewer.getTable().getItemCount()
                                + fSelectedListViewer.getTable().getItemCount()).toString() })));
        fCountLabel.getParent().layout();
    }

    private void updateButtonEnablement(boolean doAddEnablement, boolean doRemoveEnablement) {
        int availableCount = fAvailableListViewer.getTable().getItemCount();
        int importCount = fSelectedListViewer.getTable().getItemCount();

        if (doAddEnablement)
            updateSelectionBasedEnablement(fAvailableListViewer.getSelection(), true);
        if (doRemoveEnablement)
            updateSelectionBasedEnablement(fSelectedListViewer.getSelection(), false);

        fAddAllButton.setEnabled(availableCount > 0);
        fRemoveAllButton.setEnabled(importCount > 0);
    }

    private void updateSelectionBasedEnablement(ISelection theSelection, boolean available) {
        if (available)
            fAddButton.setEnabled(!theSelection.isEmpty());
        else
            fRemoveButton.setEnabled(!theSelection.isEmpty());
    }

    private void handleAdd() {
        IStructuredSelection ssel = (IStructuredSelection) fAvailableListViewer.getSelection();
        if (ssel.size() > 0) {
            Table table = fAvailableListViewer.getTable();
            int index = table.getSelectionIndices()[0];
            Object[] selection = ssel.toArray();
            setBlockSelectionListeners(true);
            setRedraw(false);
            for (int i = 0; i < selection.length; i++) {
                doAdd(selection[i]);
            }
            setRedraw(true);
            setBlockSelectionListeners(false);
            table.setSelection(index < table.getItemCount() ? index : table.getItemCount() - 1);
            pageChanged(true, false);
        }
    }

    private void handleAddAll() {
        TableItem[] items = fAvailableListViewer.getTable().getItems();

        ArrayList data = new ArrayList();
        for (int i = 0; i < items.length; i++) {
            data.add(items[i].getData());
        }
        if (data.size() > 0) {
            Object[] datas = data.toArray();
            setBlockSelectionListeners(true);
            setRedraw(false);
            for (int i = 0; i < datas.length; i++) {
                doAdd(datas[i]);
            }
            setRedraw(true);
            setBlockSelectionListeners(false);
            pageChanged(true, false);
        }
    }

    private void handleRemove() {
        IStructuredSelection ssel = (IStructuredSelection) fSelectedListViewer.getSelection();
        if (ssel.size() > 0) {
            Table table = fSelectedListViewer.getTable();
            int index = table.getSelectionIndices()[0];
            Object[] selection = ssel.toArray();
            setBlockSelectionListeners(true);
            setRedraw(false);
            for (int i = 0; i < selection.length; i++) {
                doRemove(selection[i]);
            }
            setRedraw(true);
            setBlockSelectionListeners(false);
            table.setSelection(index < table.getItemCount() ? index : table.getItemCount() - 1);
            pageChanged(false, true);
        }
    }

    private void doAdd(Object o) {
        fInternationalizeModelTable.removeModel(o);
        fSelectedListViewer.add(o);
        fAvailableListViewer.remove(o);
        fSelected.put(o, null);
    }

    private void doRemove(Object o) {
        fInternationalizeModelTable.addModel(o);
        fSelected.remove(o);
        fSelectedListViewer.remove(o);
        fAvailableListViewer.add(o);
    }

    // used to prevent flicker during operations that move items between lists
    private void setRedraw(boolean redraw) {
        fAvailableListViewer.getTable().setRedraw(redraw);
        fSelectedListViewer.getTable().setRedraw(redraw);
    }

    private void handleRemoveAll() {
        TableItem[] items = fSelectedListViewer.getTable().getItems();

        ArrayList data = new ArrayList();
        for (int i = 0; i < items.length; i++) {
            data.add(items[i].getData());
        }
        if (data.size() > 0) {
            Object[] datas = data.toArray();
            setBlockSelectionListeners(true);
            setRedraw(false);
            for (int i = 0; i < datas.length; i++) {
                doRemove(datas[i]);
            }
            setRedraw(true);
            setBlockSelectionListeners(false);
            pageChanged(false, true);
        }
    }

    public void dispose() {
        MDEPlugin.getDefault().getLabelProvider().disconnect(this);
        MDECore.getDefault().getModelManager().getExternalModelManager().removeModelProviderListener(this);
    }

    private void setBlockSelectionListeners(boolean blockSelectionListeners) {
        fBlockSelectionListeners = blockSelectionListeners;
    }

    public boolean isCurrentPage() {
        return super.isCurrentPage();
    }

    public boolean canFlipToNextPage() {
        return false;
    }
}