diff options
author | joye <joye> | 2014-04-09 18:42:45 (GMT) |
---|---|---|
committer | joye <joye> | 2014-04-09 18:42:45 (GMT) |
commit | 9044717575c1e57944609e1c6ac8a84ff8b73f84 (patch) | |
tree | 26ea811d8b270f5f077b4a20f1727a4d184b5fa7 | |
parent | 00e6acb38db87e3fbc7c97567980549ebd4b9707 (diff) | |
download | blt-9044717575c1e57944609e1c6ac8a84ff8b73f84.zip blt-9044717575c1e57944609e1c6ac8a84ff8b73f84.tar.gz blt-9044717575c1e57944609e1c6ac8a84ff8b73f84.tar.bz2 |
*** empty log message ***
-rw-r--r-- | src/bltGrLegd.C | 87 | ||||
-rw-r--r-- | src/bltGrLegd.h | 4 | ||||
-rw-r--r-- | src/bltGrLegdOp.C | 64 |
3 files changed, 77 insertions, 78 deletions
diff --git a/src/bltGrLegd.C b/src/bltGrLegd.C index 8ad4ee2..d97d378 100644 --- a/src/bltGrLegd.C +++ b/src/bltGrLegd.C @@ -45,6 +45,7 @@ extern "C" { Tcl_ObjCmdProc Blt_GraphInstCmdProc; }; +static void SelectCmdProc(ClientData clientData); static Tcl_IdleProc DisplayProc; static Tk_SelectionProc SelectionProc; static Blt_BindPickProc PickEntryProc; @@ -708,6 +709,14 @@ void Legend::eventuallyRedraw() } } +void Legend::eventuallyInvokeSelectCmd() +{ + if ((flags & SELECT_PENDING) == 0) { + flags |= SELECT_PENDING; + Tcl_DoWhenIdle(SelectCmdProc, this); + } +} + void Legend::setOrigin() { LegendOptions* ops = (LegendOptions*)ops_; @@ -863,6 +872,45 @@ void Legend::deselectElement(Element* elemPtr) } } + +int Legend::selectRange(Element *fromPtr, Element *toPtr) +{ + if (Blt_Chain_IsBefore(fromPtr->link, toPtr->link)) { + for (Blt_ChainLink link=fromPtr->link; link; + link=Blt_Chain_NextLink(link)) { + Element* elemPtr = (Element*)Blt_Chain_GetValue(link); + selectEntry(elemPtr); + if (link == toPtr->link) + break; + } + } + else { + for (Blt_ChainLink link=fromPtr->link; link; + link=Blt_Chain_PrevLink(link)) { + Element* elemPtr = (Element*)Blt_Chain_GetValue(link); + selectEntry(elemPtr); + if (link == toPtr->link) + break; + } + } + + return TCL_OK; +} + +void Legend::clearSelection() +{ + LegendOptions* ops = (LegendOptions*)ops_; + + Tcl_DeleteHashTable(&selectTable_); + Tcl_InitHashTable(&selectTable_, TCL_ONE_WORD_KEYS); + Blt_Chain_Reset(selected_); + + // eventuallyRedraw(); + + if (ops->selectCmd) + eventuallyInvokeSelectCmd(); +} + int Legend::entryIsSelected(Element* elemPtr) { Tcl_HashEntry* hPtr = Tcl_FindHashEntry(&selectTable_, (char*)elemPtr); @@ -1014,30 +1062,6 @@ Element* Legend::getLastElement() return NULL; } -int Legend::selectRange(Element *fromPtr, Element *toPtr) -{ - if (Blt_Chain_IsBefore(fromPtr->link, toPtr->link)) { - for (Blt_ChainLink link=fromPtr->link; link; - link=Blt_Chain_NextLink(link)) { - Element* elemPtr = (Element*)Blt_Chain_GetValue(link); - selectEntry(elemPtr); - if (link == toPtr->link) - break; - } - } - else { - for (Blt_ChainLink link=fromPtr->link; link; - link=Blt_Chain_PrevLink(link)) { - Element* elemPtr = (Element*)Blt_Chain_GetValue(link); - selectEntry(elemPtr); - if (link == toPtr->link) - break; - } - } - - return TCL_OK; -} - // Support static void DisplayProc(ClientData clientData) @@ -1089,6 +1113,21 @@ static int SelectionProc(ClientData clientData, int offset, char *buffer, return MIN(nBytes, maxBytes); } +static void SelectCmdProc(ClientData clientData) +{ + Legend* legendPtr = (Legend*)clientData; + LegendOptions* ops = (LegendOptions*)legendPtr->ops_; + + Tcl_Preserve(legendPtr); + legendPtr->flags &= ~SELECT_PENDING; + if (ops->selectCmd) { + Tcl_Interp* interp = legendPtr->graphPtr_->interp; + if (Tcl_GlobalEval(interp, ops->selectCmd) != TCL_OK) + Tcl_BackgroundError(interp); + } + Tcl_Release(legendPtr); +} + static ClientData PickEntryProc(ClientData clientData, int x, int y, ClientData *contextPtr) { diff --git a/src/bltGrLegd.h b/src/bltGrLegd.h index 11f9d0f..120755b 100644 --- a/src/bltGrLegd.h +++ b/src/bltGrLegd.h @@ -167,6 +167,7 @@ class Legend { void draw(Drawable drawable); void print(Blt_Ps ps); void eventuallyRedraw(); + void eventuallyInvokeSelectCmd(); void removeElement(Element*); int getElementFromObj(Tcl_Obj*, Element**); @@ -178,9 +179,10 @@ class Legend { int y() {return y_;} void selectEntry(Element*); - int selectRange(Element*, Element*); void selectElement(Element*); void deselectElement(Element*); + int selectRange(Element*, Element*); + void clearSelection(); int entryIsSelected(Element*); int isRaised() {return ((LegendOptions*)ops_)->raised;} diff --git a/src/bltGrLegdOp.C b/src/bltGrLegdOp.C index 848ee0c..4ba8c3c 100644 --- a/src/bltGrLegdOp.C +++ b/src/bltGrLegdOp.C @@ -35,15 +35,11 @@ extern "C" { #include "bltGrLegd.h" #include "bltGrElem.h" -static void SelectCmdProc(ClientData clientData); -static void EventuallyInvokeSelectCmd(Legend* legendPtr); +static Tk_LostSelProc LostSelectionProc; static int SelectionOp(Graph* graphPtr, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]); static int LegendObjConfigure(Tcl_Interp* interp, Graph* graphPtr, int objc, Tcl_Obj* const objv[]); -static void ClearSelection(Legend* legendPtr); -static Tk_LostSelProc LostSelectionProc; - typedef int (GraphLegendProc)(Graph* graphPtr, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]); @@ -275,7 +271,7 @@ static int FocusOp(Graph* graphPtr, Tcl_Interp* interp, Blt_SetFocusItem(legendPtr->bindTable_, legendPtr->focusPtr_, CID_LEGEND_ENTRY); - graphPtr->legend->eventuallyRedraw(); + // graphPtr->legend->eventuallyRedraw(); if (legendPtr->focusPtr_) Tcl_SetStringObj(Tcl_GetObjResult(interp),legendPtr->focusPtr_->name(),-1); @@ -343,7 +339,7 @@ static int SelectionAnchorOp(Graph* graphPtr, Tcl_Interp* interp, if (elemPtr) Tcl_SetStringObj(Tcl_GetObjResult(interp), elemPtr->name(), -1); - graphPtr->legend->eventuallyRedraw(); + // graphPtr->legend->eventuallyRedraw(); return TCL_OK; } @@ -351,9 +347,7 @@ static int SelectionAnchorOp(Graph* graphPtr, Tcl_Interp* interp, static int SelectionClearallOp(Graph* graphPtr, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { - Legend* legendPtr = graphPtr->legend; - - ClearSelection(legendPtr); + graphPtr->legend->clearSelection(); return TCL_OK; } @@ -404,10 +398,10 @@ static int SelectionMarkOp(Graph* graphPtr, Tcl_Interp* interp, Tcl_SetStringObj(Tcl_GetObjResult(interp), elemPtr->name(), -1); legendPtr->selMarkPtr_ = elemPtr; - graphPtr->legend->eventuallyRedraw(); + // graphPtr->legend->eventuallyRedraw(); if (ops->selectCmd) - EventuallyInvokeSelectCmd(legendPtr); + legendPtr->eventuallyInvokeSelectCmd(); } return TCL_OK; } @@ -476,10 +470,10 @@ static int SelectionSetOp(Graph* graphPtr, Tcl_Interp* interp, if (ops->exportSelection) Tk_OwnSelection(graphPtr->tkwin, XA_PRIMARY, LostSelectionProc, legendPtr); - graphPtr->legend->eventuallyRedraw(); + // graphPtr->legend->eventuallyRedraw(); if (ops->selectCmd) - EventuallyInvokeSelectCmd(legendPtr); + legendPtr->eventuallyInvokeSelectCmd(); return TCL_OK; } @@ -507,53 +501,17 @@ static int SelectionOp(Graph* graphPtr, Tcl_Interp* interp, return (*proc)(graphPtr, interp, objc, objv); } +// Support + static void LostSelectionProc(ClientData clientData) { Legend* legendPtr = (Legend*)clientData; LegendOptions* ops = (LegendOptions*)legendPtr->ops_; if (ops->exportSelection) - ClearSelection(legendPtr); + legendPtr->clearSelection(); } -static void ClearSelection(Legend* legendPtr) -{ - LegendOptions* ops = (LegendOptions*)legendPtr->ops_; - - Tcl_DeleteHashTable(&legendPtr->selectTable_); - Tcl_InitHashTable(&legendPtr->selectTable_, TCL_ONE_WORD_KEYS); - Blt_Chain_Reset(legendPtr->selected_); - - legendPtr->eventuallyRedraw(); - - if (ops->selectCmd) - EventuallyInvokeSelectCmd(legendPtr); -} -static void EventuallyInvokeSelectCmd(Legend* legendPtr) -{ - if ((legendPtr->flags & SELECT_PENDING) == 0) { - legendPtr->flags |= SELECT_PENDING; - Tcl_DoWhenIdle(SelectCmdProc, legendPtr); - } -} - -static void SelectCmdProc(ClientData clientData) -{ - Legend* legendPtr = (Legend*)clientData; - LegendOptions* ops = (LegendOptions*)legendPtr->ops_; - - Tcl_Preserve(legendPtr); - legendPtr->flags &= ~SELECT_PENDING; - if (ops->selectCmd) { - Tcl_Interp* interp; - - interp = legendPtr->graphPtr_->interp; - if (Tcl_GlobalEval(interp, ops->selectCmd) != TCL_OK) { - Tcl_BackgroundError(interp); - } - } - Tcl_Release(legendPtr); -} |