diff --git a/src/main/java/com/romraider/Settings.java b/src/main/java/com/romraider/Settings.java index 12fe31ad..c8ab6da4 100644 --- a/src/main/java/com/romraider/Settings.java +++ b/src/main/java/com/romraider/Settings.java @@ -167,6 +167,7 @@ public class Settings implements Serializable { private Color axisColor = new Color(255, 255, 255); private Color warningColor = new Color(255, 0, 0); private int tableClickCount = 1; // number of clicks to open table + private int tableClickBehavior = 0; // TableTreeNode click behavior. 0=open/close frame, 1=open/focus frame private String loggerPort; private String loggerPortDefault; @@ -208,6 +209,7 @@ public class Settings implements Serializable { private boolean openExpanded = true; private boolean showTableToolbarBorder = false; + private boolean alwaysOpenTableAtZero = false; private static Map phidgetSensors; @@ -396,6 +398,16 @@ public class Settings implements Serializable { this.tableClickCount = tableClickCount; } + public int getTableClickBehavior() { + return tableClickBehavior; + } + + public void setTableClickBehavior(int clickBehavior) { + // 0 = open/close + // 1 = open/focus + this.tableClickBehavior = clickBehavior; + } + public String getRecentVersion() { return recentVersion; } @@ -766,6 +778,14 @@ public class Settings implements Serializable { this.showTableToolbarBorder = showBorder; } + public boolean isAlwaysOpenTableAtZero() { + return alwaysOpenTableAtZero; + } + + public void setAlwaysOpenTableAtZero(boolean openAtZero) { + this.alwaysOpenTableAtZero = openAtZero; + } + public static final Map getPhidgetSensors() { return Settings.phidgetSensors; } diff --git a/src/main/java/com/romraider/editor/ecu/ECUEditor.java b/src/main/java/com/romraider/editor/ecu/ECUEditor.java index 4069d440..ec82f656 100644 --- a/src/main/java/com/romraider/editor/ecu/ECUEditor.java +++ b/src/main/java/com/romraider/editor/ecu/ECUEditor.java @@ -55,6 +55,7 @@ import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JCheckBox; +import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -279,6 +280,7 @@ public class ECUEditor extends AbstractFrame { public void addRom(Rom input) { input.refreshDisplayedTables(); + input.applyTableColorSettings(); // add to ecu image list pane getImageRoot().add(input); @@ -320,20 +322,48 @@ public class ECUEditor extends AbstractFrame { infoPanel.add(check); showMessageDialog(this, infoPanel, "ECU Revision is Obsolete", INFORMATION_MESSAGE); } - input.applyTableColorSettings(); } public void displayTable(TableFrame frame) { try { + // check if frame has been added. + for(JInternalFrame curFrame : getRightPanel().getAllFrames()) { + if(curFrame.equals(frame)) { + // table is already open. + if(1 == getSettings().getTableClickBehavior()) { // open/focus frame + // table is already open, so set focus on the frame. + boolean selected = true; + frame.toFront(); + try { + frame.setSelected(true); + } catch (PropertyVetoException e) { + frame.toBack(); + selected = false; + } + if(selected) { + frame.requestFocusInWindow(); + } + } else { // default to open/close frame + // table is already open, so close the frame. + rightPanel.remove(frame); + frame.setVisible(false); + try { + frame.setClosed(true); + } catch (PropertyVetoException e) { + ; // Do nothing. + } + frame.dispose(); + } + frame.pack(); + rightPanel.repaint(); + return; + } + } + + // frame not added. add the frame. rightPanel.add(frame); } catch (IllegalArgumentException ex) { - // table is already open, so set focus - frame.toFront(); - try { - frame.setSelected(true); - } catch (PropertyVetoException e) { - } - frame.requestFocusInWindow(); + ;// Do nothing. } frame.pack(); rightPanel.repaint(); diff --git a/src/main/java/com/romraider/swing/MDIDesktopPane.java b/src/main/java/com/romraider/swing/MDIDesktopPane.java index 9851ebfe..489030b7 100644 --- a/src/main/java/com/romraider/swing/MDIDesktopPane.java +++ b/src/main/java/com/romraider/swing/MDIDesktopPane.java @@ -59,30 +59,36 @@ public class MDIDesktopPane extends JDesktopPane { } public Component add(JInternalFrame frame) { - JInternalFrame[] array = getAllFrames(); Point p; int w; int h; - // check if frame has been added. - for(JInternalFrame curFrame : array) { - if(curFrame.equals(frame)) { - throw new IllegalArgumentException("The frame has been added."); + // get frame location. + if(getEditor().getSettings().isAlwaysOpenTableAtZero()) { + p = new Point(0, 0); + } else { + if (getAllFrames().length > 0) { + JInternalFrame selectedFrame = getSelectedFrame(); + if(null == selectedFrame) { + // if none selected get the location at index 0. + p = getAllFrames()[0].getLocation(); + } else { + // get the selected frame location and open off of that location. + p = selectedFrame.getLocation(); + } + + p.x = p.x + Settings.FRAME_OFFSET; + p.y = p.y + Settings.FRAME_OFFSET; + } else { + p = new Point(0, 0); } } Component retval = super.add(frame); + frame.setLocation(p.x, p.y); + checkDesktopSize(); - if (array.length > 0) { - p = array[0].getLocation(); - p.x = p.x + Settings.FRAME_OFFSET; - p.y = p.y + Settings.FRAME_OFFSET; - } else { - p = new Point(0, 0); - } - - frame.setLocation(p.x, p.y); if (frame.isResizable()) { w = getWidth() - (getWidth() / 3); h = getHeight() - (getHeight() / 3); @@ -114,9 +120,7 @@ public class MDIDesktopPane extends JDesktopPane { @Override public void remove(Component c) { super.remove(c); - getEditor().getTableToolBar().updateTableToolBar(); - checkDesktopSize(); } diff --git a/src/main/java/com/romraider/swing/SettingsForm.java b/src/main/java/com/romraider/swing/SettingsForm.java index d9a64097..e0d1352c 100644 --- a/src/main/java/com/romraider/swing/SettingsForm.java +++ b/src/main/java/com/romraider/swing/SettingsForm.java @@ -30,6 +30,7 @@ import java.io.File; import java.util.StringTokenizer; import javax.swing.ButtonGroup; +import javax.swing.DefaultComboBoxModel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JCheckBox; @@ -40,6 +41,7 @@ import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; import javax.swing.border.TitledBorder; import ZoeloeSoft.projects.JFontChooser.JFontChooser; @@ -75,6 +77,7 @@ public class SettingsForm extends JFrame implements MouseListener { btnRemoveAssocs.addMouseListener(this); tableClickCount.setBackground(Color.WHITE); + tableClickBehavior.setBackground(Color.WHITE); // disable file association buttons if user is not in Windows StringTokenizer osName = new StringTokenizer(System.getProperties().getProperty("os.name")); @@ -114,6 +117,12 @@ public class SettingsForm extends JFrame implements MouseListener { tableClickCount.setSelectedIndex(1); } + if(1 == settings.getTableClickBehavior()) { // open/focus + tableClickBehavior.setSelectedIndex(1); + } else { // open/close + tableClickBehavior.setSelectedIndex(0); + } + valueLimitWarning.setSelected(settings.isValueLimitWarning()); warningColor.setBackground(settings.getWarningColor()); @@ -130,6 +139,7 @@ public class SettingsForm extends JFrame implements MouseListener { chckbxShowTableToolbar.setSelected(settings.isShowTableToolbarBorder()); chckbxOpenRomNode.setSelected(settings.isOpenExpanded()); + chckbxOpenTablesAt.setSelected(settings.isAlwaysOpenTableAtZero()); } // //GEN-BEGIN:initComponents @@ -176,13 +186,11 @@ public class SettingsForm extends JFrame implements MouseListener { extensionBin = new javax.swing.JCheckBox(); btnAddAssocs = new javax.swing.JButton(); btnRemoveAssocs = new javax.swing.JButton(); - jLabel1 = new javax.swing.JLabel(); - tableClickCount = new javax.swing.JComboBox(); editorIconsPanel = new javax.swing.JPanel(); - tableIconsPanel = new javax.swing.JPanel();; - - chckbxShowTableToolbar = new JCheckBox("Show table toolbar border"); - chckbxOpenRomNode = new JCheckBox("Open rom node expanded"); + tableIconsPanel = new javax.swing.JPanel(); + tableClickBehavior = new javax.swing.JComboBox(); + labelTableClick = new javax.swing.JLabel(); + tableClickCount = new javax.swing.JComboBox(); clipboardButtonGroup = new ButtonGroup(); rdbtnDefault = new JRadioButton("RomRaider Default"); @@ -399,10 +407,6 @@ public class SettingsForm extends JFrame implements MouseListener { .add(extensionBin))) ); - jLabel1.setText("click to open tables"); - - tableClickCount.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Single", "Double"})); - initTabs(); settingsTabbedPane.addTab("General", jPanelDefault); @@ -448,52 +452,100 @@ public class SettingsForm extends JFrame implements MouseListener { }// //GEN-END:initComponents private void initTabs() { + + JPanel panelUISettings = new JPanel(); + panelUISettings.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "UI Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); // Init Default Tab Panel GroupLayout jPanelDefaultLayout = new GroupLayout(jPanelDefault); jPanelDefaultLayout.setHorizontalGroup( jPanelDefaultLayout.createParallelGroup(Alignment.LEADING) .addGroup(jPanelDefaultLayout.createSequentialGroup() + .addContainerGap() .addGroup(jPanelDefaultLayout.createParallelGroup(Alignment.LEADING) - .addGroup(jPanelDefaultLayout.createSequentialGroup() - .addContainerGap() - .addGroup(jPanelDefaultLayout.createParallelGroup(Alignment.LEADING) - .addComponent(calcConflictWarning) - .addComponent(obsoleteWarning) - .addGroup(jPanelDefaultLayout.createSequentialGroup() - .addComponent(tableClickCount, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(jLabel1))) - .addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(jPanelDefaultLayout.createSequentialGroup() - .addContainerGap() - .addComponent(chckbxOpenRomNode)) - .addGroup(jPanelDefaultLayout.createSequentialGroup() - .addContainerGap() - .addComponent(chckbxShowTableToolbar)) - .addGroup(jPanelDefaultLayout.createSequentialGroup() - .addContainerGap() - .addComponent(debug))) - .addContainerGap()) + .addComponent(panelUISettings, GroupLayout.DEFAULT_SIZE, 407, Short.MAX_VALUE) + .addComponent(obsoleteWarning) + .addComponent(calcConflictWarning) + .addComponent(debug)) + .addContainerGap()) ); jPanelDefaultLayout.setVerticalGroup( jPanelDefaultLayout.createParallelGroup(Alignment.LEADING) .addGroup(jPanelDefaultLayout.createSequentialGroup() .addContainerGap() - .addGroup(jPanelDefaultLayout.createParallelGroup(Alignment.BASELINE) - .addComponent(jLabel1) + .addComponent(obsoleteWarning) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(calcConflictWarning) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(debug) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(panelUISettings, GroupLayout.PREFERRED_SIZE, 173, GroupLayout.PREFERRED_SIZE) + .addContainerGap(267, Short.MAX_VALUE)) + ); + chckbxOpenRomNode = new JCheckBox("Open rom node expanded"); + + chckbxShowTableToolbar = new JCheckBox("Show table toolbar border"); + + panelTreeSettings = new JPanel(); + panelTreeSettings.setBorder(new TitledBorder(null, "Rom Tree Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + + chckbxOpenTablesAt = new JCheckBox("Always open tables at [0,0]"); + GroupLayout gl_panelUISettings = new GroupLayout(panelUISettings); + gl_panelUISettings.setHorizontalGroup( + gl_panelUISettings.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelUISettings.createSequentialGroup() + .addGroup(gl_panelUISettings.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxOpenRomNode) + .addComponent(chckbxShowTableToolbar)) + .addContainerGap(244, Short.MAX_VALUE)) + .addComponent(panelTreeSettings, GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE) + .addGroup(gl_panelUISettings.createSequentialGroup() + .addComponent(chckbxOpenTablesAt) + .addContainerGap()) + ); + gl_panelUISettings.setVerticalGroup( + gl_panelUISettings.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelUISettings.createSequentialGroup() + .addComponent(chckbxOpenRomNode) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(chckbxShowTableToolbar) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(chckbxOpenTablesAt) + .addPreferredGap(ComponentPlacement.RELATED, 12, Short.MAX_VALUE) + .addComponent(panelTreeSettings, GroupLayout.PREFERRED_SIZE, 69, GroupLayout.PREFERRED_SIZE)) + ); + + labelTableClick.setText("Click to open tables"); + tableClickCount.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Single", "Double"})); + tableClickBehavior.setModel(new DefaultComboBoxModel(new String[] {"open/close", "open/focus"})); + + lblClickBehavior = new JLabel("Table click behavior"); + GroupLayout gl_panelTreeSettings = new GroupLayout(panelTreeSettings); + gl_panelTreeSettings.setHorizontalGroup( + gl_panelTreeSettings.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelTreeSettings.createSequentialGroup() + .addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.LEADING) + .addComponent(tableClickCount, 0, 72, Short.MAX_VALUE) + .addComponent(tableClickBehavior, 0, 86, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.LEADING) + .addComponent(labelTableClick) + .addComponent(lblClickBehavior)) + .addGap(200)) + ); + gl_panelTreeSettings.setVerticalGroup( + gl_panelTreeSettings.createParallelGroup(Alignment.LEADING) + .addGroup(gl_panelTreeSettings.createSequentialGroup() + .addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.BASELINE) + .addComponent(labelTableClick) .addComponent(tableClickCount, GroupLayout.PREFERRED_SIZE, 18, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(obsoleteWarning) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(calcConflictWarning) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(chckbxOpenRomNode) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(chckbxShowTableToolbar) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(debug) - .addContainerGap(378, Short.MAX_VALUE)) + .addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.BASELINE) + .addComponent(lblClickBehavior) + .addComponent(tableClickBehavior, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(23, Short.MAX_VALUE)) ); + panelTreeSettings.setLayout(gl_panelTreeSettings); + panelUISettings.setLayout(gl_panelUISettings); jPanelDefault.setLayout(jPanelDefaultLayout); // Init Table Display Tab @@ -787,6 +839,7 @@ public class SettingsForm extends JFrame implements MouseListener { getSettings().setSaveDebugTables(saveDebugTables.isSelected()); getSettings().setDebug(debug.isSelected()); getSettings().setOpenExpanded(chckbxOpenRomNode.isSelected()); + getSettings().setAlwaysOpenTableAtZero(chckbxOpenTablesAt.isSelected()); getSettings().setShowTableToolbarBorder(chckbxShowTableToolbar.isSelected()); getSettings().setMaxColor(maxColor.getBackground()); @@ -807,6 +860,12 @@ public class SettingsForm extends JFrame implements MouseListener { getSettings().setTableClickCount(2); } + if(1 == tableClickBehavior.getSelectedIndex()) { // open/close frame + getSettings().setTableClickBehavior(1); + } else { // open/focus frame + getSettings().setTableClickBehavior(0); + } + getSettings().setValueLimitWarning(valueLimitWarning.isSelected()); getSettings().setWarningColor(warningColor.getBackground()); @@ -887,7 +946,8 @@ public class SettingsForm extends JFrame implements MouseListener { private javax.swing.JCheckBox extensionHex; private javax.swing.JLabel highlightColor; private javax.swing.JLabel increaseColor; - private javax.swing.JLabel jLabel1; + private javax.swing.JLabel labelTableClick; + private javax.swing.JLabel lblClickBehavior; private javax.swing.JTabbedPane settingsTabbedPane; private javax.swing.JPanel jPanelDefault; private javax.swing.JPanel jPanelClipboard; @@ -924,4 +984,7 @@ public class SettingsForm extends JFrame implements MouseListener { private JTextField textFieldEditorIconScale; private javax.swing.JCheckBox chckbxShowTableToolbar; private javax.swing.JCheckBox chckbxOpenRomNode; + private JPanel panelTreeSettings; + private javax.swing.JComboBox tableClickBehavior; + private javax.swing.JCheckBox chckbxOpenTablesAt; } \ No newline at end of file diff --git a/src/main/java/com/romraider/xml/DOMSettingsBuilder.java b/src/main/java/com/romraider/xml/DOMSettingsBuilder.java index 345f082d..4df22bec 100644 --- a/src/main/java/com/romraider/xml/DOMSettingsBuilder.java +++ b/src/main/java/com/romraider/xml/DOMSettingsBuilder.java @@ -153,6 +153,11 @@ public final class DOMSettingsBuilder { tableClickCount.setAttribute("value", String.valueOf(settings.getTableClickCount())); options.appendChild(tableClickCount); + // table click behavior + IIOMetadataNode tableClickBehavior = new IIOMetadataNode("tableclickbehavior"); + tableClickBehavior.setAttribute("value", String.valueOf(settings.getTableClickBehavior())); + options.appendChild(tableClickBehavior); + // last version used IIOMetadataNode version = new IIOMetadataNode("version"); version.setAttribute("value", versionNumber); @@ -183,6 +188,11 @@ public final class DOMSettingsBuilder { openRomExpanded.setAttribute("value", String.valueOf(settings.isOpenExpanded())); options.appendChild(openRomExpanded); + // show table toolbar border + IIOMetadataNode alwaysOpenTableAtZero = new IIOMetadataNode("alwaysopentableatzero"); + alwaysOpenTableAtZero.setAttribute("value", String.valueOf(settings.isAlwaysOpenTableAtZero())); + options.appendChild(alwaysOpenTableAtZero); + return options; } diff --git a/src/main/java/com/romraider/xml/DOMSettingsUnmarshaller.java b/src/main/java/com/romraider/xml/DOMSettingsUnmarshaller.java index ab83de8f..51a46ec4 100644 --- a/src/main/java/com/romraider/xml/DOMSettingsUnmarshaller.java +++ b/src/main/java/com/romraider/xml/DOMSettingsUnmarshaller.java @@ -142,6 +142,9 @@ public final class DOMSettingsUnmarshaller { } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tableclickcount")) { settings.setTableClickCount(unmarshallAttribute(n, "value", 2)); + } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tableclickbehavior")) { + settings.setTableClickBehavior(unmarshallAttribute(n, "value", 0)); + } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("version")) { settings.setRecentVersion(unmarshallAttribute(n, "value", "")); @@ -160,6 +163,9 @@ public final class DOMSettingsUnmarshaller { } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("openromexpanded")) { settings.setOpenExpanded(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); + } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("alwaysopentableatzero")) { + settings.setAlwaysOpenTableAtZero(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); + } } return settings;