/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * * 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: * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.infra.hyperlink.ui; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor; import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry; import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.core.utils.EditorUtils; import org.eclipse.papyrus.infra.hyperlink.Activator; import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper; import org.eclipse.papyrus.infra.hyperlink.messages.Messages; import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject; import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkContentProvider; import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkLabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.plugin.AbstractUIPlugin; /** * this class is GUI that represent a tab for each kind of hyperlink * for example a tab for diagram, for web links... * */ //TODO change the methods to get images after the refactoring public class HyperLinkTab extends AbstractHyperLinkTab { /** * The Class DiagramContentProvider. */ protected CTabItem hyperlinksTab; protected Table hyperLinkListTable; protected Button newHyperLinkbutton; protected Button modifyHyperLinkButton; protected Button removeHyperLinkButton; protected Button upHyperLinkButton; protected Button downHyperLinkButton; protected TableViewer tableViewer; private HyperLinkContentProvider contentProvider; /** * * Constructor. * */ public HyperLinkTab() { //nothing to do } /** * * Constructor. * * @param tabId * @param helper */ public HyperLinkTab(String tabId, AbstractHyperLinkHelper helper) { super(tabId, helper); } /** * get TableVeiver * * @return */ public TableViewer getTableViewer() { return tableViewer; } /** * * @return the list of hyperlink displayed in the tab */ @Override public List<HyperLinkObject> getHyperlinkObjects() { return hyperlinkObjects; } /** * set list of hyperlinks to display in the tab * * @param hyperlinkObjects */ public void setHyperlinkObjects(List<HyperLinkObject> hyperlinkObjects) { this.hyperlinkObjects = hyperlinkObjects; } /** * * @see org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab#init(org.eclipse.swt.custom.CTabFolder, java.util.List, * org.eclipse.emf.ecore.EObject) * * @param cTabFolder * @param hyperlinkObjects * @param element */ @Override public void init(CTabFolder cTabFolder, List<HyperLinkObject> hyperlinkObjects, EObject element/* , IHyperLinkShell parent */) { super.init(cTabFolder, hyperlinkObjects, element /* , parent */); this.contentProvider = new HyperLinkContentProvider(); CTabItem cTabItem2 = new CTabItem(cTabFolder, SWT.NONE); cTabItem2.setText(hyperLinkHelper.getNameofManagedHyperLink() + Messages.HyperLinkTab_hyperLinks); Composite diagramComposite = new Composite(cTabFolder, SWT.NONE); cTabItem2.setControl(diagramComposite); GridData gridData4 = new GridData(); gridData4.horizontalAlignment = GridData.FILL; gridData4.verticalAlignment = GridData.CENTER; GridData gridData3 = new GridData(); gridData3.horizontalAlignment = GridData.FILL; gridData3.verticalAlignment = GridData.CENTER; GridData gridData2 = new GridData(); gridData2.horizontalAlignment = GridData.FILL; gridData2.verticalAlignment = GridData.CENTER; GridData gridData1 = new GridData(); gridData1.verticalAlignment = GridData.FILL; gridData1.grabExcessHorizontalSpace = true; gridData1.grabExcessVerticalSpace = true; gridData1.verticalSpan = 6; gridData1.horizontalAlignment = GridData.FILL; GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; gridLayout.makeColumnsEqualWidth = false; diagramComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); diagramComposite.setLayout(gridLayout); CLabel listLabel = new CLabel(diagramComposite, SWT.SHADOW_NONE); listLabel.setText(Messages.HyperLinkTab_Listof + hyperLinkHelper.getNameofManagedHyperLink() + Messages.HyperLinkTab_Hyperlink); listLabel.setEnabled(false); listLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); new Label(diagramComposite, SWT.NONE); hyperLinkListTable = new Table(diagramComposite, SWT.BORDER | SWT.MULTI); tableViewer = new TableViewer(hyperLinkListTable); newHyperLinkbutton = new Button(diagramComposite, SWT.NONE); newHyperLinkbutton.setText(""); //$NON-NLS-1$ newHyperLinkbutton.setImage(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/Add_16x16.gif").createImage()); //$NON-NLS-1$ //$NON-NLS-2$ newHyperLinkbutton.setLayoutData(gridData4); newHyperLinkbutton.setToolTipText("New hyperlink"); hyperLinkListTable.setHeaderVisible(false); hyperLinkListTable.setToolTipText(Messages.HyperLinkTab_SetOf + hyperLinkHelper.getNameofManagedHyperLink() + Messages.HyperLinkTab_Hyperlinks); hyperLinkListTable.setLayoutData(gridData1); hyperLinkListTable.setLinesVisible(false); modifyHyperLinkButton = new Button(diagramComposite, SWT.NONE); modifyHyperLinkButton.setImage(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/Modify.gif").createImage()); //$NON-NLS-1$ //$NON-NLS-2$ modifyHyperLinkButton.setToolTipText("Edit hyperlink"); removeHyperLinkButton = new Button(diagramComposite, SWT.NONE); removeHyperLinkButton.setText(""); //$NON-NLS-1$ removeHyperLinkButton.setImage(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/Delete_16x16.gif").createImage()); //$NON-NLS-1$ //$NON-NLS-2$ removeHyperLinkButton.setToolTipText("Remove hyperlink"); upHyperLinkButton = new Button(diagramComposite, SWT.NONE); upHyperLinkButton.setImage(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/ArrowUp_16x16.gif").createImage()); //$NON-NLS-1$ //$NON-NLS-2$ upHyperLinkButton.setToolTipText("Move hyperlink up"); upHyperLinkButton.setLayoutData(gridData2); downHyperLinkButton = new Button(diagramComposite, SWT.NONE); downHyperLinkButton.setImage(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/ArrowDown_16x16.gif").createImage()); //$NON-NLS-1$ //$NON-NLS-2$ downHyperLinkButton.setToolTipText("Move hyperlink down"); downHyperLinkButton.setLayoutData(gridData3); addListeners(); tableViewer.setContentProvider(contentProvider); IPageIconsRegistry editorRegistry = null; IMultiDiagramEditor papyrusEditor = EditorUtils.getMultiDiagramEditor(); try { editorRegistry = papyrusEditor.getServicesRegistry().getService(IPageIconsRegistry.class); } catch (ServiceException e) { Activator.log.error(e); } this.hyperlinkObjects = hyperLinkHelper.getFilteredObject(hyperlinkObjects); tableViewer.setLabelProvider(new HyperLinkLabelProvider(editorRegistry)); getTableViewer().setInput(this.hyperlinkObjects); } protected void addListeners() { getRemoveHyperLinkButton().addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { } public void mouseDown(MouseEvent e) { if(HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) { Iterator<?> iterator = ((IStructuredSelection)HyperLinkTab.this.getTableViewer().getSelection()).iterator(); while(iterator.hasNext()) { Object object = iterator.next(); HyperLinkTab.this.getHyperlinkObjects().remove(object); HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects()); } } } public void mouseDoubleClick(MouseEvent e) { } }); getUpHyperLinkButton().addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { } public void mouseDown(MouseEvent e) { if(HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) { Object elt = ((IStructuredSelection)HyperLinkTab.this.getTableViewer().getSelection()).getFirstElement(); if(HyperLinkTab.this.getHyperlinkObjects().indexOf(elt) == 0) { return; } Iterator<?> iterator = ((IStructuredSelection)HyperLinkTab.this.getTableViewer().getSelection()).iterator(); while(iterator.hasNext()) { HyperLinkObject currentHyperLinkDoc = (HyperLinkObject)iterator.next(); int index = HyperLinkTab.this.getHyperlinkObjects().indexOf(currentHyperLinkDoc); HyperLinkTab.this.getHyperlinkObjects().remove(currentHyperLinkDoc); HyperLinkTab.this.getHyperlinkObjects().add(index - 1, currentHyperLinkDoc); HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects()); } } } public void mouseDoubleClick(MouseEvent e) { } }); getDownHyperLinkButton().addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { } public void mouseDown(MouseEvent e) { if(HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) { Object[] block = ((IStructuredSelection)HyperLinkTab.this.getTableViewer().getSelection()).toArray(); if((HyperLinkTab.this.getHyperlinkObjects().indexOf(block[block.length - 1])) == HyperLinkTab.this.getHyperlinkObjects().size() - 1) { return; } for(int i = block.length - 1; i >= 0; i--) { HyperLinkObject currentobject = (HyperLinkObject)block[i]; int index = HyperLinkTab.this.getHyperlinkObjects().indexOf(currentobject); HyperLinkTab.this.getHyperlinkObjects().remove(currentobject); HyperLinkTab.this.getHyperlinkObjects().add(index + 1, currentobject); HyperLinkTab.this.getTableViewer().setInput(HyperLinkTab.this.getHyperlinkObjects()); } } } public void mouseDoubleClick(MouseEvent e) { } }); getNewHyperLinkbutton().addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { } public void mouseDown(MouseEvent e) { HyperLinkTab.this.hyperLinkHelper.executeNewMousePressed(HyperLinkTab.this.getHyperlinkObjects(), HyperLinkTab.this.element); HyperLinkTab.this.setInput(HyperLinkTab.this.getHyperlinkObjects()); } public void mouseDoubleClick(MouseEvent e) { } }); getModifyHyperLinkButton().addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { } public void mouseDown(MouseEvent e) { if(HyperLinkTab.this.getTableViewer().getTable().getSelection().length != 0) { HyperLinkObject hyperLinkObject = (HyperLinkObject)((IStructuredSelection)HyperLinkTab.this.getTableViewer().getSelection()).getFirstElement(); HyperLinkTab.this.hyperLinkHelper.executeEditMousePressed(HyperLinkTab.this.getHyperlinkObjects(), hyperLinkObject, HyperLinkTab.this.element); HyperLinkTab.this.setInput(HyperLinkTab.this.getHyperlinkObjects()); } } public void mouseDoubleClick(MouseEvent e) { } }); } /** * * @return get the button to create a hyperlinkObject */ private Button getNewHyperLinkbutton() { return newHyperLinkbutton; } /** * * @return the button to edit a hyperlinkObject */ private Button getModifyHyperLinkButton() { return modifyHyperLinkButton; } /** * * @return the button to remove a hyperlinkObject */ private Button getRemoveHyperLinkButton() { return removeHyperLinkButton; } /** * * @return the button to move up a hyperlinkObject */ private Button getUpHyperLinkButton() { return upHyperLinkButton; } /** * * @return the button to move down the hyperlinkObject */ private Button getDownHyperLinkButton() { return downHyperLinkButton; } /** * set as input a list of hyperlinkObject to display * * @param hyperlinkObjects * the lis of hyperlinkobjects */ @Override public void setInput(List<HyperLinkObject> hyperlinkObjects) { if(!getTableViewer().getControl().isDisposed()) { this.hyperlinkObjects = this.hyperLinkHelper.getFilteredObject(hyperlinkObjects); getTableViewer().setInput(this.hyperlinkObjects); } else { Activator.log.warn("This hyperlink tab has been disposed"); } } }