summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/text-edit.h
blob: bca6cee9014167ed98b4d351342020033edcd572 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/** @file
 * @brief Text-edit
 */
/* Authors:
 *   Lauris Kaplinski <lauris@ximian.com>
 *   bulia byak <buliabyak@users.sf.net>
 *   Johan Engelen <goejendaagh@zonnet.nl>
 *   John Smith
 *   Kris De Gussem <Kris.DeGussem@gmail.com>
 *
 * Copyright (C) 1999-2012 Authors
 * Copyright (C) 2000-2001 Ximian, Inc.
 *
 * Released under GNU GPL, read the file 'COPYING' for more information
 */

#ifndef INKSCAPE_UI_DIALOG_TEXT_EDIT_H
#define INKSCAPE_UI_DIALOG_TEXT_EDIT_H

#include <gtkmm/box.h>
#include <gtkmm/notebook.h>
#include <gtkmm/button.h>
#include <gtkmm/frame.h>
#include <gtkmm/radiobutton.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/separator.h>
#include "ui/widget/panel.h"
#include "ui/widget/frame.h"
#include "ui/dialog/desktop-tracker.h"

class SPItem;
class SPFontSelector;
class font_instance;
class SPCSSAttr;

namespace Inkscape {
namespace UI {
namespace Dialog {

#define VB_MARGIN 4
/**
 * The TextEdit class defines the Text and font dialog.
 * 
 * The Text and font dialog allows you to set the font family, style and size
 * and shows a preview of the result. The dialogs layout settings include
 * horizontal and vertical alignment and inter line distance.
 */
class TextEdit : public UI::Widget::Panel {
public:
    TextEdit();
    virtual ~TextEdit();

    /**
     * Helper function which returns a new instance of the dialog.
     * getInstance is needed by the dialog manager (Inkscape::UI::Dialog::DialogManager).
     */
    static TextEdit &getInstance() { return *new TextEdit(); }

protected:

    /**
     * Callback for pressing the default button.
     */
    void onSetDefault ();

    /**
     * Callback for pressing the apply button.
     */
    void onApply ();
    void onSelectionChange ();
    void onSelectionModified (guint flags);
    
    /**
     * Called whenever something 'changes' on canvas.
     * 
     * onReadSelection gets the currently selected item from the canvas and sets all the controls in this dialog to the correct state.
     * 
     * @param dostyle Indicates whether the modification of the user includes a style change.
     * @param content Indicates whether the modification of the user includes a style change. Actually refers to the question if we do want to show the content? (Parameter currently not used)
     */
    void onReadSelection (gboolean style, gboolean content);
    void onToggle ();
    static void onLineSpacingChange (GtkComboBox* widget, gpointer data);
    
    /**
     * Callback invoked when the user modifies the text of the selected text object.
     *
     * onTextChange is responsible for initiating the commands after the user
     * modified the text in the selected object. The UI of the dialog is
     * updated. The subfunction setPreviewText updates the preview label.
     *
     * @param text_buffer pointer to GtkTextBuffer with the text of the selected text object
     * @param self pointer to the current instance of the dialog.
     */
    static void onTextChange (GtkTextBuffer *text_buffer, TextEdit *self);
    
    /**
     * Callback invoked when the user modifies the font through the dialog or the tools control bar.
     *
     * onFontChange updates the dialog UI. The subfunction setPreviewText updates the preview label.
     *
     * @param fontsel pointer to SPFontSelector (currently not used).
     * @param font pointer to the font instance for the text to be previewed
     * @param self pointer to the current instance of the dialog.
     */
    static void onFontChange (SPFontSelector *fontsel, font_instance *font, TextEdit *self);

    /**
     * Get the selected text off the main canvas.
     *
     * @return SPItem pointer to the selected text object
     */
    SPItem *getSelectedTextItem (void);

    /**
     * Count the number of text objects in the selection on the canvas.
     */
    unsigned getSelectedTextCount (void);

    /**
     * Helper function to create markup from a font definition and display in the preview label.
     * 
     * @param font pointer to the font instance for the text to be previewed
     * @param phrase text to be shown
     */
    void setPreviewText (font_instance *font, Glib::ustring phrase);

    void updateObjectText ( SPItem *text );
    SPCSSAttr *getTextStyle ();

    /**
     * Helper function to style radio buttons with icons, tooltips.
     * 
     * styleButton is used when creating the dialog.
     * 
     * @param button pointer to the button which is created
     * @param tooltip pointer to its tooltip string
     * @param iconname string identifying the icon to be shown
     * @param group_button group to which the radio button belongs to
     */
    void styleButton(Gtk::RadioButton *button, gchar const *tooltip, gchar const *iconname, Gtk::RadioButton *group_button  );

    /**
     * Can be invoked for setting the desktop. Currently not used.
     */
    void setDesktop(SPDesktop *desktop);

    /**
     * Is invoked by the desktop tracker when the desktop changes.
     *
     * @see DesktopTracker
     */
    void setTargetDesktop(SPDesktop *desktop);



private:

    /*
     * All the dialogs widgets
     */
    Gtk::Notebook notebook;

    Gtk::VBox font_vbox;
    Gtk::Label font_label;
    Gtk::HBox fontsel_hbox;
    SPFontSelector *fsel;

    Gtk::Alignment layout_frame;
    Gtk::HBox layout_hbox;
    Gtk::RadioButton align_left;
    Gtk::RadioButton align_center;
    Gtk::RadioButton align_right;
    Gtk::RadioButton align_justify;

#if WITH_GTKMM_3_0
    Gtk::Separator  align_sep;
#else
    Gtk::VSeparator align_sep;
#endif

    Gtk::RadioButton text_vertical;
    Gtk::RadioButton text_horizontal;

#if WITH_GTKMM_3_0
    Gtk::Separator  text_sep;
#else
    Gtk::VSeparator text_sep;
#endif

    GtkWidget *spacing_combo;

    Gtk::Label preview_label;

    Gtk::Label text_label;
    Gtk::VBox text_vbox;
    Gtk::ScrolledWindow scroller;
    GtkWidget *text_view; // TODO - Convert this to a Gtk::TextView, but GtkSpell doesn't seem to work with it
    GtkTextBuffer *text_buffer;

    Gtk::HBox button_row;
    Gtk::Button setasdefault_button;
    Gtk::Button close_button;
    Gtk::Button apply_button;

    SPDesktop *desktop;
    DesktopTracker deskTrack;
    sigc::connection desktopChangeConn;
    sigc::connection selectChangedConn;
    sigc::connection subselChangedConn;
    sigc::connection selectModifiedConn;

    bool blocked;
    const Glib::ustring samplephrase;
    TextEdit(TextEdit const &d);
    TextEdit operator=(TextEdit const &d);
};


} //namespace Dialog
} //namespace UI
} //namespace Inkscape

#endif // INKSCAPE_UI_DIALOG_TEXT_EDIT_H

/*
  Local Variables:
  mode:c++
  c-file-style:"stroustrup"
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
  indent-tabs-mode:nil
  fill-column:99
  End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :