Hi Ugo,
Here's the source of a ConstantMappingDialog I did two years ago. This
was made from scratch so don't expect too much. It works with a helper
class called SciViSDisplay which is kind of wrapper for VisADDisplays.
Should be no problem to adept it for VisADDisplays.
Cheers, Mathias
> Hi,
>
> has anyone out there coded a "ConstantMap Dialog"? Let me explain: My
> app has some data, whose layout characteristics are defined by
> ConstantMaps (colour, transparency, fixed position, etc.). I found a
> very nice method in VisAD bag of goodies, the util package:
>
> visad.util.Util.getColorMaps(myFancyColor);
>
> returns a ConstantMap[] of colours.
>
> Now, I want to extend that by providing a GUI with the following:
>
> 1) A "Data Attributes" button, click to pop up a
>
> 2) Const. map Dialog
>
> This is simply a dialog with toggle buttons indicating the const map
> (much like in the style of the visad.ss.MappingDialog) and some sort of
> interface (combo box, spinner, text field, VisAD slider) to enter the
> value of the respective map. Then, clicking on an "OK" button would
> return a ConstantMap[].
>
> So, back to the question: has anyone got that and is willing to share?
>
> Thanks in advance,
>
> Ugo
package de.scivis;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import visad.*;
import visad.ss.MappingDialog;
import de.util.*;
/** ConstantMappingDialog stellt Möglichkeiten zur Manipulation von
* ConstantMaps zur Verfügung. ConstantMaps weisen im Gegensatz zu
* ScalarMaps einer Display-Variablen einen konstanten Wert zu. So kann
* z.B. die Transparenz (Alpha) auf einen konstanten Wert gesetzt werden.
* Andererseits können bei einer Farbdarstellung die Farbwerte auf 0 gesetzt
werden.
* Möchte man z.B. eine Darstellung der Gaskonzentration als blaues Gas, müssen
* die Farbwerte von Rot und Grün mit Hilfe des ConstantMappingDialogs auf 0
* gesetzt werden da deren Standardwerte immer 1 sind.
*/
public class ConstantMappingDialog extends JDialog implements ActionListener,
MouseListener {
private static Image mapsImage = null;
private JPanel imageCanvas;
private JPanel mainPanel = new JPanel();
private JPanel mapFromPanel = new JPanel();
private JPanel mapToPanel = new JPanel();
private JPanel currentMapsPanel = new JPanel();
private JPanel upperControlsPanel = new JPanel();
private JPanel lowerControlsPanel = new JPanel();
private JLabel mapFromLabel = new JLabel("Map from:");
private JLabel mapValueLabel = new JLabel("Map value:");
private JLabel mapToLabel = new JLabel("Map to:");
private JLabel currentMapsLabel = new JLabel("Current maps:");
private JTextField mapValueTextField = new JTextField(10);
private JList mapFromList;
private JList currentMapsList;
private JScrollPane currentMapsScrollPane;
private JButton clearAllButton = new JButton("Clear all");
private JButton clearSelectedButton = new JButton("Clear selected");
private JButton doneButton = new JButton("Done");
private JButton cancelButton = new JButton("Cancel");
private BoxLayout mainPanelBoxLayout = new BoxLayout(mainPanel,
BoxLayout.X_AXIS);
private BoxLayout mapFromBoxLayout = new BoxLayout(mapFromPanel,
BoxLayout.Y_AXIS);
private BoxLayout mapToBoxLayout = new BoxLayout(mapToPanel,
BoxLayout.Y_AXIS);
private BoxLayout currentMapsBoxLayout = new BoxLayout(currentMapsPanel,
BoxLayout.Y_AXIS);
private FlowLayout upperControlsPanelFlowLayout = new
FlowLayout(FlowLayout.CENTER);
private FlowLayout lowerControlsPanelFlowLayout = new
FlowLayout(FlowLayout.CENTER);
private boolean okPressed = false;
private int oldMouseX = -1, oldMouseY = -1;
private SciViSDisplay panel;
private Vector cMaps = new Vector();
/** Konstruiert einen ConstantMappingDialog. Als Parameter sind der
* aufrufende Frame und die Start-ConstantMaps nötig.
*/
ConstantMappingDialog(Frame parent, SciViSDisplay panel) {
super(parent, "Set up constant mappings", true);
this.panel = panel;
cMaps.add(panel.getConstantMapVector());
String[] dataNames = panel.getDataNames();
if (dataNames != null) {
for (int i = 0 ; i < dataNames.length ; i++) {
ConstantMap[] cm = panel.getDisplayData(dataNames[i]).getConstantMaps();
Vector cms = new Vector();
if (cm != null)
for (int j = 0 ; j < cm.length ; j++)
cms.add(cm[j]);
cMaps.add(cms);
}
}
init();
mapFromList.setSelectedIndex(0);
}
// Initialisiert den Dialog
private void init() {
cancelButton.setActionCommand("cancel");
cancelButton.addActionListener(this);
doneButton.setActionCommand("done");
doneButton.addActionListener(this);
clearSelectedButton.setActionCommand("clearSelected");
clearSelectedButton.addActionListener(this);
clearAllButton.setActionCommand("clearAll");
clearAllButton.addActionListener(this);
currentMapsList = new JList();
currentMapsScrollPane = new JScrollPane(currentMapsList);
currentMapsPanel.setLayout(currentMapsBoxLayout);
currentMapsPanel.add(currentMapsLabel);
currentMapsPanel.add(currentMapsScrollPane);
lowerControlsPanel.setLayout(lowerControlsPanelFlowLayout);
lowerControlsPanel.add(doneButton);
lowerControlsPanel.add(cancelButton);
upperControlsPanel.setLayout(upperControlsPanelFlowLayout);
upperControlsPanel.add(clearAllButton);
upperControlsPanel.add(clearSelectedButton);
mapToPanel.setLayout(mapToBoxLayout);
mapToPanel.add(mapToLabel);
if (mapsImage == null) {
MediaTracker tracker = new MediaTracker(this);
URL url = MappingDialog.class.getResource("display.gif");
mapsImage = Toolkit.getDefaultToolkit().getImage(url);
tracker.addImage(mapsImage, 0);
try {
tracker.waitForID(0);
} catch (InterruptedException exc) {
exc.printStackTrace();
}
}
imageCanvas = new JPanel() {
public void paint(Graphics g) {
g.drawImage(mapsImage, 0, 0, this);
}
};
Dimension imageSize = new Dimension(mapsImage.getWidth(this),
mapsImage.getHeight(this));
imageCanvas.setMaximumSize(imageSize);
imageCanvas.setMinimumSize(imageSize);
imageCanvas.setPreferredSize(imageSize);
imageCanvas.addMouseListener(this);
mapToPanel.add(imageCanvas);
mapToPanel.add(upperControlsPanel);
mapToPanel.add(lowerControlsPanel);
Vector mapFromVec = new Vector();
mapFromVec.add(panel.getName());
String[] dataNames = panel.getDataNames();
if (dataNames != null)
for (int i = 0 ; i < dataNames.length ; i++)
mapFromVec.add(dataNames[i]);
mapFromList = new JList(mapFromVec);
mapFromList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
mapFromList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
updateCurrentMapsList();
}
});
mapFromPanel.setLayout(mapFromBoxLayout);
mapFromPanel.add(mapFromLabel);
mapFromPanel.add(new JScrollPane(mapFromList));
mapFromPanel.add(mapValueLabel);
mapFromPanel.add(mapValueTextField);
mainPanel.setLayout(mainPanelBoxLayout);
mainPanel.add(mapFromPanel);
mainPanel.add(Box.createRigidArea(new Dimension(5, 1)));
mainPanel.add(mapToPanel);
mainPanel.add(Box.createRigidArea(new Dimension(5, 1)));
mainPanel.add(currentMapsPanel);
JPanel controlPanel = new JPanel(new BorderLayout());
getContentPane().setLayout(new BorderLayout());
getContentPane().add(mainPanel, BorderLayout.CENTER);
getContentPane().add(controlPanel, BorderLayout.NORTH);
mapValueTextField.setMaximumSize(new Dimension(4096,
mapValueTextField.getFont().getSize()+12));
this.pack();
Dimension size = mapToPanel.getSize();
mapToPanel.setMaximumSize(size);
mapToPanel.setMinimumSize(size);
size = this.getSize();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((screenSize.width-size.width)/2,
(screenSize.height-size.height)/2);
}
/** Bereitet den Dialog zur Darstellung vor. Wird initDialog() vor der ersten
* Darstellung aufgerufen, beschleunigt sich die Darstellung u.U. erheblich.
* initDialog() lädt zur Darstellung benötigte graphische Daten in den
Speicher.
* Dies geschieht nur einmal, da die graphischen Daten statisch im Speicher
* abgelegt werden, also allen Instanzen von ConstantMappingDialog zur
* Verfügung stehen.
*/
public static void initDialog() {
if (mapsImage == null) {
URL url = MappingDialog.class.getResource("display.gif");
mapsImage = Toolkit.getDefaultToolkit().getImage(url);
}
}
/** Macht den Dialog sichtbar.
*/
public void display() {
setVisible(true);
}
/** Nach Beendigung des Dialogs können hier die modifizierten ConstantMaps
* abgerufen werden. Es wird empfohlen diese Methode nur nach Aufruf der
* Methode okPressed() zu benutzen und dann auch nur falls deren Ergebnis
* positiv (true) war.
*/
public ConstantMap[] getMaps() {
/* ConstantMap[] newMaps = new ConstantMap[maps.size()];
maps.toArray(newMaps);
return newMaps;*/
return null;
}
protected void updateCurrentMapsList() {
int index = mapFromList.getSelectedIndex();
if (index > -1)
currentMapsList.setListData(makeMapNames((Vector)cMaps.get(index)));
}
private Vector makeMapNames(Vector maps) {
Vector mapNames = new Vector();
ConstantMap map;
for (int i = 0 ; i < maps.size() ; i++) {
map = (ConstantMap) maps.get(i);
String text = new String(map.getConstant()+" -> "+map.getDisplayScalar());
mapNames.add(text);
}
return mapNames;
}
/** Standardmethode des ActionListener-Interface.
*/
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("clearSelected")) {
int index = mapFromList.getSelectedIndex();
Vector maps = (Vector)cMaps.get(index);
int[] indices = currentMapsList.getSelectedIndices();
Arrays.sort(indices);
for (int i = indices.length-1 ; i > -1 ; i--)
maps.remove(indices[i]);
updateCurrentMapsList();
} else if (cmd.equals("clearAll")) {
int index = mapFromList.getSelectedIndex();
if (index > -1) {
((Vector)cMaps.get(index)).clear();
updateCurrentMapsList();
}
} else if (cmd.equals("done")) {
panel.setMaps(panel.getScalarMaps());
Vector cVec = (Vector)cMaps.get(0);
if (cVec.size() > 0) {
ConstantMap[] maps = new ConstantMap[cVec.size()];
cVec.toArray(maps);
panel.addMaps(maps);
}
String[] dataNames = panel.getDataNames();
for (int i = 1 ; i < cMaps.size() ; i++) {
cVec = (Vector)cMaps.get(i);
ConstantMap[] maps = null;
if (cVec.size() > 0) {
maps = new ConstantMap[cVec.size()];
cVec.toArray(maps);
}
panel.getDisplayData(dataNames[i-1]).setConstantMaps(maps);
}
setVisible(false);
panel.refreshDisplay();
} else if (cmd.equals("cancel")) {
setVisible(false);
}
}
/** Standardmethode des MouseListenerInterface.
*/
public void mouseClicked(MouseEvent e) {
}
/** Standardmethode des MouseListenerInterface.
*/
public void mousePressed(MouseEvent e) {
if (e.getComponent().equals(imageCanvas)) {
int x = e.getX()/40;
int y = e.getY()/40;
oldMouseX = x;
oldMouseY = y;
Graphics g = imageCanvas.getGraphics();
g.setXORMode(Color.white);
g.fillRect(x*40, y*40, 40, 40);
try {
String text = mapValueTextField.getText();
double value = Double.parseDouble(text);
DisplayRealType type = null;
switch (6*y+x) {
case 0: type = Display.XAxis; break;
case 1: type = Display.YAxis; break;
case 2: type = Display.ZAxis; break;
case 3: type = Display.YAxisOffset; break;
case 4: type = Display.YAxisOffset; break;
case 5: type = Display.ZAxisOffset; break;
case 6: type = Display.Latitude; break;
case 7: type = Display.Longitude; break;
case 8: type = Display.Radius; break;
case 9: type = Display.CylRadius; break;
case 10: type = Display.CylAzimuth; break;
case 11: type = Display.CylZAxis; break;
case 12: type = Display.Flow1X; break;
case 13: type = Display.Flow1Y; break;
case 14: type = Display.Flow1Z; break;
case 15: type = Display.Flow2X; break;
case 16: type = Display.Flow2Y; break;
case 17: type = Display.Flow2Z; break;
case 18: type = Display.Flow1Elevation; break;
case 19: type = Display.Flow1Azimuth; break;
case 20: type = Display.Flow1Radial; break;
case 21: type = Display.Flow2Elevation; break;
case 22: type = Display.Flow2Azimuth; break;
case 23: type = Display.Flow2Radial; break;
case 24: type = Display.Red; break;
case 25: type = Display.Green; break;
case 26: type = Display.Blue; break;
case 27: type = Display.RGB; break;
case 28: type = Display.RGBA; break;
case 29: type = Display.Alpha; break;
case 30: type = Display.Cyan; break;
case 31: type = Display.Magenta; break;
case 32: type = Display.Yellow; break;
case 33: type = Display.CMY; break;
case 34: type = Display.Animation; break;
case 35: type = Display.IsoContour; break;
case 36: type = Display.Hue; break;
case 37: type = Display.Saturation; break;
case 38: type = Display.Value; break;
case 39: type = Display.HSV; break;
case 40: type = Display.SelectValue; break;
case 41: type = Display.SelectRange; break;
case 43: type = Display.Text; break;
case 46: type = Display.Shape; break;
}
if (type == null) return;
ConstantMap map = new ConstantMap(value, type);
int index = mapFromList.getSelectedIndex();
if (index > -1) {
Vector cm = (Vector)cMaps.get(index);
for (int i = 0 ; i < cm.size() ; i++) {
if (((ConstantMap)cm.get(i)).getDisplayScalar().equals(type))
cm.remove(i);
}
cm.add(map);
updateCurrentMapsList();
}
} catch(NullPointerException exc1) {
JOptionPane pane = new JOptionPane("Please type in a valid double
value",
JOptionPane.ERROR_MESSAGE);
pane.createDialog(this, "").show();
exc1.printStackTrace();
} catch(NumberFormatException exc2) {
JOptionPane pane = new JOptionPane("Please type in a valid double
value",
JOptionPane.ERROR_MESSAGE);
pane.createDialog(this, "").show();
} catch(VisADException exc3) {
JOptionPane pane = new JOptionPane(exc3.getMessage(),
JOptionPane.ERROR_MESSAGE);
pane.createDialog(this, "").show();
}
}
}
/** Standardmethode des MouseListenerInterface.
*/
public void mouseReleased(MouseEvent e) {
if ((e.getComponent().equals(imageCanvas)) && (oldMouseX != -1) &&
(oldMouseY != -1)) {
Graphics g = imageCanvas.getGraphics();
g.setXORMode(Color.white);
g.fillRect(oldMouseX*40, oldMouseY*40, 40, 40);
oldMouseX = -1;
oldMouseY = -1;
}
}
/** Standardmethode des MouseListenerInterface.
*/
public void mouseEntered(MouseEvent e) {
}
/** Standardmethode des MouseListenerInterface.
*/
public void mouseExited(MouseEvent e) {
}
}