/*
**********************************************************************************
**
** This file was created for the LibreCAD project (librecad.org), a 2D CAD program.
**
** Copyright (C) 2015 ravas (github.com/r-a-v-a-s)
**
** 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 this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
**
**********************************************************************************
*/

// This file was first published at: github.com/r-a-v-a-s/LibreCAD.git

// lc_actionfactory is a rewrite of qg_actionfactory; some copied content remains.
// qg_actionfactory contributors:
// Andrew Mustun, Claude Sylvain, R. van Twisk, Dongxu Li, Rallaz, Armin Stebich, ravas, korhadris

#include "lc_actionfactory.h"
#include "lc_actiongroupmanager.h"
#include "qc_applicationwindow.h"
#include "qg_actionhandler.h"

#include <QAction>
#include <QActionGroup>

LC_ActionFactory::LC_ActionFactory(QC_ApplicationWindow* parent, QG_ActionHandler* a_handler)
    : QObject(parent)
    , using_theme(false)
    , main_window(parent)
    , action_handler(a_handler)
{
}

void LC_ActionFactory::fillActionContainer(QMap<QString, QAction*>& a_map, LC_ActionGroupManager* agm)
{
    QAction* action;

    // <[~ Zoom ~]>

    action = new QAction(tr("Zoom &Panning"), agm->other);
    action->setIcon(QIcon(":/icons/zoom_pan.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotZoomPan()));
    action->setObjectName("ZoomPan");
    a_map["ZoomPan"] = action;

    // <[~ Select ~]>

    action = new QAction(tr("Select Entity"), agm->select);
    action->setIcon(QIcon(":/icons/select_entity.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectSingle()));
    action->setObjectName("SelectSingle");
    a_map["SelectSingle"] = action;

    action = new QAction(tr("Select Window"), agm->select);
    action->setIcon(QIcon(":/icons/select_window.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectWindow()));
    action->setObjectName("SelectWindow");
    a_map["SelectWindow"] = action;

    action = new QAction(tr("Deselect Window"), agm->select);
    action->setIcon(QIcon(":/icons/deselect_window.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDeselectWindow()));
    action->setObjectName("DeselectWindow");
    a_map["DeselectWindow"] = action;

    action = new QAction(tr("(De-)Select &Contour"), agm->select);
    action->setIcon(QIcon(":/icons/deselect_contour.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectContour()));
    action->setObjectName("SelectContour");
    a_map["SelectContour"] = action;

    action = new QAction(tr("Select Intersected Entities"), agm->select);
    action->setIcon(QIcon(":/icons/select_intersected_entities.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectIntersected()));
    action->setObjectName("SelectIntersected");
    a_map["SelectIntersected"] = action;

    action = new QAction(tr("Deselect Intersected Entities"), agm->select);
    action->setIcon(QIcon(":/icons/deselect_intersected_entities.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDeselectIntersected()));
    action->setObjectName("DeselectIntersected");
    a_map["DeselectIntersected"] = action;

    action = new QAction(tr("(De-)Select Layer"), agm->select);
    action->setIcon(QIcon(":/icons/deselect_layer.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectLayer()));
    action->setObjectName("SelectLayer");
    a_map["SelectLayer"] = action;

    // <[~ Draw ~]>

    action = new QAction(tr("&Points"), agm->other);
    action->setIcon(QIcon(":/icons/points.svg"));

    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawPoint()));
    action->setObjectName("DrawPoint");
    a_map["DrawPoint"] = action;

    // <[~ Line ~]>

    action = new QAction(tr("&2 Points"), agm->line);
    action->setIcon(QIcon(":/icons/line_2p.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLine()));
    action->setObjectName("DrawLine");
    a_map["DrawLine"] = action;

    action = new QAction(tr("&Angle"), agm->line);
    action->setIcon(QIcon(":/icons/line_angle.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineAngle()));
    action->setObjectName("DrawLineAngle");
    a_map["DrawLineAngle"] = action;

    action = new QAction(tr("&Horizontal"), agm->line);
    action->setIcon(QIcon(":/icons/line_horizontal.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineHorizontal()));
    action->setObjectName("DrawLineHorizontal");
    a_map["DrawLineHorizontal"] = action;

    action = new QAction(tr("Vertical"), agm->line);
    action->setIcon(QIcon(":/icons/line_vertical.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineVertical()));
    action->setObjectName("DrawLineVertical");
    a_map["DrawLineVertical"] = action;

//    action = new QAction(tr("Vertical"), agm->line);
//    connect(action, SIGNAL(triggered()),
//    action_handler, SLOT(slotDrawLineHorVert()));
//    action->setObjectName("DrawLineHorVert");
//    a_map["DrawLineHorVert"] = action;

    action = new QAction(tr("&Freehand Line"), agm->line);
    action->setIcon(QIcon(":/icons/line_freehand.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineFree()));
    action->setObjectName("DrawLineFree");
    a_map["DrawLineFree"] = action;

    action = new QAction(tr("&Parallel"), agm->line);
    action->setIcon(QIcon(":/icons/line_parallel.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineParallel()));
    action->setObjectName("DrawLineParallel");
    a_map["DrawLineParallel"] = action;

    action = new QAction(tr("Parallel through point"), agm->line);
    action->setIcon(QIcon(":/icons/line_parallel_p.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineParallelThrough()));
    action->setObjectName("DrawLineParallelThrough");
    a_map["DrawLineParallelThrough"] = action;

    action = new QAction(tr("Rectangle"), agm->line);
    action->setIcon(QIcon(":/icons/line_rectangle.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineRectangle()));
    action->setObjectName("DrawLineRectangle");
    a_map["DrawLineRectangle"] = action;

    action = new QAction(tr("Bisector"), agm->line);
    action->setIcon(QIcon(":/icons/line_bisector.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineBisector()));
    action->setObjectName("DrawLineBisector");
    a_map["DrawLineBisector"] = action;

    action = new QAction(tr("Tangent (P,C)"), agm->line);
    action->setIcon(QIcon(":/icons/line_tangent_pc.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineTangent1()));
    action->setObjectName("DrawLineTangent1");
    a_map["DrawLineTangent1"] = action;

    action = new QAction(tr("Tangent (C,C)"), agm->line);
    action->setIcon(QIcon(":/icons/line_tangent_cc.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineTangent2()));
    action->setObjectName("DrawLineTangent2");
    a_map["DrawLineTangent2"] = action;

    action = new QAction(tr("Tangent &Orthogonal"), agm->line);
    action->setIcon(QIcon(":/icons/line_tangent_perpendicular.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineOrthTan()));
    action->setObjectName("DrawLineOrthTan");
    a_map["DrawLineOrthTan"] = action;

    action = new QAction(tr("Orthogonal"), agm->line);
    action->setIcon(QIcon(":/icons/line_perpendicular.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineOrthogonal()));
    action->setObjectName("DrawLineOrthogonal");
    a_map["DrawLineOrthogonal"] = action;

    action = new QAction(tr("Relative angle"), agm->line);
    action->setIcon(QIcon(":/icons/line_relative_angle.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLineRelAngle()));
    action->setObjectName("DrawLineRelAngle");
    a_map["DrawLineRelAngle"] = action;

    action = new QAction(tr("Pol&ygon (Cen,Cor)"), agm->line);
    action->setIcon(QIcon(":/icons/line_polygon_cen_cor.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLinePolygon()));
    action->setObjectName("DrawLinePolygonCenCor");
    a_map["DrawLinePolygonCenCor"] = action;

    action = new QAction(tr("Pol&ygon (Cen,Tan)"), agm->line);  //20161223 added by txmy
    action->setIcon(QIcon(":/icons/line_polygon_cen_tan.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLinePolygon3()));
    action->setObjectName("DrawLinePolygonCenTan");
    a_map["DrawLinePolygonCenTan"] = action;

    action = new QAction(tr("Polygo&n (Cor,Cor)"), agm->line);
    action->setIcon(QIcon(":/icons/line_polygon_cor_cor.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawLinePolygon2()));
    action->setObjectName("DrawLinePolygonCorCor");
    a_map["DrawLinePolygonCorCor"] = action;

    // <[~ Circle ~]>

    action = new QAction(tr("Center, &Point"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_center_point.svg"));
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotDrawCircle()));
    action->setObjectName("DrawCircle");
    a_map["DrawCircle"] = action;

    action = new QAction(tr("Center, &Radius"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_center_radius.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleCR()));
    action->setObjectName("DrawCircleCR");
    a_map["DrawCircleCR"] = action;

    action = new QAction(tr("2 Points"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_2_points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircle2P()));
    action->setObjectName("DrawCircle2P");
    a_map["DrawCircle2P"] = action;

    action = new QAction(tr("2 Points, Radius"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_2_points_radius.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircle2PR()));
    action->setObjectName("DrawCircle2PR");
    a_map["DrawCircle2PR"] = action;

    action = new QAction(tr("3 Points"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_3_points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircle3P()));
    action->setObjectName("DrawCircle3P");
    a_map["DrawCircle3P"] = action;

    action = new QAction(tr("&Concentric"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_concentric.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleParallel()));
    action->setObjectName("DrawCircleParallel");
    a_map["DrawCircleParallel"] = action;

    action = new QAction(tr("Circle &Inscribed"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_inscribed.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleInscribe()));
    action->setObjectName("DrawCircleInscribe");
    a_map["DrawCircleInscribe"] = action;

    action = new QAction(tr("Tangential 2 Circles, Radius",  "circle tangential with two circles, and given radius"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_tangential_2circles_radius.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleTan2()));
    action->setObjectName("DrawCircleTan2");
    a_map["DrawCircleTan2"] = action;

    action = new QAction(tr("Tangential 2 Circles, 1 Point"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_tangential_2circles_point.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleTan2_1P()));
    action->setObjectName("DrawCircleTan2_1P");
    a_map["DrawCircleTan2_1P"] = action;

    action = new QAction(tr("Tangential &3 Circles"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_tangential_3entities.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleTan3()));
    action->setObjectName("DrawCircleTan3");
    a_map["DrawCircleTan3"] = action;

    action = new QAction(tr("Tangential, 2 P&oints"), agm->circle);
    action->setIcon(QIcon(":/icons/circle_tangential_2points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawCircleTan1_2P()));
    action->setObjectName("DrawCircleTan1_2P");
    a_map["DrawCircleTan1_2P"] = action;

    // <[~ Arc ~]>

    action = new QAction(tr("&Center, Point, Angles"), agm->curve);
    action->setIcon(QIcon(":/icons/arc_center_point_angle.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawArc()));
    action->setObjectName("DrawArc");
    a_map["DrawArc"] = action;

    action = new QAction(tr("&3 Points"), agm->curve);
    action->setIcon(QIcon(":/icons/arc_3_points.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawArc3P()));
    action->setObjectName("DrawArc3P");
    a_map["DrawArc3P"] = action;

    action = new QAction(tr("&Concentric"), agm->curve);
    action->setIcon(QIcon(":/icons/arc_concentric.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawArcParallel()));
    action->setObjectName("DrawArcParallel");
    a_map["DrawArcParallel"] = action;

    action = new QAction(tr("Arc &Tangential"), agm->curve);
    action->setIcon(QIcon(":/icons/arc_continuation.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawArcTangential()));
    action->setObjectName("DrawArcTangential");
    a_map["DrawArcTangential"] = action;

    // <[~ Ellipse ~]>

    action = new QAction(tr("&Ellipse (Axis)"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_axis.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipseAxis()));
    action->setObjectName("DrawEllipseAxis");
    a_map["DrawEllipseAxis"] = action;

    action = new QAction(tr("Ellipse &Arc (Axis)"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_arc_axis.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipseArcAxis()));
    action->setObjectName("DrawEllipseArcAxis");
    a_map["DrawEllipseArcAxis"] = action;

    action = new QAction(tr("Ellipse &Foci Point"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_foci_point.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipseFociPoint()));
    action->setObjectName("DrawEllipseFociPoint");
    a_map["DrawEllipseFociPoint"] = action;

    action = new QAction(tr("Ellipse &4 Point"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_4_points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipse4Points()));
    action->setObjectName("DrawEllipse4Points");
    a_map["DrawEllipse4Points"] = action;

    action = new QAction(tr("Ellipse Center and &3 Points"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_center_3_points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipseCenter3Points()));
    action->setObjectName("DrawEllipseCenter3Points");
    a_map["DrawEllipseCenter3Points"] = action;

    action = new QAction(tr("Ellipse &Inscribed"), agm->ellipse);
    action->setIcon(QIcon(":/icons/ellipse_inscribed.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawEllipseInscribe()));
    action->setObjectName("DrawEllipseInscribe");
    a_map["DrawEllipseInscribe"] = action;

    // <[~ Spline ~]>

    action = new QAction(tr("&Spline"), agm->curve);
    action->setIcon(QIcon(":/icons/spline.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawSpline()));
    action->setObjectName("DrawSpline");
    a_map["DrawSpline"] = action;

    action = new QAction(tr("&Spline through points"), agm->curve);
    action->setIcon(QIcon(":/icons/spline_points.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawSplinePoints()));
    action->setObjectName("DrawSplinePoints");
    a_map["DrawSplinePoints"] = action;

    // <[~ Polyline ~]>

    action = new QAction(tr("&Polyline"), agm->polyline);
    action->setIcon(QIcon(":/icons/polylines_polyline.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawPolyline()));
    action->setObjectName("DrawPolyline");
    a_map["DrawPolyline"] = action;

    action = new QAction(tr("&Add node"), agm->polyline);
    action->setShortcut(QKeySequence());
    action->setIcon(QIcon(":/icons/insert_node.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineAdd()));
    action->setObjectName("PolylineAdd");
    a_map["PolylineAdd"] = action;

    action = new QAction(tr("A&ppend node"), agm->polyline);
    action->setShortcut(QKeySequence());
    action->setIcon(QIcon(":/icons/append_node.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineAppend()));
    action->setObjectName("PolylineAppend");
    a_map["PolylineAppend"] = action;

    action = new QAction(tr("&Delete node"), agm->polyline);
    action->setShortcut(QKeySequence());
    action->setIcon(QIcon(":/icons/delete_node.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineDel()));
    action->setObjectName("PolylineDel");
    a_map["PolylineDel"] = action;

    action = new QAction(tr("Delete &between two nodes"), agm->polyline);
    action->setShortcut(QKeySequence());
    action->setIcon(QIcon(":/icons/delete_between_nodes.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineDelBetween()));
    action->setObjectName("PolylineDelBetween");
    a_map["PolylineDelBetween"] = action;

    action = new QAction(tr("&Trim segments"), agm->polyline);
    action->setShortcut(QKeySequence());
    action->setIcon(QIcon(":/icons/trim.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineTrim()));
    action->setObjectName("PolylineTrim");
    a_map["PolylineTrim"] = action;

    action = new QAction(tr("Create &Equidistant Polylines"), agm->polyline);
    action->setIcon(QIcon(":/icons/create_equidistant_polyline.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineEquidistant()));
    action->setObjectName("PolylineEquidistant");
    a_map["PolylineEquidistant"] = action;

    action = new QAction(tr("Create Polyline from Existing &Segments"), agm->polyline);
    action->setIcon(QIcon(":/icons/create_polyline_from_existing_segments.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotPolylineSegment()));
    action->setObjectName("PolylineSegment");
    a_map["PolylineSegment"] = action;

    // <[~ Misc ~]>

    action = new QAction(QIcon(":/icons/text.svg"), tr("&MText"), agm->other);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawMText()));
    action->setObjectName("DrawMText");
    a_map["DrawMText"] = action;

    action = new QAction(tr("&Text"), agm->other);
    action->setIcon(QIcon(":/icons/text.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawText()));
    action->setObjectName("DrawText");
    a_map["DrawText"] = action;

    action = new QAction(tr("&Hatch"), agm->other);
    action->setIcon(QIcon(":/icons/hatch.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawHatch()));
    action->setObjectName("DrawHatch");
    a_map["DrawHatch"] = action;

    action = new QAction(tr("Insert &Image"), agm->other);
    action->setIcon(QIcon(":/icons/camera.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDrawImage()));
    action->setObjectName("DrawImage");
    a_map["DrawImage"] = action;

    // <[~ Dimension ~]>

    action = new QAction(tr("&Aligned"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_aligned.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimAligned()));
    action->setObjectName("DimAligned");
    a_map["DimAligned"] = action;

    action = new QAction(tr("&Linear"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_linear.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimLinear()));
    action->setObjectName("DimLinear");
    a_map["DimLinear"] = action;

    action = new QAction(tr("&Horizontal"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_horizontal.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimLinearHor()));
    action->setObjectName("DimLinearHor");
    a_map["DimLinearHor"] = action;

    action = new QAction(tr("&Vertical"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_vertical.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimLinearVer()));
    action->setObjectName("DimLinearVer");
    a_map["DimLinearVer"] = action;

    action = new QAction(tr("&Radial"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_radial.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimRadial()));
    action->setObjectName("DimRadial");
    a_map["DimRadial"] = action;

    action = new QAction(tr("&Diametric"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_diametric.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimDiametric()));
    action->setObjectName("DimDiametric");
    a_map["DimDiametric"] = action;

    action = new QAction(tr("&Angular"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_angular.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimAngular()));
    action->setObjectName("DimAngular");
    a_map["DimAngular"] = action;

    action = new QAction(tr("&Leader"), agm->dimension);
    action->setIcon(QIcon(":/icons/dim_leader.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDimLeader()));
    action->setObjectName("DimLeader");
    a_map["DimLeader"] = action;

    // <[~ Modify ~]>

    action = new QAction(tr("&Attributes"), agm->modify);
    action->setIcon(QIcon(":/icons/attributes.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyAttributes()));
    action->setObjectName("ModifyAttributes");
    action->setData("modifyattr, attr, ma");
    a_map["ModifyAttributes"] = action;

    action = new QAction(tr("&Delete"), agm->modify);
    action->setIcon(QIcon(":/icons/delete.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyDelete()));
    action->setObjectName("ModifyDelete");
    a_map["ModifyDelete"] = action;

    action = new QAction(tr("Delete Freehand"), agm->modify);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyDeleteFree()));
    action->setObjectName("ModifyDeleteFree");
    a_map["ModifyDeleteFree"] = action;

    action = new QAction(tr("&Move / Copy"), agm->modify);
    action->setIcon(QIcon(":/icons/move_copy.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyMove()));
    action->setObjectName("ModifyMove");
    action->setData("move, mv");
    a_map["ModifyMove"] = action;

    action = new QAction(tr("Re&vert direction"), agm->modify);
    action->setIcon(QIcon(":/icons/revert_direction.svg"));
    action->setShortcut(QKeySequence(tr("Ctrl+R")));
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotModifyRevertDirection()));
    action->setObjectName("ModifyRevertDirection");
    action->setData("revert, rev");
    a_map["ModifyRevertDirection"] = action;

    action = new QAction(tr("&Rotate"), agm->modify);
    action->setIcon(QIcon(":/icons/rotate.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyRotate()));
    action->setObjectName("ModifyRotate");
    action->setData("rotate, ro");
    a_map["ModifyRotate"] = action;

    action = new QAction(tr("&Scale"), agm->modify);
    action->setIcon(QIcon(":/icons/scale.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyScale()));
    action->setObjectName("ModifyScale");
    action->setData("scale, sz");
    a_map["ModifyScale"] = action;

    action = new QAction(tr("&Mirror"), agm->modify);
    action->setIcon(QIcon(":/icons/mirror.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyMirror()));
    action->setObjectName("ModifyMirror");
    action->setData("mirror, mi");
    a_map["ModifyMirror"] = action;

    action = new QAction(tr("Mo&ve and Rotate"), agm->modify);
    action->setIcon(QIcon(":/icons/move_rotate.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyMoveRotate()));
    action->setObjectName("ModifyMoveRotate");
    a_map["ModifyMoveRotate"] = action;

    action = new QAction(tr("Rotate T&wo"), agm->modify);
    action->setIcon(QIcon(":/icons/rotate2.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyRotate2()));
    action->setObjectName("ModifyRotate2");
    a_map["ModifyRotate2"] = action;

    action = new QAction(tr("&Properties"), agm->modify);
    action->setIcon(QIcon(":/icons/properties.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyEntity()));
    action->setObjectName("ModifyEntity");
    action->setData("properties, prop");
    a_map["ModifyEntity"] = action;

    action = new QAction(tr("&Trim"), agm->modify);
    action->setIcon(QIcon(":/icons/trim.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyTrim()));
    action->setObjectName("ModifyTrim");
    action->setData("trim, tm");
    a_map["ModifyTrim"] = action;

    action = new QAction(tr("Tr&im Two"), agm->modify);
    action->setIcon(QIcon(":/icons/trim2.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyTrim2()));
    action->setObjectName("ModifyTrim2");
    action->setData("trim2, tm2");
    a_map["ModifyTrim2"] = action;

    action = new QAction(tr("&Lengthen"), agm->modify);
    action->setIcon(QIcon(":/icons/trim_value.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyTrimAmount()));
    action->setObjectName("ModifyTrimAmount");
    action->setData("lengthen, le");
    a_map["ModifyTrimAmount"] = action;

    action = new QAction(tr("O&ffset"),agm->modify);
    action->setIcon(QIcon(":/icons/offset.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyOffset()));
    action->setObjectName("ModifyOffset");
    action->setData("offset, o");
    a_map["ModifyOffset"] = action;

    action = new QAction(tr("&Divide"), agm->modify);
    action->setIcon(QIcon(":/icons/divide.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyCut()));
    action->setObjectName("ModifyCut");
    action->setData("divide, cut, div");
    a_map["ModifyCut"] = action;

    action = new QAction(tr("&Stretch"), agm->modify);
    action->setIcon(QIcon(":/icons/stretch.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyStretch()));
    action->setObjectName("ModifyStretch");
    action->setData("stretch, ss");
    a_map["ModifyStretch"] = action;

    action = new QAction(tr("&Bevel"), agm->modify);
    action->setIcon(QIcon(":/icons/bevel.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyBevel()));
    action->setObjectName("ModifyBevel");
    action->setData("bevel, bev, ch");
    a_map["ModifyBevel"] = action;

    action = new QAction(tr("&Fillet"), agm->modify);
    action->setIcon(QIcon(":/icons/fillet.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyRound()));
    action->setObjectName("ModifyRound");
    action->setData("fillet, fi");
    a_map["ModifyRound"] = action;

    action = new QAction(tr("&Explode Text into Letters"), agm->modify);
    action->setIcon(QIcon(":/icons/explode_text_to_letters.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyExplodeText()));
    action->setObjectName("ModifyExplodeText");
    a_map["ModifyExplodeText"] = action;

    action = new QAction(tr("Ex&plode"), agm->modify);
    action->setIcon(QIcon(":/icons/explode.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksExplode()));
    action->setObjectName("BlocksExplode");
    a_map["BlocksExplode"] = action;

    // <[~ Info ~]>

    action = new QAction(tr("Point inside contour"), agm->info);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoInside()));
    action->setObjectName("InfoInside");
    a_map["InfoInside"] = action;

    action = new QAction(tr("&Distance Point to Point"), agm->info);
    action->setIcon(QIcon(":/icons/distance_point_to_point.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoDist()));
    action->setObjectName("InfoDist");
    a_map["InfoDist"] = action;

    action = new QAction(tr("&Distance Entity to Point"), agm->info);
    action->setIcon(QIcon(":/icons/distance_point_to_entity.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoDist2()));
    action->setObjectName("InfoDist2");
    a_map["InfoDist2"] = action;

    action = new QAction(tr("An&gle between two lines"), agm->info);
    action->setIcon(QIcon(":/icons/angle_line_to_line.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoAngle()));
    action->setObjectName("InfoAngle");
    a_map["InfoAngle"] = action;

    action = new QAction(tr("&Total length of selected entities"), agm->info);
    action->setIcon(QIcon(":/icons/total_length_selected_entities.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoTotalLength()));
    action->setObjectName("InfoTotalLength");
    a_map["InfoTotalLength"] = action;

    action = new QAction(tr("Polygonal &Area"), agm->info);
    action->setIcon(QIcon(":/icons/polygonal_area.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotInfoArea()));
    action->setObjectName("InfoArea");
    a_map["InfoArea"] = action;

    foreach (QAction* value, a_map)
    {
        value->setCheckable(true);
    }

    // =============================
    // <[~ not checkable actions ~]>
    // =============================


    // <[~ Order ~]>

    action = new QAction(tr("move to bottom"), agm->modify);
    action->setShortcut(QKeySequence(Qt::Key_End));
    action->setIcon(QIcon(":/icons/downmost.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotOrderBottom()));
    action->setObjectName("OrderBottom");
    a_map["OrderBottom"] = action;

    action = new QAction(tr("lower after entity"), agm->modify);
    action->setShortcut(QKeySequence(Qt::Key_PageDown));
    action->setIcon(QIcon(":/icons/down.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotOrderLower()));
    action->setObjectName("OrderLower");
    a_map["OrderLower"] = action;

    action = new QAction(tr("raise over entity"), agm->modify);
    action->setShortcut(QKeySequence(Qt::Key_PageUp));
    action->setIcon(QIcon(":/icons/up.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotOrderRaise()));
    action->setObjectName("OrderRaise");
    a_map["OrderRaise"] = action;

    action = new QAction(tr("move to top"), agm->modify);
    action->setShortcut(QKeySequence(Qt::Key_Home));
    action->setIcon(QIcon(":/icons/upmost.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotOrderTop()));
    action->setObjectName("OrderTop");
    a_map["OrderTop"] = action;

    // <[~ Layer ~]>

    action = new QAction(tr("&Show all"), agm->layer);
    action->setIcon(QIcon(":/ui/visibleblock.png"));
    connect(action, SIGNAL(triggered()),
            action_handler, SLOT(slotLayersDefreezeAll()));
    action->setObjectName("LayersDefreezeAll");
    a_map["LayersDefreezeAll"] = action;

    action = new QAction(tr("&Hide all"), agm->layer);
    action->setIcon(QIcon(":/ui/hiddenblock.png"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersFreezeAll()));
    action->setObjectName("LayersFreezeAll");
    a_map["LayersFreezeAll"] = action;

    action = new QAction(tr("&Unlock all"), agm->layer);
    action->setIcon(QIcon(":/ui/unlockedlayer.png"));
    connect(action, SIGNAL(triggered()),
            action_handler, SLOT(slotLayersUnlockAll()));
    action->setObjectName("LayersUnlockAll");
    a_map["LayersUnlockAll"] = action;

    action = new QAction(tr("&Lock all"), agm->layer);
    action->setIcon(QIcon(":/ui/lockedlayer.png"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersLockAll()));
    action->setObjectName("LayersLockAll");
    a_map["LayersLockAll"] = action;

    action = new QAction(tr("&Add Layer"), agm->layer);
    action->setIcon(QIcon(":/icons/add.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersAdd()));
    action->setObjectName("LayersAdd");
    a_map["LayersAdd"] = action;

    action = new QAction(tr("&Remove Layer"), agm->layer);
    action->setIcon(QIcon(":/icons/remove.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersRemove()));
    action->setObjectName("LayersRemove");
    a_map["LayersRemove"] = action;

    action = new QAction(tr("&Edit Layer"), agm->layer);
    action->setIcon(QIcon(":/icons/attributes.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersEdit()));
    action->setObjectName("LayersEdit");
    a_map["LayersEdit"] = action;

    action = new QAction(tr("Toggle Layer Loc&k"), agm->layer);
    action->setIcon(QIcon(":/icons/locked.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersToggleLock()));
    action->setObjectName("LayersToggleLock");
    a_map["LayersToggleLock"] = action;

    action = new QAction(tr("&Toggle Layer Visibility"), agm->layer);
    action->setIcon(QIcon(":/icons/visible.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotLayersToggleView()));
    action->setObjectName("LayersToggleView");
    a_map["LayersToggleView"] = action;

    action = new QAction(tr("Toggle Layer &Print"), agm->layer);
    action->setIcon(QIcon(":/icons/print.svg"));
    connect(action, SIGNAL(triggered()), action_handler,
            SLOT(slotLayersTogglePrint()));
    action->setObjectName("LayersTogglePrint");
    a_map["LayersTogglePrint"] = action;

    action = new QAction(tr("Toggle &Construction Layer"), agm->layer);
    action->setIcon(QIcon(":/icons/construction_layer.svg"));
    connect(action, SIGNAL(triggered()),
            action_handler, SLOT(slotLayersToggleConstruction()));
    action->setObjectName("LayersToggleConstruction");
    a_map["LayersToggleConstruction"] = action;

    // <[~ Block ~]>

    action = new QAction(tr("&Show all"), agm->block);
    action->setIcon(QIcon(":/ui/blockdefreeze.png"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksDefreezeAll()));
    action->setObjectName("BlocksDefreezeAll");
    a_map["BlocksDefreezeAll"] = action;

    action= new QAction(tr("&Hide all"), agm->block);
    action->setIcon(QIcon(":/ui/blockfreeze.png"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksFreezeAll()));
    action->setObjectName("BlocksFreezeAll");
    a_map["BlocksFreezeAll"] = action;

    action = new QAction(tr("&Add Block"), agm->block);
    action->setIcon(QIcon(":/icons/add.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksAdd()));
    action->setObjectName("BlocksAdd");
    a_map["BlocksAdd"] = action;

    action = new QAction(tr("&Remove Block"), agm->block);
    action->setIcon(QIcon(":/icons/remove.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksRemove()));
    action->setObjectName("BlocksRemove");
    a_map["BlocksRemove"] = action;

    action = new QAction(tr("&Rename Block"), agm->block);
    action->setIcon(QIcon(":/icons/rename_active_block.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksAttributes()));
    action->setObjectName("BlocksAttributes");
    a_map["BlocksAttributes"] = action;

    action = new QAction(tr("&Edit Block"), agm->block);
    action->setIcon(QIcon(":/icons/properties.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksEdit()));
    action->setObjectName("BlocksEdit");
    a_map["BlocksEdit"] = action;

    action = new QAction( tr("&Save Block"), agm->block);
    action->setIcon(QIcon(":/icons/save.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksSave()));
    action->setObjectName("BlocksSave");
    a_map["BlocksSave"] = action;

    action = new QAction(tr("&Insert Block"), agm->block);
    action->setIcon(QIcon(":/icons/insert_active_block.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksInsert()));
    action->setObjectName("BlocksInsert");
    a_map["BlocksInsert"] = action;

    action = new QAction(tr("Toggle Block &Visibility"), agm->block);
    action->setIcon(QIcon(":/ui/layertoggle.png"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksToggleView()));
    action->setObjectName("BlocksToggleView");
    a_map["BlocksToggleView"] = action;

    action = new QAction(tr("&Create Block"), agm->block);
    action->setIcon(QIcon(":/icons/create_block.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotBlocksCreate()));
    action->setObjectName("BlocksCreate");
    a_map["BlocksCreate"] = action;

    // <[~ Options ~]>

    action = new QAction(tr("&Application Preferences"), agm->options);
    action->setIcon(QIcon(":/icons/settings.svg"));
    connect(action, SIGNAL(triggered()),
    main_window, SLOT(slotOptionsGeneral()));
    action->setMenuRole(QAction::NoRole);
    action->setObjectName("OptionsGeneral");
    a_map["OptionsGeneral"] = action;

    action = new QAction(tr("Current &Drawing Preferences"), agm->options);
    action->setIcon(QIcon(":/icons/drawing_settings.svg"));
    action->setShortcut(QKeySequence::Preferences);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotOptionsDrawing()));
    action->setObjectName("OptionsDrawing");
    a_map["OptionsDrawing"] = action;
    connect( main_window, &QC_ApplicationWindow::windowsChanged, action, &QAction::setEnabled);

    action = new QAction(tr("Widget Options"), agm->options);
    action->setObjectName("WidgetOptions");
    a_map["WidgetOptions"] = action;
    connect(action, SIGNAL(triggered()),
            main_window, SLOT(widgetOptionsDialog()));

    action = new QAction(tr("Device Options"), agm->options);
    action->setObjectName("DeviceOptions");
    a_map["DeviceOptions"] = action;
    connect(action, SIGNAL(triggered()),
            main_window, SLOT(showDeviceOptions()));

    // <[~ Modify ~]>

    action = new QAction(tr("&Delete selected"), agm->edit);
    action->setIcon(QIcon(":/icons/delete.svg"));
    action->setShortcuts(QList<QKeySequence>() << QKeySequence::Delete << QKeySequence(Qt::Key_Backspace));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotModifyDeleteQuick()));
    action->setObjectName("ModifyDeleteQuick");
    a_map["ModifyDeleteQuick"] = action;

    action = new QAction(tr("Select &All"), agm->select);
    action->setShortcut(QKeySequence::SelectAll);
    action->setIcon(QIcon(":/icons/select_all.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectAll()));
    action->setObjectName("SelectAll");
    a_map["SelectAll"] = action;

    // <[~ Select ~]>

    action = new QAction(tr("Deselect &all"), agm->select);
    // RVT April 29, 2011 - Added esc key to de-select all entities
    action->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+K")));
    action->setIcon(QIcon(":/icons/deselect_all.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotDeselectAll()));
    action->setObjectName("DeselectAll");
    a_map["DeselectAll"] = action;

    action = new QAction(tr("Invert Selection"), agm->select);
    action->setIcon(QIcon(":/icons/select_inverted.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotSelectInvert()));
    action->setObjectName("SelectInvert");
    a_map["SelectInvert"] = action;

    // <[~ Misc ~]>

    action = new QAction(tr("Export as CA&M/plain SVG..."), agm->file);
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotFileExportMakerCam()));
    action->setObjectName("FileExportMakerCam");
    a_map["FileExportMakerCam"] = action;

//    action = new QAction(tr("Regenerate Dimension Entities"), disable_group);
//    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotToolRegenerateDimensions()));
//    action->setObjectName("ToolRegenerateDimensions");
//    a_map["ToolRegenerateDimensions"] = action;


    // ===========================
    // <[~ Main Window Actions ~]>
    // ===========================


    action = new QAction(tr("&Export as image"), agm->file);
    action->setIcon(QIcon(":/icons/export.svg"));
    connect(action, SIGNAL( triggered()), main_window, SLOT(slotFileExport()));
    action->setObjectName("FileExport");
    a_map["FileExport"] = action;

    action = new QAction(tr("&Close"), agm->file);
    action->setIcon(QIcon(":/icons/close.svg"));
    action->setShortcut(QKeySequence::Close);
    action->setShortcutContext(Qt::WidgetShortcut);
    action->setObjectName("FileClose");
    a_map["FileClose"] = action;

	action = new QAction(tr("Close All"), agm->file);
	action->setIcon(QIcon(":/icons/close_all.svg"));
	QKeySequence shortcut = QKeySequence::Close;
	action->setShortcut(QKeySequence("Shift+" + shortcut.toString()));
	connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileCloseAll()));
	action->setObjectName("FileCloseAll");
	a_map["FileCloseAll"] = action;

    action = new QAction(tr("Export as PDF"), agm->file);
    action->setIcon(QIcon(":/icons/export_pdf.svg"));
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFilePrintPDF()));
    action->setObjectName("FilePrintPDF");
    a_map["FilePrintPDF"] = action;

    action = new QAction(tr("&Block"), agm->file);
    action->setIcon(QIcon(":/icons/insert_active_block.svg"));
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotImportBlock()));
    action->setObjectName("BlocksImport");
    a_map["BlocksImport"] = action;

    // <[~ View ~]>

    action = new QAction(tr("&Fullscreen"), agm->view);
    #if defined(Q_OS_LINUX)
        action->setShortcut(QKeySequence("F11"));
    #else
        action->setShortcut(QKeySequence::FullScreen);
    #endif
    action->setCheckable(true);
    connect(action, SIGNAL(toggled(bool)), main_window, SLOT(toggleFullscreen(bool)));
    action->setObjectName("Fullscreen");
    a_map["Fullscreen"] = action;

    action = new QAction(tr("&Grid"), agm->view);
    action->setIcon(QIcon(":/icons/grid.svg"));
    action->setShortcut(QKeySequence(tr("Ctrl+G", "Toggle Grid")));
    action->setCheckable(true);
    action->setChecked(true);
    connect(main_window, SIGNAL(gridChanged(bool)), action, SLOT(setChecked(bool)));
    connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewGrid(bool)));
    action->setObjectName("ViewGrid");
    a_map["ViewGrid"] = action;

    action = new QAction(tr("&Draft"), agm->view);
    action->setIcon(QIcon(":/icons/draft.svg"));
    action->setCheckable(true);
    action->setShortcut(QKeySequence(tr("Ctrl+D", "Toggle Draft Mode")));
    connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewDraft(bool)));
    connect(main_window, SIGNAL(draftChanged(bool)), action, SLOT(setChecked(bool)));
    action->setObjectName("ViewDraft");
    a_map["ViewDraft"] = action;

    action = new QAction(tr("&Statusbar"), agm->view);
    action->setCheckable(true);
    action->setChecked(true);
    action->setShortcut(QKeySequence(tr("Ctrl+I", "Hide Statusbar")));
    connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewStatusBar(bool)));
    action->setObjectName("ViewStatusBar");
    a_map["ViewStatusBar"] = action;

    action = new QAction(tr("Focus on &Command Line"), agm->view);
    action->setIcon(QIcon(":/main/editclear.png"));
    QList<QKeySequence> commandLineShortcuts;
    commandLineShortcuts<<QKeySequence(Qt::CTRL + Qt::Key_M)<<QKeySequence(Qt::Key_Colon)<<QKeySequence(Qt::Key_Space);
    action->setShortcuts(commandLineShortcuts);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFocusCommandLine()));
    action->setObjectName("FocusCommand");
    a_map["FocusCommand"] = action;

    action = new QAction(tr("Left"), agm->widgets);
    action->setIcon(QIcon(":/icons/dockwidgets_left"));
    connect(action, SIGNAL(toggled(bool)),
            main_window, SLOT(toggleLeftDockArea(bool)));
    action->setCheckable(true);
    action->setChecked(false);
    action->setObjectName("LeftDockAreaToggle");
    a_map["LeftDockAreaToggle"] = action;

    action = new QAction(tr("Right"), agm->widgets);
    action->setIcon(QIcon(":/icons/dockwidgets_right"));
    connect(action, SIGNAL(toggled(bool)),
            main_window, SLOT(toggleRightDockArea(bool)));
    action->setCheckable(true);
    action->setChecked(true);
    action->setObjectName("RightDockAreaToggle");
    a_map["RightDockAreaToggle"] = action;

    action = new QAction(tr("Top"), agm->widgets);
    action->setIcon(QIcon(":/icons/dockwidgets_top"));
    connect(action, SIGNAL(toggled(bool)),
            main_window, SLOT(toggleTopDockArea(bool)));
    action->setCheckable(true);
    action->setChecked(false);
    action->setObjectName("TopDockAreaToggle");
    a_map["TopDockAreaToggle"] = action;

    action = new QAction(tr("Bottom"), agm->widgets);
    action->setIcon(QIcon(":/icons/dockwidgets_bottom"));
    connect(action, SIGNAL(toggled(bool)),
            main_window, SLOT(toggleBottomDockArea(bool)));
    action->setCheckable(true);
    action->setChecked(false);
    action->setObjectName("BottomDockAreaToggle");
    a_map["BottomDockAreaToggle"] = action;

    action = new QAction(tr("Floating"), agm->widgets);
    action->setIcon(QIcon(":/icons/dockwidgets_floating"));
    connect(action, SIGNAL(toggled(bool)),
            main_window, SLOT(toggleFloatingDockwidgets(bool)));
    action->setCheckable(true);
    action->setChecked(false);
    action->setObjectName("FloatingDockwidgetsToggle");
    a_map["FloatingDockwidgetsToggle"] = action;

    action = new QAction(tr("Reload Style Sheet"), agm->options);
    action->setShortcut(QKeySequence("Ctrl+T"));
    connect(action, SIGNAL(triggered()),
            main_window, SLOT(reloadStyleSheet()));
    action->setObjectName("ReloadStyleSheet");
    a_map["ReloadStyleSheet"] = action;

    action = new QAction(tr("Menu Creator"), agm->widgets);
    action->setIcon(QIcon(":/icons/create_menu.svg"));
    connect(action, SIGNAL(triggered()),
            main_window, SLOT(invokeMenuCreator()));
    action->setObjectName("InvokeMenuCreator");
    a_map["InvokeMenuCreator"] = action;

    action = new QAction(tr("Toolbar Creator"), agm->widgets);
    action->setIcon(QIcon(":/icons/create_toolbar.svg"));
    connect(action, SIGNAL(triggered()),
            main_window, SLOT(invokeToolbarCreator()));
    action->setObjectName("InvokeToolbarCreator");
    a_map["InvokeToolbarCreator"] = action;

    commonActions(a_map, agm);
}

void LC_ActionFactory::commonActions(QMap<QString, QAction*>& a_map, LC_ActionGroupManager* agm)
{
    QAction* action;

    // <[~ Edit ~]>

    action = new QAction(tr("&Selection pointer"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("go-previous-view", QIcon(":/icons/cursor.svg")));
    else
        action->setIcon(QIcon(":/icons/cursor.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditKillAllActions()));
    action->setObjectName("EditKillAllActions");
    a_map["EditKillAllActions"] = action;

    action = new QAction(tr("&Undo"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("edit-undo", QIcon(":/icons/undo.svg")));
    else
        action->setIcon(QIcon(":/icons/undo.svg"));
    action->setShortcut(QKeySequence::Undo);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditUndo()));
    action->setObjectName("EditUndo");
    a_map["EditUndo"] = action;

    action = new QAction(tr("&Redo"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("edit-redo", QIcon(":/icons/redo.svg")));
    else
        action->setIcon(QIcon(":/icons/redo.svg"));
    action->setShortcut(QKeySequence::Redo);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditRedo()));
    action->setObjectName("EditRedo");
    a_map["EditRedo"] = action;

    action = new QAction(tr("Cu&t"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("edit-cut", QIcon(":/icons/cut.svg")));
    else
        action->setIcon(QIcon(":/icons/cut.svg"));
    action->setShortcut(QKeySequence::Cut);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditCut()));
    action->setObjectName("EditCut");
    a_map["EditCut"] = action;

    action = new QAction(tr("&Copy"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/icons/copy.svg")));
    else
        action->setIcon(QIcon(":/icons/copy.svg"));
    action->setShortcut(QKeySequence::Copy);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditCopy()));
    action->setObjectName("EditCopy");
    a_map["EditCopy"] = action;

    action = new QAction(tr("&Paste"), agm->edit);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("edit-paste", QIcon(":/icons/paste.svg")));
    else
        action->setIcon(QIcon(":/icons/paste.svg"));
    action->setShortcut(QKeySequence::Paste);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotEditPaste()));
    action->setObjectName("EditPaste");
    a_map["EditPaste"] = action;

    // <[~ Zoom ~]>

    action = new QAction(tr("Zoom &In"), agm->view);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/zoom_in.svg")));
    else
        action->setIcon(QIcon(":/icons/zoom_in.svg"));
    action->setShortcut(QKeySequence::ZoomIn);
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomIn()));
    action->setObjectName("ZoomIn");
    a_map["ZoomIn"] = action;

    action = new QAction(tr("Zoom &Out"), agm->view);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/icons/zoom_out.svg")));
    else
        action->setIcon(QIcon(":/icons/zoom_out.svg"));
    action->setShortcut(QKeySequence::ZoomOut);
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomOut()));
    action->setObjectName("ZoomOut");
    a_map["ZoomOut"] = action;

    action = new QAction(tr("&Auto Zoom"), agm->view);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("zoom-fit-best", QIcon(":/icons/zoom_auto.svg")));
    else
        action->setIcon(QIcon(":/icons/zoom_auto.svg"));
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomAuto()));
    action->setObjectName("ZoomAuto");
    a_map["ZoomAuto"] = action;

    action = new QAction(tr("Previous &View"), agm->view);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("zoom-previous", QIcon(":/icons/zoom_previous.svg")));
    else
        action->setIcon(QIcon(":/icons/zoom_previous.svg"));
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotZoomPrevious()));
    action->setEnabled(false);
    action->setObjectName("ZoomPrevious");
    a_map["ZoomPrevious"] = action;

    action = new QAction(tr("&Redraw"), agm->view);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("view-refresh", QIcon(":/icons/redraw.svg")));
    else
        action->setIcon(QIcon(":/icons/redraw.svg"));
    action->setShortcut(QKeySequence::Refresh);
    connect(action, SIGNAL(triggered()),
    action_handler, SLOT(slotZoomRedraw()));
    action->setObjectName("ZoomRedraw");
    a_map["ZoomRedraw"] = action;

    action = new QAction(tr("&Window Zoom"), agm->other);
    action->setCheckable(true);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("zoom-select", QIcon(":/icons/zoom_window.svg")));
    else
        action->setIcon(QIcon(":/icons/zoom_window.svg"));
    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomWindow()));
    action->setObjectName("ZoomWindow");
    a_map["ZoomWindow"] = action;

    // <[~ File ~]>

    action = new QAction(tr("&New"), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-new", QIcon(":/icons/new.svg")));
    else
        action->setIcon(QIcon(":/icons/new.svg"));
    action->setShortcut(QKeySequence::New);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileNewNew()));
    action->setObjectName("FileNew");
    a_map["FileNew"] = action;

    action = new QAction(tr("New From &Template"), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-new", QIcon(":/icons/new_from_template.svg")));
    else
        action->setIcon(QIcon(":/icons/new_from_template.svg"));
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileNewTemplate()));
    action->setObjectName("FileNewTemplate");
    a_map["FileNewTemplate"] = action;

    action = new QAction(tr("&Open..."), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-open", QIcon(":/icons/open.svg")));
    else
        action->setIcon(QIcon(":/icons/open.svg"));
    action->setShortcut(QKeySequence::Open);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileOpen()));
    action->setObjectName("FileOpen");
    a_map["FileOpen"] = action;

    action = new QAction(tr("&Save"), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-save", QIcon(":/icons/save.svg")));
    else
        action->setIcon(QIcon(":/icons/save.svg"));
    action->setShortcut(QKeySequence::Save);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSave()));
    action->setObjectName("FileSave");
    a_map["FileSave"] = action;

    action = new QAction(tr("Save &as..."), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/save_as.svg")));
    else
        action->setIcon(QIcon(":/icons/save_as.svg"));
    action->setShortcut(QKeySequence::SaveAs);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSaveAs()));
    action->setObjectName("FileSaveAs");
    a_map["FileSaveAs"] = action;

	action = new QAction(tr("Save A&ll..."), agm->file);
	action->setIcon(QIcon(":/icons/save_all.svg"));
	QKeySequence shortcut = QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S);
	// only define this shortcut for platforms not already using it for save as
	if (shortcut != QKeySequence::SaveAs)
		action->setShortcut(shortcut);
	connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSaveAll()));
	action->setObjectName("FileSaveAll");
	a_map["FileSaveAll"] = action;

    action = new QAction(tr("&Print..."), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-print", QIcon(":/icons/print.svg")));
    else
        action->setIcon(QIcon(":/icons/print.svg"));
    action->setShortcut(QKeySequence::Print);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFilePrint()));
    connect(main_window, SIGNAL(printPreviewChanged(bool)), action, SLOT(setChecked(bool)));
    action->setObjectName("FilePrint");
    a_map["FilePrint"] = action;

    action = new QAction(tr("Print Pre&view"), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("document-print-preview", QIcon(":/icons/print_preview.svg")));
    else
        action->setIcon(QIcon(":/icons/print_preview.svg"));
    action->setCheckable(true);
    connect(action, SIGNAL(triggered(bool)), main_window, SLOT(slotFilePrintPreview(bool)));
    connect(main_window, SIGNAL(printPreviewChanged(bool)), action, SLOT(setChecked(bool)));
    action->setObjectName("FilePrintPreview");
    a_map["FilePrintPreview"] = action;

    action = new QAction(tr("&Quit"), agm->file);
    if (using_theme)
        action->setIcon(QIcon::fromTheme("application-exit", QIcon(":/icons/quit.svg")));
    else
        action->setIcon(QIcon(":/icons/quit.svg"));
    action->setShortcut(QKeySequence::Quit);
    connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileQuit()));
    action->setObjectName("FileQuit");
    a_map["FileQuit"] = action;
}
