[FEATURE] Remove orphaned oracle raster plugin

Marked as feature to flag for documentation and changelog
This commit is contained in:
Nyall Dawson 2016-12-16 19:25:29 +10:00
parent a3faa92339
commit 77ae8a23b6
15 changed files with 0 additions and 1554 deletions

1
debian/qgis.install vendored
View File

@ -1,7 +1,6 @@
usr/lib/qgis/plugins/libgeorefplugin.so
usr/lib/qgis/plugins/libgpsimporterplugin.so
usr/lib/qgis/plugins/libcoordinatecaptureplugin.so
usr/lib/qgis/plugins/liboracleplugin.so
usr/lib/qgis/plugins/libevis.so
usr/lib/qgis/plugins/libspatialqueryplugin.so
usr/lib/qgis/plugins/libofflineeditingplugin.so

View File

@ -386,7 +386,6 @@ tar -C %OSGEO4W_ROOT% -cjf %ARCH%/release/qgis/%PACKAGENAME%/%PACKAGENAME%-%VERS
"apps/%PACKAGENAME%/plugins/georefplugin.dll" ^
"apps/%PACKAGENAME%/plugins/gpsimporterplugin.dll" ^
"apps/%PACKAGENAME%/plugins/offlineeditingplugin.dll" ^
"apps/%PACKAGENAME%/plugins/oracleplugin.dll" ^
"apps/%PACKAGENAME%/plugins/spatialqueryplugin.dll" ^
"apps/%PACKAGENAME%/plugins/topolplugin.dll" ^
"apps/%PACKAGENAME%/plugins/geometrycheckerplugin.dll" ^

View File

@ -15,7 +15,6 @@ WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "globeplugin" "false
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "gpsimporterplugin" "true"
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "grassplugin" "true"
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "offlineeditingplugin" "true"
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "oracleplugin" "true"
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "spatialqueryplugin" "true"
WriteRegStr HKEY_CURRENT_USER "Software\QGIS\QGIS3\Plugins" "topolplugin" "true"

View File

@ -6,7 +6,6 @@ ENDIF()
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/${QGIS_PLUGIN_SUBDIR})
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/${QGIS_PLUGIN_SUBDIR})
ADD_SUBDIRECTORY(oracle_raster)
ADD_SUBDIRECTORY(coordinate_capture)
ADD_SUBDIRECTORY(evis)
ADD_SUBDIRECTORY(spatialquery)

View File

@ -1,57 +0,0 @@
########################################################
# Files
SET (ORACLE_SRCS
qgsoracle_plugin.cpp
qgsselectgeoraster_ui.cpp
qgsoracleconnect_ui.cpp
)
SET (ORACLE_UIS
qgsselectgeorasterbase.ui
qgsoracleconnectbase.ui
)
SET (ORACLE_MOC_HDRS
qgsoracle_plugin.h
qgsselectgeoraster_ui.h
qgsoracleconnect_ui.h
)
SET (ORACLE_RCCS oracleplugin.qrc)
########################################################
# Build
QT5_WRAP_UI (ORACLE_UIS_H ${ORACLE_UIS})
QT5_WRAP_CPP (ORACLE_MOC_SRCS ${ORACLE_MOC_HDRS})
QT5_ADD_RESOURCES(ORACLE_RCC_SRCS ${ORACLE_RCCS})
ADD_LIBRARY (oracleplugin MODULE ${ORACLE_SRCS} ${ORACLE_MOC_SRCS} ${ORACLE_RCC_SRCS} ${ORACLE_UIS_H})
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
../../core ../../core/geometry ../../core/raster
../../gui
..
)
INCLUDE_DIRECTORIES( SYSTEM
${GDAL_INCLUDE_DIR}
)
TARGET_LINK_LIBRARIES(oracleplugin
qgis_core
qgis_gui
)
########################################################
# Install
INSTALL(TARGETS oracleplugin
RUNTIME DESTINATION ${QGIS_PLUGIN_DIR}
LIBRARY DESTINATION ${QGIS_PLUGIN_DIR})

View File

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/oracleplugin/" >
<file>oracleraster.svg</file>
</qresource>
</RCC>

View File

@ -1,377 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
id="svg5692"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="oracleraster.svg"
inkscape:export-filename="/home/denis/Desktop/oracle.png"
inkscape:export-xdpi="67.5"
inkscape:export-ydpi="67.5">
<title
id="title2829">GIS icon theme 0.2</title>
<defs
id="defs5694">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective3486" />
<inkscape:perspective
id="perspective3496"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3600"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7871"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective8710"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective9811"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4762"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
patternUnits="userSpaceOnUse"
width="25.999994"
height="25.999999"
patternTransform="translate(-26.390194,4.7313728)"
id="pattern4576">
<rect
y="0"
x="6.4999981"
height="6.499999"
width="6.499999"
id="rect6419"
style="fill:#6e97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
inkscape:transform-center-y="-4.3333322"
inkscape:transform-center-x="-3.2499991"
y="6.5"
x="6.4999981"
height="6.499999"
width="6.499999"
id="rect6419-6-9"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="0"
x="0"
height="6.499999"
width="6.499999"
id="rect6419-6-7"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="6.5"
x="0"
height="6.499999"
width="6.499999"
id="rect6419-3"
style="fill:#6d97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="0"
x="19.499996"
height="6.499999"
width="6.499999"
id="rect6419-8"
style="fill:#6e97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
inkscape:transform-center-y="-4.3333322"
inkscape:transform-center-x="-3.2499991"
y="6.5"
x="19.499996"
height="6.499999"
width="6.499999"
id="rect6419-6-9-8"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="0"
x="12.999997"
height="6.499999"
width="6.499999"
id="rect6419-6-7-5"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="6.5"
x="12.999997"
height="6.499999"
width="6.499999"
id="rect6419-3-7"
style="fill:#6d97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="13"
x="6.4999981"
height="6.499999"
width="6.499999"
id="rect6419-1"
style="fill:#6e97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
inkscape:transform-center-y="-4.3333322"
inkscape:transform-center-x="-3.2499991"
y="19.499998"
x="6.4999981"
height="6.499999"
width="6.499999"
id="rect6419-6-9-5"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="13"
x="0"
height="6.499999"
width="6.499999"
id="rect6419-6-7-0"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="19.499998"
x="0"
height="6.499999"
width="6.499999"
id="rect6419-3-76"
style="fill:#6d97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="13"
x="19.499996"
height="6.499999"
width="6.499999"
id="rect6419-0"
style="fill:#6e97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
inkscape:transform-center-y="-4.3333322"
inkscape:transform-center-x="-3.2499991"
y="19.5"
x="19.499996"
height="6.499999"
width="6.499999"
id="rect6419-6-9-4"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="13"
x="12.999997"
height="6.499999"
width="6.499999"
id="rect6419-6-7-3"
style="fill:#253e5b;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<rect
y="19.5"
x="12.999997"
height="6.499999"
width="6.499999"
id="rect6419-3-1"
style="fill:#6d97c4;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
</pattern>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.9375"
inkscape:cx="9.2426579"
inkscape:cy="11.376563"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
borderlayer="false"
inkscape:window-width="1382"
inkscape:window-height="852"
inkscape:window-x="382"
inkscape:window-y="67"
inkscape:window-maximized="0"
inkscape:snap-global="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-object-midpoints="false"
inkscape:snap-grids="false"
inkscape:object-paths="false"
inkscape:snap-bbox="false"
inkscape:bbox-nodes="true">
<inkscape:grid
type="xygrid"
id="grid5700"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
dotted="true"
originx="2.5px"
originy="2.5px" />
</sodipodi:namedview>
<metadata
id="metadata5697">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>GIS icon theme 0.2</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Robert Szczepanek</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>Robert Szczepanek</dc:title>
</cc:Agent>
</dc:rights>
<dc:subject>
<rdf:Bag>
<rdf:li>GIS icons</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:coverage>GIS icons</dc:coverage>
<dc:description>http://robert.szczepanek.pl/</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer"
style="display:inline"
transform="translate(0,-8)">
<path
style="fill:#7799c8;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 8.1659017,11.633061 6.4029223,0 0,6.128008 -6.4029223,0 z"
id="rect3249"
inkscape:connector-curvature="0" />
<path
style="fill:#233854;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
inkscape:transform-center-x="-3.2014611"
inkscape:transform-center-y="-4.0853379"
d="m 8.1659017,17.761072 6.4029223,0 0,6.128007 -6.4029223,0 z"
id="rect3251"
inkscape:connector-curvature="0" />
<path
style="fill:#233854;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 2.6589294,12.448714 5.5069734,-0.815653 0,6.128008 -6.4029231,0 z"
id="rect3253"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#7799c8;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 1.7629797,17.761072 6.4029231,0 0,6.128007 -5.3977112,-0.752911 z"
id="rect3255"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#233854;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 14.568823,11.633061 5.288449,0.89931 1.114474,5.228698 -6.402923,0 z"
id="rect3261"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#7799c8;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 14.568823,17.761072 6.402923,0 -1.267441,5.479668 -5.135482,0.648339 z"
id="rect3263"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
style="fill:none;stroke:#3a5d8c;stroke-width:1.47500002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:2.4"
id="rect6415"
width="18.52524"
height="12.897"
x="1.9805"
y="11.34426"
rx="5"
ry="4"
inkscape:export-filename="/home/denis/Desktop/rect6415.png"
inkscape:export-xdpi="67.5"
inkscape:export-ydpi="67.5" />
<g
style="display:inline"
id="g3772"
transform="matrix(0.69230769,0,0,0.69230769,1.8461539,9.8461539)">
<rect
ry="2.6149368"
inkscape:export-ydpi="120"
inkscape:export-xdpi="120"
y="19"
x="19"
height="13"
width="13"
id="rect3563"
style="fill:#5a8c5a;fill-opacity:1;stroke:#555753;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
inkscape:export-filename="C:\Program Files\QGIS-Dev\themes\gis-0.1\mActionAddOgrLayer.png"
rx="2.6149371" />
<path
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 21.6,25.499999 7.8,0"
id="path3807"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
id="path3809"
d="M 25.5,29.399999 25.5,21.6"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsssc"
id="path6992"
d="m 20.3,25.499999 10.4,0 c 0,0 0,0 0,-2.6 C 30.7,20.3 30.05,20.3 25.5,20.3 c -4.55,0 -5.2,0 -5.2,2.599999 0,2.6 0,2.6 0,2.6 z"
style="opacity:0.3;fill:#fcffff;fill-rule:evenodd;stroke:none;display:inline;enable-background:new" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,170 +0,0 @@
/***************************************************************************
oracleplugin.cpp Access Oracle Spatial Plugin
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "qgsoracle_plugin.h"
#include "qgsselectgeoraster_ui.h"
#include <QMenu>
static const QString sName = QObject::tr( "Oracle Spatial GeoRaster" );
static const QString sDescription = QObject::tr( "Access Oracle Spatial GeoRaster" );
static const QString sCategory = QObject::tr( "Layers" );
static const QString sPluginVersion = QObject::tr( "Version 0.1" );
static const QgisPlugin::PLUGINTYPE sPluginType = QgisPlugin::UI;
static const QString sPluginIcon = QStringLiteral( ":/oracleplugin/oracleraster.svg" );
//////////////////////////////////////////////////////////////////////
//
// THE FOLLOWING METHODS ARE MANDATORY FOR ALL PLUGINS
//
//////////////////////////////////////////////////////////////////////
/**
* Constructor for the plugin. The plugin is passed a pointer
* an interface object that provides access to exposed functions in QGIS.
* @param theQGisInterface - Pointer to the QGIS interface object
*/
QgsOraclePlugin::QgsOraclePlugin( QgisInterface * theQgisInterface )
: QgisPlugin( sName, sDescription, sCategory, sPluginVersion, sPluginType )
, mQGisIface( theQgisInterface )
, mQActionPointer( nullptr )
{
}
QgsOraclePlugin::~QgsOraclePlugin()
{
}
/*
* Initialize the GUI interface for the plugin - this is only called once when the plugin is
* added to the plugin registry in the QGIS application.
*/
void QgsOraclePlugin::initGui()
{
// Create the action for tool
mQActionPointer = new QAction( QIcon( ":/oracleplugin/oracleraster.svg" ), tr( "Add Oracle GeoRaster Layer..." ), this );
mQActionPointer->setObjectName( QStringLiteral( "mQActionPointer" ) );
// Set the what's this text
mQActionPointer->setWhatsThis( tr( "Add a Oracle Spatial GeoRaster..." ) );
// Connect the action to the run
connect( mQActionPointer, SIGNAL( triggered() ), this, SLOT( run() ) );
// Add the icon to the new layers toolbar
mQGisIface->layerToolBar()->insertAction( mQGisIface->actionAddWmsLayer(), mQActionPointer );
// Also add to Layer menu
mQGisIface->insertAddLayerAction( mQActionPointer );
}
//method defined in interface
void QgsOraclePlugin::help()
{
//implement me!
}
// Slot called when the menu item is triggered
// If you created more menu items / toolbar buttons in initiGui, you should
// create a separate handler for each action - this single run() method will
// not be enough
void QgsOraclePlugin::run()
{
QgsOracleSelectGeoraster *myPluginGui = new QgsOracleSelectGeoraster( mQGisIface->mainWindow(), mQGisIface, QgisGui::ModalDialogFlags );
myPluginGui->setAttribute( Qt::WA_DeleteOnClose );
myPluginGui->show();
}
// Unload the plugin by cleaning up the GUI
void QgsOraclePlugin::unload()
{
// remove the GUI
mQGisIface->layerToolBar()->removeAction( mQActionPointer );
mQGisIface->removeAddLayerAction( mQActionPointer );
delete mQActionPointer;
mQActionPointer = nullptr;
}
//////////////////////////////////////////////////////////////////////////
//
//
// THE FOLLOWING CODE IS AUTOGENERATED BY THE PLUGIN BUILDER SCRIPT
// YOU WOULD NORMALLY NOT NEED TO MODIFY THIS, AND YOUR PLUGIN
// MAY NOT WORK PROPERLY IF YOU MODIFY THIS INCORRECTLY
//
//
//////////////////////////////////////////////////////////////////////////
/**
* Required extern functions needed for every plugin
* These functions can be called prior to creating an instance
* of the plugin class
*/
// Class factory to return a new instance of the plugin class
QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
{
return new QgsOraclePlugin( theQgisInterfacePointer );
}
// Return the name of the plugin - note that we do not user class members as
// the class may not yet be insantiated when this method is called.
QGISEXTERN QString name()
{
return sName;
}
// Return the description
QGISEXTERN QString description()
{
return sDescription;
}
// Return the description
QGISEXTERN QString category()
{
return sCategory;
}
// Return the type (either UI or MapLayer plugin)
QGISEXTERN int type()
{
return sPluginType;
}
// Return the version number for the plugin
QGISEXTERN QString version()
{
return sPluginVersion;
}
QGISEXTERN QString icon()
{
return sPluginIcon;
}
// Delete ourself
QGISEXTERN void unload( QgisPlugin * thePluginPointer )
{
delete thePluginPointer;
}

View File

@ -1,64 +0,0 @@
/***************************************************************************
oracleplugin.h
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifndef OraclePlugin_H
#define OraclePlugin_H
// Qt Includes
#include <QObject>
#include <QAction>
#include <QToolBar>
// QGIS Includes
#include <qgisplugin.h>
#include <qgisinterface.h>
#include <qgisgui.h>
class QgsOraclePlugin : public QObject, public QgisPlugin
{
Q_OBJECT
public:
/**
* Constructor for a plugin. The QgisInterface pointer is passed by
* QGIS when it attempts to instantiate the plugin.
* @param theInterface Pointer to the QgisInterface object.
*/
explicit QgsOraclePlugin( QgisInterface * theInterface );
//! Destructor
virtual ~QgsOraclePlugin();
public slots:
//! init the gui
virtual void initGui() override;
//! Show the dialog box
void run();
//! unload the plugin
void unload() override;
//! show the help document
void help();
private:
//! Pointer to the QGIS interface object
QgisInterface *mQGisIface;
//!pointer to the qaction for this plugin
QAction * mQActionPointer;
};
#endif //OraclePlugin_H

View File

@ -1,91 +0,0 @@
/***************************************************************************
oracleconnectgui.cpp
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "qgsoracleconnect_ui.h"
// Qt Includes
#include <QSettings>
#include <QMessageBox>
QgsOracleConnect::QgsOracleConnect( QWidget* parent,
const QString& connName,
Qt::WindowFlags fl ) : QDialog( parent, fl )
{
setupUi( this );
if ( ! connName.isEmpty() )
{
// populate the dialog with the information stored for the connection
// populate the fields with the stored setting parameters
QSettings settings;
QString key = "/Oracle/connections/" + connName;
txtDatabase->setText( settings.value( key + "/database" ).toString() );
txtUsername->setText( settings.value( key + "/username" ).toString() );
if ( settings.value( key + "/savepass" ).toString() == QLatin1String( "true" ) )
{
txtPassword->setText( settings.value( key + "/password" ).toString() );
chkStorePassword->setChecked( true );
}
txtName->setText( connName );
}
}
QgsOracleConnect::~QgsOracleConnect()
{
}
void QgsOracleConnect::on_buttonBox_rejected()
{
// cancel button mapped to context help - changed this to close the
// dialog instead. If context help is to be added, a Help button
// is required. - gsherman
// helpInfo();
reject();
}
void QgsOracleConnect::on_buttonBox_accepted()
{
saveConnection();
}
void QgsOracleConnect::saveConnection()
{
QSettings settings;
QString baseKey = QStringLiteral( "/Oracle/connections/" );
settings.setValue( baseKey + "selected", txtName->text() );
baseKey += txtName->text();
settings.setValue( baseKey + "/database", txtDatabase->text() );
settings.setValue( baseKey + "/username", txtUsername->text() );
settings.setValue( baseKey + "/password", txtPassword->text() );
settings.setValue( baseKey + "/savepass", chkStorePassword->isChecked() ? "true" : "false" );
settings.setValue( baseKey + "/subdtset", "GEOR:" +
txtUsername->text() + '/' +
txtPassword->text() + '@' +
txtDatabase->text() );
accept();
}
void QgsOracleConnect::helpInfo()
{
// QgsContextHelp::run( context_id );
}

View File

@ -1,44 +0,0 @@
/***************************************************************************
oracleconnectgui.u
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifndef QgsOracleConnect_H
#define QgsOracleConnect_H
// Qt Designer Includes
#include "ui_qgsoracleconnectbase.h"
// QGIS Includes
#include <qgisgui.h>
class QgsOracleConnect : public QDialog, private Ui::OracleConnectGuiBase
{
Q_OBJECT
public:
QgsOracleConnect( QWidget* parent = nullptr,
const QString& connName = QString::null,
Qt::WindowFlags fl = QgisGui::ModalDialogFlags );
~QgsOracleConnect();
private:
void saveConnection();
void helpInfo();
public slots:
void on_buttonBox_accepted();
void on_buttonBox_rejected();
};
#endif /* _ORACLECONNECTGUI_H */

View File

@ -1,109 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>OracleConnectGuiBase</class>
<widget class="QDialog" name="OracleConnectGuiBase">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>318</width>
<height>213</height>
</rect>
</property>
<property name="windowTitle">
<string>Create Oracle Connection</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff/>
</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="TextLabel1_2">
<property name="text">
<string>Name</string>
</property>
<property name="buddy">
<cstring>txtName</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="txtName">
<property name="toolTip">
<string>Name of the new connection</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="TextLabel2">
<property name="text">
<string>Database instance</string>
</property>
<property name="buddy">
<cstring>txtDatabase</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="txtDatabase"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="TextLabel3">
<property name="text">
<string>Username</string>
</property>
<property name="buddy">
<cstring>txtUsername</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="txtUsername"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="TextLabel3_2">
<property name="text">
<string>Password</string>
</property>
<property name="buddy">
<cstring>txtPassword</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="txtPassword">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="chkStorePassword">
<property name="text">
<string>Save Password</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>txtName</tabstop>
<tabstop>txtDatabase</tabstop>
<tabstop>txtUsername</tabstop>
<tabstop>txtPassword</tabstop>
<tabstop>chkStorePassword</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -1,335 +0,0 @@
/***************************************************************************
oracleselectgui.cpp
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "qgsselectgeoraster_ui.h"
#include "qgsoracleconnect_ui.h"
//GDAL includes
#include "gdal.h"
#include "ogr_api.h"
#include "ogrsf_frmts.h"
#include <cpl_string.h>
#include "qgsvectorlayer.h"
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 1800
#define TO8F(x) (x).toUtf8().constData()
#else
#define TO8F(x) QFile::encodeName( x ).constData()
#endif
QgsOracleSelectGeoraster::QgsOracleSelectGeoraster( QWidget* parent,
QgisInterface* iface,
Qt::WindowFlags fl )
: QDialog( parent, fl )
, mIface( iface )
{
setupUi( this );
/*
* Load the list of connection from the registry
*/
populateConnectionList();
/*
* Repeat last selected connection
*/
QSettings settings;
QString selected = settings.value( QStringLiteral( "/Oracle/connections/selected" ) ).toString();
restoreGeometry( settings.value( QStringLiteral( "/Oracle/geometry" ) ).toByteArray() );
cmbConnections->setCurrentIndex( cmbConnections->findText( selected ) );
if ( selected == cmbConnections->currentText() )
{
connectToServer();
}
}
QgsOracleSelectGeoraster::~QgsOracleSelectGeoraster()
{
QSettings settings;
settings.setValue( QStringLiteral( "/Oracle/geometry" ), saveGeometry() );
settings.setValue( QStringLiteral( "/Oracle/connections/selected" ), cmbConnections->currentText() );
}
void QgsOracleSelectGeoraster::populateConnectionList()
{
QSettings settings;
settings.beginGroup( QStringLiteral( "/Oracle/connections" ) );
QStringList keys = settings.childGroups();
QStringList::Iterator it = keys.begin();
/*
* Fillup the combobox with connection names
*/
cmbConnections->clear();
while ( it != keys.end() )
{
cmbConnections->addItem( *it );
++it;
}
settings.endGroup();
setConnectionListPosition();
/*
* Update the status of several buttons
*/
if ( keys.begin() == keys.end() )
{
btnConnect->setEnabled( false );
btnEdit->setEnabled( false );
btnDelete->setEnabled( false );
}
else
{
btnConnect->setEnabled( true );
btnEdit->setEnabled( true );
btnDelete->setEnabled( true );
}
}
void QgsOracleSelectGeoraster::on_btnNew_clicked()
{
QgsOracleConnect *oc = new QgsOracleConnect( this, QStringLiteral( "New Connection" ) );
if ( oc->exec() )
{
populateConnectionList();
}
}
void QgsOracleSelectGeoraster::on_btnEdit_clicked()
{
QgsOracleConnect *oc = new QgsOracleConnect( this, cmbConnections->currentText() );
if ( oc->exec() )
{
populateConnectionList();
}
}
void QgsOracleSelectGeoraster::on_btnDelete_clicked()
{
QSettings settings;
QString key = "/Oracle/connections/" + cmbConnections->currentText();
QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
.arg( cmbConnections->currentText() );
QMessageBox::StandardButton result = QMessageBox::information( this,
tr( "Confirm Delete" ),
msg,
QMessageBox::Ok | QMessageBox::Cancel );
if ( result == QMessageBox::Ok )
{
settings.remove( key + "/database" );
settings.remove( key + "/username" );
settings.remove( key + "/password" );
settings.remove( key + "/savepass" );
settings.remove( key + "/subdtset" );
settings.remove( key );
cmbConnections->removeItem( cmbConnections->currentIndex() );
setConnectionListPosition();
lineEdit->setText( QLatin1String( "" ) );
listWidget->clear();
}
}
void QgsOracleSelectGeoraster::connectToServer()
{
if ( cmbConnections->currentText().isEmpty() )
return;
QSettings settings;
QString key = "/Oracle/connections/" + cmbConnections->currentText();
QString username = settings.value( key + "/username" ).toString();
QString savepass = settings.value( key + "/savepass" ).toString();
QString database = settings.value( key + "/database" ).toString();
QString subdtset = settings.value( key + "/subdtset" ).toString();
bool makeConnection = true;
if ( savepass == QLatin1String( "false" ) )
{
makeConnection = false;
( void )QInputDialog::getText( this,
tr( "Password for %1/<password>@%2" ).arg( username, database ),
tr( "Please enter your password:" ),
QLineEdit::Password,
QString::null,
&makeConnection );
}
if ( makeConnection )
{
settings.setValue( QStringLiteral( "/Oracle/connections/selected" ),
cmbConnections->currentText() );
showSelection( subdtset );
lineEdit->setText( subdtset );
}
}
void QgsOracleSelectGeoraster::showSelection( const QString & line )
{
QString identification = line;
GDALDatasetH hDS = nullptr;
GDALAccess eAccess = GA_ReadOnly;
/*
* Set access mode
*/
if ( checkBox->checkState() == Qt::Checked )
{
eAccess = GA_Update;
}
/*
* Try to open georaster dataset
*/
hDS = GDALOpenShared( TO8F( identification ), eAccess );
buttonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
if ( !hDS )
{
QMessageBox::information( this,
tr( "Open failed" ),
tr( "The connection to %1 failed. Please verify your connection parameters. Make sure you have the GDAL GeoRaster plugin installed." )
.arg( identification ) );
return;
}
buttonBox->button( QDialogButtonBox::Ok )->setEnabled( true );
/*
* Get subdataset list
*/
char **papszMetadata = nullptr;
papszMetadata = GDALGetMetadata( hDS, "SUBDATASETS" );
int nSubDatasets = CSLCount( papszMetadata );
/*
* Add GeoRaster Layer
*/
if ( ! nSubDatasets )
{
mIface->addRasterLayer( identification );
GDALClose( hDS );
return;
}
/*
* Save subdataset
*/
QSettings settings;
settings.setValue( "/Oracle/connections/" +
cmbConnections->currentText() + "/subdtset", identification );
/*
* List subdatasets
*/
QStringList fields = identification.split( ',' );
QString count = QString::number( nSubDatasets / 2 );
QString plural = QStringLiteral( "s" );
if ( count == QLatin1String( "1" ) )
{
plural = QLatin1String( "" );
}
if ( fields.size() < 4 )
{
labelStatus->setText( QStringLiteral( "%1 GeoRaster table%2" )
.arg( count, plural ) );
checkBox->setEnabled( false );
}
else if ( fields.size() == 4 )
{
labelStatus->setText( QStringLiteral( "%1 GeoRaster column%2 on table %3" )
.arg( count, plural, fields[3] ) );
checkBox->setEnabled( false );
}
else if ( fields.size() == 5 )
{
labelStatus->setText( QStringLiteral( "%1 GeoRaster object%2 on table %3 column %4" )
.arg( count, plural, fields[3], fields[4] ) );
checkBox->setEnabled( true );
}
else
{
labelStatus->setText( QStringLiteral( "%1 GeoRaster object%2 on table %3 column %4 where %5" )
.arg( count, plural, fields[3], fields[4], fields[5] ) );
checkBox->setEnabled( true );
}
/*
* Populate selection list based on subdataset names
*/
listWidget->clear();
QListWidgetItem *textItem;
for ( int i = 0; i < nSubDatasets; i += 2 )
{
QString metadata = papszMetadata[i];
QStringList subdataset = metadata.split( '=' );
textItem = new QListWidgetItem( subdataset[1] );
listWidget->addItem( textItem );
}
GDALClose( hDS );
}
void QgsOracleSelectGeoraster::on_listWidget_clicked( const QModelIndex& Index )
{
Q_UNUSED( Index );
if ( lineEdit->text() == listWidget->currentItem()->text() )
{
showSelection( lineEdit->text() );
}
else
{
lineEdit->setText( listWidget->currentItem()->text() );
}
}
void QgsOracleSelectGeoraster::setConnectionListPosition()
{
// If possible, set the item currently displayed database
QSettings settings;
QString toSelect = settings.value( QStringLiteral( "/Oracle/connections/selected" ) ).toString();
cmbConnections->setCurrentIndex( cmbConnections->findText( toSelect ) );
// If we couldn't find the stored item, but there are some,
// default to the last item (this makes some sense when deleting
// items as it allows the user to repeatidly click on delete to
// remove a whole lot of items).
if ( cmbConnections->currentIndex() == -1 && cmbConnections->count() > 0 )
{
// If toSelect is null, then the selected connection wasn't found
// by QSettings, which probably means that this is the first time
// the user has used qgis with database connections, so default to
// the first in the list of connetions. Otherwise default to the last.
if ( toSelect.isNull() )
cmbConnections->setCurrentIndex( 0 );
else
cmbConnections->setCurrentIndex( cmbConnections->count() - 1 );
}
}

View File

@ -1,59 +0,0 @@
/***************************************************************************
oracleselectgui.h
-------------------
begin : Oracle Spatial Plugin
copyright : (C) Ivan Lucena
email : ivan.lucena@pmldnet.com
***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifndef OraclePluginGUI_H
#define OraclePluginGUI_H
// Qt Designer Includes
#include "ui_qgsselectgeorasterbase.h"
//Qt includes
#include <QSettings>
#include <QMessageBox>
#include <QInputDialog>
// QGIS Includes
#include <qgisinterface.h>
#include <qgsmapcanvas.h>
#include "qgscontexthelp.h"
class QgsOracleSelectGeoraster : public QDialog, private Ui::SelectGeoRasterBase
{
Q_OBJECT
public:
QgsOracleSelectGeoraster( QWidget* parent, QgisInterface* iface, Qt::WindowFlags fl = 0 );
~QgsOracleSelectGeoraster();
private:
QgisInterface* mIface;
QString mUri;
private:
void populateConnectionList();
void connectToServer();
void setConnectionListPosition();
void showSelection( const QString & line );
public slots:
void on_btnConnect_clicked() { connectToServer(); }
void on_btnNew_clicked();
void on_btnEdit_clicked();
void on_btnDelete_clicked();
void on_listWidget_clicked( const QModelIndex& Index );
void on_buttonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }
};
#endif

View File

@ -1,239 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SelectGeoRasterBase</class>
<widget class="QDialog" name="SelectGeoRasterBase">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>461</width>
<height>454</height>
</rect>
</property>
<property name="windowTitle">
<string>Select Oracle Spatial GeoRaster</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>../../ui</normaloff>../../ui</iconset>
</property>
<property name="sizeGripEnabled">
<bool>true</bool>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QGridLayout">
<property name="margin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="GroupBox1">
<property name="title">
<string>Server Connections</string>
</property>
<layout class="QGridLayout">
<property name="margin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0" colspan="5">
<widget class="QComboBox" name="cmbConnections"/>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="btnEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="btnDelete">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="btnNew">
<property name="text">
<string>&amp;New</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="btnConnect">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>C&amp;onnect</string>
</property>
</widget>
</item>
<item row="1" column="4">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>131</width>
<height>30</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="btnGrpImageEncoding">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>16</width>
<height>64</height>
</size>
</property>
<property name="title">
<string>Subdatasets</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QListWidget" name="listWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="gbCRS">
<property name="title">
<string>Selection</string>
</property>
<layout class="QGridLayout" name="gridLayout_1">
<item row="0" column="0">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="checkBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Update</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelCoordRefSys">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelStatus">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Ready</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>cmbConnections</tabstop>
<tabstop>btnConnect</tabstop>
<tabstop>btnNew</tabstop>
<tabstop>btnEdit</tabstop>
<tabstop>btnDelete</tabstop>
<tabstop>listWidget</tabstop>
<tabstop>lineEdit</tabstop>
<tabstop>checkBox</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SelectGeoRasterBase</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>378</x>
<y>406</y>
</hint>
<hint type="destinationlabel">
<x>460</x>
<y>372</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SelectGeoRasterBase</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>297</x>
<y>406</y>
</hint>
<hint type="destinationlabel">
<x>455</x>
<y>434</y>
</hint>
</hints>
</connection>
</connections>
</ui>