summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoye <joye>2014-04-09 18:42:45 (GMT)
committerjoye <joye>2014-04-09 18:42:45 (GMT)
commit9044717575c1e57944609e1c6ac8a84ff8b73f84 (patch)
tree26ea811d8b270f5f077b4a20f1727a4d184b5fa7
parent00e6acb38db87e3fbc7c97567980549ebd4b9707 (diff)
downloadblt-9044717575c1e57944609e1c6ac8a84ff8b73f84.zip
blt-9044717575c1e57944609e1c6ac8a84ff8b73f84.tar.gz
blt-9044717575c1e57944609e1c6ac8a84ff8b73f84.tar.bz2
*** empty log message ***
-rw-r--r--src/bltGrLegd.C87
-rw-r--r--src/bltGrLegd.h4
-rw-r--r--src/bltGrLegdOp.C64
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);
-}