com.microsoft.tfs.client.common.ui.dialogs.vc.SetEncodingDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.dialogs.vc.SetEncodingDialog.java

Source

// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See License.txt in the repository root.

package com.microsoft.tfs.client.common.ui.dialogs.vc;

import java.text.Collator;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Shell;

import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.framework.dialog.BaseDialog;
import com.microsoft.tfs.client.common.ui.framework.helper.ButtonHelper;
import com.microsoft.tfs.client.common.ui.framework.layout.GridDataBuilder;
import com.microsoft.tfs.core.clients.versioncontrol.path.LocalPath;
import com.microsoft.tfs.core.clients.versioncontrol.path.ServerPath;
import com.microsoft.tfs.core.util.CodePageMapping;
import com.microsoft.tfs.core.util.FileEncoding;
import com.microsoft.tfs.core.util.FileEncodingDetector;
import com.microsoft.tfs.util.Check;
import com.microsoft.tfs.util.CollatorFactory;

public class SetEncodingDialog extends BaseDialog {
    private static final FileEncoding[] suggestedEncodings = new FileEncoding[] { FileEncoding.BINARY,
            FileEncoding.UTF_8, FileEncoding.UTF_16 };

    private FileEncoding[] encodings;

    private final String localPath;
    private final FileEncoding originalEncoding;
    private FileEncoding encoding;

    private Combo encodingCombo;
    private Button detectButton;

    public SetEncodingDialog(final Shell parent, final String localPath, final FileEncoding encoding) {
        super(parent);

        Check.notNull(localPath, "localPath"); //$NON-NLS-1$

        this.localPath = localPath;
        originalEncoding = encoding;
    }

    private String getFileName() {
        String fileName;

        if (ServerPath.isServerPath(localPath)) {
            fileName = ServerPath.getFileName(localPath);
        } else {
            fileName = LocalPath.getFileName(localPath);
        }

        return fileName;
    }

    @Override
    protected String provideDialogTitle() {
        final String messageFormat = Messages.getString("SetEncodingDialog.DialogTitleFormat"); //$NON-NLS-1$
        return MessageFormat.format(messageFormat, getFileName());
    }

    @Override
    protected void hookAddToDialogArea(final Composite dialogArea) {
        final GridLayout layout = new GridLayout(3, false);
        layout.marginWidth = getHorizontalMargin();
        layout.marginHeight = getVerticalMargin();
        layout.horizontalSpacing = getHorizontalSpacing();
        layout.verticalSpacing = getVerticalSpacing();
        dialogArea.setLayout(layout);

        final String messageFormat = Messages.getString("SetEncodingDialog.ExplainLabelTextFormat"); //$NON-NLS-1$
        final String message = MessageFormat.format(messageFormat, getFileName());

        final Label explanationLabel = new Label(dialogArea, SWT.NONE);
        explanationLabel.setText(message);
        GridDataBuilder.newInstance().hGrab().hFill().hSpan(3).applyTo(explanationLabel);

        final Label promptLabel = new Label(dialogArea, SWT.NONE);
        promptLabel.setText(Messages.getString("SetEncodingDialog.PromptLabelText")); //$NON-NLS-1$

        encodingCombo = new Combo(dialogArea, SWT.DROP_DOWN | SWT.READ_ONLY);
        encodingCombo.setItems(getCharsetList());
        GridDataBuilder.newInstance().hGrab().hFill().applyTo(encodingCombo);

        detectButton = new Button(dialogArea, SWT.NONE);
        detectButton.setText(Messages.getString("SetEncodingDialog.DetectButtonText")); //$NON-NLS-1$
        detectButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                try {
                    final FileEncoding encoding = FileEncodingDetector.detectEncoding(localPath,
                            FileEncoding.AUTOMATICALLY_DETECT);
                    encodingCombo.select(getEncodingIndex(encoding));
                } catch (final Exception ex) {
                    MessageDialog.openError(getShell(), Messages.getString("SetEncodingDialog.ErrorDialogTitle"), //$NON-NLS-1$
                            ex.getLocalizedMessage());
                }
            }
        });

        if (originalEncoding != null) {
            encodingCombo.select(getEncodingIndex(originalEncoding));
        } else {
            encodingCombo.select(getEncodingIndex(FileEncoding.getDefaultTextEncoding()));
        }
    }

    @Override
    protected void hookDialogAboutToClose() {
        final int idx = encodingCombo.getSelectionIndex();

        if (idx >= 0 && encodings.length > 0 && idx < encodings.length) {
            encoding = encodings[idx];

            /*
             * If the user selected the dashed separator line, then we treat
             * this as a cancellation.
             */
            if (encoding == null) {
                setReturnCode(IDialogConstants.CANCEL_ID);
            }
        }
    }

    public FileEncoding getFileEncoding() {
        return encoding;
    }

    @Override
    protected void hookAfterButtonsCreated() {
        ButtonHelper.setButtonToButtonBarSize(detectButton);
    }

    private String[] getCharsetList() {
        /* List of encodings in display order (including null separator) */
        final List<FileEncoding> encodingList = new ArrayList<FileEncoding>();

        encodingList.addAll(Arrays.asList(suggestedEncodings));

        /* Add the default system encoding */
        final FileEncoding defaultEncoding = FileEncoding.getDefaultTextEncoding();
        if (!encodingList.contains(defaultEncoding)) {
            encodingList.add(defaultEncoding);
        }

        /* Null (separator) */
        encodingList.add(null);

        /* Encodings from the codepages.xml / system properties */
        final List<FileEncoding> otherEncodings = new ArrayList<FileEncoding>();

        final int[] codePages = CodePageMapping.getCodePages();
        for (int i = 0; i < codePages.length; i++) {
            otherEncodings.add(new FileEncoding(codePages[i]));
        }

        /* Make sure the original encoding is here */
        if (originalEncoding != null) {
            otherEncodings.add(originalEncoding);
        }

        Collections.sort(otherEncodings, new FileEncodingComparator());

        for (final Iterator<FileEncoding> i = otherEncodings.iterator(); i.hasNext();) {
            final FileEncoding encoding = i.next();

            if (!encodingList.contains(encoding)) {
                encodingList.add(encoding);
            }
        }

        encodings = encodingList.toArray(new FileEncoding[encodingList.size()]);

        /*
         * Setup charset names
         */
        final String[] charsetNames = new String[encodings.length];

        for (int i = 0; i < encodings.length; i++) {
            if (encodings[i] == null) {
                charsetNames[i] = "--------------------"; //$NON-NLS-1$
            } else if (encodings[i].equals(defaultEncoding)) {
                charsetNames[i] = encodings[i].getName()
                        + Messages.getString("SetEncodingDialog.DefaultEncodingIndicator"); //$NON-NLS-1$
            } else {
                charsetNames[i] = encodings[i].getName();
            }
        }

        return charsetNames;
    }

    private int getEncodingIndex(final FileEncoding encoding) {
        Check.notNull(encoding, "encoding"); //$NON-NLS-1$

        for (int i = 0; i < encodings.length; i++) {
            if (encoding.equals(encodings[i])) {
                return i;
            }
        }

        return 0;
    }

    private class FileEncodingComparator implements Comparator<FileEncoding> {
        private final Collator caseInsensitiveCollator = CollatorFactory.getCaseInsensitiveCollator();

        @Override
        public int compare(final FileEncoding encoding0, final FileEncoding encoding1) {
            return caseInsensitiveCollator.compare(encoding0.getName(), encoding1.getName());
        }
    }
}