📄 apanel.java
字号:
/**
* Window
*/
if (wbType == MWorkbench.TYPE_WINDOW)
{
HashMap<Integer,GridController> includedMap = new HashMap<Integer,GridController>(4);
//
MWindowVO wVO = AEnv.getMWindowVO(m_curWindowNo, m_mWorkbench.getWindowID(wb), 0);
if (wVO == null)
{
ADialog.error(0, null, "AccessTableNoView", "(No Window Model Info)");
return false;
}
MWindow mWindow = new MWindow (wVO); // Timing: ca. 0.3-1 sec
// Set SO/AutoNew for Window
Env.setContext(m_ctx, m_curWindowNo, "IsSOTrx", mWindow.isSOTrx());
if (!autoNew && mWindow.isTransaction())
Env.setAutoNew(m_ctx, m_curWindowNo, true);
m_mWorkbench.setMWindow(wb, mWindow);
if (wb == 0)
m_onlyCurrentRows = mWindow.isTransaction(); // default = only current
if (windowSize == null)
windowSize = mWindow.getWindowSize();
/**
* Window Tabs
*/
int tabSize = mWindow.getTabCount();
boolean goSingleRow = query != null; // Zoom Query
for (int tab = 0; tab < tabSize; tab++)
{
boolean included = false;
// MTab
MTab mTab = m_mWorkbench.getMWindow(wb).getTab(tab);
// Query first tab
if (tab == 0)
{
// initial user query for single workbench tab
if (m_mWorkbench.getWindowCount() == 1)
{
query = initialQuery (query, mTab);
if (query != null && query.getRecordCount() <= 1)
goSingleRow = true;
}
else if (wb != 0)
// workbench dynamic query for dependent windows
{
query = m_mWorkbench.getQuery();
}
// Set initial Query on first tab
if (query != null)
{
m_onlyCurrentRows = false; // Query might involve history
mTab.setQuery(query);
}
if (wb == 0)
m_curTab = mTab;
} // query on first tab
Component tabElement = null;
// GridController
if (mTab.isSortTab())
{
VSortTab st = new VSortTab(m_curWindowNo, mTab.getAD_Table_ID(),
mTab.getAD_ColumnSortOrder_ID(), mTab.getAD_ColumnSortYesNo_ID());
st.setTabLevel(mTab.getTabLevel());
tabElement = st;
}
else // normal tab
{
GridController gc = new GridController(); // Timing: ca. .1 sec
CompiereColor cc = mWindow.getColor();
if (cc != null)
gc.setBackgroundColor(cc); // set color on Window level
gc.initGrid(mTab, false, m_curWindowNo, this, mWindow); // will set color on Tab level
// Timing: ca. 6-7 sec for first .2 for next
gc.addDataStatusListener(this);
gc.registerESCAction(aIgnore); // register Escape Key
// Set First Tab
if (wb == 0 && tab == 0)
{
m_curGC = gc;
Dimension size = gc.getPreferredSize(); // Screen Sizing
size.width += 4;
size.height += 4;
gc.setPreferredSize(size);
}
tabElement = gc;
// If we have a zoom query, switch to single row
if (tab == 0 && goSingleRow)
gc.switchSingleRow();
// Store GC if it has a included Tab
if (mTab.getIncluded_Tab_ID() != 0)
includedMap.put(new Integer(mTab.getIncluded_Tab_ID()), gc);
// Is this tab included?
if (includedMap.size() > 0)
{
GridController parent = (GridController)includedMap.get(new Integer(mTab.getAD_Tab_ID()));
if (parent != null)
{
included = parent.includeTab(gc);
if (!included)
log.log(Level.SEVERE, "Not Included = " + gc);
}
}
} // normal tab
if (!included) // Add to TabbedPane
{
StringBuffer tabName = new StringBuffer ();
tabName.append ("<html>");
if (mTab.isReadOnly())
tabName.append("<i>");
int pos = mTab.getName ().indexOf (" ");
if (pos == -1)
tabName.append (mTab.getName ()).append ("<br> ");
else
{
tabName.append (mTab.getName().substring (0, pos))
.append ("<br>")
.append (mTab.getName().substring(pos + 1));
}
if (mTab.isReadOnly())
tabName.append("</i>");
tabName.append ("</html>");
// Add Tab - sets ALT-<number> and Shift-ALT-<x>
window.addTab (tabName.toString(), mTab.getIcon(),
tabElement, mTab.getDescription());
}
} // Tab Loop
// Tab background
// window.setBackgroundColor(new CompiereColor(Color.magenta, Color.green));
} // Type-MWindow
// Single Workbench Window Tab
if (m_mWorkbench.getWindowCount() == 1)
{
window.setToolTipText(m_mWorkbench.getDescription(wb));
}
else
// Add Workbench Window Tab
{
tabPanel.addTab(m_mWorkbench.getName(wb), m_mWorkbench.getIcon(wb), window, m_mWorkbench.getDescription(wb));
}
// Used for Env.getHeader
Env.setContext(m_ctx, m_curWindowNo, "WindowName", m_mWorkbench.getName(wb));
} // Workbench Loop
// stateChanged (<->) triggered
toolBar.setName(getTitle());
m_curTab.getTableModel().setChanged(false);
// Set Detail Button
aDetail.setEnabled(0 != m_curWinTab.getTabCount()-1);
if (windowSize != null)
setPreferredSize(windowSize);
Dimension size = getPreferredSize();
log.info( "fini - " + size);
m_curWinTab.requestFocusInWindow();
return true;
} // initPanel
/**
* Get Current Window No
* @return win no
*/
public int getWindowNo()
{
return m_curWindowNo;
} // getWindowNo
/**
* Initial Query
* @param query initial query
* @param mTab tab
* @return query or null
*/
private MQuery initialQuery (MQuery query, MTab mTab)
{
// We have a (Zoom) query
if (query != null && query.isActive() && query.getRecordCount() < 10)
return query;
//
StringBuffer where = new StringBuffer();
// Query automatically if high volume and no query
boolean require = mTab.isHighVolume();
if (!require && !m_onlyCurrentRows) // No Trx Window
{
String wh1 = mTab.getWhereExtended();
if (wh1 == null || wh1.length() == 0)
wh1 = mTab.getWhereClause();
if (wh1 != null && wh1.length() > 0)
where.append(wh1);
//
if (query != null)
{
String wh2 = query.getWhereClause();
if (wh2.length() > 0)
{
if (where.length() > 0)
where.append (" AND ");
where.append(wh2);
}
}
//
StringBuffer sql = new StringBuffer("SELECT COUNT(*) FROM ")
.append(mTab.getTableName());
if (where.length() > 0)
sql.append(" WHERE ").append(where);
// Does not consider security
int no = DB.getSQLValue(null, sql.toString());
//
require = MRole.getDefault().isQueryRequire(no);
}
// Show Query
if (require)
{
MField[] findFields = mTab.getFields();
Find find = new Find (Env.getFrame(this), m_curWindowNo, mTab.getName(),
mTab.getAD_Table_ID(), mTab.getTableName(),
where.toString(), findFields, 10); // no query below 10
query = find.getQuery();
find = null;
}
return query;
} // initialQuery
/**
* Get Window Index
* @return Window Index
*/
private int getWindowIndex()
{
// only one window
if (m_mWorkbench.getWindowCount() == 1)
return 0;
// workbench
return tabPanel.getSelectedIndex();
} // getWindowIndex
/**
* Is first Tab (on Window)
* @return true if the panel displays the first tab
*/
private boolean isFirstTab()
{
return m_curWinTab.getSelectedIndex() == 0;
} // isFirstTab
/**
* Get Window Image
* @return image or null
*/
public Image getImage()
{
return m_mWorkbench.getImage(getWindowIndex());
} // getImage
/**************************************************************************
* Data Status Listener (row change) ^ | v
* @param e event
*/
public void dataStatusChanged (DataStatusEvent e)
{
if (m_disposing)
return;
log.info(e.getMessage());
String dbInfo = e.getMessage();
if (m_curTab != null && m_curTab.isQueryActive())
dbInfo = "[ " + dbInfo + " ]";
statusBar.setStatusDB(dbInfo, e);
// Set Message / Info
if (e.getAD_Message() != null || e.getInfo() != null)
{
StringBuffer sb = new StringBuffer();
String msg = e.getMessage();
if (msg != null && msg.length() > 0)
sb.append(Msg.getMsg(m_ctx, e.getAD_Message()));
String info = e.getInfo();
if (info != null && info.length() > 0)
{
if (sb.length() > 0 && !sb.toString().trim().endsWith(":"))
sb.append(": ");
sb.append(info);
}
if (sb.length() > 0)
{
int pos = sb.indexOf("\n");
if (pos != -1) // replace CR/NL
sb.replace(pos, pos+1, " - ");
setStatusLine (sb.toString (), e.isError ());
}
}
// Confirm Error
if (e.isError() && !e.isConfirmed())
{
ADialog.error(m_curWindowNo, this, e.getAD_Message(), e.getInfo());
e.setConfirmed(true); // show just once - if MTable.setCurrentRow is involved the status event is re-issued
m_errorDisplayed = true;
}
// Confirm Warning
else if (e.isWarning() && !e.isConfirmed())
{
ADialog.warn(m_curWindowNo, this, e.getAD_Message(), e.getInfo());
e.setConfirmed(true); // show just once - if MTable.setCurrentRow is involved the status event is re-issued
}
// update Navigation
boolean firstRow = e.isFirstRow();
aFirst.setEnabled(!firstRow);
aPrevious.setEnabled(!firstRow);
boolean lastRow = e.isLastRow();
aNext.setEnabled(!lastRow);
aLast.setEnabled(!lastRow);
// update Change
boolean changed = e.isChanged() || e.isInserting();
boolean readOnly = m_curTab.isReadOnly();
boolean insertRecord = !readOnly;
if (insertRecord)
insertRecord = m_curTab.isInsertRecord();
aNew.setEnabled(!changed && insertRecord);
aCopy.setEnabled(!changed && insertRecord);
aRefresh.setEnabled(!changed);
aDelete.setEnabled(!changed && !readOnly);
//
if (readOnly && m_curTab.isAlwaysUpdateField())
readOnly = false;
aIgnore.setEnabled(changed && !readOnly);
aSave.setEnabled(changed && !readOnly);
//
// No Rows
if (e.getTotalRows() == 0 && insertRecord)
{
aNew.setEnabled(true);
aDelete.setEnabled(false);
}
// Single-Multi
aMulti.setPressed(!m_curGC.isSingleRow());
// History (on first Tab only)
if (isFirstTab())
aHistory.setPressed(!m_curTab.isOnlyCurrentRows());
// Transaction info
String trxInfo = m_curTab.getTrxInfo();
if (trxInfo != null)
statusBar.setInfo(trxInfo);
// Check Attachment
boolean canHaveAttachment = m_curTab.canHaveAttachment(); // not single _ID column
//
if (canHaveAttachment && e.isLoading() && m_curTab.getCurrentRow() > e.getLoadedRows())
canHaveAttachment = false;
if (canHaveAttachment && m_curTab.getRecord_ID() == -1) // No Key
canHaveAttachment = false;
if (canHaveAttachment)
{
aAttachment.setEnabled(true);
aAttachment.setPressed(m_curTab.hasAttachment());
}
else
aAttachment.setEnabled(false);
// Lock Indicator
if (m_isPersonalLock)
aLock.setPressed(m_curTab.isLocked());
// log.info( "APanel.dataStatusChanged - fini", e.getMessage());
} // dataStatusChanged
/**
* Set Status Line to text
* @param text clear text
* @param error error flag
*/
public void setStatusLine (String text, boolean error)
{
log.fine(text);
statusBar.setStatusLine(text, error);
} // setStatusLine
/**
* Indicate Busy
* @param busy busy
*/
private void setBusy (boolean busy)
{
m_isLocked = busy;
//
JFrame frame = Env.getFrame(this);
if (frame == null) // during init
return;
if (frame instanceof AWindow)
((AWindow)frame).setBusy(busy);
// String processing = Msg.getMsg(m_ctx, "Processing");
if (busy)
{
// setStatusLine(processing);
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
else
{
this.setCursor(Cursor.getDefaultCursor());
frame.setCursor(Cursor.getDefaultCursor());
m_curGC.requestFocus();
// if (statusBar.getStatusLine().equals(processing))
// statusBar.setStatusLine("");
}
} // set Busy
/**************************************************************************
* Change Listener - (tab change) <->
* @param e event
*/
public void stateChanged (ChangeEvent e)
{
if (m_disposing)
return;
log.info(e.toString());
setBusy(true);
VTabbedPane tp = (VTabbedPane)e.getSource();
boolean back = false;
boolean isAPanelTab = false;
// Workbench Tab Change
if (tp.isWorkbench())
{
int WBIndex = tabPanel.getSelectedIndex();
m_curWindowNo = m_mWorkbench.getWindowNo(WBIndex);
// Window Change
log.info("curWin=" + m_curWindowNo + " - Win=" + tp);
if (tp.getSelectedComponent() instanceof JTabbedPane)
m_curWinTab = (JTabbedPane)tp.getSelectedComponent();
else
throw new java.lang.IllegalArgumentException("Window does not contain Tabs");
if (m_curWinTab.getSelectedComponent() instanceof GridController)
m_curGC = (GridController)m_curWinTab.getSelectedComponent();
// else if (m_curWinTab.getSelectedComponent() instanceof APanelTab)
// isAPanelTab = true;
else
throw new java.lang.IllegalArgumentException("Window-Tab does not contain GridControler");
// change pointers
m_curTabIndex = m_curWinTab.getSelectedIndex();
}
else
{
// Just a Tab Change
log.info("Tab=" + tp);
m_curWinTab = tp;
int tpIndex = m_curWinTab.getSelectedIndex();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -