示例#1
0
        public override void OnLeftMouseButtonDown(OverlayShapeVM item, Point p, TEMouseArgs e)
        {
            if (!EnsureParseTreeExists())
                return;

            Point prast = overlay.Rasterizer.RasterizePixel(p);
            p = overlay.Rasterizer.RasterizePixelToTikz(p);
            if (ContinueWithBigImage(p) == false)
                return;

            overlay.BeginUpdate();

            overlay.SetCorrectRaster(overlay.CurEditing, true);

            //Point p = new Point(e.GetPosition(canvas1).X, Height - e.GetPosition(canvas1).Y);


            // find next tikzpicture and add
            bool lcreated;
            if (EnsureCurAddToExists(out lcreated))
            {
                {
                    // there are three states:  (i)   new path -> add coordinate
                    //                          (ii)  add controlpoints
                    //                          (iii) 2 cps's added -> add bezier segment
                    if (CPCount == 2)
                    {
                        // add controls
                        Tikz_Controls tcont = new Tikz_Controls();
                        tcont.starttag = " .. controls ";
                        tcont.endtag = " ..";
                        Parser.Tikz_Coord tc1 = new Parser.Tikz_Coord(), tc2 = new Parser.Tikz_Coord(); // control points
                        tc1.type = tc2.type = overlay.UsePolarCoordinates ? Parser.Tikz_CoordType.Polar : Parser.Tikz_CoordType.Cartesian;

                        tcont.AddChild(tc1);
                        tcont.AddChild(new Tikz_Something(" and "));
                        tcont.AddChild(tc2);

                        curAddTo.AddChild(tcont);

                        // the endpoint
                        Parser.Tikz_Coord tcend = new Parser.Tikz_Coord();
                        tcend.type = overlay.UsePolarCoordinates ? Parser.Tikz_CoordType.Polar : Parser.Tikz_CoordType.Cartesian;
                        curAddTo.AddChild(new Tikz_Something(" "));
                        curAddTo.AddChild(tcend);
                        
                        // do it here since the coordinate calculation needs the parents' coord. transform, and the second added point 
                        tcend.SetAbsPos(p);                        
                        tc1.SetAbsPos(CP1);
                        tc2.SetAbsPos(CP2);
 
                        tcont.UpdateText();
                        tcend.UpdateText();

                        // draw the added objects in the overlay
                 //       overlay.AddToDisplayTree(tcend);
                 //       overlay.AddToDisplayTree(tcont);

                        CPCount = 0;
                        Preview_CP1.Visible = Preview_CP2.Visible = false;
                    }
                    else if (lcreated)
                    {
                        // add starting point
                        // create new coordinate
                        Parser.Tikz_Coord tc = new Parser.Tikz_Coord();
                        tc.type = overlay.UsePolarCoordinates ? Parser.Tikz_CoordType.Polar : Parser.Tikz_CoordType.Cartesian;
                        curAddTo.AddChild(tc);
                        // do it here since the coordinate calculation needs the parents' coord. transform
                        tc.SetAbsPos(new Point(p.X, p.Y)); //hack
                        curAddTo.UpdateText();                        
                        // draw the added object in the overlay
                //        overlay.AddToDisplayTree(tc);

                        CPCount = 0;
                    } else 
                    {
                        // remember control points
                        if (CPCount == 0)
                        {
                            CP1 = p;

                            Preview_CP1.SetCenter(prast.X, prast.Y);
                            ////Canvas.SetLeft(Preview_CP1, prast.X - Preview_CP1.Width / 2);
                            ////Canvas.SetBottom(Preview_CP1, prast.Y - Preview_CP1.Height / 2);
                            ////if (!overlay.canvas.Children.Contains(Preview_CP1))
                            ////    overlay.canvas.Children.Add(Preview_CP1);
                            ////Preview_CP1.Visibility = Visibility.Visible;
                            Preview_CP1.Visible = true;
                        }
                        else if (CPCount == 1)
                        {
                            CP2 = p;
                            Preview_CP2.SetCenter(prast.X, prast.Y);
                            ////Canvas.SetLeft(Preview_CP2, prast.X - Preview_CP2.Width / 2);
                            ////Canvas.SetBottom(Preview_CP2, prast.Y - Preview_CP2.Height / 2);
                            ////if (!overlay.canvas.Children.Contains(Preview_CP2))
                            ////    overlay.canvas.Children.Add(Preview_CP2);
                            ////Preview_CP2.Visibility = Visibility.Visible;
                            Preview_CP2.Visible = true;
                        }
                        CPCount++;
                    }
                }
            }

            overlay.EndUpdate();
        }
示例#2
0
        static bool FillItem(TikzContainerParseItem item, CommonTree t, CommonTokenStream tokens)
        {
            int curToken = t.TokenStartIndex;
            if (item is Tikz_ParseTree)
                curToken = 0;   // for root, start at the beginning

            if (t.Children == null)
                return false;

            foreach (CommonTree childt in t.Children)
            {
                addSomething(item, tokens, curToken, childt.TokenStartIndex - 1);
                
                switch (childt.Type)
                {
                    case simpletikzParser.IM_PICTURE:
                        Tikz_Picture tp = new Tikz_Picture();
                        FillItem(tp, childt, tokens);
                        item.AddChild(tp);
                        break;
                    case simpletikzParser.IM_STARTTAG:
                        item.starttag = getTokensString(tokens, childt.TokenStartIndex, childt.TokenStopIndex);
                        break;
                    case simpletikzParser.IM_ENDTAG:
                        item.endtag = getTokensString(tokens, childt.TokenStartIndex, childt.TokenStopIndex);
                        break;
                    case simpletikzParser.IM_PATH:
                        Tikz_Path tpath = new Tikz_Path();
                        FillItem(tpath, childt, tokens);
                        item.AddChild(tpath);
                        break;
                    case simpletikzParser.IM_SCOPE:
                        Tikz_Scope tscope = new Tikz_Scope();
                        FillItem(tscope, childt, tokens);
                        item.AddChild(tscope);
                        break;
                    case simpletikzParser.IM_COORD:
                        Tikz_Coord tc = Tikz_Coord.FromCommonTree(childt, tokens);
                        tc.text = getTokensString(tokens, childt);
                        item.AddChild(tc);
                        break;
                    case simpletikzParser.IM_ARC:
                        Tikz_Arc ta = Tikz_Arc.FromCommonTree(childt, tokens);
                        ta.text = getTokensString(tokens, childt);
                        item.AddChild(ta);
                        break;
                    case simpletikzParser.IM_NODE:
                        Tikz_Node tn = Tikz_Node.FromCommonTree(childt, tokens);
                        tn.text = getTokensString(tokens, childt);
                        item.AddChild(tn);
                        break;                    
                    case simpletikzParser.IM_OPTION_KV:
                    case simpletikzParser.IM_OPTION_STYLE:
                        Tikz_Option topt = Tikz_Option.FromCommonTree(childt, tokens);
                        if (topt == null) break;
                        //topt.text = getTokensString(tokens, childt);
                        String s = getTokensString(tokens, childt);
                        topt.text = s;
                        item.AddChild(topt);
                        break;
                    case simpletikzParser.IM_OPTIONS:
                        //Tikz_Options to = Tikz_Options.FromCommonTree(childt);                        
                        Tikz_Options to = new Tikz_Options();
                        FillItem(to, childt, tokens);
                        item.AddChild(to);
                        //to.text = getTokensString(tokens, childt);
                        //item.AddChild(tn);
                        if (item.options == null)
                        {
                            // determine whether option belongs to the item (e.g. \draw [this belongs to draw] blabla [thisnot])
                            // i.e., the scope of the options is the whole item's body
                            // this is hacky
                            if (item.Children.Count == 1 ||
                                (item.Children.Count == 2 && (item.Children[0] is Tikz_Something)
                                 && item.Children[0].ToString().Trim() == ""))
                            {
                                item.options = to;
                            }
                        }
                        break;
                    case simpletikzParser.IM_TIKZSET:
                        Tikz_Options to2 = new Tikz_Options();
                        FillItem(to2, childt, tokens);
                        item.AddChild(to2);
                        break;
                    case simpletikzParser.IM_STYLE:
                        Tikz_Option topt2 = Tikz_Option.FromCommonTree(childt, tokens);
                        //FillItem(to2, childt, tokens);
                        topt2.text = getTokensString(tokens, childt);
                        item.AddChild(topt2);
                        break;
                    case simpletikzParser.IM_CONTROLS:
                        Tikz_Controls tcontrols = new Tikz_Controls();
                        FillItem(tcontrols, childt, tokens);
                        item.AddChild(tcontrols);
                        break;
                    case simpletikzParser.IM_SIZE:
                        Tikz_Size tsize = Tikz_Size.FromCommonTree(childt, tokens);
                        tsize.text = getTokensString(tokens, childt);
                        item.AddChild(tsize);
                        //Tikz_Size tsize = new Tikz_Size();
                        //item.AddChild(tsize);
                        break;                 
                    //case simpletikzParser.ID:
                    //case simpletikzParser.IM_STRING:
                    //case simpletikzParser.COMMAND:
                    //case simpletikzParser.T__57:
                    //    break;
                    case simpletikzParser.IM_TIKZEDT_CMD:
                        Tikz_EdtCommand cmd = new Tikz_EdtCommand(getTokensString(tokens, childt));
                        item.AddChild(cmd);
                        break;
                    case simpletikzParser.IM_DONTCARE:
                        Tikz_Something st = new Tikz_Something(getTokensString(tokens, childt));
                        item.AddChild(st);
                        break;
                        
                    default:
                        // getting here is an error
                        throw new Exception(" childt.Type not handled! " + childt.Type.ToString() + " (\"" + getTokensString(tokens, childt) + "\")");
                        //break;

                }

                curToken = childt.TokenStopIndex + 1;               

            }

            if (t.TokenStartIndex >= 0)   // rule out empty code 
                addSomething(item, tokens, curToken, t.TokenStopIndex);

            return true;
        }