/*******************************************************************************
* Copyright (c) 2006-2009
* Software Technology Group, Dresden University of Technology
*
* 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:
* Software Technology Group - TU Dresden, Germany
* - initial API and implementation
******************************************************************************/
package org.reuseware.coconut.roundtrip.interactive.gui;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.ListModel;
import javax.swing.border.BevelBorder;
import org.eclipse.emf.common.util.URI;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.reuseware.coconut.fragment.util.CopiedFromAdapter;
import org.reuseware.coconut.roundtrip.IConflictResolveResultHandler;
import org.reuseware.coconut.roundtrip.interactive.compare.EMFCompareViewOpener;
/**
* MultipleUtilizationPane shows conflicts that may occur when fragments are
* used in multiple composition programs.
*
* @author Roland Samlaus
*/
public class MultipleUtilizationPane extends javax.swing.JDialog {
private static final long serialVersionUID = 7225834347574379097L;
private JDesktopPane conflictPane;
private JPanel candidatesPanel;
private JTextPane conflictDescription;
private JList candidatesList;
private JButton copyFragmentButton;
private JButton confirmButton;
private JButton discardButton;
//private boolean isactive = true;
//private String newSourceName;
private IConflictResolveResultHandler resultHandler;
private RoundTripAdapter adapter;
/**
* Constructor of MultipleUtilizationPane.
*
* @param compositionProgramUFIs
* UFIs of compositions programs where the source fragment is
* used in.
* @param resultHandler
* The GUI of type ConflitcsGUI that uses this Dialog
*/
public MultipleUtilizationPane(List<URI> compositionProgramUFIs,
RoundTripAdapter adapter,
IConflictResolveResultHandler resultHandler) {
super(new Frame());
this.adapter = adapter;
this.resultHandler = resultHandler;
initGUI(compositionProgramUFIs);
}
public void closePanel() {
dispose();
}
/**
* Opens the MultipleUtilizationPane.
*
* @param compositionProgramUFIs
* UFIs of composition programs that are using the source
* fragment that was edited by the user.
*/
public void initGUI(List<URI> compositionProgramUFIs) {
setTitle("Conflict");
addConflictPane();
addCandidatesPanel(compositionProgramUFIs);
addDiscardChangesButton();
addConfirmButton();
addCopyFragmentButton();
addConflictDescription();
setSize(393, 300);
pack();
setAlwaysOnTop(true);
setVisible(true);
}
private void addConflictDescription() {
conflictDescription = new JTextPane();
getContentPane().add(conflictDescription, BorderLayout.NORTH);
conflictDescription
.setText("Unresolved Conflict: The Fragment you edited is used in multiple Composition Programs. The following list shows all occurences. To view the result of changing the attribute, double-click the UFI of the source fragment.");
conflictDescription.setPreferredSize(new java.awt.Dimension(
385, 37));
}
private void addConflictPane() {
conflictPane = new JDesktopPane();
getContentPane().add(conflictPane, BorderLayout.CENTER);
conflictPane.setPreferredSize(new java.awt.Dimension(662, 229));
conflictPane.setBackground(new java.awt.Color(192, 192, 192));
}
private void addCandidatesPanel(List<URI> compositionProgramUFIs) {
candidatesPanel = new JPanel();
conflictPane.add(candidatesPanel);
candidatesPanel.setBounds(0, 12, 654, 176);
candidatesPanel.setBackground(new java.awt.Color(255, 255, 255));
candidatesPanel.setForeground(new java.awt.Color(255, 0, 0));
Object[] list = compositionProgramUFIs.toArray();
ListModel candidatesListModel = new DefaultComboBoxModel(
list);
candidatesList = new JList();
candidatesPanel.add(candidatesList);
candidatesList.setModel(candidatesListModel);
candidatesList.setPreferredSize(new java.awt.Dimension(
635, 164));
candidatesList.setBorder(BorderFactory
.createEtchedBorder(BevelBorder.LOWERED));
MouseAdapter ma = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() <= 1)
return;
int index = candidatesList.locationToIndex(e
.getPoint());
if (index < 0) {
return;
}
Object o = candidatesList.getModel().getElementAt(index);
//TODO jj: which objects are expected here?
if (o instanceof URI) {
showCompareView((URI) o);
}
}
};
candidatesList.addMouseListener(ma);
}
private void addDiscardChangesButton() {
discardButton = new JButton();
conflictPane.add(discardButton);
discardButton.setText("Discard changes");
discardButton.setBounds(12, 200, 92, 21);
discardButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
resultHandler.discardChanges(adapter);
}
});
}
private void addCopyFragmentButton() {
copyFragmentButton = new JButton();
conflictPane.add(copyFragmentButton);
copyFragmentButton.setText("Copy Fragment ...");
copyFragmentButton.setBounds(220, 200, 143, 21);
copyFragmentButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
resultHandler.copyFragment(adapter);
}
});
}
private void addConfirmButton() {
confirmButton = new JButton();
conflictPane.add(confirmButton);
confirmButton.setText("Confirm changes");
confirmButton.setBounds(115, 200, 94, 21);
confirmButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
resultHandler.confirmChanges(adapter);
}
});
}
/**
* Sets the models and opens the compare view.
*
* @param o
* Object that was double-clicked by user. (UFI)
*/
private void showCompareView(URI uri) {
final EMFCompareViewOpener viewOpener = new EMFCompareViewOpener();
viewOpener.setModelOne(uri);
resultHandler.preCompareAction(adapter);
viewOpener.setModelTwo(uri);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
IWorkbenchWindow dwindow = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IWorkbenchPage page = dwindow.getActivePage();
if (page != null) {
try {
viewOpener.openCompareView();
} catch (Exception pie) {
pie.printStackTrace();
}
}
}
});
resultHandler.postCompareAction(adapter);
}
}