| /******************************************************************************* |
| * Copyright (c) 2001, 2006 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 |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.ui.internal.dialogs; |
| |
| import java.util.List; |
| import java.util.Vector; |
| |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.ColumnWeightData; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITableLabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TableLayout; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.MouseAdapter; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Image; |
| 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.Group; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.TableItem; |
| import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo; |
| import org.eclipse.wst.xml.ui.internal.XMLUIMessages; |
| import org.eclipse.wst.xml.ui.internal.XMLUIPlugin; |
| |
| public class NamespaceInfoTable extends Composite { |
| |
| /** |
| * NamespaceInfoTableLabelProvider |
| */ |
| protected class NamespaceInfoTableLabelProvider implements ITableLabelProvider, IStructuredContentProvider { |
| |
| public void addListener(ILabelProviderListener listener) { |
| } |
| |
| public void dispose() { |
| } |
| |
| public Image getColumnImage(Object object, int columnIndex) { |
| return null; |
| } |
| |
| public String getColumnText(Object object, int column) { |
| NamespaceInfo info = (NamespaceInfo) object; |
| String result = null; |
| switch (column) { |
| case 0 : { |
| result = info.uri; |
| break; |
| } |
| case 1 : { |
| result = info.prefix; |
| break; |
| } |
| case 2 : { |
| result = info.locationHint; |
| break; |
| } |
| } |
| result = result != null ? result : ""; //$NON-NLS-1$ |
| if (result.equals("")) { //$NON-NLS-1$ |
| switch (column) { |
| case 0 : { |
| result = XMLUIMessages._UI_NO_NAMESPACE_NAME; |
| break; |
| } |
| case 1 : { |
| result = XMLUIMessages._UI_NO_PREFIX; |
| break; |
| } |
| } |
| } |
| return result; |
| } |
| |
| String getDefaultPrefix() { |
| String defaultPrefix = "p"; //$NON-NLS-1$ |
| if (namespaceInfoList == null) { |
| return defaultPrefix; |
| } |
| Vector v = new Vector(); |
| for (int i = 0; i < namespaceInfoList.size(); i++) { |
| NamespaceInfo nsinfo = (NamespaceInfo) namespaceInfoList.get(i); |
| if (nsinfo.prefix != null) { |
| v.addElement(nsinfo.prefix); |
| } |
| } |
| if (v.contains(defaultPrefix)) { |
| String s = defaultPrefix; |
| for (int j = 0; v.contains(s); j++) { |
| s = defaultPrefix + Integer.toString(j); |
| } |
| return s; |
| } |
| else { |
| return defaultPrefix; |
| } |
| } |
| |
| public Object[] getElements(Object inputElement) { |
| return namespaceInfoList.toArray(); |
| } |
| |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| } |
| |
| public boolean isDeleted(Object element) { |
| return false; |
| } |
| |
| public boolean isLabelProperty(Object object, Object property) { |
| return false; |
| } |
| |
| public boolean isLabelProperty(Object element, String property) { |
| return false; |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| } |
| } |
| |
| protected static final String LOCATION_HINT = XMLUIMessages._UI_LABEL_LOCATION_HINT; |
| protected static final String NAMESPACE_URI = XMLUIMessages._UI_LABEL_NAMESPACE_NAME; |
| protected static final String PREFIX = XMLUIMessages._UI_LABEL_PREFIX; |
| protected Button deleteButton; |
| protected boolean dummyRowsRemoved = false; |
| protected Button editButton; |
| protected List namespaceInfoList = new Vector(); |
| protected Button newButton; |
| protected NamespaceInfoTableLabelProvider provider; |
| protected IPath resourceLocation; |
| protected TableViewer tableViewer; |
| protected UpdateListener updateListener; |
| protected int visibleRows = -1; |
| |
| public NamespaceInfoTable(Composite parent) { |
| this(parent, -1, -1, -1); |
| } |
| |
| public NamespaceInfoTable(Composite parent, int visibleRows) { |
| this(parent, -1, -1, visibleRows); |
| } |
| |
| public NamespaceInfoTable(Composite parent, int widthHint, int heightHint) { |
| this(parent, widthHint, heightHint, -1); |
| } |
| |
| public NamespaceInfoTable(Composite parent, int widthHint, int heightHint, int visibleRows) { |
| super(parent, SWT.NONE); |
| setLayout(createGridLayout()); |
| setLayoutData(new GridData(GridData.FILL_BOTH)); |
| Group namespaceInfoGroup = new Group(this, SWT.NONE); |
| namespaceInfoGroup.setText(XMLUIMessages._UI_LABEL_XML_SCHEMA_INFORMATION); |
| namespaceInfoGroup.setLayout(new GridLayout()); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| if (widthHint != -1) { |
| gd.widthHint = widthHint; |
| } |
| if (heightHint != -1) { |
| gd.heightHint = heightHint; |
| } |
| namespaceInfoGroup.setLayoutData(gd); |
| // WorkbenchHelp.setHelp(namespaceInfoGroup, new |
| // ControlContextComputer(namespaceInfoGroup, |
| // XMLBuilderContextIds.XMLC_NAMESPACE_GROUP)); |
| String[] titleArray = {NAMESPACE_URI, PREFIX, LOCATION_HINT}; |
| tableViewer = new TableViewer(namespaceInfoGroup, SWT.FULL_SELECTION); |
| provider = new NamespaceInfoTableLabelProvider(); |
| tableViewer.setContentProvider(provider); |
| tableViewer.setLabelProvider(provider); |
| tableViewer.setColumnProperties(titleArray); |
| Table table = tableViewer.getTable(); |
| table.setHeaderVisible(true); |
| table.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| int[] widthArray = {50, 20, 30}; |
| TableLayout layout = new TableLayout(); |
| for (int i = 0; i < titleArray.length; i++) { |
| TableColumn column = new TableColumn(table, i); |
| column.setText(titleArray[i]); |
| column.setAlignment(SWT.LEFT); |
| layout.addColumnData(new ColumnWeightData(widthArray[i], true)); |
| } |
| this.visibleRows = visibleRows; |
| for (int i = 0; i < visibleRows; i++) { |
| TableItem item = new TableItem(table, SWT.NONE); |
| item.setText("#######"); //$NON-NLS-1$ |
| } |
| table.setLayout(layout); |
| CellEditor[] cellEditors = new CellEditor[titleArray.length]; |
| cellEditors[1] = new TextCellEditor(table); |
| cellEditors[2] = new TextCellEditor(table); |
| tableViewer.setCellEditors(cellEditors); |
| MouseAdapter mouseAdapter = new MouseAdapter() { |
| public void mouseDoubleClick(MouseEvent e) { |
| if (tableViewer.getTable().getItem(new Point(e.x, e.y)) != null) { |
| performEdit(); |
| } |
| } |
| }; |
| table.addMouseListener(mouseAdapter); |
| createButtons(namespaceInfoGroup); |
| ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| updateButtonEnabledState(); |
| } |
| }; |
| tableViewer.addSelectionChangedListener(selectionChangedListener); |
| } |
| |
| protected void createButtons(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NONE); |
| composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| GridLayout gridLayout = new GridLayout(); |
| gridLayout.numColumns = 2; |
| gridLayout.marginHeight = 0; |
| gridLayout.marginWidth = 0; |
| composite.setLayout(gridLayout); |
| Button hiddenButton = new Button(composite, SWT.NONE); |
| hiddenButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| hiddenButton.setVisible(false); |
| hiddenButton.setEnabled(false); |
| SelectionListener selectionListener = new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| if (e.widget == newButton) { |
| performNew(); |
| } |
| else if (e.widget == editButton) { |
| performEdit(); |
| } |
| else if (e.widget == deleteButton) { |
| performDelete(); |
| } |
| } |
| }; |
| // create a composite to hold the three buttons |
| Composite buttonComposite = new Composite(composite, SWT.NONE); |
| buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| GridLayout buttonGridLayout = new GridLayout(); |
| buttonGridLayout.numColumns = 3; |
| buttonGridLayout.makeColumnsEqualWidth = true; |
| buttonComposite.setLayout(buttonGridLayout); |
| // add the New button |
| // |
| newButton = new Button(buttonComposite, SWT.NONE); |
| newButton.setText(XMLUIMessages._UI_BUTTON_NEW); |
| newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| newButton.addSelectionListener(selectionListener); |
| // add the Edit button |
| // |
| editButton = new Button(buttonComposite, SWT.NONE); |
| editButton.setText(XMLUIMessages._UI_BUTTON_EDIT); |
| editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| editButton.addSelectionListener(selectionListener); |
| // add the Delete button |
| // |
| deleteButton = new Button(buttonComposite, SWT.NONE); |
| deleteButton.setText(XMLUIMessages._UI_BUTTON_DELETE); |
| deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| deleteButton.addSelectionListener(selectionListener); |
| } |
| |
| public GridLayout createGridLayout() { |
| GridLayout gridLayout = new GridLayout(); |
| gridLayout.marginWidth = 0; |
| gridLayout.horizontalSpacing = 0; |
| return gridLayout; |
| } |
| |
| public List getNamespaceInfoList() { |
| return namespaceInfoList; |
| } |
| |
| protected NamespaceInfo getTargetNamespaceInfo() { |
| return ((namespaceInfoList != null) && (namespaceInfoList.size() > 0)) ? (NamespaceInfo) namespaceInfoList.get(0) : null; |
| } |
| |
| protected EditNamespaceInfoDialog invokeDialog(String title, NamespaceInfo info) { |
| Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell(); |
| EditNamespaceInfoDialog dialog = new EditNamespaceInfoDialog(shell, info); |
| dialog.create(); |
| dialog.getShell().setText(title); |
| dialog.setBlockOnOpen(true); |
| dialog.setResourceLocation(resourceLocation); |
| dialog.open(); |
| return dialog; |
| } |
| |
| protected void performDelayedUpdate() { |
| Runnable delayedUpdate = new Runnable() { |
| public void run() { |
| update(); |
| } |
| }; |
| getDisplay().asyncExec(delayedUpdate); |
| if (updateListener != null) { |
| updateListener.updateOccured(this, namespaceInfoList); |
| } |
| } |
| |
| public void performDelete() { |
| ISelection selection = tableViewer.getSelection(); |
| Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null; |
| if (selectedObject != null) { |
| namespaceInfoList.remove(selectedObject); |
| performDelayedUpdate(); |
| } |
| } |
| |
| public void performEdit() { |
| ISelection selection = tableViewer.getSelection(); |
| Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null; |
| if (selectedObject instanceof NamespaceInfo) { |
| invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, (NamespaceInfo) selectedObject); |
| performDelayedUpdate(); |
| } |
| } |
| |
| public void performNew() { |
| NamespaceInfo info = new NamespaceInfo(); |
| EditNamespaceInfoDialog dialog = invokeDialog(XMLUIMessages._UI_LABEL_NEW_NAMESPACE_INFORMATION, info); |
| if (dialog.getReturnCode() == Window.OK) { |
| namespaceInfoList.add(info); |
| performDelayedUpdate(); |
| } |
| } |
| |
| public void setNamespaceInfoList(List namespaceInfoList) { |
| this.namespaceInfoList = namespaceInfoList; |
| update(); |
| } |
| |
| public void setResourceLocation(IPath resourceLocation) { |
| this.resourceLocation = resourceLocation; |
| } |
| |
| public void setUpdateListener(UpdateListener updateListener) { |
| this.updateListener = updateListener; |
| } |
| |
| public void update() { |
| updateHelper(namespaceInfoList); |
| } |
| |
| public void updateButtonEnabledState() { |
| ISelection selection = tableViewer.getSelection(); |
| Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null; |
| NamespaceInfo info = (NamespaceInfo) selectedObject; |
| editButton.setEnabled(info != null); |
| deleteButton.setEnabled((info != null) && (info.getProperty("unremovable") == null)); //$NON-NLS-1$ |
| } |
| |
| public void updateHelper(List namespaceInfoList) { |
| if ((visibleRows != -1) && !dummyRowsRemoved) { |
| dummyRowsRemoved = true; |
| tableViewer.getTable().removeAll(); |
| } |
| ISelection selection = tableViewer.getSelection(); |
| tableViewer.setInput(namespaceInfoList); |
| if (selection.isEmpty()) { |
| if (namespaceInfoList.size() > 0) { |
| tableViewer.setSelection(new StructuredSelection(namespaceInfoList.get(0))); |
| } |
| } |
| else { |
| tableViewer.setSelection(selection); |
| } |
| } |
| } |