Files
mars-flaim/xflaim/util/domedit.h
dsandersoremutah c55dab446f Renamed version4 to flaim and version5 to xflaim
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@7 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2006-01-27 21:06:39 +00:00

861 lines
17 KiB
C++

//------------------------------------------------------------------------------
// Desc: DOM editor
//
// Tabs: 3
//
// Copyright (c) 2003-2006 Novell, Inc. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of 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, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com
//
// $Id: domedit.h 3116 2006-01-19 13:31:53 -0700 (Thu, 19 Jan 2006) dsanders $
//------------------------------------------------------------------------------
#ifndef DOMEDIT_HPP
#define DOMEDIT_HPP
class F_DomEditor;
typedef F_DomEditor * F_DomEditor_p;
/*
Constants
*/
#define F_DOMEDIT_BUF_SIZE 0x0000FFFF
#define F_DOMEDIT_MAX_TITLE_SIZE 64
/*
System flags
*/
#define F_DOMEDIT_FLAG_NOPARENT 0x00000001
#define F_DOMEDIT_FLAG_NOCHILD 0x00000002
#define F_DOMEDIT_FLAG_LIST_ITEM 0x00000004
#define F_DOMEDIT_FLAG_HIDE_TAG 0x00000008
#define F_DOMEDIT_FLAG_HIDE_LEVEL 0x00000010
#define F_DOMEDIT_FLAG_HIDE_SOURCE 0x00000020
#define F_DOMEDIT_FLAG_READ_ONLY 0x00000040
#define F_DOMEDIT_FLAG_SELECTED 0x00000080
#define F_DOMEDIT_FLAG_ENDTAG 0x00000100
#define F_DOMEDIT_FLAG_NO_DELETE 0x00000200
#define F_DOMEDIT_FLAG_COLLAPSED 0x00000400
#define F_DOMEDIT_FLAG_HIDE_EXPAND 0x00000800
#define F_DOMEDIT_FLAG_COMMENT 0x00001000
#define F_DOMEDIT_FLAG_KEY_FROM 0x00002000
#define F_DOMEDIT_FLAG_KEY_UNTIL 0x00004000
#define F_DOMEDIT_FLAG_NODOM 0x00008000 // Don't fetch a dom object.
#define F_DOMEDIT_FLAG_ELEMENT_DATA 0x00010000 // Display the data embedded in the element node (acting as the child)
/*
Index selection flags
*/
#define F_DOMEDIT_ISEL_NOIX 0x0001 // Show "no index" as an option
/*
Configuration options
*/
#define F_DOMEDIT_CONFIG_STATS_START 0x0001
#define F_DOMEDIT_CONFIG_STATS_STOP 0x0002
#define F_DOMEDIT_CONFIG_STATS_RESET 0x0003
/*
Types, enums, etc.
*/
typedef enum
{
F_DOMEDIT_EVENT_RECREAD,
F_DOMEDIT_EVENT_RECINSERT,
F_DOMEDIT_EVENT_GETDISPVAL,
F_DOMEDIT_EVENT_GETNEXTNODE,
F_DOMEDIT_EVENT_GETPREVNODE,
F_DOMEDIT_EVENT_IEDIT, // Interactive editor invoked
F_DOMEDIT_EVENT_REFRESH, // Called prior to refresh
F_DOMEDIT_EVENT_NAME_TABLE
} eDomEventType;
#define MAX_DISPLAY_SEGMENT 100
typedef struct
{
char szString[ MAX_DISPLAY_SEGMENT];
FLMUINT uiCol;
FLMUINT uiForeground;
FLMUINT uiBackground;
} DME_DISP_COLUMN;
// Structure to hold an entire row
typedef struct rowInfo
{
FLMUINT uiLevel;
FLMUINT64 ui64NodeId;
FLMUINT64 ui64DocId;
FLMUINT uiNameId;
FLMBOOL bExpanded;
FLMBOOL bHasChildren;
FLMBOOL bHasAttributes;
FLMBOOL bHasElementData; // When this flag is set, the node is acting as the parent.
F_DOMNode * pDomNode;
F_DataVector * pVector;
eDomNodeType eType;
FLMUNICODE * puzValue;
FLMUINT uiLength;
FLMUINT uiIndex;
FLMUINT uiElementNumber;
FLMBOOL bUseValue;
FLMUINT uiFlags;
struct rowInfo * pNext;
struct rowInfo * pPrev;
} DME_ROW_INFO;
typedef struct
{
FLMBOOL bSingleLevel;
FLMUINT uiAnchorLevel;
FLMUINT64 ui64NodeId;
} DME_ROW_ANCHOR;
typedef struct
{
F_NameTable * pNameTable;
FLMBOOL bInitialized;
} DME_NAME_TABLE_INFO;
/*
Callbacks
*/
typedef RCODE (* F_DOMEDIT_DISP_HOOK)(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pRow,
FLMUINT * puiNumVals);
typedef RCODE (* F_DOMEDIT_KEY_HOOK)(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pCurRow,
FLMUINT uiKeyIn,
FLMUINT * puiKeyOut,
void * pvKeyData);
typedef RCODE (* F_DOMEDIT_HELP_HOOK)(
F_DomEditor * pDomEditor,
F_DomEditor * pHelpEditor);
typedef RCODE (* F_DOMEDIT_EVENT_HOOK)(
F_DomEditor * pDomEditor,
eDomEventType eEventType,
void * EventData,
void * UserData);
/*
Class definitions
*/
class F_DomEditor : public XF_RefCount, public XF_Base
{
public:
F_DomEditor( void);
~F_DomEditor( void);
void reset( void);
RCODE Setup(
FTX_SCREEN * pScreen);
void setParent(
F_DomEditor * pParent);
F_DomEditor * getParentEditor( void);
RCODE setSource(
F_Db * pDb,
FLMUINT uiCollection);
F_Db * getSource( void )
{
return m_pDb;
}
RCODE insertRow(
DME_ROW_INFO * pRow,
DME_ROW_INFO * pStartRow = NULL);
RCODE setTitle(
char * pszTitle);
void setCurrentAtTop( void);
void setCurrentAtBottom( void);
void setReadOnly(
FLMBOOL bReadOnly);
RCODE interactiveEdit(
FLMUINT uiULX = 0,
FLMUINT uiULY = 0,
FLMUINT uiLRX = 0,
FLMUINT uiLRY = 0,
FLMBOOL bBorder = TRUE,
FLMUINT uiStatusLines = 1,
FLMUINT uiStartChar = 0);
FLMBOOL isMonochrome( void);
RCODE getPrevRow(
DME_ROW_INFO * pCurRow,
DME_ROW_INFO ** ppPrevRow,
FLMBOOL bFetchPrevRow = FALSE);
RCODE getNextRow(
DME_ROW_INFO * pCurRow,
DME_ROW_INFO ** ppNextRow,
FLMBOOL bFetchNextRow = FALSE,
FLMBOOL bIgnoreAnchor = FALSE);
RCODE getNextDocument(
DME_ROW_INFO * pCurRow,
DME_ROW_INFO ** ppNextRow,
FLMBOOL bFetchNextRow = FALSE,
FLMBOOL bIgnoreAnchor = FALSE);
void setScrFirstRow(
DME_ROW_INFO * pScrFirstRow);
DME_ROW_INFO * getScrFirstRow( void);
DME_ROW_INFO * getScrLastRow( void);
FLMUINT getCursorRow( void);
FLMUINT getNumRows( void);
FLMUINT getDispRows( void)
{
return m_uiNumRows;
}
void setNumDispRows(
FLMUINT uiNumDispRows)
{
m_uiNumRows = uiNumDispRows;
}
RCODE getDisplayValue(
DME_ROW_INFO * pRow,
char * pszBuf,
FLMUINT uiBufSize);
DME_ROW_INFO * findRecord(
FLMUINT uiCollection,
FLMUINT uiDrn,
DME_ROW_INFO * pStartRow = NULL);
void setShutdown(
FLMBOOL * pbShutdown);
FLMBOOL * getShutdown( void);
RCODE setCurrentRow(
DME_ROW_INFO * pCurRow,
FLMUINT uiCurRow);
DME_ROW_INFO * getCurrentRow(
FLMUINT * puiCurRow);
RCODE setFirstRow(
DME_ROW_INFO * pRow);
RCODE setControlFlags(
DME_ROW_INFO * pCurRow,
FLMUINT uiFlags);
RCODE getControlFlags(
DME_ROW_INFO * pCurRow,
FLMUINT * puiFlags);
void setDisplayHook(
F_DOMEDIT_DISP_HOOK pDispHook,
void * DispData);
void setKeyHook(
F_DOMEDIT_KEY_HOOK pKeyHook,
void * KeyData);
void setHelpHook(
F_DOMEDIT_HELP_HOOK pHelpHook,
void * HelpData);
void setEventHook(
F_DOMEDIT_EVENT_HOOK pEventHook,
void * EventData);
F_Db * getDb( void);
FLMUINT getCollection( void);
FLMUINT getLastKey( void);
RCODE getNumber(
char * pszBuf,
FLMUINT64 * pui64Value,
FLMINT64 * pi64Value);
RCODE getCollectionNumber(
char * pszCollectionName,
FLMUINT * puiCollectionNum);
RCODE getIndexNumber(
char * pszIndexName,
FLMUINT * puiIndexNum);
RCODE retrieveNodeFromDb(
FLMUINT uiCollection,
FLMUINT64 ui64NodeId,
FLMUINT uiAttrNameId);
RCODE requestInput(
char * pszMessage,
char * pszResponse,
FLMUINT uiMaxRespLen,
FLMUINT * puiTermChar);
RCODE displayMessage(
char * pszMessage,
RCODE rcOfMessage,
FLMUINT * puiTermChar,
FLMUINT uiBackground,
FLMUINT uiForeground);
RCODE globalConfig(
FLMUINT uiOption);
RCODE createStatusWindow(
char * pszTitle,
FLMUINT uiBack,
FLMUINT uiFore,
FLMUINT * puiCols,
FLMUINT * puiRows,
FTX_WINDOW ** ppWindow);
FLMUINT getULX( void);
FLMUINT getULY( void);
RCODE openNewDb();
RCODE refreshNameTable( void);
RCODE retrieveDocumentList(
FLMUINT uiCollection,
FLMUINT64 * pui64NodeId,
FLMUINT * puiTermChar);
RCODE getDomNode(
FLMUINT64 ui64NodeId,
FLMUINT uiAttrNameId,
F_DOMNode ** ppDomNode);
void setDocList(
FLMBOOL bDocList
)
{
m_bDocList = bDocList;
}
DME_DISP_COLUMN * getDispColumns( void)
{
return &m_dispColumns[0];
}
FINLINE FLMUINT getEditCanvasCols( void);
RCODE getNodeName(
F_DOMNode * pDOMNode,
DME_ROW_INFO * pRow,
FLMUNICODE ** ppuzName,
FLMUINT * puiBufSize = NULL);
RCODE getNodeValue(
F_DOMNode * pDOMNode,
FLMUNICODE ** ppuzValue,
FLMUINT * puiBufSize = NULL,
FLMBOOL bStartTrans = TRUE);
RCODE beginTransaction(
eDbTransType eTransType);
RCODE commitTransaction( void);
RCODE abortTransaction( void);
void doQuery(
char * pszQuery,
FLMUINT uiQueryBufSize);
RCODE indexList( void);
RCODE editIndexRow(
DME_ROW_INFO * pCurRow);
RCODE editIndexNode(
DME_ROW_INFO * pCurRow);
FLMBOOL canEditRow(
DME_ROW_INFO * pCurRow);
void releaseAllRows( void);
FINLINE FLMBOOL isDocList( void)
{
return( m_bDocList);
}
FINLINE FLMUINT getCanvasCols( void)
{
return m_uiEditCanvasCols;
}
RCODE viewOnlyDeleteIxKey( void);
FINLINE FTX_WINDOW * getStatusWindow( void)
{
return( m_pEditStatusWin);
}
private:
/*
Methods
*/
void checkDocument(
DME_ROW_INFO ** ppDocRow,
DME_ROW_INFO * pRow);
RCODE asciiUCMixToUC(
char * pszAscii,
FLMUNICODE * puzUnicode,
FLMUINT uiMaxUniChars);
RCODE UCToAsciiUCMix(
FLMUNICODE * puzUnicode,
char * pszAscii,
FLMUINT uiMaxAsciiChars);
FINLINE DME_ROW_ANCHOR * getRowAnchor( void);
FINLINE void setRowAnchor(
DME_ROW_ANCHOR * pRowAnchor);
RCODE editTextBuffer(
char ** ppszBuffer,
FLMUINT uiBufSize,
FLMUINT * puiTermChar);
RCODE addDocumentToList(
FLMUINT uiCollection,
FLMUINT64 ui64DocumentId);
void releaseLastRow( void);
RCODE expandRow(
DME_ROW_INFO * pRow,
FLMBOOL bOneLevel,
DME_ROW_INFO ** ppLastRow);
RCODE collapseRow(
DME_ROW_INFO ** ppRow);
RCODE refreshEditWindow(
DME_ROW_INFO ** ppFirstRow,
DME_ROW_INFO * pCursorRow,
FLMUINT * puiCurRow);
RCODE refreshRow(
FLMUINT uiRow,
DME_ROW_INFO * pNd,
FLMBOOL bSelected);
RCODE clearSelections( void);
RCODE editRow(
FLMUINT uiRow,
DME_ROW_INFO * pRow,
FLMBOOL bReadOnly = FALSE);
FLMBOOL canDeleteRow(
DME_ROW_INFO * pCurRow);
RCODE addRowToDb(
DME_ROW_INFO * pCurRow,
FLMUINT uiCollection,
FLMBOOL bAddInBackground,
FLMBOOL bStartThread,
FLMUINT * pudDrn);
RCODE modifyRowInDb(
DME_ROW_INFO * pCurRow,
FLMBOOL bAddInBackground,
FLMBOOL bStartThread);
FLMBOOL isExiting( void);
RCODE _insertRow(
DME_ROW_INFO * pRecord,
DME_ROW_INFO * pStartNd = NULL);
RCODE selectCollection(
FLMUINT * puiCollection,
FLMUINT * puiTermChar);
RCODE selectIndex(
FLMUINT uiFlags,
FLMUINT * puiIndex,
FLMUINT * puiTermChar);
RCODE displayAttributes(
DME_ROW_INFO * pRow);
RCODE displayNodeInfo(
DME_ROW_INFO * pRow);
RCODE exportNode(
DME_ROW_INFO * pRow);
RCODE showHelp(
FLMUINT * puiKeyRV = NULL);
RCODE getNextTitle(
DME_ROW_INFO * pRow,
DME_ROW_INFO ** ppNewRow);
RCODE getPrevTitle(
DME_ROW_INFO * pRow,
DME_ROW_INFO ** ppNewRow);
RCODE selectElementAttribute(
DME_ROW_INFO * pRow,
FLMUINT * puiTermChar);
RCODE deleteRow(
DME_ROW_INFO ** ppCurRow);
RCODE addSomething(
DME_ROW_INFO ** ppCurRow);
RCODE createDocumentNode(
DME_ROW_INFO ** ppCurRow);
RCODE createRootElementNode(
DME_ROW_INFO ** ppCurRow);
RCODE createElementNode(
DME_ROW_INFO ** ppCurRow);
RCODE createTextNode(
DME_ROW_INFO ** ppRow,
eDomNodeType eNodeType);
RCODE createAttributeNode(
DME_ROW_INFO ** ppCurRow);
RCODE selectNodeType(
eDomNodeType * peNodeType,
FLMUINT * puiTermChar);
RCODE buildNewRow(
FLMINT iLevel,
F_DOMNode * pDomNode,
DME_ROW_INFO ** ppNewRow);
RCODE selectTag(
FLMUINT uiTagType,
FLMUINT * puiTag,
FLMUINT * puiTermChar);
RCODE selectEncDef(
FLMUINT uiTagType,
FLMUINT * puiEncDefId,
FLMUINT * puiTermChar);
RCODE addComment(
DME_ROW_INFO ** ppCurRow,
const char * pucFormat, ...);
/*
Data
*/
DME_ROW_INFO * m_pScrFirstRow;
DME_ROW_INFO * m_pScrLastRow;
DME_ROW_INFO * m_pCurRow;
DME_ROW_ANCHOR * m_pRowAnchor;
DME_ROW_INFO * m_pDocList;
DME_ROW_INFO * m_pCurDoc;
F_Db * m_pDb;
FLMBOOL m_bOpenedDb;
FLMUINT m_uiCollection;
FLMUINT m_uiLastKey;
char m_szTitle[ F_DOMEDIT_MAX_TITLE_SIZE + 1];
FLMUINT m_uiCurRow;
FLMUINT m_uiEditCanvasRows;
FLMUINT m_uiEditCanvasCols;
FLMUINT m_uiNumRows;
FLMUINT m_uiULX;
FLMUINT m_uiULY;
FLMUINT m_uiLRX;
FLMUINT m_uiLRY;
FLMBOOL m_bReadOnly;
FLMBOOL m_bSetupCalled;
FLMBOOL * m_pbShutdown;
FLMBOOL m_bMonochrome;
FTX_SCREEN * m_pScreen;
FTX_WINDOW * m_pEditWindow;
FTX_WINDOW * m_pEditStatusWin;
F_DomEditor * m_pParent;
F_DOMEDIT_DISP_HOOK m_pDisplayHook;
void * m_DisplayData;
F_DOMEDIT_KEY_HOOK m_pKeyHook;
void * m_KeyData;
F_DOMEDIT_HELP_HOOK m_pHelpHook;
void * m_HelpData;
F_DOMEDIT_EVENT_HOOK m_pEventHook;
void * m_EventData;
FLMBOOL m_bDocList;
F_NameTable * m_pNameTable;
DME_DISP_COLUMN m_dispColumns[ 16];
};
FINLINE FLMUINT F_DomEditor::getEditCanvasCols( void)
{
return m_uiEditCanvasCols;
}
FINLINE void F_DomEditor::setShutdown(
FLMBOOL * pbShutdown)
{
flmAssert( m_bSetupCalled == TRUE);
m_pbShutdown = pbShutdown;
}
FINLINE FLMBOOL * F_DomEditor::getShutdown( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pbShutdown);
}
FINLINE FLMBOOL F_DomEditor::isExiting( void)
{
flmAssert( m_bSetupCalled == TRUE);
if( m_pbShutdown && *m_pbShutdown)
{
return( TRUE);
}
return( FALSE);
}
FINLINE FLMBOOL F_DomEditor::isMonochrome( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_bMonochrome);
}
FINLINE void F_DomEditor::setParent(
F_DomEditor * pParent)
{
flmAssert( m_bSetupCalled == TRUE);
m_pParent = pParent;
}
FINLINE F_DomEditor * F_DomEditor::getParentEditor( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pParent);
}
FINLINE void F_DomEditor::setReadOnly(
FLMBOOL bReadOnly)
{
flmAssert( m_bSetupCalled == TRUE);
m_bReadOnly = bReadOnly;
}
FINLINE DME_ROW_INFO * F_DomEditor::getScrFirstRow( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pScrFirstRow);
}
FINLINE DME_ROW_INFO * F_DomEditor::getScrLastRow( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pScrLastRow);
}
FINLINE FLMUINT F_DomEditor::getCursorRow( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_uiCurRow);
}
FINLINE DME_ROW_ANCHOR * F_DomEditor::getRowAnchor( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pRowAnchor);
}
FINLINE void F_DomEditor::setRowAnchor(
DME_ROW_ANCHOR * pRowAnchor)
{
flmAssert( m_bSetupCalled == TRUE);
m_pRowAnchor = pRowAnchor;
}
FINLINE FLMUINT F_DomEditor::getNumRows( void)
{
flmAssert( m_bSetupCalled == TRUE && m_pEditWindow != NULL);
return( m_uiEditCanvasRows);
}
FINLINE F_Db * F_DomEditor::getDb( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_pDb);
}
FINLINE FLMUINT F_DomEditor::getCollection( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_uiCollection);
}
FINLINE FLMUINT F_DomEditor::getLastKey( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_uiLastKey);
}
FINLINE FLMUINT F_DomEditor::getULX( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_uiULX);
}
FINLINE FLMUINT F_DomEditor::getULY( void)
{
flmAssert( m_bSetupCalled == TRUE);
return( m_uiULY);
}
FINLINE void F_DomEditor::setDisplayHook(
F_DOMEDIT_DISP_HOOK pDispHook,
void * DispData)
{
flmAssert( m_bSetupCalled == TRUE);
m_pDisplayHook = pDispHook;
m_DisplayData = DispData;
}
FINLINE void F_DomEditor::setKeyHook(
F_DOMEDIT_KEY_HOOK pKeyHook,
void * KeyData)
{
flmAssert( m_bSetupCalled == TRUE);
m_pKeyHook = pKeyHook;
m_KeyData = KeyData;
}
FINLINE void F_DomEditor::setHelpHook(
F_DOMEDIT_HELP_HOOK pHelpHook,
void * HelpData)
{
flmAssert( m_bSetupCalled == TRUE);
m_pHelpHook = pHelpHook;
m_HelpData = HelpData;
}
FINLINE void F_DomEditor::setEventHook(
F_DOMEDIT_EVENT_HOOK pEventHook,
void * EventData)
{
flmAssert( m_bSetupCalled == TRUE);
m_pEventHook = pEventHook;
m_EventData = EventData;
}
/*
Prototypes
*/
RCODE F_DomEditorDefaultDispHook(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pRow,
FLMUINT * puiNumVals);
RCODE F_DomEditorViewOnlyKeyHook(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pCurRow,
FLMUINT uiKeyIn,
FLMUINT * puiKeyOut,
void * pvKeyData);
RCODE F_DomEditorSelectionKeyHook(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pCurRow,
FLMUINT uiKeyIn,
FLMUINT * puiKeyOut,
void * pvKeyData);
RCODE F_DomEditorFileKeyHook(
F_DomEditor * pDomEditor,
DME_ROW_INFO * pCurRow,
FLMUINT uiKeyIn,
FLMUINT * puiKeyOut,
void * pvKeyData);
FLMBOOL domDisplayNodeInfo(
FTX_WINDOW * pWindow,
char * pszOutputFileName,
IF_Db * pDb,
FLMUINT uiCollection,
FLMUINT64 ui64NodeId,
FLMBOOL bDoSubTree,
FLMBOOL bWaitForKeystroke);
FLMBOOL domDisplayEntryInfo(
FTX_WINDOW * pWindow,
char * pszOutputFileName,
IF_Db * pDb,
FLMUINT64 ui64NodeId,
FLMBOOL bWaitForKeystroke);
FLMBOOL domDisplayBTreeInfo(
FTX_WINDOW * pWindow,
char * pszOutputFileName,
IF_Db * pDb,
FLMUINT uiLfNum,
FLMBOOL bDoCollection,
FLMBOOL bDoIndex,
FLMBOOL bWaitForKeystroke);
#endif