diff options
| author | Martin Owens <doctormo@gmail.com> | 2019-02-24 06:13:39 +0000 |
|---|---|---|
| committer | Martin Owens <doctormo@gmail.com> | 2019-02-24 06:13:39 +0000 |
| commit | 89dec29933b82615972ab5cb5691df7a445aac6b (patch) | |
| tree | c3bb2ad8c0beba42805d51f09671a81790e96188 /src | |
| parent | Make background color affect checkerboard (diff) | |
| download | inkscape-89dec29933b82615972ab5cb5691df7a445aac6b.tar.gz inkscape-89dec29933b82615972ab5cb5691df7a445aac6b.zip | |
Merge in bazaar branch for alignment handles
Diffstat (limited to 'src')
| -rw-r--r-- | src/seltrans-handles.cpp | 12 | ||||
| -rw-r--r-- | src/seltrans-handles.h | 43 | ||||
| -rw-r--r-- | src/seltrans.cpp | 42 | ||||
| -rw-r--r-- | src/seltrans.h | 6 | ||||
| -rw-r--r-- | src/ui/dialog/align-and-distribute.cpp | 15 | ||||
| -rw-r--r-- | src/ui/dialog/align-and-distribute.h | 2 | ||||
| -rw-r--r-- | src/ui/pixmaps/handles.xpm | 60 | ||||
| -rw-r--r-- | src/ui/tools/select-tool.cpp | 5 | ||||
| -rw-r--r-- | src/verbs.cpp | 44 | ||||
| -rw-r--r-- | src/verbs.h | 10 |
10 files changed, 221 insertions, 18 deletions
diff --git a/src/seltrans-handles.cpp b/src/seltrans-handles.cpp index fec384086..5cf2457a1 100644 --- a/src/seltrans-handles.cpp +++ b/src/seltrans-handles.cpp @@ -19,7 +19,8 @@ SPSelTransTypeInfo const handtypes[] = { { DEF_COLOR, N_("<b>Scale</b> selection; with <b>Ctrl</b> to scale uniformly; with <b>Shift</b> to scale around rotation center") }, { DEF_COLOR, N_("<b>Skew</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> to skew around the opposite side") }, { DEF_COLOR, N_("<b>Rotate</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> to rotate around the opposite corner") }, - { CEN_COLOR, N_("<b>Center</b> of rotation and skewing: drag to reposition; scaling with Shift also uses this center") } + { CEN_COLOR, N_("<b>Center</b> of rotation and skewing: drag to reposition; scaling with Shift also uses this center") }, + { DEF_COLOR, N_("<b>Align</b> selected objects to the side clicked; <b>Shift</b> click to align against side instead.") } }; SPSelTransHandle const hands[] = { @@ -42,6 +43,15 @@ SPSelTransHandle const hands[] = { {HANDLE_SKEW, SP_ANCHOR_N, GDK_SB_H_DOUBLE_ARROW, 10, 0.5, 0}, {HANDLE_ROTATE, SP_ANCHOR_NE, GDK_EXCHANGE, 7, 0, 0}, {HANDLE_SKEW, SP_ANCHOR_E, GDK_SB_V_DOUBLE_ARROW, 11, 0, 0.5}, + {HANDLE_ALIGN, SP_ANCHOR_S, GDK_TOP_SIDE, 13, 0.5, 1}, + {HANDLE_ALIGN, SP_ANCHOR_W, GDK_RIGHT_SIDE, 14, 1, 0.5}, + {HANDLE_ALIGN, SP_ANCHOR_N, GDK_BOTTOM_SIDE, 15, 0.5, 0}, + {HANDLE_ALIGN, SP_ANCHOR_E, GDK_LEFT_SIDE, 16, 0, 0.5}, + {HANDLE_ALIGN, SP_ANCHOR_CENTER, GDK_CROSSHAIR, 17, 0.5, 0.5}, + {HANDLE_ALIGN, SP_ANCHOR_SE, GDK_TOP_LEFT_CORNER, 18, 0, 1}, + {HANDLE_ALIGN, SP_ANCHOR_SW, GDK_TOP_RIGHT_CORNER, 19, 1, 1}, + {HANDLE_ALIGN, SP_ANCHOR_NW, GDK_BOTTOM_RIGHT_CORNER, 20, 1, 0}, + {HANDLE_ALIGN, SP_ANCHOR_NE, GDK_BOTTOM_LEFT_CORNER, 21, 0, 0}, }; /* diff --git a/src/seltrans-handles.h b/src/seltrans-handles.h index 04658aa3e..5b0e71c5e 100644 --- a/src/seltrans-handles.h +++ b/src/seltrans-handles.h @@ -17,6 +17,7 @@ #include <gdk/gdk.h> #include "enums.h" +#include "verbs.h" typedef unsigned int guint32; @@ -24,23 +25,53 @@ namespace Inkscape { class SelTrans; } -guint32 const DEF_COLOR[] = { 0xff, 0xff6600, 0xff6600, 0xff, 0xff, 0xff }; -guint32 const CEN_COLOR[] = { 0x0, 0x0, 0x0, 0xff, 0xff0000b0, 0xff0000b0 }; +// Colours are RRGGBBAA: FILL, OVER&DRAG, STROKE, OVER&DRAG +guint32 const DEF_COLOR[] = { 0x000000ff, 0x00ff6600, 0x000000ff, 0x000000ff }; +guint32 const CEN_COLOR[] = { 0x00000000, 0x00000000, 0x000000ff, 0xff0000b0 }; enum SPSelTransType { HANDLE_STRETCH, HANDLE_SCALE, HANDLE_SKEW, HANDLE_ROTATE, - HANDLE_CENTER + HANDLE_CENTER, + HANDLE_ALIGN }; +// Which handle does what in the alignment (clicking) +const int AlignVerb[18] = { + // Left Click + SP_VERB_ALIGN_VERTICAL_TOP, + SP_VERB_ALIGN_HORIZONTAL_RIGHT, + SP_VERB_ALIGN_VERTICAL_BOTTOM, + SP_VERB_ALIGN_HORIZONTAL_LEFT, + SP_VERB_ALIGN_VERTICAL_CENTER, + SP_VERB_ALIGN_BOTH_BOTTOM_LEFT, + SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT, + SP_VERB_ALIGN_BOTH_TOP_RIGHT, + SP_VERB_ALIGN_BOTH_TOP_LEFT, + // Shift Click + SP_VERB_ALIGN_VERTICAL_BOTTOM_TO_ANCHOR, + SP_VERB_ALIGN_HORIZONTAL_LEFT_TO_ANCHOR, + SP_VERB_ALIGN_VERTICAL_TOP_TO_ANCHOR, + SP_VERB_ALIGN_HORIZONTAL_RIGHT_TO_ANCHOR, + SP_VERB_ALIGN_HORIZONTAL_CENTER, + SP_VERB_ALIGN_BOTH_TOP_RIGHT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_TOP_LEFT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_BOTTOM_LEFT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT_TO_ANCHOR, +}; +// Ofset from the index in the handle list to the index in the verb list. +const int AlignHandleToVerb = -13; +// Offset for moving from Left click to Shift Click +const int AlignShiftVerb = 9; + struct SPSelTransTypeInfo { guint32 const *color; char const *tip; }; // One per handle type in order -extern SPSelTransTypeInfo const handtypes[5]; +extern SPSelTransTypeInfo const handtypes[6]; struct SPSelTransHandle; @@ -52,8 +83,8 @@ struct SPSelTransHandle { gdouble x, y; }; // These are 4 * each handle type + 1 for center -int const NUMHANDS = 17; -extern SPSelTransHandle const hands[17]; +int const NUMHANDS = 26; +extern SPSelTransHandle const hands[NUMHANDS]; #endif // SEEN_SP_SELTRANS_HANDLES_H diff --git a/src/seltrans.cpp b/src/seltrans.cpp index 4ad4f2154..f43ce3f76 100644 --- a/src/seltrans.cpp +++ b/src/seltrans.cpp @@ -41,6 +41,9 @@ #include "display/snap-indicator.h" #include "display/sodipodi-ctrl.h" #include "display/sp-ctrlline.h" +#include "display/guideline.h" + +#include "helper/action.h" #include "object/sp-item-transform.h" #include "object/sp-namedview.h" @@ -222,6 +225,8 @@ void Inkscape::SelTrans::increaseState() { if (_state == STATE_SCALE) { _state = STATE_ROTATE; + } else if (_state == STATE_ROTATE) { + _state = STATE_ALIGN; } else { _state = STATE_SCALE; } @@ -603,6 +608,8 @@ void Inkscape::SelTrans::_updateHandles() if ( _state == STATE_SCALE ) { _showHandles(HANDLE_STRETCH); _showHandles(HANDLE_SCALE); + } else if(_state == STATE_ALIGN) { + _showHandles(HANDLE_ALIGN); } else { _showHandles(HANDLE_SKEW); _showHandles(HANDLE_ROTATE); @@ -666,8 +673,9 @@ void Inkscape::SelTrans::_makeHandles() knots[i]->setSize(13); knots[i]->setAnchor(hands[i].anchor); knots[i]->setMode(SP_CTRL_MODE_XOR); - knots[i]->setFill(info.color[0], info.color[1], info.color[2],info.color[1]); + knots[i]->setFill(info.color[0], info.color[1], info.color[2], info.color[1]); knots[i]->setStroke(info.color[3], info.color[4], info.color[5], info.color[4]); + knots[i]->setPixbuf(handles[hands[i].control]); knots[i]->updateCtrl(); @@ -733,6 +741,8 @@ void Inkscape::SelTrans::handleClick(SPKnot */*knot*/, guint state, SPSelTransHa _("Reset center")); } break; + case HANDLE_ALIGN: + align(state, handle); default: break; } @@ -793,6 +803,8 @@ void Inkscape::SelTrans::handleNewEvent(SPKnot *knot, Geom::Point *position, gui case HANDLE_CENTER: setCenter(*position); break; + case HANDLE_ALIGN: + break; } } @@ -1094,6 +1106,8 @@ gboolean Inkscape::SelTrans::request(SPSelTransHandle const &handle, Geom::Point return rotateRequest(pt, state); case HANDLE_CENTER: return centerRequest(pt, state); + case HANDLE_ALIGN: + break; // Do nothing, no dragging } return FALSE; } @@ -1329,6 +1343,32 @@ gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state) return TRUE; } +void Inkscape::SelTrans::align(guint state, SPSelTransHandle const &handle) +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool sel_as_group = prefs->getBool("/dialogs/align/sel-as-groups"); + int align_to = prefs->getInt("/dialogs/align/align-to", 6); + + int verb_id = -1; + if (state & GDK_SHIFT_MASK) { + verb_id = AlignVerb[handle.control + AlignHandleToVerb + AlignShiftVerb]; + } else { + verb_id = AlignVerb[handle.control + AlignHandleToVerb]; + } + if(verb_id >= 0) { + prefs->setBool("/dialogs/align/sel-as-groups", (state & GDK_CONTROL_MASK) != 0); + prefs->setInt("/dialogs/align/align-to", 6); + Inkscape::Verb *verb = Inkscape::Verb::get( verb_id ); + g_assert( verb != NULL ); + SPAction *action = verb->get_action((Inkscape::UI::View::View *) this->_desktop); + sp_action_perform (action, NULL); + } + + // Set the special align point and settings back to nothing so we don't interfere + prefs->setBool("/dialogs/align/sel-as-groups", sel_as_group); + prefs->setInt("/dialogs/align/align-to", align_to); +} + /* * handlers for handle movement * diff --git a/src/seltrans.h b/src/seltrans.h index fe3a2ffc0..dadef62ef 100644 --- a/src/seltrans.h +++ b/src/seltrans.h @@ -29,7 +29,7 @@ #include "selcue.h" #include "object/sp-item.h" - +#include "display/guideline.h" class SPKnot; class SPDesktop; @@ -63,6 +63,7 @@ public: void scale(Geom::Point &pt, unsigned int state); void skew(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state); void rotate(Geom::Point &pt, unsigned int state); + void align(guint state, SPSelTransHandle const &handle); int request(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state); int scaleRequest(Geom::Point &pt, unsigned int state); int stretchRequest(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state); @@ -124,7 +125,8 @@ private: enum State { STATE_SCALE, //scale or stretch - STATE_ROTATE //rotate or skew + STATE_ROTATE, //rotate or skew + STATE_ALIGN //on canvas align }; SPDesktop *_desktop; diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp index b43afe179..d62ca3ea7 100644 --- a/src/ui/dialog/align-and-distribute.cpp +++ b/src/ui/dialog/align-and-distribute.cpp @@ -106,7 +106,7 @@ void ActionAlign::do_node_action(Inkscape::UI::Tools::NodeTool *nt, int verb) prefs->setInt("/dialogs/align/align-nodes-to", MIN_NODE ); nt->_multipath->alignNodes(Geom::X); break; - case SP_VERB_ALIGN_VERTICAL_HORIZONTAL_CENTER: + case SP_VERB_ALIGN_BOTH_CENTER: nt->_multipath->alignNodes(Geom::X); nt->_multipath->alignNodes(Geom::Y); break; @@ -162,6 +162,7 @@ void ActionAlign::do_action(SPDesktop *desktop, int index) if(focus) b = focus->desktopPreferredBounds(); + g_return_if_fail(b); if (horiz == Selection::HORIZONTAL && desktop->is_yaxisdown()) { @@ -213,7 +214,7 @@ void ActionAlign::do_action(SPDesktop *desktop, int index) } -ActionAlign::Coeffs const ActionAlign::_allCoeffs[11] = { +ActionAlign::Coeffs const ActionAlign::_allCoeffs[19] = { {1., 0., 0., 0., 0., 1., 0., 0., SP_VERB_ALIGN_HORIZONTAL_RIGHT_TO_ANCHOR}, {1., 0., 0., 0., 1., 0., 0., 0., SP_VERB_ALIGN_HORIZONTAL_LEFT}, {.5, .5, 0., 0., .5, .5, 0., 0., SP_VERB_ALIGN_HORIZONTAL_CENTER}, @@ -224,7 +225,15 @@ ActionAlign::Coeffs const ActionAlign::_allCoeffs[11] = { {0., 0., .5, .5, 0., 0., .5, .5, SP_VERB_ALIGN_VERTICAL_CENTER}, {0., 0., 1., 0., 0., 0., 1., 0., SP_VERB_ALIGN_VERTICAL_BOTTOM}, {0., 0., 1., 0., 0., 0., 0., 1., SP_VERB_ALIGN_VERTICAL_TOP_TO_ANCHOR}, - {.5, .5, .5, .5, .5, .5, .5, .5, SP_VERB_ALIGN_VERTICAL_HORIZONTAL_CENTER} + {1., 0., 0., 1., 1., 0., 0., 1., SP_VERB_ALIGN_BOTH_TOP_LEFT}, + {0., 1., 0., 1., 0., 1., 0., 1., SP_VERB_ALIGN_BOTH_TOP_RIGHT}, + {0., 1., 1., 0., 0., 1., 1., 0., SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT}, + {1., 0., 1., 0., 1., 0., 1., 0., SP_VERB_ALIGN_BOTH_BOTTOM_LEFT}, + {0., 1., 1., 0., 1., 0., 0., 1., SP_VERB_ALIGN_BOTH_TOP_LEFT_TO_ANCHOR}, + {1., 0., 1., 0., 0., 1., 0., 1., SP_VERB_ALIGN_BOTH_TOP_RIGHT_TO_ANCHOR}, + {1., 0., 0., 1., 0., 1., 1., 0., SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT_TO_ANCHOR}, + {0., 1., 0., 1., 1., 0., 1., 0., SP_VERB_ALIGN_BOTH_BOTTOM_LEFT_TO_ANCHOR}, + {.5, .5, .5, .5, .5, .5, .5, .5, SP_VERB_ALIGN_BOTH_CENTER} }; void ActionAlign::do_verb_action(SPDesktop *desktop, int verb) diff --git a/src/ui/dialog/align-and-distribute.h b/src/ui/dialog/align-and-distribute.h index 6259736e0..ad23530ec 100644 --- a/src/ui/dialog/align-and-distribute.h +++ b/src/ui/dialog/align-and-distribute.h @@ -199,7 +199,7 @@ private : guint _index; AlignAndDistribute &_dialog; - static const Coeffs _allCoeffs[11]; + static const Coeffs _allCoeffs[19]; }; diff --git a/src/ui/pixmaps/handles.xpm b/src/ui/pixmaps/handles.xpm index b61ad377c..e16e61bc7 100644 --- a/src/ui/pixmaps/handles.xpm +++ b/src/ui/pixmaps/handles.xpm @@ -98,3 +98,63 @@ static char const *handle_center_xpm[] = { " . ", " "}; +/* XPM */ +static char const *handle_align_xpm[] = { +"13 13 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ", +" ", +" ", +" ", +" ........... ", +" .+++++++. ", +" .+++++. ", +" .+++. ", +" .+. ", +" + ", +" ........... ", +" "}; + +/* XPM */ +static char const *handle_align_center_xpm[] = { +"13 13 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ......... ", +" .+++++. ", +". .+++. .", +".. .+. ..", +".+. . .+.", +".++. . .++.", +".+++.....+++.", +".++. . .++.", +".+. . .+.", +".. .+. ..", +". .+++. .", +" .+++++. ", +" ......... "}; + +/* XPM */ +static char const *handle_align_corner_xpm[] = { +"13 13 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ", +" . . ", +" .. . ", +" .+. . ", +" .++. . ", +" .+++. . ", +" ...... . ", +" . . ", +" . . ", +" .. ", +" ........... ", +" "}; + diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp index 01ede4b6d..93ff8d1d2 100644 --- a/src/ui/tools/select-tool.cpp +++ b/src/ui/tools/select-tool.cpp @@ -59,7 +59,7 @@ using Inkscape::DocumentUndo; -GdkPixbuf *handles[13]; +GdkPixbuf *handles[23]; namespace Inkscape { namespace UI { @@ -112,6 +112,9 @@ SelectTool::SelectTool() sp_load_handles(4, 4, handle_rotate_xpm); sp_load_handles(8, 4, handle_skew_xpm); sp_load_handles(12, 1, handle_center_xpm); + sp_load_handles(13, 4, handle_align_xpm); + sp_load_handles(17, 1, handle_align_center_xpm); + sp_load_handles(18, 4, handle_align_corner_xpm); } //static gint xp = 0, yp = 0; // where drag started diff --git a/src/verbs.cpp b/src/verbs.cpp index 4a872485e..86b884b4d 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -1817,7 +1817,15 @@ void ContextVerb::perform(SPAction *action, void *data) case SP_VERB_ALIGN_VERTICAL_CENTER: case SP_VERB_ALIGN_VERTICAL_BOTTOM: case SP_VERB_ALIGN_VERTICAL_TOP_TO_ANCHOR: - case SP_VERB_ALIGN_VERTICAL_HORIZONTAL_CENTER: + case SP_VERB_ALIGN_BOTH_TOP_LEFT: + case SP_VERB_ALIGN_BOTH_TOP_RIGHT: + case SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT: + case SP_VERB_ALIGN_BOTH_BOTTOM_LEFT: + case SP_VERB_ALIGN_BOTH_TOP_LEFT_TO_ANCHOR: + case SP_VERB_ALIGN_BOTH_TOP_RIGHT_TO_ANCHOR: + case SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT_TO_ANCHOR: + case SP_VERB_ALIGN_BOTH_BOTTOM_LEFT_TO_ANCHOR: + case SP_VERB_ALIGN_BOTH_CENTER: ActionAlign::do_verb_action(dt, verb); break; @@ -3221,8 +3229,40 @@ Verb *Verb::_base_verbs[] = { new ContextVerb(SP_VERB_ALIGN_VERTICAL_TOP_TO_ANCHOR, "AlignVerticalTopToAnchor", N_("Align top edges of objects to the bottom edge of the anchor"), N_("Align top edges of objects to the bottom edge of the anchor"), + INKSCAPE_ICON("align-vertical-top")), + new ContextVerb(SP_VERB_ALIGN_BOTH_TOP_LEFT, "AlignBothTopLeft", + N_("Align edges of objects to the top-left corner of the anchor"), + N_("Align edges of objects to the top-left corner of the anchor"), + INKSCAPE_ICON("align-vertical-top-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_TOP_RIGHT, "AlignBothTopRight", + N_("Align edges of objects to the top-right corner of the anchor"), + N_("Align edges of objects to the top-right corner of the anchor"), + INKSCAPE_ICON("align-vertical-top-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT, "AlignBothBottomRight", + N_("Align edges of objects to the bottom-right corner of the anchor"), + N_("Align edges of objects to the bottom-right corner of the anchor"), + INKSCAPE_ICON("align-vertical-bottom-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_BOTTOM_LEFT, "AlignBothBottomLeft", + N_("Align edges of objects to the bottom-left corner of the anchor"), + N_("Align edges of objects to the bottom-left corner of the anchor"), + INKSCAPE_ICON("align-vertical-bottom-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_TOP_LEFT_TO_ANCHOR, "AlignBothTopLeftToAnchor", + N_("Align edges of objects to the top-left corner of the anchor"), + N_("Align edges of objects to the top-left corner of the anchor"), + INKSCAPE_ICON("align-vertical-top-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_TOP_RIGHT_TO_ANCHOR, "AlignBothTopRightToAnchor", + N_("Align edges of objects to the top-right corner of the anchor"), + N_("Align edges of objects to the top-right corner of the anchor"), INKSCAPE_ICON("align-vertical-top-to-anchor")), - new ContextVerb(SP_VERB_ALIGN_VERTICAL_HORIZONTAL_CENTER, "AlignVerticalHorizontalCenter", + new ContextVerb(SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT_TO_ANCHOR, "AlignBothBottomRightToAnchor", + N_("Align edges of objects to the bottom-right corner of the anchor"), + N_("Align edges of objects to the bottom-right corner of the anchor"), + INKSCAPE_ICON("align-vertical-bottom-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_BOTTOM_LEFT_TO_ANCHOR, "AlignBothBottomLeftToAnchor", + N_("Align edges of objects to the bottom-left corner of the anchor"), + N_("Align edges of objects to the bottom-left corner of the anchor"), + INKSCAPE_ICON("align-vertical-bottom-to-anchor")), + new ContextVerb(SP_VERB_ALIGN_BOTH_CENTER, "AlignVerticalHorizontalCenter", N_("Center on horizontal and vertical axis"), N_("Center on horizontal and vertical axis"), INKSCAPE_ICON("align-vertical-center")), diff --git a/src/verbs.h b/src/verbs.h index 2eee095b8..17faf1067 100644 --- a/src/verbs.h +++ b/src/verbs.h @@ -391,7 +391,15 @@ enum { SP_VERB_ALIGN_VERTICAL_CENTER, SP_VERB_ALIGN_VERTICAL_BOTTOM, SP_VERB_ALIGN_VERTICAL_TOP_TO_ANCHOR, - SP_VERB_ALIGN_VERTICAL_HORIZONTAL_CENTER, + SP_VERB_ALIGN_BOTH_TOP_LEFT, + SP_VERB_ALIGN_BOTH_TOP_RIGHT, + SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT, + SP_VERB_ALIGN_BOTH_BOTTOM_LEFT, + SP_VERB_ALIGN_BOTH_TOP_LEFT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_TOP_RIGHT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_BOTTOM_RIGHT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_BOTTOM_LEFT_TO_ANCHOR, + SP_VERB_ALIGN_BOTH_CENTER, /* Footer */ SP_VERB_LAST |
