diff --git a/client/src/org/compiere/grid/VPanel.java b/client/src/org/compiere/grid/VPanel.java index 0c90640884..7c87ff8f61 100644 --- a/client/src/org/compiere/grid/VPanel.java +++ b/client/src/org/compiere/grid/VPanel.java @@ -1,1070 +1,1080 @@ -/****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * - * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it * - * under the terms version 2 of the GNU General Public License as published * - * by the Free Software Foundation. This program is distributed in the hope * - * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * - * For the text or an alternative of this public license, you may reach us * - * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * - * or via info@compiere.org or http://www.compiere.org/license.html * - * @contributor Victor Perez , e-Evolution.SC FR [ 1757088 ] - *****************************************************************************/ -package org.compiere.grid; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Event; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.JPanel; -import javax.swing.KeyStroke; -import javax.swing.border.CompoundBorder; - -import org.adempiere.plaf.AdempierePLAF; -import org.compiere.apps.APanel; -import org.compiere.grid.ed.VButton; -import org.compiere.grid.ed.VCheckBox; -import org.compiere.grid.ed.VEditor; -import org.compiere.grid.ed.VEditorFactory; -import org.compiere.grid.ed.VLine; -import org.compiere.model.GridField; -import org.compiere.model.X_AD_FieldGroup; -import org.compiere.swing.CLabel; -import org.compiere.swing.CPanel; -import org.compiere.swing.CTabbedPane; -import org.compiere.swing.CollapsiblePanel; -import org.compiere.util.CLogger; -import org.compiere.util.DisplayType; -import org.compiere.util.Language; -import org.compiere.util.Util; -import org.jdesktop.swingx.JXCollapsiblePane; -import org.jdesktop.swingx.border.DropShadowBorder; - -/** - * Single Row Panel. - * Called from GridController - *
- *	Structure
- *		this (CPanel - Group Bag Layout)
- *			group
- *			label - field
- *
- *  Spacing:
- *  -------------------
- *  Total Top = 10+2
- *  Total Right = 0+12
- *  Total Left = 0+12
- *  Total Bottom = 3+9
- *  -------------------
- *       2
- *  12 Label 0+5 Field 0
- *       3+2=5
- *  12 Label 0+5 Field 0
- *       3
- *
- *  
- * @author Jorg Janke - * @version $Id: VPanel.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $ - * @contributor Victor Perez , e-Evolution.SC FR [ 1757088 ] - */ -public final class VPanel extends CTabbedPane -{ - - private int m_WindowNo; - - public VPanel(String Name) - { - this(Name, 0); - } - - /** - * - * @param Name - * @param WindowNo - */ - public VPanel(String Name, int WindowNo) - { - m_WindowNo = WindowNo; - - //set up map used for label and field alignment - labels.put(0, new ArrayList()); - labels.put(2, new ArrayList()); - // for the case of a right-to-left-language (e.g. arabic) - labels.put(1, new ArrayList()); - labels.put(3, new ArrayList()); - - - fields.put(1, new ArrayList()); - fields.put(3, new ArrayList()); - // for the case of a right-to-left-language (e.g. arabic) - fields.put(0, new ArrayList()); - fields.put(2, new ArrayList()); - - fillers.put(0, new ArrayList()); - fillers.put(2, new ArrayList()); - // for the case of a right-to-left-language (e.g. arabic) - fillers.put(1, new ArrayList()); - fillers.put(3, new ArrayList()); - - //[ 1757088 ] - m_main.setName(Name); - setupMainPanelLayout(m_main); - m_main.setBorder(new CompoundBorder(m_main.getBorder(), BorderFactory.createEmptyBorder(10, 12, 0, 12))); - m_tablist.put("main", m_main); - this.setBorder(marginBorder); - - CPanel dummy = new CPanel(); - dummy.setLayout(new BorderLayout()); - dummy.add(m_main, BorderLayout.NORTH); - dummy.setName(m_main.getName()); - this.add(dummy); - - // Set initial values of constraint - m_gbc.anchor = GridBagConstraints.NORTHWEST; - m_gbc.gridy = 0; // line - m_gbc.gridx = 0; - m_gbc.gridheight = 1; - m_gbc.gridwidth = 1; - m_gbc.insets = m_zeroInset; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - m_gbc.weightx = 0; - m_gbc.weighty = 0; - m_gbc.ipadx = 0; - m_gbc.ipady = 0; - - - } // VPanel - - /** GridBag Constraint */ - private GridBagConstraints m_gbc = new GridBagConstraints(); - - /** Orientation */ - private final boolean m_leftToRight = Language.getLoginLanguage().isLeftToRight(); - /** Label Inset */ - private final Insets m_labelInset = - m_leftToRight ? new Insets(1,12,1,0) : new Insets(1,5,1,0); // top,left,bottom,right - private final Insets m_firstLabelInset = - m_leftToRight ? new Insets(1,0,1,0) : new Insets(1,5,1,0); // top,left,bottom,right - /** Field Inset */ - private final Insets m_fieldInset = - m_leftToRight ? new Insets(1,5,1,0) : new Insets(1,12,1,0); // top,left,bottom,right - /** Zero Inset */ - private final Insets m_zeroInset = new Insets(0,0,0,0); - // - private int m_line = 0; - private boolean m_hGapAdded = false; // only once - /** Previous Field Group Header */ - private String m_oldFieldGroup = null; - /** Previous Field Group Type */ - private String m_oldFieldGroupType = null; - //[ 1757088 ] - private java.util.Hashtable m_tablist = new java.util.Hashtable(); - private java.util.Hashtable m_tabincludelist = new java.util.Hashtable(); - private CPanel m_main = new CPanel(org.compiere.plaf.CompiereColor.getDefaultBackground()); - private DropShadowBorder marginBorder = new DropShadowBorder(); - - private HashMap> labels = new HashMap>(); - - private HashMap> fields = new HashMap>(); - - private HashMap> fillers = new HashMap>(); - - private HashMap collapsibleEndFiller = new HashMap(); - - /** Logger */ - private static CLogger log = CLogger.getCLogger (VPanel.class); - - - /** - * Set Field Mnemonic - * @param mField field - */ - public void setMnemonic (GridField mField) - { - if (mField.isCreateMnemonic()) - return; - String text = mField.getHeader(); - int pos = text.indexOf('&'); - if (pos != -1 && text.length() > pos) // We have a nemonic - creates Ctrl_Shift_ - { - char mnemonic = text.toUpperCase().charAt(pos+1); - if (mnemonic != ' ') - { - if (!m_mnemonics.contains(mnemonic)) - { - mField.setMnemonic(mnemonic); - m_mnemonics.add(mnemonic); - } - else - log.warning(mField.getColumnName() - + " - Conflict - Already exists: " + mnemonic + " (" + text + ")"); - } - } - } // setMnemonic - - /** - * Add Field and Label to Panel - * @param editor editor - * @param mField field model - */ - public void addField (VEditor editor, GridField mField) - { - //[ 1757088 ] - int AD_Tab_ID = mField.getIncluded_Tab_ID(); - if(AD_Tab_ID != 0 ) - { - m_gbc.gridx = 0; - m_gbc.gridy = m_line++; - CollapsiblePanel m_tab = new CollapsiblePanel(""); - m_tabincludelist.put(AD_Tab_ID, m_tab); - m_gbc.anchor = GridBagConstraints.NORTHWEST; - m_gbc.gridx = 0; - m_gbc.gridheight = 1; - m_gbc.insets = new Insets(2,0,0,0); - m_gbc.gridy = m_line++; - m_gbc.gridwidth = 5; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - m_gbc.weightx = 1; - m_gbc.ipadx = 0; - m_main.add(m_tab,m_gbc); - m_tab.setName("IncludedTab#"+AD_Tab_ID); - - if (includedTabList.containsKey(AD_Tab_ID)) - { - includeTab(includedTabList.get(AD_Tab_ID)); - } - return; - } - - CLabel label = VEditorFactory.getLabel(mField); - if (label == null && editor == null) - return; - - boolean sameLine = mField.isSameLine(); - //[ 1757088 ] // sets top - String fieldGroup = mField.getFieldGroup(); - String fieldGroupType = mField.getFieldGroupType(); - if (Util.isEmpty(fieldGroup)) - { - fieldGroup = m_oldFieldGroup; - fieldGroupType = m_oldFieldGroupType; - } - - if (addGroup(fieldGroup, fieldGroupType)) // sets top - { - if (X_AD_FieldGroup.FIELDGROUPTYPE_Collapse.equals(fieldGroupType)) - { - CollapsiblePanel panel = (CollapsiblePanel) m_tablist.get(fieldGroup); - panel.getCollapsiblePane().setCollapsed(mField.getIsCollapsedByDefault()); - } - sameLine = false; - } - else - { - fieldGroup = m_oldFieldGroup; - fieldGroupType = m_oldFieldGroupType; - } - - if (sameLine) // Set line # - m_gbc.gridy = m_line-1; - else - m_gbc.gridy = m_line++; - - // *** The Label *** - if (label != null) - { - m_gbc.gridwidth = 1; - m_gbc.insets = m_labelInset; - m_gbc.fill = GridBagConstraints.HORIZONTAL; // required for right justified - // Set column # - if (m_leftToRight) - m_gbc.gridx = sameLine ? 2 : 0; - else - m_gbc.gridx = sameLine | mField.isLongField() ? 3 : 1; - if (m_gbc.gridx == 0) - m_gbc.insets = m_firstLabelInset; - // Weight factor for Label - m_gbc.weightx = 0; - // - if (mField.isCreateMnemonic()) - setMnemonic(label, mField.getMnemonic()); - // Add Label - //[ 1757088 ] - //this.add(label, m_gbc); - if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) - { - CPanel m_tab = (CPanel)m_tablist.get(fieldGroup); - m_tab.add(label, m_gbc); - - } - else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) - { - CollapsiblePanel m_tab = (CollapsiblePanel) m_tablist.get(fieldGroup); - if (m_gbc.gridx == 0) - m_gbc.insets = m_firstLabelInset; - m_tab.getCollapsiblePane().getContentPane().add(label, m_gbc); - labels.get(m_gbc.gridx).add(label); - - moveCollapsibleEndFiller(m_tab.getCollapsiblePane()); - } - else // Label or null - { - m_main.add(label, m_gbc); - labels.get(m_gbc.gridx).add(label); - } - } - - // *** The Field *** - if (editor != null) - { - Component field = (Component)editor; - // Default Width - m_gbc.gridwidth = mField.isLongField() ? 3 : 1; - m_gbc.insets = m_fieldInset; - // m_gbc.fill = GridBagConstraints.NONE; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - // Set column # - if (m_leftToRight) - m_gbc.gridx = sameLine ? 3 : 1; - else - m_gbc.gridx = sameLine ? 2 : 0; - // Weight factor for Fields - m_gbc.weightx = 1; - // Add Field - //[ 1757088 ] - if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) - { - CPanel m_tab = (CPanel)m_tablist.get(fieldGroup); - m_tab.add(field, m_gbc); - } - else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) - { - boolean textArea = false; - CollapsiblePanel m_tab = (CollapsiblePanel) m_tablist.get(fieldGroup); - if (mField.getDisplayType() == DisplayType.Text - || mField.getDisplayType() == DisplayType.TextLong - || mField.getDisplayType() == DisplayType.Memo) - { - textArea = true; - } - if (textArea) - { - m_gbc.gridheight = 1; - m_gbc.weighty = 1; - m_gbc.fill = GridBagConstraints.BOTH; - } - m_tab.getCollapsiblePane().getContentPane().add(field, m_gbc); - if (textArea) - { - m_gbc.gridheight = 1; - m_gbc.weighty = 0; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - } - - if (!mField.isLongField()) - fields.get(m_gbc.gridx).add(field); - - moveCollapsibleEndFiller(m_tab.getCollapsiblePane()); - } - else // Label or null - { - m_main.add(field, m_gbc); - if (!mField.isLongField()) - fields.get(m_gbc.gridx).add(field); - } - // Link Label to Field - if (label != null) - label.setLabelFor(field); - else if (mField.isCreateMnemonic()) - setMnemonic(editor, mField.getMnemonic()); - } - } // addField - - /** - * Move the end spacer of the collapsible pane - * @param collapsiblePane - */ - private void moveCollapsibleEndFiller(JXCollapsiblePane collapsiblePane) { - Component end = collapsibleEndFiller.get(collapsiblePane); - if (end != null) { - collapsiblePane.getContentPane().remove(end); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridheight = 1; - gbc.gridwidth = 1; - gbc.gridx = 0; - gbc.gridy = m_gbc.gridy + 1; - collapsiblePane.getContentPane().add(end, gbc); - } - } - - /** - * Add Group - * @param fieldGroup field group - * @param fieldGroupType - * @return true if group added - */ - private boolean addGroup(String fieldGroup, String fieldGroupType) - { - // First time - add top - if (m_oldFieldGroup == null) - { - m_oldFieldGroup = ""; - m_oldFieldGroupType = ""; - } - - if (fieldGroup == null || fieldGroup.length() == 0 || fieldGroup.equals(m_oldFieldGroup)) - return false; - - //[ 1757088 ] - if (m_tablist.get(fieldGroup) != null) - { - return false; - } - - //[ 1757088 ] - if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) - { - - CPanel m_tab = new CPanel(); - m_tab.setBackground(AdempierePLAF.getFormBackground()); - setupTabPanelLayout(m_tab); - m_tab.setName(fieldGroup); - CPanel dummy = new CPanel(); - dummy.setLayout(new BorderLayout()); - dummy.add(m_tab, BorderLayout.NORTH); - dummy.setName(m_tab.getName()); - dummy.setBorder(BorderFactory.createEmptyBorder(10,12,0,12)); - this.add(dummy); - m_tablist.put(fieldGroup, m_tab); - } - else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) - { - CollapsiblePanel collapsibleSection = new CollapsiblePanel(fieldGroup); - JXCollapsiblePane m_tab = collapsibleSection.getCollapsiblePane(); - m_tab.setAnimated(false); - m_tab.getContentPane().setBackground(AdempierePLAF.getFormBackground()); - setupCollapsiblePaneLayout(m_tab); - CompoundBorder border = (CompoundBorder)m_tab.getBorder(); - m_tab.setBorder(new CompoundBorder(border.getOutsideBorder(), BorderFactory.createEmptyBorder(0, 0, 2, 0))); - collapsibleSection.setName(fieldGroup); - m_gbc.anchor = GridBagConstraints.NORTHWEST; - //m_gbc.gridy = 0; // line - m_gbc.gridx = 0; - m_gbc.gridheight = 1; - if (m_oldFieldGroup.length() > 0 && m_oldFieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) - m_gbc.insets = new Insets(0,0,3,0); - else - m_gbc.insets = new Insets(3,0,3,0); - m_gbc.gridy = m_line++; - m_gbc.gridwidth = 4; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - m_gbc.weightx = 1; - m_main.add(collapsibleSection,m_gbc); - m_tablist.put(fieldGroup, collapsibleSection); - } - else // Label or null - { - CPanel group = new CPanel(); - group.setBorder(new VLine(fieldGroup)); - group.add(Box.createVerticalStrut(VLine.SPACE)); - m_gbc.gridx = 0; - m_gbc.gridy = m_line++; - m_gbc.gridwidth = 4; - m_main.add(group, m_gbc); - // reset - m_gbc.gridwidth = 1; - } - m_oldFieldGroup = fieldGroup; - m_oldFieldGroupType = fieldGroupType; - return true; - } // addGroup - - /** - * Set up the gridbaglayout for additonal field group tab - * @param m_tab - */ - private void setupMainPanelLayout(CPanel m_tab) { - m_tab.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.gridy = 0; // line - gbc.gridx = 0; - gbc.gridheight = 0; - gbc.gridwidth = 1; - gbc.insets = m_firstLabelInset; - gbc.fill = GridBagConstraints.NONE; - gbc.weightx = 0; - gbc.weighty = 0; - gbc.ipadx = 0; - gbc.ipady = 0; - CLabel label = new CLabel(""); - fillers.get(0).add(label); - m_tab.add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 1; - gbc.insets = m_fieldInset; - label = new CLabel(""); - fields.get(1).add(label); - m_tab.add(label, gbc); - - gbc.weightx = 0; - gbc.gridx = 2; - gbc.insets = m_labelInset; - label = new CLabel(""); - fillers.get(2).add(label); - m_tab.add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 3; - gbc.insets = m_fieldInset; - label = new CLabel(""); - fields.get(3).add(label); - m_tab.add(label, gbc); - - //right gap - gbc.weightx = 1; - gbc.gridx = 4; - m_tab.add(Box.createHorizontalGlue(), gbc); - - } - - /** - * Set up the gridbaglayout for additonal field group tab - * @param m_tab - */ - private void setupTabPanelLayout(CPanel m_tab) { - m_tab.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.gridy = 0; // line - gbc.gridx = 0; - gbc.gridheight = 0; - gbc.gridwidth = 1; - gbc.insets = m_firstLabelInset; - gbc.fill = GridBagConstraints.NONE; - gbc.weightx = 0; - gbc.weighty = 0; - gbc.ipadx = 0; - gbc.ipady = 0; - CLabel label = new CLabel(""); - m_tab.add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 1; - gbc.insets = m_fieldInset; - label = new CLabel(""); - m_tab.add(label, gbc); - - gbc.weightx = 0; - gbc.gridx = 2; - gbc.insets = m_labelInset; - label = new CLabel(""); - m_tab.add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 3; - gbc.insets = m_fieldInset; - fields.get(3).add(label); - m_tab.add(label, gbc); - - //right gap - gbc.weightx = 1; - gbc.gridx = 4; - m_tab.add(Box.createHorizontalGlue(), gbc); - - } - - /** - * Set up the grid bag layout of collapsible pane - * @param m_tab - */ - private void setupCollapsiblePaneLayout(JXCollapsiblePane m_tab) { - m_tab.getContentPane().setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.gridy = 0; // line - gbc.gridx = 0; - gbc.gridheight = 0; - gbc.gridwidth = 1; - gbc.insets = m_firstLabelInset; - gbc.fill = GridBagConstraints.NONE; - gbc.weightx = 0; - gbc.weighty = 0; - gbc.ipadx = 0; - gbc.ipady = 0; - CLabel label = new CLabel(""); - fillers.get(0).add(label); - m_tab.getContentPane().add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 1; - gbc.insets = m_fieldInset; - label = new CLabel(""); - fields.get(1).add(label); - m_tab.getContentPane().add(label, gbc); - - gbc.weightx = 0; - gbc.gridx = 2; - gbc.insets = m_labelInset; - label = new CLabel(""); - fillers.get(2).add(label); - m_tab.getContentPane().add(label, gbc); - - gbc.weightx = 1; - gbc.gridx = 3; - gbc.insets = m_fieldInset; - label = new CLabel(""); - fields.get(3).add(label); - m_tab.getContentPane().add(label, gbc); - - //right gap - /* - gbc.weightx = 1; - gbc.gridx = 4; - m_tab.getContentPane().add(Box.createHorizontalGlue(), gbc);*/ - - Component c = Box.createVerticalStrut(3); - gbc.gridheight = 1; - gbc.gridy = GridBagConstraints.RELATIVE; - gbc.gridx = 0; - gbc.weightx = 0; - gbc.insets = m_zeroInset; - m_tab.getContentPane().add(c, gbc); - collapsibleEndFiller.put(m_tab, c); - } - - /** - * Add End (9) of Form - */ - public void addEnd() - { - m_gbc.gridx = 0; - m_gbc.gridy = m_line; - m_gbc.gridwidth = 1; - m_gbc.insets = m_zeroInset; - m_gbc.fill = GridBagConstraints.HORIZONTAL; - m_gbc.weightx = 0; - // - //[ 1757088 ] - m_main.add(Box.createVerticalStrut(9), m_gbc); - } // addEnd - - /** - * Set Mnemonic for Label CTRL_SHIFT_x - * @param label label - * @param predefinedMnemonic predefined Mnemonic - */ - private void setMnemonic (CLabel label, char predefinedMnemonic) - { - String text = label.getText(); - int pos = text.indexOf('&'); - if (pos != -1 && predefinedMnemonic != 0) - { - text = text.substring(0, pos) + text.substring(pos+1); - label.setText(text); - label.setSavedMnemonic(predefinedMnemonic); - m_fields.add(label); - log.finest(predefinedMnemonic + " - " + label.getName()); - } - else - { - char mnemonic = getMnemonic(text, label); - if (mnemonic != 0) - label.setSavedMnemonic(mnemonic); - // label.setDisplayedMnemonic(mnemonic); - } - } // setMnemonic - - /** - * Set Mnemonic for Check Box or Button - * @param editor check box or button - other ignored - * @param predefinedMnemonic predefined Mnemonic - */ - private void setMnemonic (VEditor editor, char predefinedMnemonic) - { - if (editor instanceof VCheckBox) - { - VCheckBox cb = (VCheckBox)editor; - String text = cb.getText(); - int pos = text.indexOf('&'); - if (pos != -1 && predefinedMnemonic != 0) - { - text = text.substring(0, pos) + text.substring(pos+1); - cb.setText(text); - cb.setSavedMnemonic(predefinedMnemonic); - m_fields.add(cb); - log.finest(predefinedMnemonic + " - " + cb.getName()); - } - else - { - char mnemonic = getMnemonic(text, cb); - if (mnemonic != 0) - cb.setSavedMnemonic(mnemonic); - // cb.setMnemonic(mnemonic); - } - } - // Button - else if (editor instanceof VButton) - { - VButton b = (VButton)editor; - String text = b.getText(); - int pos = text.indexOf('&'); - if (pos != -1 && predefinedMnemonic != 0) - { - text = text.substring(0, pos) + text.substring(pos+1); - b.setText(text); - b.setSavedMnemonic(predefinedMnemonic); - m_fields.add(b); - log.finest(predefinedMnemonic + " - " + b.getName()); - } - else if (b.getColumnName().equals("DocAction")) - { - b.getInputMap(WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, Event.SHIFT_MASK, false), "pressed"); - b.getInputMap(WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, Event.SHIFT_MASK, true), "released"); - // Util.printActionInputMap(b); - } - else if (b.getColumnName().equals("Posted")) - { - b.getInputMap(WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, Event.SHIFT_MASK, false), "pressed"); - b.getInputMap(WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, Event.SHIFT_MASK, true), "released"); - // Util.printActionInputMap(b); - } - else - { - char mnemonic = getMnemonic(text, b); - if (mnemonic != 0) - b.setSavedMnemonic(mnemonic); - } - } - } // setMnemonic - - /** - * Get Mnemonic from text - * @param text text - * @param source component - * @return Mnemonic or 0 if not unique - */ - private char getMnemonic (String text, Component source) - { - if (text == null || text.length() == 0) - return 0; - String oText = text; - text = text.trim().toUpperCase(); - char mnemonic = text.charAt(0); - if (m_mnemonics.contains(mnemonic)) - { - mnemonic = 0; - // Beginning new word - int index = text.indexOf(' '); - while (index != -1 && text.length() > index) - { - char c = text.charAt(index+1); - if (Character.isLetterOrDigit(c) && !m_mnemonics.contains(c)) - { - mnemonic = c; - break; - } - index = text.indexOf(' ', index+1); - } - // Any character - if (mnemonic == 0) - { - for (int i = 1; i < text.length(); i++) - { - char c = text.charAt(i); - if (Character.isLetterOrDigit(c) && !m_mnemonics.contains(c)) - { - mnemonic = c; - break; - } - } - } - // Nothing found - if (mnemonic == 0) - { - log.finest("None for: " + oText); - return 0; // if first char would be returned, the first occurance is invalid. - } - } - m_mnemonics.add(mnemonic); - m_fields.add(source); - log.finest(mnemonic + " - " + source.getName()); - return mnemonic; - } // getMnemonic - - /** Used Mnemonics */ - private ArrayList m_mnemonics = new ArrayList(30); - /** Mnemonic Fields */ - private ArrayList m_fields = new ArrayList(30); - - private HashMap includedTabList = new HashMap(); - - /** - * Set Window level Mnemonics - * @param set true if set otherwise unregiser - */ - public void setMnemonics (boolean set) - { - int size = m_fields.size(); - for (int i = 0; i < size; i++) - { - Component c = m_fields.get(i); - if (c instanceof CLabel) - { - CLabel l = (CLabel)c; - if (set) - l.setDisplayedMnemonic(l.getSavedMnemonic()); - else - l.setDisplayedMnemonic(0); - } - else if (c instanceof VCheckBox) - { - VCheckBox cb = (VCheckBox)c; - if (set) - cb.setMnemonic(cb.getSavedMnemonic()); - else - cb.setMnemonic(0); - } - else if (c instanceof VButton) - { - VButton b = (VButton)c; - if (set) - b.setMnemonic(b.getSavedMnemonic()); - else - b.setMnemonic(0); - } - } - } // setMnemonics - - /************************************************************************** - * Set Background to AD_Color_ID (nop) - * @param AD_Color_ID Color - */ - public void setBackground (int AD_Color_ID) - { - } // setBackground - - - private void findChildComponents(CPanel container, List list) - { - Component[] comp = container.getComponents(); - for (int c = 0; c < comp.length; c++) - { - list.add(comp[c]); - if ( comp [c] instanceof CollapsiblePanel) - { - CollapsiblePanel collapsiblePanel = (CollapsiblePanel)comp [c]; - - Component[] nestedComps = collapsiblePanel.getCollapsiblePane() - .getContentPane().getComponents(); - - for (int y = 0; y < nestedComps.length; y++) - { - - if ( nestedComps [y] instanceof CPanel) - { - CPanel nestedPanel = (CPanel)nestedComps[y]; - Component[] nestedPanelComps = nestedPanel.getComponents(); - - for (int x = 0; x < nestedPanelComps.length; x++) - { - list.add(nestedPanelComps[x]); - } - } - else - { - list.add(nestedComps[y]); - } - } - } else if (comp[c] instanceof CPanel) - { - - findChildComponents((CPanel)comp[c], list); - } - } - } - - //[ 1757088 ] - public Component[] getComponentsRecursive() - { - java.util.ArrayList list = new java.util.ArrayList(); - - for (int i = 0; i < this.getTabCount(); i++) - { - list.add(this.getComponentAt(i)); - if (this.getComponentAt(i) instanceof CPanel) - { - CPanel panel = (CPanel)this.getComponentAt(i); - findChildComponents(panel, list); - } - } - - Component[] result = new Component[list.size ()]; - list.toArray (result); - return result; - } - - @Override - public void doLayout() { - //align labels - int w = 0; - Collection clabels = labels.get(0); - for (CLabel l : clabels) { - if (l.isVisible()) { - int lw = l.getPreferredSize().width; - if (lw > w) w = lw; - } - } - - for (CLabel l : clabels) { - if (l.isVisible()) { - Dimension d = l.getMinimumSize(); - if (d.width != w) { - d.width = w; - l.setMinimumSize(d); - } - - } - } - - clabels = fillers.get(0); - for (CLabel l : clabels) { - if (l.isVisible()) { - Dimension d = l.getMinimumSize(); - if (d.width != w) { - d.width = w; - l.setMinimumSize(d); - } - } - } - - w = 0; - clabels = labels.get(2); - for (CLabel l : clabels) { - if (l.isVisible()) { - int lw = l.getPreferredSize().width; - if (lw > w) w = lw; - } - } - - for (CLabel l : clabels) { - if (l.isVisible()) { - Dimension d = l.getMinimumSize(); - if (d.width != w) { - d.width = w; - l.setMinimumSize(d); - } - } - } - - clabels = fillers.get(2); - for (CLabel l : clabels) { - if (l.isVisible()) { - Dimension d = l.getMinimumSize(); - if (d.width != w) { - d.width = w; - l.setMinimumSize(d); - } - } - } - - //align fields - w = 0; - Collection collection = fields.get(1); - for (Component c : collection) { - if (c.isVisible()) { - int cw = c.getPreferredSize().width; - if ( cw > w ) - w = cw; - } - } - - for (Component c : collection) { - if (c.isVisible()) { - Dimension d = c.getMinimumSize(); - if ( d.width != w ) { - d.width = w; - c.setMinimumSize(d); - } - d = c.getPreferredSize(); - if (d.width != w) { - d.width = w; - c.setPreferredSize(d); - } - } - } - - w = 0; - collection = fields.get(3); - for (Component c : collection) { - if (c.isVisible()) { - int cw = c.getPreferredSize().width; - if ( cw > w ) - w = cw; - } - } - - for (Component c : collection) { - if (c.isVisible()) { - Dimension d = c.getMinimumSize(); - if ( d.width != w ) { - d.width = w; - c.setMinimumSize(d); - } - d = c.getPreferredSize(); - if (d.width != w) { - d.width = w; - c.setPreferredSize(d); - } - } - } - - super.doLayout(); - } - - /** - * - * @param detail - */ - public void includeTab(GridController detail) { - CollapsiblePanel section = m_tabincludelist.get(detail.getMTab().getAD_Tab_ID()); - if(section != null) - { - APanel panel = new APanel(detail, m_WindowNo); - String name = detail.getMTab().getName() + ""; - section.setTitle(name); - section.getCollapsiblePane().getContentPane().setLayout(new BorderLayout()); - section.getCollapsiblePane().getContentPane().add(panel, BorderLayout.CENTER); - } - - //this can be call before addField - if (!includedTabList.containsKey(detail.getMTab().getAD_Tab_ID())) - includedTabList.put(detail.getMTab().getAD_Tab_ID(), detail); - } - - -} // VPanel \ No newline at end of file +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + * @contributor Victor Perez , e-Evolution.SC FR [ 1757088 ] + *****************************************************************************/ +package org.compiere.grid; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Event; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JPanel; +import javax.swing.KeyStroke; +import javax.swing.border.CompoundBorder; + +import org.adempiere.plaf.AdempierePLAF; +import org.compiere.apps.APanel; +import org.compiere.grid.ed.VButton; +import org.compiere.grid.ed.VCheckBox; +import org.compiere.grid.ed.VEditor; +import org.compiere.grid.ed.VEditorFactory; +import org.compiere.grid.ed.VLine; +import org.compiere.model.GridField; +import org.compiere.model.X_AD_FieldGroup; +import org.compiere.swing.CLabel; +import org.compiere.swing.CPanel; +import org.compiere.swing.CTabbedPane; +import org.compiere.swing.CollapsiblePanel; +import org.compiere.util.CLogger; +import org.compiere.util.DisplayType; +import org.compiere.util.Language; +import org.compiere.util.Util; +import org.jdesktop.swingx.JXCollapsiblePane; +import org.jdesktop.swingx.border.DropShadowBorder; + +/** + * Single Row Panel. + * Called from GridController + *
+ *	Structure
+ *		this (CPanel - Group Bag Layout)
+ *			group
+ *			label - field
+ *
+ *  Spacing:
+ *  -------------------
+ *  Total Top = 10+2
+ *  Total Right = 0+12
+ *  Total Left = 0+12
+ *  Total Bottom = 3+9
+ *  -------------------
+ *       2
+ *  12 Label 0+5 Field 0
+ *       3+2=5
+ *  12 Label 0+5 Field 0
+ *       3
+ *
+ *  
+ * @author Jorg Janke + * @version $Id: VPanel.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $ + * @contributor Victor Perez , e-Evolution.SC FR [ 1757088 ] + * Carlos Ruiz - globalqss / Fix bug 2307133 - Swing client hiding fields incorrectly + */ +public final class VPanel extends CTabbedPane +{ + + private int m_WindowNo; + + public VPanel(String Name) + { + this(Name, 0); + } + + /** + * + * @param Name + * @param WindowNo + */ + public VPanel(String Name, int WindowNo) + { + m_WindowNo = WindowNo; + + //set up map used for label and field alignment + labels.put(0, new ArrayList()); + labels.put(2, new ArrayList()); + // for the case of a right-to-left-language (e.g. arabic) + labels.put(1, new ArrayList()); + labels.put(3, new ArrayList()); + + + fields.put(1, new ArrayList()); + fields.put(3, new ArrayList()); + // for the case of a right-to-left-language (e.g. arabic) + fields.put(0, new ArrayList()); + fields.put(2, new ArrayList()); + + fillers.put(0, new ArrayList()); + fillers.put(2, new ArrayList()); + // for the case of a right-to-left-language (e.g. arabic) + fillers.put(1, new ArrayList()); + fillers.put(3, new ArrayList()); + + //[ 1757088 ] + m_main.setName(Name); + setupMainPanelLayout(m_main); + m_main.setBorder(new CompoundBorder(m_main.getBorder(), BorderFactory.createEmptyBorder(10, 12, 0, 12))); + m_tablist.put("main", m_main); + this.setBorder(marginBorder); + + CPanel dummy = new CPanel(); + dummy.setLayout(new BorderLayout()); + dummy.add(m_main, BorderLayout.NORTH); + dummy.setName(m_main.getName()); + this.add(dummy); + + // Set initial values of constraint + m_gbc.anchor = GridBagConstraints.NORTHWEST; + m_gbc.gridy = 0; // line + m_gbc.gridx = 0; + m_gbc.gridheight = 1; + m_gbc.gridwidth = 1; + m_gbc.insets = m_zeroInset; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + m_gbc.weightx = 0; + m_gbc.weighty = 0; + m_gbc.ipadx = 0; + m_gbc.ipady = 0; + + + } // VPanel + + /** GridBag Constraint */ + private GridBagConstraints m_gbc = new GridBagConstraints(); + + /** Orientation */ + private final boolean m_leftToRight = Language.getLoginLanguage().isLeftToRight(); + /** Label Inset */ + private final Insets m_labelInset = + m_leftToRight ? new Insets(1,12,1,0) : new Insets(1,5,1,0); // top,left,bottom,right + private final Insets m_firstLabelInset = + m_leftToRight ? new Insets(1,0,1,0) : new Insets(1,5,1,0); // top,left,bottom,right + /** Field Inset */ + private final Insets m_fieldInset = + m_leftToRight ? new Insets(1,5,1,0) : new Insets(1,12,1,0); // top,left,bottom,right + /** Zero Inset */ + private final Insets m_zeroInset = new Insets(0,0,0,0); + // + private int m_line = 0; + private boolean m_hGapAdded = false; // only once + /** Previous Field Group Header */ + private String m_oldFieldGroup = null; + /** Previous Field Group Type */ + private String m_oldFieldGroupType = null; + /** Previous Field Is Same Line */ + private boolean m_oldSameLine = false; + /** Previous Field Size */ + private boolean m_oldLongField = false; + //[ 1757088 ] + private java.util.Hashtable m_tablist = new java.util.Hashtable(); + private java.util.Hashtable m_tabincludelist = new java.util.Hashtable(); + private CPanel m_main = new CPanel(org.compiere.plaf.CompiereColor.getDefaultBackground()); + private DropShadowBorder marginBorder = new DropShadowBorder(); + + private HashMap> labels = new HashMap>(); + + private HashMap> fields = new HashMap>(); + + private HashMap> fillers = new HashMap>(); + + private HashMap collapsibleEndFiller = new HashMap(); + + /** Logger */ + private static CLogger log = CLogger.getCLogger (VPanel.class); + + + /** + * Set Field Mnemonic + * @param mField field + */ + public void setMnemonic (GridField mField) + { + if (mField.isCreateMnemonic()) + return; + String text = mField.getHeader(); + int pos = text.indexOf('&'); + if (pos != -1 && text.length() > pos) // We have a nemonic - creates Ctrl_Shift_ + { + char mnemonic = text.toUpperCase().charAt(pos+1); + if (mnemonic != ' ') + { + if (!m_mnemonics.contains(mnemonic)) + { + mField.setMnemonic(mnemonic); + m_mnemonics.add(mnemonic); + } + else + log.warning(mField.getColumnName() + + " - Conflict - Already exists: " + mnemonic + " (" + text + ")"); + } + } + } // setMnemonic + + /** + * Add Field and Label to Panel + * @param editor editor + * @param mField field model + */ + public void addField (VEditor editor, GridField mField) + { + //[ 1757088 ] + int AD_Tab_ID = mField.getIncluded_Tab_ID(); + if(AD_Tab_ID != 0 ) + { + m_gbc.gridx = 0; + m_gbc.gridy = m_line++; + CollapsiblePanel m_tab = new CollapsiblePanel(""); + m_tabincludelist.put(AD_Tab_ID, m_tab); + m_gbc.anchor = GridBagConstraints.NORTHWEST; + m_gbc.gridx = 0; + m_gbc.gridheight = 1; + m_gbc.insets = new Insets(2,0,0,0); + m_gbc.gridy = m_line++; + m_gbc.gridwidth = 5; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + m_gbc.weightx = 1; + m_gbc.ipadx = 0; + m_main.add(m_tab,m_gbc); + m_tab.setName("IncludedTab#"+AD_Tab_ID); + + if (includedTabList.containsKey(AD_Tab_ID)) + { + includeTab(includedTabList.get(AD_Tab_ID)); + } + return; + } + + CLabel label = VEditorFactory.getLabel(mField); + if (label == null && editor == null) + return; + + boolean sameLine = mField.isSameLine(); + if (sameLine && (m_oldSameLine || m_oldLongField)) + sameLine = false; + + //[ 1757088 ] // sets top + String fieldGroup = mField.getFieldGroup(); + String fieldGroupType = mField.getFieldGroupType(); + if (Util.isEmpty(fieldGroup)) + { + fieldGroup = m_oldFieldGroup; + fieldGroupType = m_oldFieldGroupType; + } + + if (addGroup(fieldGroup, fieldGroupType)) // sets top + { + if (X_AD_FieldGroup.FIELDGROUPTYPE_Collapse.equals(fieldGroupType)) + { + CollapsiblePanel panel = (CollapsiblePanel) m_tablist.get(fieldGroup); + panel.getCollapsiblePane().setCollapsed(mField.getIsCollapsedByDefault()); + } + sameLine = false; + } + else + { + fieldGroup = m_oldFieldGroup; + fieldGroupType = m_oldFieldGroupType; + } + + if (sameLine) // Set line # + m_gbc.gridy = m_line-1; + else + m_gbc.gridy = m_line++; + + // *** The Label *** + if (label != null) + { + m_gbc.gridwidth = 1; + m_gbc.insets = m_labelInset; + m_gbc.fill = GridBagConstraints.HORIZONTAL; // required for right justified + // Set column # + if (m_leftToRight) + m_gbc.gridx = mField.isSameLine() ? 2 : 0; + else + m_gbc.gridx = mField.isSameLine() | mField.isLongField() ? 3 : 1; + if (m_gbc.gridx == 0) + m_gbc.insets = m_firstLabelInset; + // Weight factor for Label + m_gbc.weightx = 0; + // + if (mField.isCreateMnemonic()) + setMnemonic(label, mField.getMnemonic()); + // Add Label + //[ 1757088 ] + //this.add(label, m_gbc); + if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) + { + CPanel m_tab = (CPanel)m_tablist.get(fieldGroup); + m_tab.add(label, m_gbc); + + } + else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) + { + CollapsiblePanel m_tab = (CollapsiblePanel) m_tablist.get(fieldGroup); + if (m_gbc.gridx == 0) + m_gbc.insets = m_firstLabelInset; + m_tab.getCollapsiblePane().getContentPane().add(label, m_gbc); + labels.get(m_gbc.gridx).add(label); + + moveCollapsibleEndFiller(m_tab.getCollapsiblePane()); + } + else // Label or null + { + m_main.add(label, m_gbc); + labels.get(m_gbc.gridx).add(label); + } + } + + // *** The Field *** + if (editor != null) + { + Component field = (Component)editor; + // Default Width + m_gbc.gridwidth = mField.isLongField() ? 3 : 1; + m_gbc.insets = m_fieldInset; + // m_gbc.fill = GridBagConstraints.NONE; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + // Set column # + if (m_leftToRight) + m_gbc.gridx = mField.isSameLine() ? 3 : 1; + else + m_gbc.gridx = mField.isSameLine() ? 2 : 0; + // Weight factor for Fields + m_gbc.weightx = 1; + // Add Field + //[ 1757088 ] + if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) + { + CPanel m_tab = (CPanel)m_tablist.get(fieldGroup); + m_tab.add(field, m_gbc); + } + else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) + { + boolean textArea = false; + CollapsiblePanel m_tab = (CollapsiblePanel) m_tablist.get(fieldGroup); + if (mField.getDisplayType() == DisplayType.Text + || mField.getDisplayType() == DisplayType.TextLong + || mField.getDisplayType() == DisplayType.Memo) + { + textArea = true; + } + if (textArea) + { + m_gbc.gridheight = 1; + m_gbc.weighty = 1; + m_gbc.fill = GridBagConstraints.BOTH; + } + m_tab.getCollapsiblePane().getContentPane().add(field, m_gbc); + if (textArea) + { + m_gbc.gridheight = 1; + m_gbc.weighty = 0; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + } + + if (!mField.isLongField()) + fields.get(m_gbc.gridx).add(field); + + moveCollapsibleEndFiller(m_tab.getCollapsiblePane()); + } + else // Label or null + { + m_main.add(field, m_gbc); + if (!mField.isLongField()) + fields.get(m_gbc.gridx).add(field); + } + // Link Label to Field + if (label != null) + label.setLabelFor(field); + else if (mField.isCreateMnemonic()) + setMnemonic(editor, mField.getMnemonic()); + } + m_oldSameLine = sameLine; + m_oldLongField = mField.isLongField(); + } // addField + + /** + * Move the end spacer of the collapsible pane + * @param collapsiblePane + */ + private void moveCollapsibleEndFiller(JXCollapsiblePane collapsiblePane) { + Component end = collapsibleEndFiller.get(collapsiblePane); + if (end != null) { + collapsiblePane.getContentPane().remove(end); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridheight = 1; + gbc.gridwidth = 1; + gbc.gridx = 0; + gbc.gridy = m_gbc.gridy + 1; + collapsiblePane.getContentPane().add(end, gbc); + } + } + + /** + * Add Group + * @param fieldGroup field group + * @param fieldGroupType + * @return true if group added + */ + private boolean addGroup(String fieldGroup, String fieldGroupType) + { + // First time - add top + if (m_oldFieldGroup == null) + { + m_oldFieldGroup = ""; + m_oldFieldGroupType = ""; + } + + if (fieldGroup == null || fieldGroup.length() == 0 || fieldGroup.equals(m_oldFieldGroup)) + return false; + + //[ 1757088 ] + if (m_tablist.get(fieldGroup) != null) + { + return false; + } + + //[ 1757088 ] + if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Tab)) + { + + CPanel m_tab = new CPanel(); + m_tab.setBackground(AdempierePLAF.getFormBackground()); + setupTabPanelLayout(m_tab); + m_tab.setName(fieldGroup); + CPanel dummy = new CPanel(); + dummy.setLayout(new BorderLayout()); + dummy.add(m_tab, BorderLayout.NORTH); + dummy.setName(m_tab.getName()); + dummy.setBorder(BorderFactory.createEmptyBorder(10,12,0,12)); + this.add(dummy); + m_tablist.put(fieldGroup, m_tab); + } + else if (fieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) + { + CollapsiblePanel collapsibleSection = new CollapsiblePanel(fieldGroup); + JXCollapsiblePane m_tab = collapsibleSection.getCollapsiblePane(); + m_tab.setAnimated(false); + m_tab.getContentPane().setBackground(AdempierePLAF.getFormBackground()); + setupCollapsiblePaneLayout(m_tab); + CompoundBorder border = (CompoundBorder)m_tab.getBorder(); + m_tab.setBorder(new CompoundBorder(border.getOutsideBorder(), BorderFactory.createEmptyBorder(0, 0, 2, 0))); + collapsibleSection.setName(fieldGroup); + m_gbc.anchor = GridBagConstraints.NORTHWEST; + //m_gbc.gridy = 0; // line + m_gbc.gridx = 0; + m_gbc.gridheight = 1; + if (m_oldFieldGroup.length() > 0 && m_oldFieldGroupType.equals(X_AD_FieldGroup.FIELDGROUPTYPE_Collapse)) + m_gbc.insets = new Insets(0,0,3,0); + else + m_gbc.insets = new Insets(3,0,3,0); + m_gbc.gridy = m_line++; + m_gbc.gridwidth = 4; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + m_gbc.weightx = 1; + m_main.add(collapsibleSection,m_gbc); + m_tablist.put(fieldGroup, collapsibleSection); + } + else // Label or null + { + CPanel group = new CPanel(); + group.setBorder(new VLine(fieldGroup)); + group.add(Box.createVerticalStrut(VLine.SPACE)); + m_gbc.gridx = 0; + m_gbc.gridy = m_line++; + m_gbc.gridwidth = 4; + m_main.add(group, m_gbc); + // reset + m_gbc.gridwidth = 1; + } + m_oldFieldGroup = fieldGroup; + m_oldFieldGroupType = fieldGroupType; + return true; + } // addGroup + + /** + * Set up the gridbaglayout for additonal field group tab + * @param m_tab + */ + private void setupMainPanelLayout(CPanel m_tab) { + m_tab.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.gridy = 0; // line + gbc.gridx = 0; + gbc.gridheight = 0; + gbc.gridwidth = 1; + gbc.insets = m_firstLabelInset; + gbc.fill = GridBagConstraints.NONE; + gbc.weightx = 0; + gbc.weighty = 0; + gbc.ipadx = 0; + gbc.ipady = 0; + CLabel label = new CLabel(""); + fillers.get(0).add(label); + m_tab.add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 1; + gbc.insets = m_fieldInset; + label = new CLabel(""); + fields.get(1).add(label); + m_tab.add(label, gbc); + + gbc.weightx = 0; + gbc.gridx = 2; + gbc.insets = m_labelInset; + label = new CLabel(""); + fillers.get(2).add(label); + m_tab.add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 3; + gbc.insets = m_fieldInset; + label = new CLabel(""); + fields.get(3).add(label); + m_tab.add(label, gbc); + + //right gap + gbc.weightx = 1; + gbc.gridx = 4; + m_tab.add(Box.createHorizontalGlue(), gbc); + + } + + /** + * Set up the gridbaglayout for additonal field group tab + * @param m_tab + */ + private void setupTabPanelLayout(CPanel m_tab) { + m_tab.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.gridy = 0; // line + gbc.gridx = 0; + gbc.gridheight = 0; + gbc.gridwidth = 1; + gbc.insets = m_firstLabelInset; + gbc.fill = GridBagConstraints.NONE; + gbc.weightx = 0; + gbc.weighty = 0; + gbc.ipadx = 0; + gbc.ipady = 0; + CLabel label = new CLabel(""); + m_tab.add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 1; + gbc.insets = m_fieldInset; + label = new CLabel(""); + m_tab.add(label, gbc); + + gbc.weightx = 0; + gbc.gridx = 2; + gbc.insets = m_labelInset; + label = new CLabel(""); + m_tab.add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 3; + gbc.insets = m_fieldInset; + fields.get(3).add(label); + m_tab.add(label, gbc); + + //right gap + gbc.weightx = 1; + gbc.gridx = 4; + m_tab.add(Box.createHorizontalGlue(), gbc); + + } + + /** + * Set up the grid bag layout of collapsible pane + * @param m_tab + */ + private void setupCollapsiblePaneLayout(JXCollapsiblePane m_tab) { + m_tab.getContentPane().setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.gridy = 0; // line + gbc.gridx = 0; + gbc.gridheight = 0; + gbc.gridwidth = 1; + gbc.insets = m_firstLabelInset; + gbc.fill = GridBagConstraints.NONE; + gbc.weightx = 0; + gbc.weighty = 0; + gbc.ipadx = 0; + gbc.ipady = 0; + CLabel label = new CLabel(""); + fillers.get(0).add(label); + m_tab.getContentPane().add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 1; + gbc.insets = m_fieldInset; + label = new CLabel(""); + fields.get(1).add(label); + m_tab.getContentPane().add(label, gbc); + + gbc.weightx = 0; + gbc.gridx = 2; + gbc.insets = m_labelInset; + label = new CLabel(""); + fillers.get(2).add(label); + m_tab.getContentPane().add(label, gbc); + + gbc.weightx = 1; + gbc.gridx = 3; + gbc.insets = m_fieldInset; + label = new CLabel(""); + fields.get(3).add(label); + m_tab.getContentPane().add(label, gbc); + + //right gap + /* + gbc.weightx = 1; + gbc.gridx = 4; + m_tab.getContentPane().add(Box.createHorizontalGlue(), gbc);*/ + + Component c = Box.createVerticalStrut(3); + gbc.gridheight = 1; + gbc.gridy = GridBagConstraints.RELATIVE; + gbc.gridx = 0; + gbc.weightx = 0; + gbc.insets = m_zeroInset; + m_tab.getContentPane().add(c, gbc); + collapsibleEndFiller.put(m_tab, c); + } + + /** + * Add End (9) of Form + */ + public void addEnd() + { + m_gbc.gridx = 0; + m_gbc.gridy = m_line; + m_gbc.gridwidth = 1; + m_gbc.insets = m_zeroInset; + m_gbc.fill = GridBagConstraints.HORIZONTAL; + m_gbc.weightx = 0; + // + //[ 1757088 ] + m_main.add(Box.createVerticalStrut(9), m_gbc); + } // addEnd + + /** + * Set Mnemonic for Label CTRL_SHIFT_x + * @param label label + * @param predefinedMnemonic predefined Mnemonic + */ + private void setMnemonic (CLabel label, char predefinedMnemonic) + { + String text = label.getText(); + int pos = text.indexOf('&'); + if (pos != -1 && predefinedMnemonic != 0) + { + text = text.substring(0, pos) + text.substring(pos+1); + label.setText(text); + label.setSavedMnemonic(predefinedMnemonic); + m_fields.add(label); + log.finest(predefinedMnemonic + " - " + label.getName()); + } + else + { + char mnemonic = getMnemonic(text, label); + if (mnemonic != 0) + label.setSavedMnemonic(mnemonic); + // label.setDisplayedMnemonic(mnemonic); + } + } // setMnemonic + + /** + * Set Mnemonic for Check Box or Button + * @param editor check box or button - other ignored + * @param predefinedMnemonic predefined Mnemonic + */ + private void setMnemonic (VEditor editor, char predefinedMnemonic) + { + if (editor instanceof VCheckBox) + { + VCheckBox cb = (VCheckBox)editor; + String text = cb.getText(); + int pos = text.indexOf('&'); + if (pos != -1 && predefinedMnemonic != 0) + { + text = text.substring(0, pos) + text.substring(pos+1); + cb.setText(text); + cb.setSavedMnemonic(predefinedMnemonic); + m_fields.add(cb); + log.finest(predefinedMnemonic + " - " + cb.getName()); + } + else + { + char mnemonic = getMnemonic(text, cb); + if (mnemonic != 0) + cb.setSavedMnemonic(mnemonic); + // cb.setMnemonic(mnemonic); + } + } + // Button + else if (editor instanceof VButton) + { + VButton b = (VButton)editor; + String text = b.getText(); + int pos = text.indexOf('&'); + if (pos != -1 && predefinedMnemonic != 0) + { + text = text.substring(0, pos) + text.substring(pos+1); + b.setText(text); + b.setSavedMnemonic(predefinedMnemonic); + m_fields.add(b); + log.finest(predefinedMnemonic + " - " + b.getName()); + } + else if (b.getColumnName().equals("DocAction")) + { + b.getInputMap(WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, Event.SHIFT_MASK, false), "pressed"); + b.getInputMap(WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, Event.SHIFT_MASK, true), "released"); + // Util.printActionInputMap(b); + } + else if (b.getColumnName().equals("Posted")) + { + b.getInputMap(WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, Event.SHIFT_MASK, false), "pressed"); + b.getInputMap(WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, Event.SHIFT_MASK, true), "released"); + // Util.printActionInputMap(b); + } + else + { + char mnemonic = getMnemonic(text, b); + if (mnemonic != 0) + b.setSavedMnemonic(mnemonic); + } + } + } // setMnemonic + + /** + * Get Mnemonic from text + * @param text text + * @param source component + * @return Mnemonic or 0 if not unique + */ + private char getMnemonic (String text, Component source) + { + if (text == null || text.length() == 0) + return 0; + String oText = text; + text = text.trim().toUpperCase(); + char mnemonic = text.charAt(0); + if (m_mnemonics.contains(mnemonic)) + { + mnemonic = 0; + // Beginning new word + int index = text.indexOf(' '); + while (index != -1 && text.length() > index) + { + char c = text.charAt(index+1); + if (Character.isLetterOrDigit(c) && !m_mnemonics.contains(c)) + { + mnemonic = c; + break; + } + index = text.indexOf(' ', index+1); + } + // Any character + if (mnemonic == 0) + { + for (int i = 1; i < text.length(); i++) + { + char c = text.charAt(i); + if (Character.isLetterOrDigit(c) && !m_mnemonics.contains(c)) + { + mnemonic = c; + break; + } + } + } + // Nothing found + if (mnemonic == 0) + { + log.finest("None for: " + oText); + return 0; // if first char would be returned, the first occurance is invalid. + } + } + m_mnemonics.add(mnemonic); + m_fields.add(source); + log.finest(mnemonic + " - " + source.getName()); + return mnemonic; + } // getMnemonic + + /** Used Mnemonics */ + private ArrayList m_mnemonics = new ArrayList(30); + /** Mnemonic Fields */ + private ArrayList m_fields = new ArrayList(30); + + private HashMap includedTabList = new HashMap(); + + /** + * Set Window level Mnemonics + * @param set true if set otherwise unregiser + */ + public void setMnemonics (boolean set) + { + int size = m_fields.size(); + for (int i = 0; i < size; i++) + { + Component c = m_fields.get(i); + if (c instanceof CLabel) + { + CLabel l = (CLabel)c; + if (set) + l.setDisplayedMnemonic(l.getSavedMnemonic()); + else + l.setDisplayedMnemonic(0); + } + else if (c instanceof VCheckBox) + { + VCheckBox cb = (VCheckBox)c; + if (set) + cb.setMnemonic(cb.getSavedMnemonic()); + else + cb.setMnemonic(0); + } + else if (c instanceof VButton) + { + VButton b = (VButton)c; + if (set) + b.setMnemonic(b.getSavedMnemonic()); + else + b.setMnemonic(0); + } + } + } // setMnemonics + + /************************************************************************** + * Set Background to AD_Color_ID (nop) + * @param AD_Color_ID Color + */ + public void setBackground (int AD_Color_ID) + { + } // setBackground + + + private void findChildComponents(CPanel container, List list) + { + Component[] comp = container.getComponents(); + for (int c = 0; c < comp.length; c++) + { + list.add(comp[c]); + if ( comp [c] instanceof CollapsiblePanel) + { + CollapsiblePanel collapsiblePanel = (CollapsiblePanel)comp [c]; + + Component[] nestedComps = collapsiblePanel.getCollapsiblePane() + .getContentPane().getComponents(); + + for (int y = 0; y < nestedComps.length; y++) + { + + if ( nestedComps [y] instanceof CPanel) + { + CPanel nestedPanel = (CPanel)nestedComps[y]; + Component[] nestedPanelComps = nestedPanel.getComponents(); + + for (int x = 0; x < nestedPanelComps.length; x++) + { + list.add(nestedPanelComps[x]); + } + } + else + { + list.add(nestedComps[y]); + } + } + } else if (comp[c] instanceof CPanel) + { + + findChildComponents((CPanel)comp[c], list); + } + } + } + + //[ 1757088 ] + public Component[] getComponentsRecursive() + { + java.util.ArrayList list = new java.util.ArrayList(); + + for (int i = 0; i < this.getTabCount(); i++) + { + list.add(this.getComponentAt(i)); + if (this.getComponentAt(i) instanceof CPanel) + { + CPanel panel = (CPanel)this.getComponentAt(i); + findChildComponents(panel, list); + } + } + + Component[] result = new Component[list.size ()]; + list.toArray (result); + return result; + } + + @Override + public void doLayout() { + //align labels + int w = 0; + Collection clabels = labels.get(0); + for (CLabel l : clabels) { + if (l.isVisible()) { + int lw = l.getPreferredSize().width; + if (lw > w) w = lw; + } + } + + for (CLabel l : clabels) { + if (l.isVisible()) { + Dimension d = l.getMinimumSize(); + if (d.width != w) { + d.width = w; + l.setMinimumSize(d); + } + + } + } + + clabels = fillers.get(0); + for (CLabel l : clabels) { + if (l.isVisible()) { + Dimension d = l.getMinimumSize(); + if (d.width != w) { + d.width = w; + l.setMinimumSize(d); + } + } + } + + w = 0; + clabels = labels.get(2); + for (CLabel l : clabels) { + if (l.isVisible()) { + int lw = l.getPreferredSize().width; + if (lw > w) w = lw; + } + } + + for (CLabel l : clabels) { + if (l.isVisible()) { + Dimension d = l.getMinimumSize(); + if (d.width != w) { + d.width = w; + l.setMinimumSize(d); + } + } + } + + clabels = fillers.get(2); + for (CLabel l : clabels) { + if (l.isVisible()) { + Dimension d = l.getMinimumSize(); + if (d.width != w) { + d.width = w; + l.setMinimumSize(d); + } + } + } + + //align fields + w = 0; + Collection collection = fields.get(1); + for (Component c : collection) { + if (c.isVisible()) { + int cw = c.getPreferredSize().width; + if ( cw > w ) + w = cw; + } + } + + for (Component c : collection) { + if (c.isVisible()) { + Dimension d = c.getMinimumSize(); + if ( d.width != w ) { + d.width = w; + c.setMinimumSize(d); + } + d = c.getPreferredSize(); + if (d.width != w) { + d.width = w; + c.setPreferredSize(d); + } + } + } + + w = 0; + collection = fields.get(3); + for (Component c : collection) { + if (c.isVisible()) { + int cw = c.getPreferredSize().width; + if ( cw > w ) + w = cw; + } + } + + for (Component c : collection) { + if (c.isVisible()) { + Dimension d = c.getMinimumSize(); + if ( d.width != w ) { + d.width = w; + c.setMinimumSize(d); + } + d = c.getPreferredSize(); + if (d.width != w) { + d.width = w; + c.setPreferredSize(d); + } + } + } + + super.doLayout(); + } + + /** + * + * @param detail + */ + public void includeTab(GridController detail) { + CollapsiblePanel section = m_tabincludelist.get(detail.getMTab().getAD_Tab_ID()); + if(section != null) + { + APanel panel = new APanel(detail, m_WindowNo); + String name = detail.getMTab().getName() + ""; + section.setTitle(name); + section.getCollapsiblePane().getContentPane().setLayout(new BorderLayout()); + section.getCollapsiblePane().getContentPane().add(panel, BorderLayout.CENTER); + } + + //this can be call before addField + if (!includedTabList.containsKey(detail.getMTab().getAD_Tab_ID())) + includedTabList.put(detail.getMTab().getAD_Tab_ID(), detail); + } + + +} // VPanel