|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.merge.builtin.visualizer;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.TabbedPaneUI;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.actions.FileSystemAction;
import org.openide.awt.MouseUtils;
import org.openide.awt.JPopupMenuPlus;
import org.openide.cookies.CloseCookie;
import org.openide.cookies.SaveCookie;
import org.openide.nodes.Node;
import org.openide.windows.Mode;
import org.openide.windows.TopComponent;
import org.openide.windows.Workspace;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.WeakListener;
import org.openide.util.actions.CallableSystemAction;
import org.openide.util.actions.SystemAction;
import org.openide.windows.WindowManager;
/**
* This is a component, that acts as a non modal dialog.
* There are problems with accessibility to non-modal dialogs,
* therefore this approach was chosen.
* @author Martin Entlicher
*/
public class MergeDialogComponent extends TopComponent implements ChangeListener {
public static final String PROP_PANEL_CLOSING = "panelClosing"; // NOI18N
public static final String PROP_ALL_CLOSED = "allPanelsClosed"; // NOI18N
public static final String PROP_ALL_CANCELLED = "allPanelsCancelled"; // NOI18N
public static final String PROP_PANEL_SAVE = "panelSave"; // NOI18N
private Map nodesForPanels = new HashMap();
/** Creates new form MergeDialogComponent */
public MergeDialogComponent() {
initComponents();
okButton.setMnemonic(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_OK_Mnemonic").charAt(0)); // NOI18N
cancelButton.setMnemonic(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_Cancel_Mnemonic").charAt(0)); // NOI18N
helpButton.setMnemonic(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_Help_Mnemonic").charAt(0)); // NOI18N
initListeners();
putClientProperty("PersistenceType", "Never");
setName(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "MergeDialogComponent.title"));
getAccessibleContext().setAccessibleName(NbBundle.getMessage(MergeDialogComponent.class, "ACSN_Merge_Dialog_Component")); // NOI18N
getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(MergeDialogComponent.class, "ACSD_Merge_Dialog_Component")); // NOI18N
mergeTabbedPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(MergeDialogComponent.class, "ACSN_Merge_Tabbed_Pane")); // NOI18N
mergeTabbedPane.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(MergeDialogComponent.class, "ACSD_Merge_Tabbed_Pane")); // NOI18N
}
public HelpCtx getHelpCtx() {
return new HelpCtx(MergeDialogComponent.class);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
mergeTabbedPane = new javax.swing.JTabbedPane();
buttonsPanel = new javax.swing.JPanel();
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
helpButton = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
mergeTabbedPane.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
mergeTabbedPane.setPreferredSize(new java.awt.Dimension(600, 600));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(mergeTabbedPane, gridBagConstraints);
buttonsPanel.setLayout(new java.awt.GridBagLayout());
okButton.setText(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_OK"));
okButton.setToolTipText(org.openide.util.NbBundle.getBundle(MergeDialogComponent.class).getString("ACS_BTN_OKA11yDesc"));
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
buttonsPanel.add(okButton, gridBagConstraints);
cancelButton.setText(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_Cancel"));
cancelButton.setToolTipText(org.openide.util.NbBundle.getBundle(MergeDialogComponent.class).getString("ACS_BTN_CancelA11yDesc"));
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
buttonsPanel.add(cancelButton, gridBagConstraints);
helpButton.setText(org.openide.util.NbBundle.getMessage(MergeDialogComponent.class, "BTN_Help"));
helpButton.setToolTipText(org.openide.util.NbBundle.getBundle(MergeDialogComponent.class).getString("ACS_BTN_HelpA11yDesc"));
helpButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
buttonsPanel.add(helpButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 12, 11, 11);
add(buttonsPanel, gridBagConstraints);
}//GEN-END:initComponents
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
// Add your handling code here:
//List panelsToCloseList;
Component[] panels;
synchronized (this) {
panels = mergeTabbedPane.getComponents();
}
boolean warning = false;
ArrayList unsavedPanelNames = new ArrayList();
ArrayList saveCookies = new ArrayList();
for (int i = 0; i < panels.length; i++) {
MergePanel panel = (MergePanel) panels[i];
if((panel.getNumUnresolvedConflicts() > 0) && (!warning))
warning = true;
MergeNode node = (MergeNode) nodesForPanels.get(panel);
SaveCookie sc;
if ((sc = (SaveCookie) node.getCookie(SaveCookie.class)) != null) {
unsavedPanelNames.add(panel.getName());
saveCookies.add(sc);
}
}
Object ret;
if (unsavedPanelNames.size() == 1) {
ret = DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Confirmation((warning)?NbBundle.getMessage(MergeDialogComponent.class,"SaveFileWarningQuestion",unsavedPanelNames.get(0)):
NbBundle.getMessage(MergeDialogComponent.class,"SaveFileQuestion",unsavedPanelNames.get(0)),
NotifyDescriptor.YES_NO_CANCEL_OPTION));
} else if (unsavedPanelNames.size() > 1) {
ret = DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Confirmation((warning)?NbBundle.getMessage(MergeDialogComponent.class,"SaveFilesWarningQuestion",new Integer(unsavedPanelNames.size())):
NbBundle.getMessage(MergeDialogComponent.class,"SaveFilesQuestion",new Integer(unsavedPanelNames.size())),
NotifyDescriptor.YES_NO_CANCEL_OPTION));
} else {
if(warning){
ret = DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Confirmation(NbBundle.getMessage(MergeDialogComponent.class,"WarningQuestion",new Integer(unsavedPanelNames.size())),
NotifyDescriptor.YES_NO_CANCEL_OPTION));
if(ret.equals(NotifyDescriptor.NO_OPTION))
return;
}else
ret = NotifyDescriptor.YES_OPTION;
}
if (!NotifyDescriptor.YES_OPTION.equals(ret) && !NotifyDescriptor.NO_OPTION.equals(ret)) return ;
if (NotifyDescriptor.YES_OPTION.equals(ret)) {
try {
for (Iterator it = saveCookies.iterator(); it.hasNext(); ) {
SaveCookie sc = (SaveCookie) it.next();
sc.save();
}
} catch (java.io.IOException ioEx) {
DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(ioEx.getLocalizedMessage()));
return ;
}
}
for (int i = 0; i < panels.length; i++) {
MergePanel panel = (MergePanel) panels[i];
try {
fireVetoableChange(PROP_PANEL_CLOSING, null, panel);
} catch (PropertyVetoException pvex) {
return ;
}
removeMergePanel(panel);
}
}//GEN-LAST:event_okButtonActionPerformed
private void helpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpButtonActionPerformed
// Add your handling code here:
}//GEN-LAST:event_helpButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
// Add your handling code here:
synchronized (this) {
try {
fireVetoableChange(PROP_ALL_CANCELLED, null, null);
} catch (PropertyVetoException pvex) {}
close();
}
}//GEN-LAST:event_cancelButtonActionPerformed
protected void componentClosed() {
Component[] panels;
synchronized (this) {
try {
fireVetoableChange(PROP_ALL_CANCELLED, null, null);
} catch (PropertyVetoException pvex) {}
panels = mergeTabbedPane.getComponents();
}
for (int i = 0; i < panels.length; i++) {
MergePanel panel = (MergePanel) panels[i];
removeMergePanel(panel);
}
}
/** @return Preferred size of editor top component */
public Dimension getPreferredSize() {
Rectangle bounds = WindowManager.getDefault().getCurrentWorkspace().getBounds();
return new Dimension(bounds.width / 2, (int) (bounds.height / 1.25));
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTabbedPane mergeTabbedPane;
private javax.swing.JPanel buttonsPanel;
private javax.swing.JButton okButton;
private javax.swing.JButton cancelButton;
private javax.swing.JButton helpButton;
// End of variables declaration//GEN-END:variables
public void addNotify() {
super.addNotify();
javax.swing.JRootPane root = getRootPane();
if (root != null) root.setDefaultButton(okButton);
/*
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
javax.swing.JRootPane root = getRootPane();
if (root != null) root.setDefaultButton(okButton);
}
});
*/
}
private void initListeners() {
mergeTabbedPane.addMouseListener(new PopupMenuImpl());
mergeTabbedPane.addChangeListener(this);
}
public void open(Workspace workspace) {
super.open(workspace);
requestActive();
}
public synchronized void addMergePanel(MergePanel panel) {
mergeTabbedPane.addTab(panel.getName(), panel);
MergeNode node = new MergeNode(panel);
nodesForPanels.put(panel, node);
mergeTabbedPane.setSelectedComponent(panel);
setActivatedNodes(new Node[] { node });
}
public synchronized void removeMergePanel(MergePanel panel) {
mergeTabbedPane.remove(panel);
nodesForPanels.remove(panel);
if (mergeTabbedPane.getTabCount() == 0) {
try {
fireVetoableChange(PROP_ALL_CLOSED, null, null);
} catch (PropertyVetoException pvex) {
return ;
}
close();
}
}
public MergePanel getSelectedMergePanel() {
Component selected = mergeTabbedPane.getSelectedComponent();
if (selected == null || !(selected instanceof MergePanel)) return null;
return ((MergePanel) selected);
}
private static JPopupMenu createPopupMenu(MergePanel panel) {
JPopupMenu popup = new JPopupMenuPlus();
SystemAction[] actions = panel.getSystemActions();
for (int i = 0; i < actions.length; i++) {
if (actions[i] == null) {
popup.addSeparator();
} else if (actions[i] instanceof CallableSystemAction) {
popup.add(((CallableSystemAction)actions[i]).getPopupPresenter());
//add FileSystemAction to pop-up menu
} else if (actions[i] instanceof FileSystemAction) {
popup.add(((FileSystemAction)actions[i]).getPopupPresenter());
}
}
return popup;
}
/** Shows given popup on given coordinations and takes care about the
* situation when menu can exceed screen limits.
* Copied from org.netbeans.core.windows.frames.DefaultContainerImpl
*/
private static void showPopupMenu(JPopupMenu popup, Point p, Component comp) {
SwingUtilities.convertPointToScreen(p, comp);
Dimension popupSize = popup.getPreferredSize();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if (p.x + popupSize.width > screenSize.width) {
p.x = screenSize.width - popupSize.width;
}
if (p.y + popupSize.height > screenSize.height) {
p.y = screenSize.height - popupSize.height;
}
SwingUtilities.convertPointFromScreen(p, comp);
popup.show(comp, p.x, p.y);
}
/** Listen on tabbed pane merge panel selection */
public void stateChanged(javax.swing.event.ChangeEvent changeEvent) {
MergePanel panel = (MergePanel) mergeTabbedPane.getSelectedComponent();
if (panel != null) {
Node node = (Node) nodesForPanels.get(panel);
if (node != null) {
setActivatedNodes(new Node[] { node });
}
}
}
/** Popup menu reaction implementation */
private class PopupMenuImpl extends MouseUtils.PopupMouseAdapter {
/** Called when the seqeunce of mouse events should lead to actual
* showing of the popup menu. */
protected void showPopup(java.awt.event.MouseEvent mouseEvent) {
TabbedPaneUI tabUI = mergeTabbedPane.getUI();
int clickTab = tabUI.tabForCoordinate(mergeTabbedPane, mouseEvent.getX(), mouseEvent.getY());
MergePanel panel = getSelectedMergePanel();
if (panel == null) {
return;
}
if (clickTab != -1) {
//Click is on valid tab, not on empty area in tab
showPopupMenu(createPopupMenu(panel), mouseEvent.getPoint(), mergeTabbedPane);
}
}
}
private class MergeNode extends org.openide.nodes.AbstractNode implements PropertyChangeListener, SaveCookie {
private Reference mergePanelRef;
public MergeNode(MergePanel panel) {
super(org.openide.nodes.Children.LEAF);
panel.addPropertyChangeListener(WeakListener.propertyChange(this, panel));
mergePanelRef = new WeakReference(panel);
getCookieSet().add(new CloseCookieImpl());
//activateSave();
}
private void activateSave() {
getCookieSet().add(this);
}
private void deactivateSave() {
getCookieSet().remove(this);
}
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
if (MergePanel.PROP_CAN_BE_SAVED.equals(propertyChangeEvent.getPropertyName())) {
activateSave();
} else if (MergePanel.PROP_CAN_NOT_BE_SAVED.equals(propertyChangeEvent.getPropertyName())) {
deactivateSave();
}
}
public void save() throws java.io.IOException {
try {
MergeDialogComponent.this.fireVetoableChange(PROP_PANEL_SAVE, null, mergePanelRef.get());
} catch (PropertyVetoException vetoEx) {
throw new java.io.IOException(vetoEx.getLocalizedMessage());
}
//System.out.println("SAVE called.");
//deactivateSave();
}
private class CloseCookieImpl extends Object implements CloseCookie {
public boolean close() {
try {
MergeDialogComponent.this.fireVetoableChange(PROP_PANEL_CLOSING, null, mergePanelRef.get());
} catch (PropertyVetoException vetoEx) {
return false;
}
removeMergePanel((MergePanel) mergePanelRef.get());
return true;
}
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.