com.nokia.tools.theme.s60.ui.preferences.ComponentStorePrefPage.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.theme.s60.ui.preferences.ComponentStorePrefPage.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.theme.s60.ui.preferences;

import java.io.File;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.nokia.tools.media.utils.IRefreshableObject;
import com.nokia.tools.platform.extension.IThemeContainerDescriptor;
import com.nokia.tools.platform.extension.PlatformExtensionManager;
import com.nokia.tools.resource.util.FileUtils;
import com.nokia.tools.resource.util.StringUtils;
import com.nokia.tools.theme.s60.cstore.ComponentPoolConfig;
import com.nokia.tools.theme.s60.examplethemes.ExampleThemeProvider;

/**
 * Preference page for Component Store
 */
public class ComponentStorePrefPage extends PreferencePage
        implements IWorkbenchPreferencePage, IMenuListener, SelectionListener {

    public static final String PREFERENCES_CONTEXT = "com.nokia.tools.theme.s60.ui" + '.' //$NON-NLS-1$
            + "component_store_preferences_context";

    private Button addExample, addWorkspace, addCustom;

    private List userList;

    private Button removeThemeButton, addTheme;

    private ComponentPoolConfig data = null;

    /**
     * @see org.eclipse.jface.dialogs.Dialog#
     *      createDialogArea(org.eclipse.swt.widgets.Composite) Here we fill the
     *      center area of the dialog
     */
    protected Control createDialogArea(Composite parent) {

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, PREFERENCES_CONTEXT);

        Composite area = parent;

        // Create new composite as container
        final Composite container = new Composite(area, SWT.NONE);

        container.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 7;
        container.setLayout(layout);

        setTitle(Messages.ComponentPooDlg_title);

        /*
         * If there are theme containers other that S60 theme container i.e.
         * there are more than one theme containers then put a warning message
         * in description message area saying that the preferences on this page
         * are applicable for S60 Themes only.
         */
        IThemeContainerDescriptor[] themeContainerDescriptors = PlatformExtensionManager
                .getThemeContainerDescriptors();
        if (themeContainerDescriptors.length > 1) {
            warningMessage = Messages.ComponentPooDlg_componentStrMsgPart;
        }

        setDescription(Messages.ComponentPooDlg_msg);

        GridData gd = null;
        setWarningMessage(container);

        createDescriptionText(container);

        if (ExampleThemeProvider.isExampleThemeAvailable()) {
            addExample = new Button(container, SWT.CHECK);
            addExample.setText(Messages.ComponentPooDlg_showExamples);
            gd = new GridData();
            gd.verticalIndent = 5;
            gd.horizontalSpan = 2;
            addExample.setLayoutData(gd);
        }

        addWorkspace = new Button(container, SWT.CHECK);
        addWorkspace.setText(Messages.ComponentPooDlg_showWspace);
        gd = new GridData();
        gd.horizontalSpan = 2;
        addWorkspace.setLayoutData(gd);

        addCustom = new Button(container, SWT.CHECK);
        addCustom.setText(Messages.ComponentPooDlg_showcustom);
        gd = new GridData();
        gd.horizontalSpan = 2;
        addCustom.setLayoutData(gd);

        addCustom.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doAddCustomChecked();
            }
        });

        userList = new List(container, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
        gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 200;
        gd.widthHint = 200;
        userList.setLayoutData(gd);

        if (ExampleThemeProvider.isExampleThemeAvailable()) {
            addExample.setSelection(data.addExampleThemes);
            addWorkspace.setSelection(data.addWorkspaceTheme);
            addCustom.setSelection(data.addCustomThemes);
        }

        userList.setItems(data.userThemeList.toArray(new String[0]));
        MenuManager manager = new MenuManager();
        manager.addMenuListener(this);
        userList.setMenu(manager.createContextMenu(userList));
        userList.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                try {
                    if (e.keyCode == SWT.DEL)
                        if (!StringUtils.isEmpty(userList.getItem(userList.getSelectionIndex()))) {
                            doRemoveThemeAction();
                        }
                } catch (Exception es) {
                }
            }
        });
        userList.addSelectionListener(this);

        Composite userListBtContainer = new Composite(container, SWT.None);
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 7;
        userListBtContainer.setLayout(layout);
        gd = new GridData();
        gd.verticalAlignment = SWT.TOP;
        userListBtContainer.setLayoutData(gd);

        addTheme = new Button(userListBtContainer, SWT.PUSH);
        addTheme.setText(Messages.ComponentPooDlg_add);
        addTheme.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        calculateButtonSize(addTheme);
        addTheme.addSelectionListener(this);

        removeThemeButton = new Button(userListBtContainer, SWT.PUSH);
        removeThemeButton.setText(Messages.ComponentPooDlg_delete);
        removeThemeButton.setEnabled(false);
        removeThemeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        calculateButtonSize(removeThemeButton);
        removeThemeButton.addSelectionListener(this);

        // proper init add custom themes check
        doAddCustomChecked();

        return area;
    }

    private String warningMessage;

    private Text messageText;
    private Composite messageComposite;
    private Label messageImageLabel;

    private Composite setWarningMessage(Composite parent) {
        if (warningMessage != null) {
            messageComposite = new Composite(parent, SWT.NONE);
            GridLayout messageLayout = new GridLayout();
            messageLayout.numColumns = 2;
            messageLayout.marginWidth = 0;
            messageLayout.marginHeight = 0;
            messageLayout.makeColumnsEqualWidth = false;
            messageComposite.setLayout(messageLayout);

            messageImageLabel = new Label(messageComposite, SWT.NONE);
            messageImageLabel.setImage(JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
            messageImageLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

            messageText = new Text(messageComposite, SWT.WRAP);
            messageText.setEditable(false);
            GridData textData = new GridData(
                    GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
            messageText.setLayoutData(textData);
            messageText.setText(warningMessage);
        }
        return messageComposite;
    }

    private Text createDescriptionText(Composite parent) {
        Text warningMsgText = null;
        warningMsgText = new Text(parent, SWT.WRAP);
        warningMsgText.setEditable(false);
        GridData textData = new GridData(
                GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
        warningMsgText.setLayoutData(textData);
        warningMsgText.setText(getDescription());
        GridData gd = new GridData();
        gd.horizontalSpan = 2;
        warningMsgText.setLayoutData(gd);
        return warningMsgText;
    }

    protected void doAddCustomChecked() {
        removeThemeButton.setEnabled(userList.getSelectionIndex() > -1);
        pageChanged();
    }

    private void doAddThemeAction() {
        FileDialog fd = new FileDialog(getShell(), SWT.OPEN);
        fd.setText(Messages.ComponentPooDlg_select);
        fd.setFilterExtensions(new String[] { "*.tdf" }); //$NON-NLS-1$
        String path = fd.open();
        if (path != null && new File(path).exists()) {
            if ("tdf".equalsIgnoreCase(FileUtils.getExtension(path))) { //$NON-NLS-1$
                userList.add(path);
            }
        }
    }

    private void doRemoveThemeAction() {
        int index = userList.getSelectionIndex();
        userList.remove(userList.getSelectionIndex());
        addCustom.setSelection(userList.getItemCount() > 0);
        if (removeThemeButton != null)
            try {
                userList.setSelection(--index);
                removeThemeButton.setEnabled(!StringUtils.isEmpty(userList.getItem(userList.getSelectionIndex())));
            } catch (Exception e) {
                removeThemeButton.setEnabled(false);
            }
    }

    @Override
    protected Control createContents(Composite parent) {
        return createDialogArea(parent);
    }

    public void init(IWorkbench workbench) {
        data = ComponentPoolConfig.load();
    }

    @Override
    protected void performDefaults() {
        userList.removeAll();
        if (ExampleThemeProvider.isExampleThemeAvailable()) {
            addExample.setSelection(true);
        }
        addWorkspace.setSelection(false);
        addCustom.setSelection(false);
        doAddCustomChecked();
    }

    @Override
    protected void performApply() {
        performOk();
    }

    @Override
    public boolean performOk() {
        if (ExampleThemeProvider.isExampleThemeAvailable()) {
            data.addExampleThemes = addExample.getSelection();
        }
        data.addWorkspaceTheme = addWorkspace.getSelection();
        data.addCustomThemes = addCustom.getSelection();

        data.userThemeList.clear();
        if (userList.getItemCount() > 0)
            for (String a : userList.getItems())
                data.userThemeList.add(a);
        data.save();

        refreshComponentStore();

        return true;
    }

    // force refresh of C.Store View if displayed
    private void refreshComponentStore() {
        try {
            String viewId = "com.nokia.tools.theme.s60.ui.views.ComponentStore";
            IRefreshableObject instance = (IRefreshableObject) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                    .getActivePage().findView(viewId);
            if (instance != null) {
                instance.notifyRefreshNeeded(null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void menuAboutToShow(IMenuManager manager) {
        manager.removeAll();

        Action delete = new Action(Messages.ComponentPooDlg_delete) {
            @Override
            public void run() {
                doRemoveThemeAction();
            }
        };
        delete.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
        try {
            delete.setEnabled(false);
            if (!StringUtils.isEmpty(userList.getItem(userList.getSelectionIndex()))) {
                delete.setEnabled(true);
            }
        } catch (Exception e) {
        }

        Action add = new Action(Messages.ComponentPooDlg_add) {
            @Override
            public void run() {
                doAddThemeAction();
            }
        };
        add.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD));

        manager.add(add);
        manager.add(delete);
    }

    public void widgetSelected(SelectionEvent e) {
        try {
            if (e.getSource() == removeThemeButton) {
                doRemoveThemeAction();
            } else if (e.getSource() == addTheme) {
                doAddThemeAction();
            } else if (e.getSource() == userList) {
                removeThemeButton.setEnabled(!StringUtils.isEmpty(userList.getItem(userList.getSelectionIndex())));
            }
        } catch (Exception ee) {
            ee.printStackTrace();
        }
        pageChanged();
    }

    public void widgetDefaultSelected(SelectionEvent e) {
    }

    private void pageChanged() {
        if (addCustom.getSelection() && userList.getItemCount() == 0) {
            updateStatus(Messages.ComponentPooDlg_list_empty);
            return;
        }
        setValid(true);
        updateStatus(null);
    }

    /**
     * Updates error messages
     */
    private void updateStatus(String message) {
        setErrorMessage(message);
        setValid(message == null);
    }

    private void calculateButtonSize(Button button) {
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        int wHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        Point mSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        data.widthHint = Math.max(wHint, mSize.x);
        button.setLayoutData(data);
    }
}