Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.ldapbrowser.common.dialogs.preferences; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.LdapSyntax; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.connection.core.Utils; import org.apache.directory.studio.ldapbrowser.core.BrowserConnectionManager; import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.ldapbrowser.core.model.schema.BinaryAttribute; import org.apache.directory.studio.ldapbrowser.core.model.schema.BinarySyntax; import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema; import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; /** * The BinaryAttributesAndSyntaxesPreferencePage is used to specify * binary attributes and syntaxes. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class BinaryAttributesAndSyntaxesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { /** Map with attribute OID => attribute type description */ private SortedMap<String, AttributeType> attributeOid2AtdMap; /** Map with attribute name => attribute type description */ private SortedMap<String, AttributeType> attributeNames2AtdMap; /** The attribute names and OIDs. */ private String[] attributeNamesAndOids; /** Map with syntax OID => syntax description */ private SortedMap<String, LdapSyntax> syntaxOid2LsdMap; /** Map with syntax DESC => syntax description */ private SortedMap<String, LdapSyntax> syntaxDesc2LsdMap; /** The syntax OIDs. */ private String[] syntaxOids; /** The attribute list. */ private List<BinaryAttribute> attributeList; /** The attribute viewer. */ private TableViewer attributeViewer; /** The attribute add button. */ private Button attributeAddButton; /** The attribute edit button. */ private Button attributeEditButton; /** The attribute remove button. */ private Button attributeRemoveButton; /** The syntax list. */ private List<BinarySyntax> syntaxList; /** The syntax viewer. */ private TableViewer syntaxViewer; /** The syntax add button. */ private Button syntaxAddButton; /** The syntax edit button. */ private Button syntaxEditButton; /** The syntax remove button. */ private Button syntaxRemoveButton; /** * Creates a new instance of BinaryAttributesAndSyntaxesPreferencePage. */ public BinaryAttributesAndSyntaxesPreferencePage() { super(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributes")); //$NON-NLS-1$ super.setDescription( Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributesDescription")); //$NON-NLS-1$ } /** * {@inheritDoc} */ public void init(IWorkbench workbench) { } /** * {@inheritDoc} */ protected Control createContents(Composite parent) { Composite composite = BaseWidgetUtils.createColumnContainer(parent, 1, 1); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); // init available attribute types attributeNames2AtdMap = new TreeMap<String, AttributeType>(); attributeOid2AtdMap = new TreeMap<String, AttributeType>(); BrowserConnectionManager cm = BrowserCorePlugin.getDefault().getConnectionManager(); IBrowserConnection[] connections = cm.getBrowserConnections(); for (IBrowserConnection browserConnection : connections) { Schema schema = browserConnection.getSchema(); createAttributeMaps(schema); } createAttributeMaps(Schema.DEFAULT_SCHEMA); attributeNamesAndOids = new String[attributeNames2AtdMap.size() + attributeOid2AtdMap.size()]; System.arraycopy(attributeNames2AtdMap.keySet().toArray(), 0, attributeNamesAndOids, 0, attributeNames2AtdMap.size()); System.arraycopy(attributeOid2AtdMap.keySet().toArray(), 0, attributeNamesAndOids, attributeNames2AtdMap.size(), attributeOid2AtdMap.size()); // init available syntaxes syntaxOid2LsdMap = new TreeMap<String, LdapSyntax>(); syntaxDesc2LsdMap = new TreeMap<String, LdapSyntax>(); for (IBrowserConnection browserConnection : connections) { Schema schema = browserConnection.getSchema(); createSyntaxMaps(schema); } createSyntaxMaps(Schema.DEFAULT_SCHEMA); syntaxOids = new String[syntaxOid2LsdMap.size()]; System.arraycopy(syntaxOid2LsdMap.keySet().toArray(), 0, syntaxOids, 0, syntaxOid2LsdMap.size()); // create attribute contents BaseWidgetUtils.createSpacer(composite, 1); BaseWidgetUtils.createSpacer(composite, 1); createAttributeContents(composite); attributeList = new ArrayList<BinaryAttribute>( Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getBinaryAttributes())); attributeViewer.setInput(attributeList); attributeViewer.getTable().getColumn(0).pack(); // create syntax contents BaseWidgetUtils.createSpacer(composite, 1); BaseWidgetUtils.createSpacer(composite, 1); createSyntaxContents(composite); syntaxList = new ArrayList<BinarySyntax>( Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getBinarySyntaxes())); syntaxViewer.setInput(syntaxList); syntaxViewer.getTable().getColumn(0).pack(); syntaxViewer.getTable().pack(); return composite; } private void createAttributeMaps(Schema schema) { Collection<AttributeType> atds = schema.getAttributeTypeDescriptions(); for (AttributeType atd : atds) { attributeOid2AtdMap.put(atd.getOid(), atd); for (String name : atd.getNames()) { attributeNames2AtdMap.put(name, atd); } } } private void createSyntaxMaps(Schema schema) { Collection<LdapSyntax> lsds = schema.getLdapSyntaxDescriptions(); for (LdapSyntax lsd : lsds) { syntaxOid2LsdMap.put(lsd.getOid(), lsd); if (lsd.getDescription() != null) { syntaxDesc2LsdMap.put(lsd.getDescription(), lsd); } } } private void createAttributeContents(Composite parent) { BaseWidgetUtils.createLabel(parent, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributes"), 1); //$NON-NLS-1$ Composite composite = BaseWidgetUtils.createColumnContainer(parent, 2, 1); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite listComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1); listComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite buttonComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1); buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); Table table = new Table(listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION); GridData data = new GridData(GridData.FILL_BOTH); data.widthHint = 360; data.heightHint = convertHeightInCharsToPixels(10); table.setLayoutData(data); table.setHeaderVisible(true); table.setLinesVisible(true); attributeViewer = new TableViewer(table); TableColumn c1 = new TableColumn(table, SWT.NONE); c1.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Attribute")); //$NON-NLS-1$ c1.setWidth(300); TableColumn c2 = new TableColumn(table, SWT.NONE); c2.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Alias")); //$NON-NLS-1$ c2.setWidth(60); attributeViewer.setColumnProperties( new String[] { Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Attribute") }); //$NON-NLS-1$ attributeViewer.setContentProvider(new ArrayContentProvider()); attributeViewer.setLabelProvider(new AttributeLabelProvider()); attributeViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { editAttribute(); } }); attributeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { attributeEditButton.setEnabled(!attributeViewer.getSelection().isEmpty()); attributeRemoveButton.setEnabled(!attributeViewer.getSelection().isEmpty()); } }); attributeAddButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Add"), 1); //$NON-NLS-1$ attributeAddButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addAttribute(); } }); attributeEditButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Edit"), 1); //$NON-NLS-1$ attributeEditButton.setEnabled(false); attributeEditButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { editAttribute(); } }); attributeRemoveButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Remove"), 1); //$NON-NLS-1$ attributeRemoveButton.setEnabled(false); attributeRemoveButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeAttribute(); } }); } private void createSyntaxContents(Composite parent) { BaseWidgetUtils.createLabel(parent, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinarySyntaxes"), 1); //$NON-NLS-1$ Composite composite = BaseWidgetUtils.createColumnContainer(parent, 2, 1); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite listComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1); listComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite buttonComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1); buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); Table table = new Table(listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION); GridData data = new GridData(GridData.FILL_BOTH); data.widthHint = 360; data.heightHint = convertHeightInCharsToPixels(10); table.setLayoutData(data); table.setHeaderVisible(true); table.setLinesVisible(true); syntaxViewer = new TableViewer(table); TableColumn c1 = new TableColumn(table, SWT.NONE); c1.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Syntax")); //$NON-NLS-1$ c1.setWidth(300); TableColumn c2 = new TableColumn(table, SWT.NONE); c2.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Desc")); //$NON-NLS-1$ c2.setWidth(60); syntaxViewer.setColumnProperties( new String[] { Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Syntax") }); //$NON-NLS-1$ syntaxViewer.setContentProvider(new ArrayContentProvider()); syntaxViewer.setLabelProvider(new SyntaxLabelProvider()); syntaxViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { editSyntax(); } }); syntaxViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { syntaxEditButton.setEnabled(!syntaxViewer.getSelection().isEmpty()); syntaxRemoveButton.setEnabled(!syntaxViewer.getSelection().isEmpty()); } }); syntaxAddButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Add"), 1); //$NON-NLS-1$ syntaxAddButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addSyntax(); } }); syntaxEditButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Edit"), 1); //$NON-NLS-1$ syntaxEditButton.setEnabled(false); syntaxEditButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { editSyntax(); } }); syntaxRemoveButton = BaseWidgetUtils.createButton(buttonComposite, Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Remove"), 1); //$NON-NLS-1$ syntaxRemoveButton.setEnabled(false); syntaxRemoveButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeSyntax(); } }); } private void addAttribute() { AttributeDialog dialog = new AttributeDialog(getShell(), null, attributeNamesAndOids); if (dialog.open() == AttributeValueEditorDialog.OK) { BinaryAttribute attribute = dialog.getAttribute(); // Ensuring we use OID for consistency in the table viewer if (attributeNames2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) { attribute = new BinaryAttribute( attributeNames2AtdMap.get(attribute.getAttributeNumericOidOrName()).getOid()); } else if (attributeOid2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) { attribute = new BinaryAttribute( attributeOid2AtdMap.get(attribute.getAttributeNumericOidOrName()).getOid()); } attributeList.add(attribute); attributeViewer.refresh(); } } private void removeAttribute() { Object o = ((StructuredSelection) attributeViewer.getSelection()).getFirstElement(); attributeList.remove(o); attributeViewer.refresh(); } private void editAttribute() { StructuredSelection sel = (StructuredSelection) attributeViewer.getSelection(); if (!sel.isEmpty()) { BinaryAttribute attribute = (BinaryAttribute) sel.getFirstElement(); AttributeDialog dialog = new AttributeDialog(getShell(), attribute, attributeNamesAndOids); if (dialog.open() == AttributeValueEditorDialog.OK) { int index = attributeList.indexOf(attribute); attributeList.set(index, dialog.getAttribute()); attributeViewer.refresh(); } } } private void addSyntax() { SyntaxDialog dialog = new SyntaxDialog(getShell(), null, syntaxOids); if (dialog.open() == SyntaxValueEditorDialog.OK) { syntaxList.add(dialog.getSyntax()); syntaxViewer.refresh(); } } private void removeSyntax() { Object o = ((StructuredSelection) syntaxViewer.getSelection()).getFirstElement(); syntaxList.remove(o); syntaxViewer.refresh(); } private void editSyntax() { StructuredSelection sel = (StructuredSelection) syntaxViewer.getSelection(); if (!sel.isEmpty()) { BinarySyntax syntax = (BinarySyntax) sel.getFirstElement(); SyntaxDialog dialog = new SyntaxDialog(getShell(), syntax, syntaxOids); if (dialog.open() == SyntaxValueEditorDialog.OK) { int index = syntaxList.indexOf(syntax); syntaxList.set(index, dialog.getSyntax()); syntaxViewer.refresh(); } } } /** * {@inheritDoc} */ public boolean performOk() { BinaryAttribute[] attributes = attributeList.toArray(new BinaryAttribute[attributeList.size()]); BrowserCorePlugin.getDefault().getCorePreferences().setBinaryAttributes(attributes); BinarySyntax[] syntaxes = syntaxList.toArray(new BinarySyntax[syntaxList.size()]); BrowserCorePlugin.getDefault().getCorePreferences().setBinarySyntaxes(syntaxes); return true; } /** * {@inheritDoc} */ protected void performDefaults() { attributeList.clear(); attributeList.addAll( Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getDefaultBinaryAttributes())); attributeViewer.refresh(); syntaxList.clear(); syntaxList.addAll( Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getDefaultBinarySyntaxes())); syntaxViewer.refresh(); super.performDefaults(); } class AttributeLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { if (obj instanceof BinaryAttribute) { BinaryAttribute attribute = (BinaryAttribute) obj; if (index == 0) { return attribute.getAttributeNumericOidOrName(); } else if (index == 1) { if (attribute.getAttributeNumericOidOrName() != null) { if (attributeNames2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) { AttributeType atd = attributeNames2AtdMap.get(attribute.getAttributeNumericOidOrName()); String s = atd.getOid(); for (String attributeName : atd.getNames()) { if (!attribute.getAttributeNumericOidOrName().equals(attributeName)) { s += ", " + attributeName; //$NON-NLS-1$ } } return s; } else if (attributeOid2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) { AttributeType atd = attributeOid2AtdMap.get(attribute.getAttributeNumericOidOrName()); return SchemaUtils.toString(atd); } else if (Utils.getOidDescription(attribute.getAttributeNumericOidOrName()) != null) { return Utils.getOidDescription(attribute.getAttributeNumericOidOrName()); } } } } return null; } public Image getColumnImage(Object obj, int index) { return null; } } class SyntaxLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { if (obj instanceof BinarySyntax) { BinarySyntax syntax = (BinarySyntax) obj; if (index == 0) { return syntax.getSyntaxNumericOid(); } else if (index == 1) { if (syntax.getSyntaxNumericOid() != null) { if (syntaxOid2LsdMap.containsKey(syntax.getSyntaxNumericOid())) { LdapSyntax lsd = (LdapSyntax) syntaxOid2LsdMap.get(syntax.getSyntaxNumericOid()); return SchemaUtils.toString(lsd); } else if (Utils.getOidDescription(syntax.getSyntaxNumericOid()) != null) { return Utils.getOidDescription(syntax.getSyntaxNumericOid()); } } } } return null; } public Image getColumnImage(Object obj, int index) { return null; } } }