// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.datatype;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.infinity.gui.ChildFrame;
import org.infinity.gui.InfinityScrollPane;
import org.infinity.gui.InfinityTextArea;
import org.infinity.gui.StringEditor;
import org.infinity.gui.StructViewer;
import org.infinity.gui.ViewFrame;
import org.infinity.icon.Icons;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.ResourceFactory;
import org.infinity.resource.StructEntry;
import org.infinity.resource.key.ResourceEntry;
import org.infinity.search.StringReferenceSearcher;
import org.infinity.util.StringResource;
public final class StringRef extends Datatype implements Editable, IsNumeric, IsTextual, ActionListener
{
private JButton bPlay, bEdit, bUpdate, bSearch;
private InfinityTextArea taRefText;
private JTextField tfRefNr;
private int value;
public StringRef(String name, int value)
{
this(null, name, value);
}
public StringRef(StructEntry parent, String name, int value)
{
super(parent, 0, 4, name);
this.value = value;
}
public StringRef(ByteBuffer buffer, int offset, String name)
{
this(null, buffer, offset, name);
}
public StringRef(StructEntry parent, ByteBuffer buffer, int offset, String name)
{
super(parent, offset, 4, name);
read(buffer, offset);
}
// --------------------- Begin Interface ActionListener ---------------------
@Override
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == tfRefNr || event.getSource() == bUpdate) {
taRefText.setText(StringResource.getStringRef(Integer.parseInt(tfRefNr.getText())));
String resname = StringResource.getWavResource(Integer.parseInt(tfRefNr.getText()));
bPlay.setEnabled(resname != null && ResourceFactory.resourceExists(resname + ".WAV"));
}
else if (event.getSource() == bEdit) {
StringEditor editor = null;
List<ChildFrame> frames = ChildFrame.getFrames(StringEditor.class);
for (int i = 0; i < frames.size(); i++) {
StringEditor e = (StringEditor)frames.get(i);
if (e.getPath().equals(StringResource.getPath()))
editor = e;
}
if (editor == null)
new StringEditor(StringResource.getPath(), Integer.parseInt(tfRefNr.getText()));
else {
editor.setVisible(true);
editor.showEntry(Integer.parseInt(tfRefNr.getText()));
}
}
else if (event.getSource() == bPlay) {
int newvalue = Integer.parseInt(tfRefNr.getText());
ResourceEntry entry = ResourceFactory.getResourceEntry(StringResource.getWavResource(newvalue) + ".WAV");
new ViewFrame(bPlay.getTopLevelAncestor(), ResourceFactory.getResource(entry));
}
else if (event.getSource() == bSearch)
new StringReferenceSearcher(Integer.parseInt(tfRefNr.getText()), bSearch.getTopLevelAncestor());
}
// --------------------- End Interface ActionListener ---------------------
// --------------------- Begin Interface Editable ---------------------
@Override
public JComponent edit(ActionListener container)
{
if (tfRefNr == null) {
tfRefNr = new JTextField(8);
tfRefNr.addActionListener(this);
taRefText = new InfinityTextArea(1, 200, true);
taRefText.setHighlightCurrentLine(false);
taRefText.setEditable(false);
taRefText.setLineWrap(true);
taRefText.setWrapStyleWord(true);
taRefText.setMargin(new Insets(3, 3, 3, 3));
bPlay = new JButton("Sound", Icons.getIcon(Icons.ICON_VOLUME_16));
bPlay.setToolTipText("Opens associated sound");
bPlay.addActionListener(this);
bEdit = new JButton("Edit", Icons.getIcon(Icons.ICON_EDIT_16));
bEdit.setToolTipText("Opens string editor");
bEdit.setMnemonic('e');
bEdit.addActionListener(this);
bSearch = new JButton("Find references...", Icons.getIcon(Icons.ICON_FIND_16));
bSearch.addActionListener(this);
bSearch.setMnemonic('f');
}
String resname = StringResource.getWavResource(value);
bPlay.setEnabled(resname != null && ResourceFactory.resourceExists(resname + ".WAV"));
taRefText.setText(StringResource.getStringRef(value));
taRefText.setCaretPosition(0);
InfinityScrollPane scroll = new InfinityScrollPane(taRefText, true);
scroll.setLineNumbersEnabled(false);
tfRefNr.setText(String.valueOf(value));
tfRefNr.setMinimumSize(tfRefNr.getPreferredSize());
JLabel label = new JLabel("StringRef: ");
label.setLabelFor(tfRefNr);
label.setDisplayedMnemonic('s');
bPlay.setMargin(new Insets(1, 3, 1, 3));
bEdit.setMargin(bPlay.getMargin());
bSearch.setMargin(bPlay.getMargin());
tfRefNr.setMinimumSize(new Dimension(tfRefNr.getPreferredSize().width, bPlay.getPreferredSize().height));
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 6, 0));
if (container != null) {
bUpdate = new JButton("Update value", Icons.getIcon(Icons.ICON_REFRESH_16));
bUpdate.setMargin(bPlay.getMargin());
bUpdate.setActionCommand(StructViewer.UPDATE_VALUE);
bUpdate.addActionListener(this);
bUpdate.addActionListener(container);
buttonPanel.add(bUpdate);
}
buttonPanel.add(bPlay);
buttonPanel.add(bEdit);
buttonPanel.add(bSearch);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel panel = new JPanel(gbl);
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 0, 3, 3);
gbc.fill = GridBagConstraints.NONE;
gbl.setConstraints(label, gbc);
panel.add(label);
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(tfRefNr, gbc);
panel.add(tfRefNr);
gbc.insets.right = 0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(buttonPanel, gbc);
panel.add(buttonPanel);
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(scroll, gbc);
panel.add(scroll);
panel.setMinimumSize(DIM_BROAD);
panel.setPreferredSize(DIM_BROAD);
return panel;
}
@Override
public void select()
{
}
@Override
public boolean updateValue(AbstractStruct struct)
{
int newvalue = Integer.parseInt(tfRefNr.getText());
String newstring = StringResource.getStringRef(newvalue);
if (newstring.equalsIgnoreCase("Error"))
return false;
value = newvalue;
// notifying listeners
fireValueUpdated(new UpdateEvent(this, struct));
return true;
}
// --------------------- End Interface Editable ---------------------
// --------------------- Begin Interface Writeable ---------------------
@Override
public void write(OutputStream os) throws IOException
{
writeInt(os, value);
}
// --------------------- End Interface Writeable ---------------------
//--------------------- Begin Interface Readable ---------------------
@Override
public int read(ByteBuffer buffer, int offset)
{
buffer.position(offset);
value = buffer.getInt();
return offset + getSize();
}
//--------------------- End Interface Readable ---------------------
@Override
public String toString()
{
return toString(false);
}
public String toString(boolean extended)
{
return toString(extended, false);
}
public String toString(boolean extended, boolean asPrefix)
{
return StringResource.getStringRef(value, extended, asPrefix);
}
//--------------------- Begin Interface IsNumeric ---------------------
@Override
public long getLongValue()
{
return (long)value & 0xffffffffL;
}
@Override
public int getValue()
{
return value;
}
//--------------------- End Interface IsNumeric ---------------------
//--------------------- Begin Interface IsTextual ---------------------
@Override
public String getText()
{
return StringResource.getStringRef(value);
}
//--------------------- End Interface IsTextual ---------------------
public void setValue(int newvalue)
{
value = newvalue;
taRefText.setText(StringResource.getStringRef(value));
tfRefNr.setText(String.valueOf(value));
String resname = StringResource.getWavResource(value);
bPlay.setEnabled(resname != null && ResourceFactory.resourceExists(resname + ".WAV"));
}
}