Commit d9acba5a authored by Claes Sjofors's avatar Claes Sjofors

Xtt method toolbar modified

parent d7cb9b1d
......@@ -1025,7 +1025,8 @@ XttGtk::XttGtk( int argc, char *argv[], int *return_sts) :
gtk_toolbar_append_widget( tools, tools_zoom_reset,CoWowGtk::translate_utf8("Zoom reset"), "");
// Toolbar
methodtoolbar = new XttMethodToolbarGtk(0, 0, ~mt_mMethod_RtNavigator, "");
methodtoolbar = new XttMethodToolbarGtk(0, 0, ~pwr_mXttOpMethodsMask_ParentObjectGraph,
~pwr_mXttMntMethodsMask_RtNavigator, "");
GtkToolbar *tools2 = (GtkToolbar *) ((XttMethodToolbarGtk *)methodtoolbar)->build();
// Statusbar and cmd input
......
This diff is collapsed.
......@@ -2751,16 +2751,18 @@ class GeMethodToolbar : public GeDynElem {
public:
pwr_tAName method_object;
static int method_toolbar_op_cnt;
static unsigned int method_toolbar_op_helpmask;
static unsigned int method_toolbar_mnt_helpmask;
#if 0
static int method_toolbar_op_cnt;
static char method_toolbar_op_subgraph[32][80];
static char method_toolbar_op_methods[32][80];
static char method_toolbar_op_tooltip[32][80];
static int method_toolbar_mnt_cnt;
static unsigned int method_toolbar_mnt_helpmask;
static char method_toolbar_mnt_subgraph[32][80];
static char method_toolbar_mnt_methods[32][80];
static char method_toolbar_mnt_tooltip[32][80];
#endif
GeMethodToolbar( GeDyn *e_dyn, ge_mInstance e_instance = ge_mInstance_1) :
GeDynElem(e_dyn, ge_mDynType1_No, ge_mDynType2_No, ge_mActionType1_MethodToolbar, ge_mActionType2_No, ge_eDynPrio_MethodToolbar)
......
......@@ -53,6 +53,7 @@
#include "ge_graph.h"
#include "ge_attr.h"
#include "ge_dyn.h"
#include "ge_methods.h"
#include "ge_msg.h"
#include "glow_msg.h"
......@@ -5162,10 +5163,10 @@ void Graph::create_toolbar( grow_tObject *object, double x, double y)
GeDyn *dyn;
grow_CreateGrowToolbar( grow->ctx, "mbtoolbar", "mbtoolbar",
(char *)GeMethodToolbar::method_toolbar_op_subgraph,
(char *)GeMethodToolbar::method_toolbar_mnt_subgraph,
GeMethodToolbar::method_toolbar_op_cnt,
GeMethodToolbar::method_toolbar_mnt_cnt,
(char *)GeMethods::op_subgraph,
(char *)GeMethods::mnt_subgraph,
GeMethods::opmeth_size,
GeMethods::mntmeth_size,
x, y, NULL, object);
dyn = new GeDyn( this);
dyn->action_type1 = dyn->total_action_type1 = ge_mActionType1_MethodToolbar;
......
/*
* Proview Open Source Process Control.
* Copyright (C) 2005-2014 SSAB EMEA AB.
*
* This file is part of Proview.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of
* the License, or (at your option) any later version.
*
* 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 Proview. If not, see <http://www.gnu.org/licenses/>
*
* Linking Proview statically or dynamically with other modules is
* making a combined work based on Proview. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
*
* In addition, as a special exception, the copyright holders of
* Proview give you permission to, from the build function in the
* Proview Configurator, combine Proview with modules generated by the
* Proview PLC Editor to a PLC program, regardless of the license
* terms of these modules. You may copy and distribute the resulting
* combined work under the terms of your choice, provided that every
* copy of the combined work is accompanied by a complete copy of
* the source code of Proview (the version used to produce the
* combined work), being distributed under the terms of the GNU
* General Public License plus this exception.
*/
/* ge_methodtoolbar.cpp -- Find available methods */
#include <stdio.h>
#include <stdlib.h>
#include "pwr.h"
#include "pwr_baseclasses.h"
#include "co_cdh.h"
#include "rt_gdh.h"
#include "ge_methods.h"
pwr_tString80 GeMethods::op_name[GeMethods::opmeth_size] = {
"Graph",
"Object Graph",
"Trend",
"History",
"Fast",
"Camera",
"Event Log...",
"Block Events...",
"Help",
"Photo",
"Note",
"Parent Object Graph"};
pwr_tString80 GeMethods::op_subgraph[GeMethods::opmeth_size] = {
"pwr_mb2opengraph",
"pwr_mb2openobjectgraph",
"pwr_mb2trend",
"pwr_mb2history",
"pwr_mb2fast",
"pwr_mb2camera",
"pwr_mb2histevent",
"pwr_mb2blockevents",
"pwr_mb2help",
"pwr_mb2photo",
"pwr_mb2note",
"pwr_mb2parentgraph"};
pwr_tString80 GeMethods::op_image[GeMethods::opmeth_size] = {
"$pwr_exe/xtt_meth_graph.png",
"$pwr_exe/xtt_meth_classgraph.png",
"$pwr_exe/xtt_meth_trend.png",
"$pwr_exe/xtt_meth_history.png",
"$pwr_exe/xtt_meth_fast.png",
"",
"$pwr_exe/xtt_meth_histevent.png",
"$pwr_exe/xtt_meth_block.png",
"$pwr_exe/xtt_meth_help.png",
"$pwr_exe/xtt_meth_photo.png",
"$pwr_exe/xtt_meth_note.png",
""};
pwr_tString80 GeMethods::op_tooltip[GeMethods::opmeth_size] = {
"Graph",
"Object graph",
"Trend",
"History",
"Fast curve",
"Camera",
"Event log",
"Block events",
"Help",
"Photo",
"Note",
"Open parent object graph"};
pwr_tString80 GeMethods::op_method[GeMethods::opmeth_size] = {
"$Object-OpenGraph",
"$Object-OpenObjectGraph",
"$Object-OpenTrend",
"$Object-OpenHistory",
"$Object-OpenFast",
"$Object-Camera",
"$Object-HistEvent",
"$Object-BlockEvents",
"$Object-Help",
"$Object-Photo",
"$Object-Note",
"$Object-OpenParentObjectGraph"};
pwr_tString80 GeMethods::op_filter[GeMethods::opmeth_size] = {
"$Object-OpenGraphFilter",
"$Object-OpenObjectGraphFilter",
"$Object-OpenTrendFilter",
"$Object-OpenHistoryFilter",
"$Object-OpenFastFilter",
"$Object-CameraFilter",
"$Object-HistEventFilter",
"$Object-BlockEventsFilter",
"$Object-HelpFilter",
"$Object-PhotoFilter",
"$Object-NoteFilter",
"$Object-OpenParentObjectGraphFilter"};
pwr_tString80 GeMethods::mnt_name[GeMethods::mntmeth_size] = {
"Open Object",
"Open Plc",
"RtNavigator",
"Crossreferences",
"Help Class",
"DataSheet",
"CircuitDiagram",
"","","","","","","","","","","","","","","","","","","","","","","","",
"Simulate"};
pwr_tString80 GeMethods::mnt_subgraph[GeMethods::mntmeth_size] = {
"pwr_mb2openobject",
"pwr_mb2openplc",
"pwr_mb2rtnavigator",
"pwr_mb2crossreferences",
"pwr_mb2helpclass",
"pwr_mb2datasheet",
"pwr_mb2circuitdiagram",
"","","","","","","","","","","","","","","","","","","","","","","","",
"pwr_mb2simulate"};
pwr_tString80 GeMethods::mnt_image[GeMethods::mntmeth_size] = {
"$pwr_exe/xtt_meth_openobject.png",
"$pwr_exe/xtt_meth_trace.png",
"$pwr_exe/xtt_meth_navigator.png",
"$pwr_exe/xtt_meth_crossref.png",
"$pwr_exe/xtt_meth_classhelp.png",
"$pwr_exe/xtt_meth_datasheet.png",
"$pwr_exe/xtt_meth_circuitdiagram.png",
"","","","","","","","","","","","","","","","","","","","","","","","",
""};
pwr_tString80 GeMethods::mnt_tooltip[GeMethods::mntmeth_size] = {
"Open object",
"Open plc",
"Navigator",
"Crossreferences",
"Help class",
"Datasheet",
"CicuitDiagram",
"","","","","","","","","","","","","","","","","","","","","","","","",
"Simulate"};
pwr_tString80 GeMethods::mnt_method[GeMethods::mntmeth_size] = {
"$Object-OpenObject",
"$Object-OpenTrace",
"$Object-RtNavigator",
"$Object-OpenCrossref",
"$Object-HelpClass",
"$Object-DataSheet",
"$Object-CircuitDiagram",
"","","","","","","","","","","","","","","","","","","","","","","","",
"$Object-Simulate"};
pwr_tString80 GeMethods::mnt_filter[GeMethods::mntmeth_size] = {
"$Object-OpenObjectFilter",
"$Object-OpenTraceFilter",
"$Object-RtNavigatorFilter",
"$Object-OpenCrossrefFilter",
"$Object-HelpClassFilter",
"$Object-DataSheetFilter",
"$Object-CircuitDiagramFilter",
"","","","","","","","","","","","","","","","","","","","","","","","",
"$Object-SimulateFilter"};
int GeMethods::get_xm_mask( pwr_tAttrRef *arp, char *name, pwr_sClass_XttMethodsMask *xm_mask, int *configured,
int (command_cb)( char *cmd, void *udata), void *udata)
{
pwr_tAName aname, xm_name;
pwr_tStatus sts;
pwr_tCmd command;
int mask_configure = 0;
*configured = 0;
if ( name) {
strncpy( aname, name, sizeof(aname));
}
else {
sts = gdh_AttrrefToName( arp, aname, sizeof(aname), cdh_mName_pathStrict);
if ( EVEN(sts)) return sts;
}
strcpy( xm_name, aname);
strcat( xm_name, ".XttMethodsMask");
sts = gdh_GetObjectInfo( xm_name, xm_mask, sizeof(*xm_mask));
if ( ODD(sts)) {
if ( !(xm_mask->Flags & pwr_mXttMethodsFlagsMask_IsConfigured)) {
mask_configure = 1;
*configured = 1;
}
}
else {
mask_configure = 1;
xm_mask->Flags = 0;
}
if ( mask_configure) {
xm_mask->OpMethods = 0;
for ( int i = 0; i < opmeth_size; i++) {
if ( strcmp( op_name[i], "") == 0)
continue;
#if 0
if ( strcmp( op_name[i], "Parent Object Graph") == 0) {
if ( strchr( aname, '.') != 0)
xm_mask->OpMethods |= 1 << i;
}
else
#endif
{
sprintf( command, "check method/filter=\"%s\"/object=%s",
op_filter[i], aname);
sts = (command_cb)(command, udata);
if ( ODD(sts))
xm_mask->OpMethods |= 1 << i;
}
}
xm_mask->MntMethods = 0;
for ( int i = 0; i < mntmeth_size; i++) {
if ( strcmp( mnt_name[i], "") == 0)
continue;
sprintf( command, "check method/filter=\"%s\"/object=%s",
mnt_filter[i], aname);
sts = (command_cb)( command, udata);
if ( ODD(sts))
xm_mask->MntMethods |= 1 << i;
}
xm_mask->Flags |= pwr_mXttMethodsFlagsMask_IsConfigured;
}
return 1;
}
/*
* Proview Open Source Process Control.
* Copyright (C) 2005-2014 SSAB EMEA AB.
*
* This file is part of Proview.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of
* the License, or (at your option) any later version.
*
* 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 Proview. If not, see <http://www.gnu.org/licenses/>
*
* Linking Proview statically or dynamically with other modules is
* making a combined work based on Proview. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
*
* In addition, as a special exception, the copyright holders of
* Proview give you permission to, from the build function in the
* Proview Configurator, combine Proview with modules generated by the
* Proview PLC Editor to a PLC program, regardless of the license
* terms of these modules. You may copy and distribute the resulting
* combined work under the terms of your choice, provided that every
* copy of the combined work is accompanied by a complete copy of
* the source code of Proview (the version used to produce the
* combined work), being distributed under the terms of the GNU
* General Public License plus this exception.
*/
#ifndef ge_methods_h
#define ge_methods_h
#include <string.h>
#include "pwr.h"
#include "pwr_baseclasses.h"
class GeMethods {
public:
static const int opmeth_size = 12;
static const int mntmeth_size = 32;
static const unsigned int op_helpmask = 1 << 8;
static const unsigned int mnt_helpmask = 1 << 4;
static pwr_tString80 op_name[opmeth_size];
static pwr_tString80 op_subgraph[opmeth_size];
static pwr_tString80 op_image[opmeth_size];
static pwr_tString80 op_tooltip[opmeth_size];
static pwr_tString80 op_method[opmeth_size];
static pwr_tString80 op_filter[opmeth_size];
static pwr_tString80 mnt_name[mntmeth_size];
static pwr_tString80 mnt_subgraph[mntmeth_size];
static pwr_tString80 mnt_image[mntmeth_size];
static pwr_tString80 mnt_tooltip[mntmeth_size];
static pwr_tString80 mnt_method[mntmeth_size];
static pwr_tString80 mnt_filter[mntmeth_size];
static int get_xm_mask( pwr_tAttrRef *arp, char *name, pwr_sClass_XttMethodsMask *xm_mask, int *configured,
int (command_cb)( char *cmd, void *udata), void *udata);
};
#endif
......@@ -326,13 +326,14 @@ EvGtk::EvGtk( void *ev_parent_ctx,
g_object_set( tools_zoom_reset, "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( tools, tools_zoom_reset,CoWowGtk::translate_utf8("Zoom reset"), "");
eve_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~0, "");
eve_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~pwr_mXttOpMethodsMask_ParentObjectGraph, ~0, "");
GtkToolbar *tools_meth = (GtkToolbar *) ((XttMethodToolbarGtk *)eve_methodtoolbar)->build();
eve_methodtoolbar->m_xnav = (XNav *)parent_ctx;
eve_methodtoolbar->m_parent_ctx = eve;
eve_methodtoolbar->get_select_cb = eve->get_select;
eve_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, mt_mMethod_OpenPlc | mt_mMethod_RtNavigator,
eve_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, 0, pwr_mXttMntMethodsMask_OpenTrace |
pwr_mXttMntMethodsMask_RtNavigator,
" for supervisory object");
GtkToolbar *tools_sup = (GtkToolbar *) ((XttMethodToolbarGtk *)eve_sup_methodtoolbar)->build();
eve_sup_methodtoolbar->m_xnav = (XNav *)parent_ctx;
......@@ -624,14 +625,15 @@ EvGtk::EvGtk( void *ev_parent_ctx,
g_object_set( tools_zoom_reset, "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( tools, tools_zoom_reset,CoWowGtk::translate_utf8("Zoom reset"), "");
ala_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~0, "");
ala_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~pwr_mXttOpMethodsMask_ParentObjectGraph, ~0, "");
GtkToolbar *tools_meth = (GtkToolbar *) ((XttMethodToolbarGtk *)ala_methodtoolbar)->build();
ala_methodtoolbar->m_xnav = (XNav *)parent_ctx;
ala_methodtoolbar->m_parent_ctx = ala;
ala_methodtoolbar->get_select_cb = ala->get_select;
ala_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, mt_mMethod_OpenPlc | mt_mMethod_RtNavigator,
ala_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, 0, pwr_mXttMntMethodsMask_OpenTrace |
pwr_mXttMntMethodsMask_RtNavigator,
" for supervisory object");
GtkToolbar *tools_sup = (GtkToolbar *) ((XttMethodToolbarGtk *)ala_sup_methodtoolbar)->build();
ala_sup_methodtoolbar->m_xnav = (XNav *)parent_ctx;
......
......@@ -385,14 +385,15 @@ EvAlaGtk::EvAlaGtk( void *ev_parent_ctx,
g_object_set( tools_zoom_reset, "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( tools, tools_zoom_reset,CoWowGtk::translate_utf8("Zoom reset"), "");
ala_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~0, "");
ala_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~pwr_mXttOpMethodsMask_ParentObjectGraph, ~0, "");
GtkToolbar *tools_meth = (GtkToolbar *) ((XttMethodToolbarGtk *)ala_methodtoolbar)->build();
ala_methodtoolbar->m_xnav = (XNav *)((Ev *)parent_ctx)->parent_ctx;
ala_methodtoolbar->m_parent_ctx = ala;
ala_methodtoolbar->get_select_cb = ala->get_select;
ala_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, mt_mMethod_OpenPlc | mt_mMethod_RtNavigator,
ala_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, 0, pwr_mXttMntMethodsMask_OpenTrace |
pwr_mXttMntMethodsMask_RtNavigator,
" for supervisory object");
GtkToolbar *tools_sup = (GtkToolbar *) ((XttMethodToolbarGtk *)ala_sup_methodtoolbar)->build();
ala_sup_methodtoolbar->m_xnav = (XNav *)((Ev *)parent_ctx)->parent_ctx;
......
......@@ -362,14 +362,15 @@ EvEveGtk::EvEveGtk( void *ev_parent_ctx,
g_object_set( tools_zoom_reset, "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( tools, tools_zoom_reset,CoWowGtk::translate_utf8("Zoom reset"), "");
eve_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~0, "");
eve_methodtoolbar = new XttMethodToolbarGtk(0, 0, ~pwr_mXttOpMethodsMask_ParentObjectGraph, ~0, "");
GtkToolbar *tools_meth = (GtkToolbar *) ((XttMethodToolbarGtk *)eve_methodtoolbar)->build();
eve_methodtoolbar->m_xnav = (XNav *)((Ev *)parent_ctx)->parent_ctx;
eve_methodtoolbar->m_parent_ctx = ala;
eve_methodtoolbar->get_select_cb = ala->get_select;
eve_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, mt_mMethod_OpenPlc | mt_mMethod_RtNavigator,
eve_sup_methodtoolbar = new XttMethodToolbarGtk(0, 0, 0, pwr_mXttMntMethodsMask_OpenTrace |
pwr_mXttMntMethodsMask_RtNavigator,
" for supervisory object");
GtkToolbar *tools_sup = (GtkToolbar *) ((XttMethodToolbarGtk *)eve_sup_methodtoolbar)->build();
eve_sup_methodtoolbar->m_xnav = (XNav *)((Ev *)parent_ctx)->parent_ctx;
......
......@@ -41,14 +41,17 @@
#include <gtk/gtk.h>
#include "co_dcli.h"
#include "cow_wow_gtk.h"
#include "co_cdh.h"
#include "rt_gdh.h"
#include "xtt_xnav.h"
#include "xtt_methodtoolbar_gtk.h"
#include "ge_methods.h"
XttMethodToolbarGtk::XttMethodToolbarGtk( void *parent_ctx, void *xnav, unsigned int method_mask,
const char *tooltip_suffix) :
XttMethodToolbar( parent_ctx, xnav, method_mask, tooltip_suffix), m_timerid(0)
XttMethodToolbarGtk::XttMethodToolbarGtk( void *parent_ctx, void *xnav, unsigned int op_method_mask,
unsigned int mnt_method_mask, const char *tooltip_suffix) :
XttMethodToolbar( parent_ctx, xnav, op_method_mask, mnt_method_mask, tooltip_suffix), m_timerid(0)
{
for ( int i = 0; i < m_size; i++) {
for ( int i = 0; i < 64; i++) {
m_cb[i].mt = this;
m_cb[i].idx = i;
}
......@@ -68,6 +71,8 @@ void XttMethodToolbarGtk::activate_button( GtkWidget *w, gpointer data)
int sts = 0;
int is_attr;
pwr_sAttrRef aref;
pwr_tAName aname;
pwr_tCmd cmd;
xmenu_eItemType menu_type;
if ( mt->get_select_cb)
......@@ -81,13 +86,23 @@ void XttMethodToolbarGtk::activate_button( GtkWidget *w, gpointer data)
else
menu_type = xmenu_eItemType_Attribute;
mt->m_xnav->call_method( mt->m_data[idx].method, mt->m_data[idx].filter, aref,
menu_type,
xmenu_mUtility_XNav,
mt->m_xnav->priv, 0);
sts = gdh_AttrrefToName( &aref, aname, sizeof(aname), cdh_mName_volumeStrict);
if ( idx < 32)
sprintf( cmd, "call method/function=%s/object=%s", GeMethods::op_method[idx], aname);
else
sprintf( cmd, "call method/function=%s/object=%s", GeMethods::mnt_method[idx-32], aname);
mt->m_xnav->command( cmd);
}
}
static int methods_command_cb( char *command, void *udata)
{
XNav *xnav = (XNav *)udata;
xnav->command( command);
return xnav->get_command_sts();
}
GtkWidget *XttMethodToolbarGtk::build()
{
pwr_tFileName fname;
......@@ -95,20 +110,36 @@ GtkWidget *XttMethodToolbarGtk::build()
// Toolbar
m_toolbar_w = (GtkWidget *) g_object_new(GTK_TYPE_TOOLBAR, NULL);
for ( int i = 0; i < m_size; i++) {
if ( m_method_mask & (1 << i)) {
for ( int i = 0; i < GeMethods::opmeth_size; i++) {
if ( m_op_method_mask & (1 << i) && strcmp( GeMethods::op_image[i],"") != 0) {
char tooltip[200];
strcpy( tooltip, GeMethods::op_tooltip[i]);
strcat( tooltip, m_tooltip_suffix);
m_op_button_w[i] = gtk_button_new();
dcli_translate_filename( fname, GeMethods::op_image[i]);
gtk_container_add( GTK_CONTAINER(m_op_button_w[i]),
gtk_image_new_from_file( fname));
g_signal_connect( m_op_button_w[i], "clicked", G_CALLBACK(activate_button), &m_cb[i]);
g_object_set( m_op_button_w[i], "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( GTK_TOOLBAR(m_toolbar_w), m_op_button_w[i], CoWowGtk::translate_utf8( tooltip), "");
}
}
for ( int i = 0; i < GeMethods::mntmeth_size; i++) {
if ( m_mnt_method_mask & (1 << i) && strcmp( GeMethods::mnt_image[i],"") != 0) {
char tooltip[200];
strcpy( tooltip, m_data[i].tooltip);
strcpy( tooltip, GeMethods::mnt_tooltip[i]);
strcat( tooltip, m_tooltip_suffix);
m_button_w[i] = gtk_button_new();
dcli_translate_filename( fname, m_data[i].image);
gtk_container_add( GTK_CONTAINER(m_button_w[i]),
m_mnt_button_w[i] = gtk_button_new();
dcli_translate_filename( fname, GeMethods::mnt_image[i]);
gtk_container_add( GTK_CONTAINER(m_mnt_button_w[i]),
gtk_image_new_from_file( fname));
g_signal_connect( m_button_w[i], "clicked", G_CALLBACK(activate_button), &m_cb[i]);
g_object_set( m_button_w[i], "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( GTK_TOOLBAR(m_toolbar_w), m_button_w[i], CoWowGtk::translate_utf8( tooltip), "");
g_signal_connect( m_mnt_button_w[i], "clicked", G_CALLBACK(activate_button), &m_cb[32+i]);
g_object_set( m_mnt_button_w[i], "can-focus", FALSE, NULL);
gtk_toolbar_append_widget( GTK_TOOLBAR(m_toolbar_w), m_mnt_button_w[i], CoWowGtk::translate_utf8( tooltip), "");
}
}
return m_toolbar_w;
......@@ -145,9 +176,13 @@ void XttMethodToolbarGtk::set_current_sensitive()
sts = (get_select_cb)( m_parent_ctx, &aref, &is_attr);
if ( EVEN(sts)) {
// Nothing selected
for ( int i = 0; i < m_size; i++) {
if ( m_method_mask & (1 << i))
gtk_widget_set_sensitive( m_button_w[i], FALSE);
for ( int i = 0; i < GeMethods::opmeth_size; i++) {
if ( m_op_method_mask & (1 << i) && strcmp( GeMethods::op_image[i], "") != 0)
gtk_widget_set_sensitive( m_op_button_w[i], FALSE);
}
for ( int i = 0; i < GeMethods::mntmeth_size; i++) {
if ( m_mnt_method_mask & (1 << i) && strcmp( GeMethods::mnt_image[i], "") != 0)
gtk_widget_set_sensitive( m_mnt_button_w[i], FALSE);
}
}
else {
......@@ -158,9 +193,13 @@ void XttMethodToolbarGtk::set_current_sensitive()
if ( EVEN(sts)) return;
if ( info.cid == pwr_eClass_ExternVolume) {
for ( int i = 0; i < m_size; i++) {
if ( m_method_mask & (1 << i))
gtk_widget_set_sensitive( m_button_w[i], FALSE);
for ( int i = 0; i < GeMethods::opmeth_size; i++) {
if ( m_op_method_mask & (1 << i) && strcmp( GeMethods::op_image[i], "") != 0)
gtk_widget_set_sensitive( m_op_button_w[i], FALSE);
}
for ( int i = 0; i < GeMethods::mntmeth_size; i++) {
if ( m_mnt_method_mask & (1 << i) && strcmp( GeMethods::mnt_image[i], "") != 0)
gtk_widget_set_sensitive( m_mnt_button_w[i], FALSE);
}
return;
}
......@@ -172,15 +211,37 @@ void XttMethodToolbarGtk::set_current_sensitive()
else
menu_type = xmenu_eItemType_Attribute;
for ( int i = 0; i < m_size; i++) {
if ( m_method_mask & (1 << i)) {
sts = m_xnav->check_object_methodfilter( aref, menu_type, xmenu_mUtility_XNav,
m_xnav->priv, m_data[i].name);
if ( ODD(sts))
gtk_widget_set_sensitive( m_button_w[i], TRUE);
pwr_tAName aname;
pwr_sClass_XttMethodsMask xm_mask;
int mask_store = 0;
sts = gdh_AttrrefToName( &aref, aname, sizeof(aname), cdh_mName_volumeStrict);
if ( EVEN(sts)) return;
sts = GeMethods::get_xm_mask( 0, aname, &xm_mask, &mask_store, methods_command_cb, m_xnav);
for ( int i = 0; i < GeMethods::opmeth_size; i++) {
if ( m_op_method_mask & (1 << i) && strcmp( GeMethods::op_image[i],"") != 0) {
if ( xm_mask.OpMethods & (1 << i))
gtk_widget_set_sensitive( m_op_button_w[i], TRUE);
else
gtk_widget_set_sensitive( m_button_w[i], FALSE);
gtk_widget_set_sensitive( m_op_button_w[i], FALSE);
}
}
for ( int i = 0; i < GeMethods::mntmeth_size; i++) {
if ( m_mnt_method_mask & (1 << i) && strcmp( GeMethods::mnt_image[i],"") != 0) {
if ( xm_mask.MntMethods & (1 << i))
gtk_widget_set_sensitive( m_mnt_button_w[i], TRUE);
else
gtk_widget_set_sensitive( m_mnt_button_w[i], FALSE);
}
}
if ( mask_store) {
strcat( aname, ".XttMethodsMask");
sts = gdh_SetObjectInfo( aname, &xm_mask, sizeof(xm_mask));
if ( EVEN(sts))
printf( "Set mask error %s\n", aname);
}
}
}
......@@ -49,12 +49,13 @@ typedef struct {
class XttMethodToolbarGtk : public XttMethodToolbar {
public:
GtkWidget *m_toolbar_w;
GtkWidget *m_button_w[m_size];
xtt_sMethodButtonCb m_cb[m_size];
GtkWidget *m_op_button_w[32];
GtkWidget *m_mnt_button_w[32];
xtt_sMethodButtonCb m_cb[64];
gint m_timerid;
XttMethodToolbarGtk( void *parent_ctx, void *xnav, unsigned int method_mask,
const char *tooltip_suffix);
XttMethodToolbarGtk( void *parent_ctx, void *xnav, unsigned int op_method_mask,
unsigned int mnt_method_mask, const char *tooltip_suffix);
~XttMethodToolbarGtk();
GtkWidget *build();
void set_sensitive();
......
......@@ -1014,6 +1014,94 @@ static pwr_tStatus OpenObjectGraphFilter( xmenu_sMenuCall *ip)
return XNAV__INVISIBLE;
}
// Open parent class graph
static pwr_tStatus OpenParentObjectGraph( xmenu_sMenuCall *ip)
{
int sts;
pwr_tAName name;
char cmd[800];
pwr_sAttrRef aref;
pwr_sAttrRef *objar;
pwr_tAttrRef pobjar;
if (!ip->ItemList || cdh_ObjidIsNull( ip->ItemList[ip->ChosenItem].CurrentObject.Objid))
objar = &ip->Pointed;
else
objar = &ip->ItemList[ip->ChosenItem].CurrentObject;
if ( !objar->Flags.b.ObjectAttr)
return 0;
sts = gdh_AttrArefToObjectAref( objar, &pobjar);
if ( EVEN(sts)) return sts;
sts = gdh_AttrrefToName( &pobjar,
name, sizeof(name), cdh_mNName);
if ( EVEN(sts)) return sts;
// Check if object is mounted with other name
sts = gdh_NameToAttrref( pwr_cNObjid, name, &aref);
if ( EVEN(sts)) {
sts = gdh_AttrrefToName( &pobjar,
name, sizeof(name), cdh_mName_volumeStrict);
if ( EVEN(sts)) return sts;
}
sprintf( cmd, "open graph/class/inst=%s/name=\"%s\"", name, name);
((XNav *)ip->EditorContext)->command( cmd);
return XNAV__SUCCESS;
}
// Open object graph filter
static pwr_tStatus OpenParentObjectGraphFilter( xmenu_sMenuCall *ip)
{
int sts;
pwr_tClassId classid;
pwr_tObjName classname;
pwr_tFileName fname;
pwr_tFileName found_file;
pwr_sAttrRef *objar;
pwr_tAttrRef pobjar;
if (!ip->ItemList || cdh_ObjidIsNull( ip->ItemList[ip->ChosenItem].CurrentObject.Objid))
objar = &ip->Pointed;
else
objar = &ip->ItemList[ip->ChosenItem].CurrentObject;
if ( !objar->Flags.b.ObjectAttr)
return XNAV__INVISIBLE;
sts = gdh_AttrArefToObjectAref( objar, &pobjar);
if ( EVEN(sts))
return XNAV__INVISIBLE;
for ( sts = gdh_GetAttrRefTid( &pobjar, &classid);
ODD(sts);
sts = gdh_GetSuperClass( classid, &classid, pwr_cNObjid)) {
sts = gdh_ObjidToName( cdh_ClassIdToObjid( classid),
classname, sizeof(classname), cdh_mName_object);
if ( EVEN(sts)) return sts;
cdh_ToLower( classname, classname);
if ( classname[0] == '$')
sprintf( fname, "$pwr_exe/pwr_c_%s.pwg", &classname[1]);
else
sprintf( fname, "$pwr_exe/pwr_c_%s.pwg", classname);
sts = dcli_search_file( fname, found_file, DCLI_DIR_SEARCH_INIT);
dcli_search_file( fname, found_file, DCLI_DIR_SEARCH_END);
if ( EVEN(sts)) {
sprintf( fname, "$pwrp_exe/%s.pwg", classname);
sts = dcli_search_file( fname, found_file, DCLI_DIR_SEARCH_INIT);
dcli_search_file( fname, found_file, DCLI_DIR_SEARCH_END);
}
if ( ODD(sts))
return XNAV__SUCCESS;
}
return XNAV__INVISIBLE;
}
// Open Graph
static pwr_tStatus OpenGraph( xmenu_sMenuCall *ip)
{
......@@ -2255,6 +2343,8 @@ pwr_dExport pwr_BindXttMethods($Object) = {
pwr_BindXttMethod(RtNavigatorFilter),
pwr_BindXttMethod(OpenObjectGraph),
pwr_BindXttMethod(OpenObjectGraphFilter),
pwr_BindXttMethod(OpenParentObjectGraph),
pwr_BindXttMethod(OpenParentObjectGraphFilter),
pwr_BindXttMethod(OpenGraph),
pwr_BindXttMethod(OpenGraphFilter),
pwr_BindXttMethod(Collect),
......
......@@ -41,24 +41,3 @@
#include "xtt_methodtoolbar.h"
int XttMethodToolbar::m_disabled = 0;
xtt_sMethodButton XttMethodToolbar::m_data[XttMethodToolbar::m_size] =
{{"Help", "$Object-Help", "$Object-HelpFilter", "$pwr_exe/xtt_meth_help.png", "Help"},
{"Note", "$Object-Note", "$Object-NoteFilter", "$pwr_exe/xtt_meth_note.png", "Note"},
{"Trend", "$Object-OpenTrend", "$Object-OpenTrendFilter", "$pwr_exe/xtt_meth_trend.png", "Trend"},
{"Fast", "$Object-OpenFast", "$Object-OpenFastFilter", "$pwr_exe/xtt_meth_fast.png", "Fast"},
{"History", "$Object-OpenHistory", "$Object-OpenHistoryFilter", "$pwr_exe/xtt_meth_history.png", "History"},
{"Photo", "$Object-Photo", "$Object-PhotoFilter", "$pwr_exe/xtt_meth_photo.png", "Photo"},
{"Graph", "$Object-OpenGraph", "$Object-OpenGraphFilter", "$pwr_exe/xtt_meth_graph.png", "Graph"},
{"RtNavigator", "$Object-RtNavigator", "$Object-RtNavigatorFilter", "$pwr_exe/xtt_meth_navigator.png", "RtNavigator"},
{"Object Graph", "$Object-OpenObjectGraph","$Object-OpenObjectGraphFilter", "$pwr_exe/xtt_meth_classgraph.png", "Object Graph"},
{"Open Plc", "$Object-OpenTrace", "$Object-OpenTraceFilter", "$pwr_exe/xtt_meth_trace.png", "Open Plc"},
{"DataSheet", "$Object-DataSheet", "$Object-DataSheetFilter", "$pwr_exe/xtt_meth_datasheet.png", "DataSheet"},
{"Event Log...", "$Object-HistEvent", "$Object-HistEventFilter", "$pwr_exe/xtt_meth_histevent.png", "Event Log..."},
{"Block Events...", "$Object-BlockEvents", "$Object-BlockEventsFilter", "$pwr_exe/xtt_meth_block.png", "Block Events..."},
{"Open Object", "$Object-OpenObject", "$Object-OpenObjectFilter", "$pwr_exe/xtt_meth_openobject.png", "Open Object"},
{"Crossreferences", "$Object-OpenCrossref", "$Object-OpenCrossrefFilter", "$pwr_exe/xtt_meth_crossref.png", "Crossreferences"},
{"CircuitDiagram", "$Object-CircuitDiagram", "$Object-CircuitDiagramFilter", "$pwr_exe/xtt_meth_circuitdiagram.png", "CircuitDiagram"},
{"Help Class", "$Object-HelpClass", "$Object-HelpClassFilter", "$pwr_exe/xtt_meth_classhelp.png", "Help Class"}};
......@@ -42,48 +42,20 @@
class XNav;
typedef struct {
char name[80];
char method[80];
char filter[80];
char image[80];
char tooltip[80];
} xtt_sMethodButton;
typedef enum {
mt_mMethod_Help = 1 << 0,
mt_mMethod_Note = 1 << 1,
mt_mMethod_Trend = 1 << 2,
mt_mMethod_Fast = 1 << 3,
mt_mMethod_History = 1 << 4,
mt_mMethod_Photo = 1 << 5,
mt_mMethod_Graph = 1 << 6,
mt_mMethod_RtNavigator = 1 << 7,
mt_mMethod_ObjectGraph = 1 << 8,
mt_mMethod_OpenPlc = 1 << 9,
mt_mMethod_DataSheet = 1 << 10,
mt_mMethod_HistEvent = 1 << 11,
mt_mMethod_BlockEvents = 1 << 12,
mt_mMethod_OpenObject = 1 << 13,
mt_mMethod_Crossreferences = 1 << 14,
mt_mMethod_CircuitDiagram = 1 << 15,
mt_mMethod_HelpClass = 1 << 16
} mt_mMethod;
class XttMethodToolbar {
public:
static const int m_size = 17;
static xtt_sMethodButton m_data[m_size];
static int m_disabled;
XNav *m_xnav;
void *m_parent_ctx;
unsigned int m_method_mask;
unsigned int m_op_method_mask;
unsigned int m_mnt_method_mask;
char m_tooltip_suffix[80];
int (*get_select_cb)( void *, pwr_tAttrRef *, int *);
XttMethodToolbar( void *parent_ctx, void *xnav, unsigned int method_mask, const char *tooltip_suffix) :
m_xnav((XNav *)xnav), m_parent_ctx(parent_ctx), m_method_mask(method_mask),
get_select_cb(0) { strcpy( m_tooltip_suffix, tooltip_suffix); }
XttMethodToolbar( void *parent_ctx, void *xnav, unsigned int op_method_mask,
unsigned int mnt_method_mask, const char *tooltip_suffix) :
m_xnav((XNav *)xnav), m_parent_ctx(parent_ctx), m_op_method_mask(op_method_mask),
m_mnt_method_mask(mnt_method_mask), get_select_cb(0) { strcpy( m_tooltip_suffix, tooltip_suffix); }
virtual ~XttMethodToolbar() {}
virtual void set_sensitive() {}
......
......@@ -397,12 +397,12 @@ dcli_tCmdTable xnav_command_table[] = {
{
"CALL",
&xnav_call_func,
{ "dcli_arg1", "/METHOD", "/OBJECT", ""}
{ "dcli_arg1", "/METHOD", "/OBJECT", "/FUNCTION", ""}
},
{
"CHECK",
&xnav_check_func,
{ "dcli_arg1", "/METHOD", "/OBJECT", ""}
{ "dcli_arg1", "/METHOD", "/OBJECT", "/FILTER", ""}
},
{
"PRINT",
......@@ -6756,36 +6756,68 @@ static int xnav_call_func( void *client_data,
xmenu_eItemType menu_type;
pwr_sAttrRef aref;
if ( EVEN( dcli_get_qualifier( "/METHOD", method_str, sizeof(method_str)))) {
xnav->message('E', "Enter method");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
if ( ODD( dcli_get_qualifier( "/FUNCTION", method_str, sizeof(method_str)))) {
xmenu_sMenuCall mcp;
pwr_tStatus (*method)( xmenu_sMenuCall *);
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
sts = XNav::GetMethod( method_str, &method);
if ( EVEN(sts)) {
xnav->message('E', "Method not found");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
if ( aref.Flags.b.Object)
menu_type = xmenu_eItemType_Object;
else if ( aref.Flags.b.ObjectAttr)
menu_type = xmenu_eItemType_AttrObject;
else
menu_type = xmenu_eItemType_Attribute;
memset( &mcp, 0, sizeof(mcp));
mcp.Pointed = aref;
mcp.Selected = &aref;
mcp.SelectCount = 1;
mcp.EditorContext = xnav;
sts = xnav->call_object_method( aref, menu_type, xmenu_mUtility_XNav,
xnav->priv, method_str);
if ( EVEN(sts)) {
xnav->message('E',"Unable to call method");
return XNAV__HOLDCOMMAND;
}
else
sts = (method)( &mcp);
return sts;
}
else {
if ( EVEN( dcli_get_qualifier( "/METHOD", method_str, sizeof(method_str)))) {
xnav->message('E', "Enter method");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
if ( aref.Flags.b.Object)
menu_type = xmenu_eItemType_Object;
else if ( aref.Flags.b.ObjectAttr)
menu_type = xmenu_eItemType_AttrObject;
else
menu_type = xmenu_eItemType_Attribute;
sts = xnav->call_object_method( aref, menu_type, xmenu_mUtility_XNav,
xnav->priv, method_str);
if ( EVEN(sts)) {
xnav->message('E',"Unable to call method");
return XNAV__HOLDCOMMAND;
}
else
return sts;
}
}
else
xnav->message('E',"Syntax error");
......@@ -6801,8 +6833,7 @@ static int xnav_check_func( void *client_data,
arg1_sts = dcli_get_qualifier( "dcli_arg1", arg1_str, sizeof(arg1_str));
if ( cdh_NoCaseStrncmp( arg1_str, "METHOD", strlen( arg1_str)) == 0)
{
if ( cdh_NoCaseStrncmp( arg1_str, "METHOD", strlen( arg1_str)) == 0) {
// Command is "CHECK METHOD"
char method_str[80];
pwr_tAName object_str;
......@@ -6810,31 +6841,63 @@ static int xnav_check_func( void *client_data,
xmenu_eItemType menu_type;
pwr_sAttrRef aref;
if ( EVEN( dcli_get_qualifier( "/METHOD", method_str, sizeof(method_str)))) {
xnav->message('E', "Enter method");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
if ( ODD( dcli_get_qualifier( "/FILTER", method_str, sizeof(method_str)))) {
xmenu_sMenuCall mcp;
pwr_tStatus (*method)( xmenu_sMenuCall *);
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
sts = XNav::GetMethod( method_str, &method);
if ( EVEN(sts)) {
xnav->message('E', "Method not found");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
if ( aref.Flags.b.Object)
menu_type = xmenu_eItemType_Object;
else if ( aref.Flags.b.ObjectAttr)
menu_type = xmenu_eItemType_AttrObject;
else
menu_type = xmenu_eItemType_Attribute;
memset( &mcp, 0, sizeof(mcp));
mcp.Pointed = aref;
mcp.Selected = &aref;
mcp.SelectCount = 1;
mcp.EditorContext = xnav;
sts = xnav->check_object_methodfilter( aref, menu_type, xmenu_mUtility_XNav,
xnav->priv, method_str);
return sts;
sts = (method)( &mcp);
return sts;
}
else {
if ( EVEN( dcli_get_qualifier( "/METHOD", method_str, sizeof(method_str)))) {
xnav->message('E', "Enter method");
return XNAV__HOLDCOMMAND;
}
if ( EVEN( dcli_get_qualifier( "/OBJECT", object_str, sizeof(object_str)))) {
xnav->message('E', "Enter object");
return XNAV__HOLDCOMMAND;
}
sts = gdh_NameToAttrref( pwr_cNObjid, object_str, &aref);
if ( EVEN(sts)) {
xnav->message('E', "No such object");
return XNAV__HOLDCOMMAND;
}
if ( aref.Flags.b.Object)
menu_type = xmenu_eItemType_Object;
else if ( aref.Flags.b.ObjectAttr)
menu_type = xmenu_eItemType_AttrObject;
else
menu_type = xmenu_eItemType_Attribute;
sts = xnav->check_object_methodfilter( aref, menu_type, xmenu_mUtility_XNav,
xnav->priv, method_str);
return sts;
}
}
if ( cdh_NoCaseStrncmp( arg1_str, "ISATTRIBUTE", strlen( arg1_str)) == 0)
{
......
xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png

249 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png

261 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png
xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png
xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png
xtt/mmi/xtt/src/xtt_meth_circuitdiagram.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_classgraph.png

280 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_classgraph.png

502 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_classgraph.png
xtt/mmi/xtt/src/xtt_meth_classgraph.png
xtt/mmi/xtt/src/xtt_meth_classgraph.png
xtt/mmi/xtt/src/xtt_meth_classgraph.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_classhelp.png

258 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_classhelp.png

333 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_classhelp.png
xtt/mmi/xtt/src/xtt_meth_classhelp.png
xtt/mmi/xtt/src/xtt_meth_classhelp.png
xtt/mmi/xtt/src/xtt_meth_classhelp.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_crossref.png

382 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_crossref.png

793 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_crossref.png
xtt/mmi/xtt/src/xtt_meth_crossref.png
xtt/mmi/xtt/src/xtt_meth_crossref.png
xtt/mmi/xtt/src/xtt_meth_crossref.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_datasheet.png

342 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_datasheet.png

244 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_datasheet.png
xtt/mmi/xtt/src/xtt_meth_datasheet.png
xtt/mmi/xtt/src/xtt_meth_datasheet.png
xtt/mmi/xtt/src/xtt_meth_datasheet.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_fast.png

284 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_fast.png

339 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_fast.png
xtt/mmi/xtt/src/xtt_meth_fast.png
xtt/mmi/xtt/src/xtt_meth_fast.png
xtt/mmi/xtt/src/xtt_meth_fast.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_history.png

293 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_history.png

321 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_history.png
xtt/mmi/xtt/src/xtt_meth_history.png
xtt/mmi/xtt/src/xtt_meth_history.png
xtt/mmi/xtt/src/xtt_meth_history.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_note.png

172 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_note.png

323 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_note.png
xtt/mmi/xtt/src/xtt_meth_note.png
xtt/mmi/xtt/src/xtt_meth_note.png
xtt/mmi/xtt/src/xtt_meth_note.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_openobject.png

411 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_openobject.png

253 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_openobject.png
xtt/mmi/xtt/src/xtt_meth_openobject.png
xtt/mmi/xtt/src/xtt_meth_openobject.png
xtt/mmi/xtt/src/xtt_meth_openobject.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_photo.png

277 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_photo.png

471 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_photo.png
xtt/mmi/xtt/src/xtt_meth_photo.png
xtt/mmi/xtt/src/xtt_meth_photo.png
xtt/mmi/xtt/src/xtt_meth_photo.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_trace.png

349 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_trace.png

485 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_trace.png
xtt/mmi/xtt/src/xtt_meth_trace.png
xtt/mmi/xtt/src/xtt_meth_trace.png
xtt/mmi/xtt/src/xtt_meth_trace.png
  • 2-up
  • Swipe
  • Onion skin
xtt/mmi/xtt/src/xtt_meth_trend.png

293 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_trend.png

322 Bytes | W: | H:

xtt/mmi/xtt/src/xtt_meth_trend.png
xtt/mmi/xtt/src/xtt_meth_trend.png
xtt/mmi/xtt/src/xtt_meth_trend.png
xtt/mmi/xtt/src/xtt_meth_trend.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment