Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/imports/NamespaceSelectionDialog.java')
-rw-r--r--plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/imports/NamespaceSelectionDialog.java365
1 files changed, 365 insertions, 0 deletions
diff --git a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/imports/NamespaceSelectionDialog.java b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/imports/NamespaceSelectionDialog.java
new file mode 100644
index 000000000..ceb76f6a3
--- /dev/null
+++ b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/imports/NamespaceSelectionDialog.java
@@ -0,0 +1,365 @@
+/*******************************************************************************
+ * Copyright (c) 2019 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * CONTRIBUTORS:
+ * Henrik Rentz-Reichert (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.core.common.ui.imports;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.SWT;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog;
+import org.eclipse.ui.dialogs.FilteredList;
+
+/**
+ * @author Henrik Rentz-Reichert
+ *
+ * (initial code from org.eclipse.jdt.internal.ui.dialogs.MultiElementListSelectionDialog)
+ */
+public class NamespaceSelectionDialog extends AbstractElementListSelectionDialog {
+
+ private static class Page {
+ private Object[] elements;
+ public String filter;
+ public boolean okState= false;
+
+ public Page(Object[] elements) {
+ this.elements= elements;
+ }
+ }
+
+ private Page[] fPages;
+ private int fCurrentPage;
+ private int fNumberOfPages;
+
+ private Button fFinishButton;
+ private Button fBackButton;
+ private Button fNextButton;
+ private Button fSkipButton;
+
+ private Label fPageInfoLabel;
+ private String fPageInfoMessage= "Page {0} of {1}";
+ private Comparator<?> fComparator;
+
+ /**
+ * Constructs a multi-page list selection dialog.
+ * @param parent The parent shell
+ * @param renderer the label renderer.
+ */
+ public NamespaceSelectionDialog(Shell parent, ILabelProvider renderer) {
+ super(parent, renderer);
+ }
+
+ /**
+ * Sets message shown in the right top corner. Use {0} and {1} as placeholders
+ * for the current and the total number of pages.
+ * @param message the message.
+ */
+ public void setPageInfoMessage(String message) {
+ fPageInfoMessage= message;
+ }
+
+ /**
+ * Sets the elements to be displayed in the dialog.
+ * @param elements an array of pages holding arrays of elements
+ */
+ public void setElements(Object[][] elements) {
+ fNumberOfPages= elements.length;
+ fPages= new Page[fNumberOfPages];
+ for (int i= 0; i != fNumberOfPages; i++)
+ fPages[i]= new Page(elements[i]);
+
+ initializeResult(fNumberOfPages);
+ }
+
+ /*
+ * @see Window#open()
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int open() {
+ List<Object[]> selection= getInitialElementSelections();
+ if (selection == null || selection.size() != fNumberOfPages) {
+ setInitialSelections(new Object[fNumberOfPages]);
+ selection= getInitialElementSelections();
+ }
+
+ Assert.isTrue(selection.size() == fNumberOfPages);
+
+ return super.open();
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite contents= (Composite) super.createDialogArea(parent);
+
+ createMessageArea(contents);
+ createFilterText(contents);
+ createFilteredList(contents);
+
+ fCurrentPage= 0;
+ setPageData();
+
+ applyDialogFont(contents);
+ return contents;
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(Composite)
+ */
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ fSkipButton= createButton(parent, IDialogConstants.SKIP_ID, IDialogConstants.SKIP_LABEL, false);
+ fBackButton= createButton(parent, IDialogConstants.BACK_ID, IDialogConstants.BACK_LABEL, false);
+
+ // XXX: Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=279425
+ boolean HAS_BUG_279425= true;
+ fNextButton= createButton(parent, IDialogConstants.NEXT_ID, IDialogConstants.NEXT_LABEL, !HAS_BUG_279425);
+ fFinishButton= createButton(parent, IDialogConstants.OK_ID, IDialogConstants.FINISH_LABEL, HAS_BUG_279425);
+
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ }
+
+ /*
+ * XXX: Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=279425
+ * The whole method can be removed once that bug is fixed.
+ * @see org.eclipse.jface.dialogs.Dialog#initializeBounds()
+ * @since 3.5.1
+ */
+ @Override
+ protected void initializeBounds() {
+ super.initializeBounds();
+ fNextButton.getShell().setDefaultButton(fNextButton);
+ }
+
+ /*
+ * @see org.eclipse.ui.dialogs.SelectionDialog#createMessageArea(Composite)
+ */
+ @Override
+ protected Label createMessageArea(Composite parent) {
+ Composite composite= new Composite(parent, SWT.NONE);
+
+ GridLayout layout= new GridLayout();
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ layout.horizontalSpacing= 5;
+ layout.numColumns= 2;
+ composite.setLayout(layout);
+
+ GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ composite.setLayoutData(data);
+
+ Label messageLabel= super.createMessageArea(composite);
+
+ fPageInfoLabel= new Label(composite, SWT.NULL);
+ fPageInfoLabel.setText(getPageInfoMessage());
+
+ data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ data.horizontalAlignment= GridData.END;
+ fPageInfoLabel.setLayoutData(data);
+ applyDialogFont(messageLabel);
+ return messageLabel;
+ }
+
+ /*
+ * @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult()
+ */
+ @Override
+ protected void computeResult() {
+ setResult(fCurrentPage, getSelectedElements());
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+ */
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == IDialogConstants.SKIP_ID) {
+ boolean isLastPage= fCurrentPage == fNumberOfPages - 1 ? true : false;
+ turnPage(true, true);
+ if (isLastPage) {
+ buttonPressed(IDialogConstants.OK_ID);
+ }
+ } else if (buttonId == IDialogConstants.BACK_ID) {
+ turnPage(false, false);
+ } else if (buttonId == IDialogConstants.NEXT_ID) {
+ turnPage(true, false);
+ } else {
+ super.buttonPressed(buttonId);
+ }
+ }
+
+ /**
+ * @see AbstractElementListSelectionDialog#handleDefaultSelected()
+ */
+ @Override
+ protected void handleDefaultSelected() {
+ if (validateCurrentSelection()) {
+ if (fCurrentPage == fNumberOfPages - 1) {
+ buttonPressed(IDialogConstants.OK_ID);
+ } else {
+ buttonPressed(IDialogConstants.NEXT_ID);
+ }
+ }
+ }
+
+ /**
+ * @see AbstractElementListSelectionDialog#updateButtonsEnableState(IStatus)
+ */
+ @Override
+ protected void updateButtonsEnableState(IStatus status) {
+ boolean isOK= !status.matches(IStatus.ERROR);
+ fPages[fCurrentPage].okState= isOK;
+
+ boolean isAllOK= isOK;
+ for (int i= 0; i != fNumberOfPages; i++)
+ isAllOK = isAllOK && fPages[i].okState;
+
+ fFinishButton.setEnabled(isAllOK);
+
+ boolean nextButtonEnabled= isOK && (fCurrentPage < fNumberOfPages - 1);
+
+ fNextButton.setEnabled(nextButtonEnabled);
+ fBackButton.setEnabled(fCurrentPage != 0);
+
+ // since there will always be a default selection - see FilteredList.TableUpdateJob.defaultSelect()
+ fSkipButton.setEnabled(true);
+
+ if (nextButtonEnabled) {
+ getShell().setDefaultButton(fNextButton);
+ } else if (isAllOK) {
+ getShell().setDefaultButton(fFinishButton);
+ }
+ }
+
+ private void turnPage(boolean toNextPage, boolean skipSelection) {
+ Page page= fPages[fCurrentPage];
+
+ // store filter
+ String filter= getFilter();
+ if (filter == null)
+ filter= ""; //$NON-NLS-1$
+ page.filter= filter;
+
+ if (skipSelection) {
+ setSelection(null);
+ }
+
+ // store selection
+ Object[] selectedElements= getSelectedElements();
+ @SuppressWarnings("unchecked")
+ List<Object[]> list= getInitialElementSelections();
+ list.set(fCurrentPage, selectedElements);
+
+ // store result
+ setResult(fCurrentPage, selectedElements);
+
+ if (toNextPage) {
+ if (fCurrentPage + 1 >= fNumberOfPages)
+ return;
+
+ fCurrentPage++;
+ } else {
+ if (fCurrentPage - 1 < 0)
+ return;
+
+ fCurrentPage--;
+ }
+
+ if (fPageInfoLabel != null && !fPageInfoLabel.isDisposed())
+ fPageInfoLabel.setText(getPageInfoMessage());
+
+ setPageData();
+
+ validateCurrentSelection();
+ }
+
+ private void setPageData() {
+ Page page= fPages[fCurrentPage];
+
+ // 1. set elements
+ setListElements(page.elements);
+
+ // 2. apply filter
+ String filter= page.filter;
+ if (filter == null)
+ filter= ""; //$NON-NLS-1$
+ setFilter(filter);
+
+ // 3. select elements
+ Object[] selectedElements= (Object[]) getInitialElementSelections().get(fCurrentPage);
+ setSelection(selectedElements);
+ fFilteredList.setFocus();
+ }
+
+ private String getPageInfoMessage() {
+ if (fPageInfoMessage == null)
+ return ""; //$NON-NLS-1$
+
+ Object[] args= new Object[] { Integer.toString(fCurrentPage + 1), Integer.toString(fNumberOfPages) };
+ return MessageFormat.format(fPageInfoMessage, args);
+ }
+
+ private void initializeResult(int length) {
+ List<Object> result= new ArrayList<>(length);
+ for (int i= 0; i != length; i++)
+ result.add(null);
+
+ setResult(result);
+ }
+
+ /**
+ * Gets the current Page.
+ * @return Returns a int
+ */
+ public int getCurrentPage() {
+ return fCurrentPage;
+ }
+
+ /**
+ * Set the <code>Comparator</code> used to sort
+ * the elements in the List.
+ *
+ * @param comparator the comparator to use, not null.
+ */
+ public void setComparator(Comparator<?> comparator) {
+ fComparator= comparator;
+ if (fFilteredList != null)
+ fFilteredList.setComparator(fComparator);
+ }
+
+ @Override
+ protected FilteredList createFilteredList(Composite parent) {
+ FilteredList filteredList= super.createFilteredList(parent);
+ if (fComparator != null) {
+ filteredList.setComparator(fComparator);
+ }
+ return filteredList;
+ }
+}

Back to the top