Class GridTab

  • All Implemented Interfaces:
    Serializable, EventListener, DataStatusListener, Evaluatee

    public class GridTab
    extends Object
    implements DataStatusListener, Evaluatee, Serializable
    Tab Model. - a combination of AD_Tab (the display attributes) and AD_Table information.

    The Tab owns also it's Table model and listens to data changes to update the Field values.

    The Tab maintains the bound property: CurrentRow

      Event Hierarchies:
          - dataChanged (from MTable)
              - setCurrentRow
                  - Update all Field Values
    
          - setValue
              - Update Field Value
              - Callout
      
    Version:
    $Id: GridTab.java,v 1.10 2006/10/02 05:18:39 jjanke Exp $
    Author:
    Jorg Janke, Teo Sarca, SC ARHIPAC SERVICE SRL
  • BF [ 1742159 ] Editable number field for inactive record
  • BF [ 1968598 ] Callout is not called if tab is processed
  • BF [ 2104022 ] GridTab.processCallout: throws NPE if callout returns null
  • FR [ 2846871 ] Add method org.compiere.model.GridTab.getIncludedTabs https://sourceforge.net/p/adempiere/feature-requests/805/, Teo Sarca, teo.sarca@gmail.com
  • BF [ 2873323 ] ABP: Do not concatenate strings in SQL queries https://sourceforge.net/p/adempiere/feature-requests/845/
  • BF [ 2874109 ] Tab ORDER BY clause is not supporting context variables https://sourceforge.net/p/adempiere/bugs/2162/
  • BF [ 2905287 ] GridTab query is not build correctly https://sourceforge.net/p/adempiere/bugs/2242/
  • BF [ 3007342 ] Included tab context conflict issue https://sourceforge.net/p/adempiere/bugs/2409/, Victor Perez , e-Evolution.SC
  • FR [1877902] Implement JSR 223 Scripting APIs to Callout
  • BF [ 2910358 ] Error in context when a field is found in different tabs. https://sourceforge.net/p/adempiere/bugs/2255/
  • BF [ 2910368 ] Error in context when IsActive field is found in different https://sourceforge.net/p/adempiere/bugs/2256/, Carlos Ruiz, qss FR [1877902], Cristina Ghita, www.arhipac.ro FR [2870645] Set null value for an ID, Paul Bowden, phib BF 2900767 Zoom to child tab - inefficient queries
  • See Also:
    Serialized Form
    • Constructor Detail

      • GridTab

        public GridTab​(GridTabVO vo,
                       GridWindow w)
        Create Tab (Model) from Value Object.

        MTab provides a property listener for changed rows and a DataStatusListener for communicating changes of the underlying data

        Parameters:
        vo - Value Object
        w -
      • GridTab

        public GridTab​(GridTabVO vo,
                       GridWindow w,
                       boolean virtual)
        Create Tab (Model) from Value Object.

        MTab provides a property listener for changed rows and a DataStatusListener for communicating changes of the underlying data

        Parameters:
        vo - Value Object
        w -
        virtual -
    • Method Detail

      • isLoadComplete

        public boolean isLoadComplete()
      • initTab

        public boolean initTab​(boolean async)
        Initialize Tab with record from AD_Tab_v
        Parameters:
        async - async
        Returns:
        true, if correctly initialized (ignored)
      • loadTab

        protected boolean loadTab()
      • dispose

        protected void dispose()
        Dispose - clean up resources
      • getDependentOn

        public ArrayList<String> getDependentOn()
        Get a list of variables, this tab is dependent on. - for display purposes
        Returns:
        ArrayList
      • getDisplayLogic

        public String getDisplayLogic()
        Get Display Logic
        Returns:
        display logic
      • getTableModel

        public GridTable getTableModel()
        Get TableModel. Do not directly communicate with the table model, but through the methods of this class
        Returns:
        Table Model
      • getIcon

        public Icon getIcon()
        Get Tab Icon
        Returns:
        Icon
      • hasDependants

        public boolean hasDependants​(String columnName)
        Has this field dependents ?
        Parameters:
        columnName - column name
        Returns:
        true if column has dependent
      • getDependantFields

        public ArrayList<GridField> getDependantFields​(String columnName)
        Get dependents fields of columnName
        Parameters:
        columnName - column name
        Returns:
        ArrayList with GridFields dependent on columnName
      • setQuery

        public void setQuery​(MQuery query)
        Set Query
        Parameters:
        query - query
      • getQuery

        public MQuery getQuery()
        Get Query
        Returns:
        query
      • isQueryActive

        public boolean isQueryActive()
        Is Query Active
        Returns:
        true if query active
      • isQueryNewRecord

        public boolean isQueryNewRecord()
        Is Query New Record
        Returns:
        true if query active
      • enableEvents

        public void enableEvents()
        Enable Events - enable data events of tabs (add listeners)
      • getTabType

        public String getTabType()
        get Tab Type
        Returns:
        String
      • query

        public void query​(boolean onlyCurrentRows)
        Assemble whereClause and query MTable and position to row 0.
                        Scenarios:
                        - Never opened                                  (full query)
                        - query changed                                 (full query)
                        - Detail link value changed             (full query)
                        - otherwise                                     (refreshAll)
          
        Parameters:
        onlyCurrentRows - only current rows (1 day)
      • query

        public void query​(boolean onlyCurrentRows,
                          int onlyCurrentDays,
                          int maxRows)
        Assemble whereClause and query MTable and position to row 0.
                        Scenarios:
                        - Never opened                                  (full query)
                        - query changed                                 (full query)
                        - Detail link value changed             (full query)
                        - otherwise                                     (refreshAll)
          
        Parameters:
        onlyCurrentRows - only current rows
        onlyCurrentDays - if only current row, how many days back
        maxRows - maximum rows or 0 for all
      • resetDetailForNewParentRecord

        public void resetDetailForNewParentRecord()
        reset detail data grid when parent tab current record is new and not saved yet
      • dataRefreshAll

        public void dataRefreshAll()
        Refresh all data
      • dataRefreshAll

        public void dataRefreshAll​(boolean fireEvent)
        Refresh all data
        Parameters:
        fireEvent -
      • dataRefreshAll

        public void dataRefreshAll​(boolean fireEvent,
                                   boolean retainedCurrentRow)
        Refresh all data
        Parameters:
        fireEvent -
      • dataRefresh

        public void dataRefresh()
        Refresh current row data
      • dataRefresh

        public void dataRefresh​(boolean fireEvent)
        Refresh current row data
        Parameters:
        fireEvent -
      • dataRefresh

        public void dataRefresh​(int row)
        Refresh row data
        Parameters:
        row - index
      • dataRefresh

        public void dataRefresh​(int row,
                                boolean fireEvent)
        Refresh row data
        Parameters:
        row - index
        fireEvent -
      • dataSave

        public boolean dataSave​(boolean manualCmd)
        Unconditionally Save data
        Parameters:
        manualCmd - if true, no vetoable PropertyChange will be fired for save confirmation from MTable
        Returns:
        true if save complete (or nor required)
      • hasChangedCurrentTabAndParents

        public boolean hasChangedCurrentTabAndParents()
      • refreshParentTabs

        public void refreshParentTabs()
        refresh current row of parent tabs
      • refreshParentTabs

        public void refreshParentTabs​(boolean fireParentEvent)
        refresh current row of parent tabs
      • needSave

        public boolean needSave​(boolean rowChange,
                                boolean onlyRealChange)
        Do we need to Save?
        Parameters:
        rowChange - row change
        onlyRealChange - if true the value of a field was actually changed (e.g. for new records, which have not been changed) - default false
        Returns:
        true it needs to be saved
      • dataIgnore

        public void dataIgnore()
        Ignore data changes
      • dataNew

        public boolean dataNew​(boolean copy)
        Create (copy) new Row and process Callouts
        Parameters:
        copy - copy
        Returns:
        true if copied/new
      • dataDelete

        public boolean dataDelete()
        Delete current Row
        Returns:
        true if deleted
      • getName

        public String getName()
        Get Name of Tab
        Returns:
        name
      • getDescription

        public String getDescription()
        Get Description of Tab
        Returns:
        description
      • getHelp

        public String getHelp()
        Get Help of Tab
        Returns:
        help
      • getTabLevel

        public int getTabLevel()
        Get Tab Level
        Returns:
        tab level
      • getCommitWarning

        public String getCommitWarning()
        Get Commit Warning
        Returns:
        commit warning
      • getMTable

        protected GridTable getMTable()
        Return Table Model
        Returns:
        MTable
      • getKeyColumnName

        public String getKeyColumnName()
        Return the name of the key column - may be ""
        Returns:
        key column name
      • getKeyColumnIndex

        public int getKeyColumnIndex()
      • getLinkColumnName

        public String getLinkColumnName()
        Return Name of link column
        Returns:
        link column name
      • setLinkColumnName

        public void setLinkColumnName​(String linkColumnName)
        Set Name of link column. Set from MWindow.loadTabData Used in MTab.isCurreny, (.setCurrentRow) .query - APanel.cmd_report and MField.isEditable and .isDefault via context
        Parameters:
        linkColumnName - name of column - or sets name to AD_Column_ID, if exists
      • isCurrent

        public boolean isCurrent()
        Is the tab current?.
                Yes     - Table must be open
                                - Query String is the same
                                - Not Detail
                                - Old link column value is same as current one
          
        Returns:
        true if current
      • isOpen

        public boolean isOpen()
        Is the tab/table currently open
        Returns:
        true if open
      • isIncluded

        public boolean isIncluded()
        Is Tab Included in other Tab
        Returns:
        true if included
      • setIncluded

        public void setIncluded​(boolean isIncluded)
        Deprecated.
        The method getIncluded now validate against the structure, this method is called nowhere
        Is Tab Included in other Tab
        Parameters:
        isIncluded - true if included
      • isOnlyCurrentRows

        public boolean isOnlyCurrentRows()
        Are Only Current Rows displayed
        Returns:
        true if no history
      • getParentColumnNames

        public ArrayList<String> getParentColumnNames()
        Return Parent ArrayList
        Returns:
        parent column names
      • isDetail

        public boolean isDetail()
        Returns true if this is a detail record
        Returns:
        true if not parent tab
      • isPrinted

        public boolean isPrinted()
        Is Printed (Document can be printed)
        Returns:
        true if printing
      • getWindowNo

        public int getWindowNo()
        Get WindowNo
        Returns:
        window no
      • getTabNo

        public int getTabNo()
        Get TabNo
        Returns:
        tab no
      • getAD_Process_ID

        public int getAD_Process_ID()
        Get Process ID
        Returns:
        Process ID
      • isHighVolume

        public boolean isHighVolume()
        Is High Volume?
        Returns:
        true if high volume table
      • IsLookupOnlySelection

        public boolean IsLookupOnlySelection()
        Is Lookup Only By Selection Fields?
        Returns:
        true if only selection
      • IsAllowAdvancedLookup

        public boolean IsAllowAdvancedLookup()
        Is Allow Advanced Lookup panel?
        Returns:
        true if allow the use
      • isReadOnly

        public boolean isReadOnly()
        Is Read Only?
        Returns:
        true if read only
      • isAlwaysUpdateField

        public boolean isAlwaysUpdateField()
        Tab contains Always Update Field
        Returns:
        true if field with always updateable
      • isInsertRecord

        public boolean isInsertRecord()
        Can we Insert Records?
        Returns:
        true not read only and allowed
      • isDeleteRecord

        public boolean isDeleteRecord()
        Can we Delete Records?
        Returns:
        true not read only and allowed
      • isDisplayed

        public boolean isDisplayed()
        Is the Tab Visible. Called when constructing the window.
        Returns:
        true, if displayed
      • get_ValueAsString

        public String get_ValueAsString​(String variableName)
        Get Variable Value (Evaluatee)
        Specified by:
        get_ValueAsString in interface Evaluatee
        Parameters:
        variableName - name
        Returns:
        value
      • get_ValueAsString

        public String get_ValueAsString​(Properties ctx,
                                        String variableName)
        Get Variable Value (Evaluatee)
        Parameters:
        ctx - context
        variableName - name
        Returns:
        value
      • isSingleRow

        public boolean isSingleRow()
        Is Single Row
        Returns:
        true if single row
      • setSingleRow

        public void setSingleRow​(boolean isSingleRow)
        Set Single Row. Temporary store of current value
        Parameters:
        isSingleRow - toggle
      • isTreeTab

        public boolean isTreeTab()
        Has Tree
        Returns:
        true if tree exists
      • getTreeDisplayedOn

        public String getTreeDisplayedOn()
        Where the tree should be shown
        Returns:
        master, detail or both
      • getAD_Tab_ID

        public int getAD_Tab_ID()
        Get Tab ID
        Returns:
        Tab ID
      • getAD_Table_ID

        public int getAD_Table_ID()
        Get Table ID
        Returns:
        Table ID
      • getAD_Window_ID

        public int getAD_Window_ID()
        Get Window ID
        Returns:
        Window ID
      • getIncluded_Tab_ID

        public int getIncluded_Tab_ID()
        Deprecated.
        the functionality related to AD_Tab.Included_Tab_ID was not developed
        Get Included Tab ID
        Returns:
        Included_Tab_ID
      • getTableName

        public String getTableName()
        Get TableName
        Returns:
        Table Name
      • getWhereClause

        public String getWhereClause()
        Get Tab Where Clause
        Returns:
        where clause
      • isSortTab

        public boolean isSortTab()
        Is Sort Tab
        Returns:
        true if sort tab
      • getAD_ColumnSortOrder_ID

        public int getAD_ColumnSortOrder_ID()
        Get Order column for sort tab
        Returns:
        AD_Column_ID
      • getAD_ColumnSortYesNo_ID

        public int getAD_ColumnSortYesNo_ID()
        Get Yes/No column for sort tab
        Returns:
        AD_Column_ID
      • getWhereExtended

        public String getWhereExtended()
        Get extended Where Clause (parent link)
        Returns:
        parent link
      • getTrxInfo

        public String getTrxInfo()
        Deprecated.
        use getStatusLine and configure Status Line instead
        Transaction support. Depending on Table returns transaction info
        Returns:
        info
      • getStatusLine

        public String getStatusLine()
        Status Line support Depending on Window/Tab returns transaction info
        Returns:
        info
      • getStatusLinesWidget

        public String getStatusLinesWidget()
        Widget support Depending on Window/Tab returns widget lines info
        Returns:
        info
      • canHaveAttachment

        public boolean canHaveAttachment()
        Can this tab have Attachments?.

        It can have an attachment if it has a key column ending with _ID. The key column is empty, if there is no single identifying key.

        Returns:
        true if record can have attachment
      • hasAttachment

        public boolean hasAttachment()
        Returns true, if current row has an Attachment
        Returns:
        true if record has attachment
      • getAD_AttachmentID

        public int getAD_AttachmentID()
        Get Attachment_ID for current record.
        Returns:
        ID or 0, if not found
      • hasChat

        public boolean hasChat()
        Returns true, if current row has a Chat
        Returns:
        true if record has chat
      • getCM_ChatID

        public int getCM_ChatID()
        Get Chat_ID for this record.
        Returns:
        ID or 0, if not found
      • hasPostIt

        public boolean hasPostIt()
      • getAD_PostIt_ID

        public int getAD_PostIt_ID()
        Get PostItID for this record.
        Returns:
        ID or 0, if not found
      • hasTemplate

        public boolean hasTemplate()
        Returns true, if this tab have templates allowed with current role
        Returns:
        true if record has templates
      • loadLocks

        public void loadLocks()
        Load Locks for Table and User
      • isLocked

        public boolean isLocked()
        Record Is Locked
        Returns:
        true if locked
      • lock

        public void lock​(Properties ctx,
                         int Record_ID,
                         boolean lock)
        Lock Record
        Parameters:
        ctx - context
        Record_ID - id
        lock - true if lock, otherwise unlock
      • dataStatusChanged

        public void dataStatusChanged​(DataStatusEvent e)
        Data Status Listener from MTable. - get raw info and add current row information - update the current row - redistribute (fire) Data Status event
        Specified by:
        dataStatusChanged in interface DataStatusListener
        Parameters:
        e - event
      • updateDataStatusEventProperties

        public void updateDataStatusEventProperties​(DataStatusEvent e)
        update DataStatusEvent properties from gridTab
        Parameters:
        e -
      • fireDataStatusEEvent

        public void fireDataStatusEEvent​(String AD_Message,
                                         String info,
                                         boolean isError)
        Create and fire Data Status Error Event
        Parameters:
        AD_Message - message
        info - info
        isError - if not true, it is a Warning
      • fireDataStatusEEvent

        public void fireDataStatusEEvent​(ValueNamePair errorLog)
        Create and fire Data Status Error Event (from Error Log)
        Parameters:
        errorLog - log
      • getCurrentRow

        public int getCurrentRow()
        Get Current Row
        Returns:
        current row
      • getRecord_ID

        public int getRecord_ID()
        Get Current Table Key ID
        Returns:
        Record_ID
      • getKeyID

        public int getKeyID​(int row)
        Get Key ID of row
        Parameters:
        row - row number
        Returns:
        The Key ID of the row or -1 if not found
      • navigate

        public int navigate​(int targetRow)
        Navigate absolute - goto Row - (zero based). - does nothing, if in current row - saves old row if required
        Parameters:
        targetRow - target row
        Returns:
        current row
      • navigateRelative

        public int navigateRelative​(int rowChange)
        Navigate relatively - i.e. plus/minus from current position
        Parameters:
        rowChange - row change
        Returns:
        current row
      • navigateCurrent

        public int navigateCurrent()
        Navigate to current now (reload)
        Returns:
        current row
      • setCurrentRow

        public int setCurrentRow​(int newCurrentRow,
                                 boolean fireEvents)
        Set current row and load data into fields. If there is no row - load nulls
        Parameters:
        newCurrentRow - new current row
        fireEvents - fire events
        Returns:
        current row
      • setCurrentRow

        public void setCurrentRow​(int row)
        Set current row - used for deleteSelection
      • getRowCount

        public int getRowCount()
        Get RowCount
        Returns:
        row count
      • getFieldCount

        public int getFieldCount()
        Get Column/Field Count
        Returns:
        field count
      • getField

        public GridField getField​(int index)
        Get Field by index
        Parameters:
        index - index
        Returns:
        MField
      • getField

        public GridField getField​(String columnName)
        Get Field by DB column name
        Parameters:
        columnName - column name
        Returns:
        MField
      • getFields

        public GridField[] getFields()
        Get all Fields
        Returns:
        MFields
      • setValue

        public String setValue​(String columnName,
                               Object value)
        Set New Value and call Callout
        Parameters:
        columnName - database column name
        value - value
        Returns:
        error message or ""
      • setValue

        public String setValue​(GridField field,
                               Object value)
        Set New Value and call Callout
        Parameters:
        field - field
        value - value
        Returns:
        error message or ""
      • isProcessed

        public boolean isProcessed()
        Is Processed
        Returns:
        true if current record is processed
      • isActive

        public boolean isActive()
        Is the current record active
        Returns:
        true if current record is active author Teo Sarca - BF [ 1742159 ]
      • processFieldChange

        public String processFieldChange​(GridField changedField)
        Process Field Change - evaluate Dependencies and process Callouts. called from MTab.setValue or GridController.dataStatusChanged
        Parameters:
        changedField - changed field
        Returns:
        error message or ""
      • getActiveCallouts

        public String[] getActiveCallouts()
        Returns:
        list of active call out for this tab
      • getActiveCalloutInstance

        public Callout[] getActiveCalloutInstance()
        Returns:
        list of active call out instance for this tab
      • processCallout

        public String processCallout​(GridField field)
        Process Callout(s).

        The Callout is in the string of "class.method;class.method;" If there is no class name, i.e. only a method name, the class is regarded as CalloutSystem. The class needs to comply with the Interface Callout. For a limited time, the old notation of Sx_matheod / Ux_menthod is maintained.

        Parameters:
        field - field
        Returns:
        error message or ""
        See Also:
        Callout
      • getValue

        public Object getValue​(String columnName)
        Get Value of Field with columnName
        Parameters:
        columnName - column name
        Returns:
        value
      • getValueAsBoolean

        public boolean getValueAsBoolean​(String columnName)
        Get Boolean Value of Field with columnName. If there is no column with the given name, the context for current window will be checked.
        Parameters:
        columnName - column name
        Returns:
        boolean value or false if the field was not found author Teo Sarca
      • getValue

        public Object getValue​(GridField field)
        Get Value of Field
        Parameters:
        field - field
        Returns:
        value
      • getValue

        public Object getValue​(int row,
                               String columnName)
        Get Value of Field in row
        Parameters:
        row - row
        columnName - column name
        Returns:
        value
      • toString

        public String toString()
        toString
        Overrides:
        toString in class Object
        Returns:
        String representation
      • removePropertyChangeListener

        public void removePropertyChangeListener​(PropertyChangeListener l)
        Parameters:
        l - listener
      • addPropertyChangeListener

        public void addPropertyChangeListener​(PropertyChangeListener l)
        Parameters:
        l - listener
      • removeDataStatusListener

        public void removeDataStatusListener​(DataStatusListener l)
        Parameters:
        l - listener
      • addDataStatusListener

        public void addDataStatusListener​(DataStatusListener l)
        Parameters:
        l - listener
      • addStateChangeListener

        public void addStateChangeListener​(StateChangeListener l)
        Parameters:
        l -
      • removeStateChangeListener

        public void removeStateChangeListener​(StateChangeListener l)
        Parameters:
        l -
      • setFieldVFormat

        public void setFieldVFormat​(String identifier,
                                    String strNewFormat)
        Feature Request [1707462] Enable runtime change of VFormat
        Parameters:
        identifier - field indent
        strNewFormat - new mask author fer_luck
      • switchRows

        public void switchRows​(int from,
                               int to,
                               int sortColumn,
                               boolean ascending)
        Switches the line/seqNo of the two rows
        Parameters:
        from - row index
        to - row index
        sortColumn - column index of sort column
        ascending - sorting modus
      • getIncludedTabs

        public List<GridTab> getIncludedTabs()
        Returns:
        list of all tabs included in this tab
      • getParentTab

        public GridTab getParentTab()
      • getNumColumns

        public int getNumColumns()
      • isNew

        public boolean isNew()
      • getAD_Tab_UU

        public String getAD_Tab_UU()
      • getAD_Process_UU

        public String getAD_Process_UU()
      • isUpdateWindowContext

        public boolean isUpdateWindowContext()
      • setUpdateWindowContext

        public void setUpdateWindowContext​(boolean updateWindowContext)
      • addToSelection

        public void addToSelection​(int rowIndex)
      • removeFromSelection

        public boolean removeFromSelection​(int rowIndex)
      • getSelection

        public int[] getSelection()
      • isSelected

        public boolean isSelected​(int rowIndex)
      • clearSelection

        public void clearSelection()
      • isQuickForm

        public boolean isQuickForm()
      • setQuickForm

        public void setQuickForm​(boolean isQuickForm)
      • getGridWindow

        public GridWindow getGridWindow()
      • setCalloutUI

        public void setCalloutUI​(ICalloutUI calloutUI)
      • getMaxQueryRecords

        public int getMaxQueryRecords()
        Get Max Query Records.
        Returns:
        If defined, you cannot query more records as defined - the query criteria needs to be changed to query less records
      • isQueryRequire

        public boolean isQueryRequire​(int noRecords)
        Require Query
        Parameters:
        noRecords - records
        Returns:
        true if query required
      • isQueryMax

        public boolean isQueryMax​(int noRecords)
        Over max Query
        Parameters:
        noRecords - records
        Returns:
        true if over max query
      • reset

        public void reset()
        reset to empty