{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Data Editor","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":false}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"data-editor","__idx":0},"children":["Data Editor"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each layer has an event handler (implementation of ILayerEventHandler). This class is responsible for handling events coming from mouse and keyboard. It has to convert mouse coordinates into model coordinates, update data and shape. To accomplish it we create class HorizonEventHandler which implements ILayerEventHandler."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We implement three methods: mouseReleased(MouseEvent e), mouseDragged (MouseEvent e) and mousePressed(MouseEvent e). The fragment below contains three of them."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["EVENT HANDLING"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"@Override\n    public void mouseReleased(MouseEvent e) {\n        layer.commit(data);\n    }\n    @Override\n    public void mouseDragged(MouseEvent e) {\n        Point2D p = getModelPoint(e);\n        ArrayList<Float> tmpData = new ArrayList<Float>();\n        if(p.getX() >lastPoint.getX()){\n            int start = (int)lastPoint.getX();\n            int end = (int)p.getX();\n            for(int x = start;x<= end;x++){\n                double y = lastPoint.getY();\n                PointData pd = layer.pickValue(x,y);\n                if(pd == null)\n                    break;\n                data.add(pd);\n                tmpData.add(pd.getValue(vertIndex));\n                shape.update((int)lastPoint.getX(), (int)p.getX(), tmpData);\n            }\n        } else{\n            int end = (int)lastPoint.getX();\n            int start = (int)p.getX();\n            for(int x = start;x<=end;x++){                \n                double y = p.getY();\n                PointData pd = layer.pickValue(x,y);\n                if(pd == null)\n                    break;\n                data.add(pd);\n                tmpData.add(pd.getValue(vertIndex));\n                shape.update((int)p.getX(), (int)lastPoint.getX() , tmpData);\n            }\n        }\n        lastPoint = p;\n    }\n    @Override\n    public void mousePressed(MouseEvent e) {\n        data.clear();\n        lastPoint = getModelPoint(e);\n        ArrayList<Float> tmpData = new ArrayList<Float>();\n        PointData pd = layer.pickValue((int)lastPoint.getX(),lastPoint.getY());\n        if(pd == null)\n            return;\n        data.add(pd);\n        tmpData.add(pd.getValue(vertIndex));\n        shape.update((int)lastPoint.getX(), (int)lastPoint.getX(), tmpData);\n    }\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["mouseReleased is simplest, it just commits collected data into layer. mousePressed remembers points where event happens and updates shape. mouseDraged iterates from first point (saved by mousePressed) to last, collects data, updates shape."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Mapping view coordinates to model is done by getModelPoint method (with layer's help):"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["GETMODELPOINT"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"private Point2D getModelPoint(MouseEvent e){\n        Point p = layer.getViewPosition();\n        Point ep = e.getPoint();\n        Point pp= new Point(ep.x+p.x, ep.y+p.y);\n        return layer.deviceToModel(pp);\n    }\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Layer's method commit() updates horizon data:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["COMMIT()"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"void commit(final List<PointData> data) {\n        final IHorizonData hdata = (IHorizonData)getData();\n        hdata.update(new Runnable() {\n            public void run() {\n                for(PointData pd:data){\n                    hdata.addPointData(pd);\n                }\n            }\n        });\n    }\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We finished data editor. HorizonLayer provides basic functionality now. But if you try to change selection in seismic layer you will see our layer ignores it. It still shows old data. The reason is we ignore events INTViewer sends when something important happens. In next section we will fix it: INTViewer events."]}]},"headings":[{"value":"Data Editor","id":"data-editor","depth":1}],"frontmatter":{"title":"Data Editor","pageId":"intviewer-api-for-layers/creating-layer2d/data-editor","seo":{"title":"Data Editor"}},"lastModified":"2026-10-22T14:32:05.573Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/intviewer/intviewer-api-for-layers/creating-layer2d/data-editor","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}