]> icculus.org git repositories - divverent/netradiant.git/blob - radiant/findtexturedialog.cpp
new args -meta and -patchmeta to -convert with .map file argument
[divverent/netradiant.git] / radiant / findtexturedialog.cpp
1 /*
2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 //
23 // Find/Replace textures dialogs
24 //
25 // Leonardo Zide (leo@lokigames.com)
26 //
27
28 #include "findtexturedialog.h"
29
30 #include "debugging/debugging.h"
31
32 #include "ishaders.h"
33
34 #include <gtk/gtkhbox.h>
35 #include <gtk/gtkentry.h>
36 #include <gtk/gtkvbox.h>
37 #include <gtk/gtkframe.h>
38 #include <gtk/gtklabel.h>
39 #include <gtk/gtktable.h>
40 #include <gtk/gtkbutton.h>
41 #include <gtk/gtktogglebutton.h>
42 #include <gtk/gtkcheckbutton.h>
43 #include <gtk/gtkmenuitem.h>
44 #include <gtk/gtkarrow.h>
45
46 #include "gtkutil/window.h"
47 #include "stream/stringstream.h"
48
49 #include "commands.h"
50 #include "dialog.h"
51 #include "select.h"
52 #include "textureentry.h"
53
54
55
56 class FindTextureDialog : public Dialog
57 {
58  public:
59   static void setReplaceStr(const char* name);
60   static void setFindStr(const char* name);
61   static bool isOpen();
62   static void show();
63   typedef FreeCaller<&FindTextureDialog::show> ShowCaller;
64   static void updateTextures(const char* name);
65
66   FindTextureDialog();
67   virtual ~FindTextureDialog();
68   GtkWindow* BuildDialog();
69
70   void constructWindow(GtkWindow* parent)
71   {
72     m_parent = parent;
73     Create();
74   }
75   void destroyWindow()
76   {
77     Destroy();
78   }
79
80
81   bool m_bSelectedOnly;
82   CopiedString m_strFind;
83   CopiedString m_strReplace;
84 };
85
86 FindTextureDialog g_FindTextureDialog;
87 static bool g_bFindActive = true;
88
89 namespace
90 {
91   void FindTextureDialog_apply()
92   {
93     StringOutputStream find(256);
94     StringOutputStream replace(256);
95
96     find << "textures/" << g_FindTextureDialog.m_strFind.c_str();
97     replace << "textures/" << g_FindTextureDialog.m_strReplace.c_str();
98     FindReplaceTextures(find.c_str(), replace.c_str(), g_FindTextureDialog.m_bSelectedOnly);
99   }
100
101   static void OnApply(GtkWidget* widget, gpointer data) 
102   {
103     g_FindTextureDialog.exportData();
104     FindTextureDialog_apply();
105   }
106
107   static void OnFind(GtkWidget* widget, gpointer data) 
108   {
109     g_FindTextureDialog.exportData();
110     FindTextureDialog_apply();
111   }
112
113   static void OnOK(GtkWidget* widget, gpointer data) 
114   {
115     g_FindTextureDialog.exportData();
116     FindTextureDialog_apply();
117     g_FindTextureDialog.HideDlg();
118   }
119
120   static void OnClose(GtkWidget* widget, gpointer data) 
121   {
122     g_FindTextureDialog.HideDlg();
123   }
124
125
126   static gint find_focus_in (GtkWidget* widget, GdkEventFocus *event, gpointer data)
127   {
128     g_bFindActive = true;
129     return FALSE;
130   }
131
132   static gint replace_focus_in (GtkWidget* widget, GdkEventFocus *event, gpointer data)
133   {
134     g_bFindActive = false;
135     return FALSE;
136   }
137 }
138
139 // =============================================================================
140 // FindTextureDialog class
141
142 FindTextureDialog::FindTextureDialog()
143 {
144   m_bSelectedOnly = FALSE;
145 }
146
147 FindTextureDialog::~FindTextureDialog()
148 {
149 }
150
151 GtkWindow* FindTextureDialog::BuildDialog()
152 {
153   GtkWidget* vbox, *hbox, *table, *label;
154   GtkWidget* button, *check, *entry;
155
156   GtkWindow* dlg = create_floating_window("Find / Replace Texture(s)", m_parent);
157
158   hbox = gtk_hbox_new (FALSE, 5);
159   gtk_widget_show (hbox);
160   gtk_container_add(GTK_CONTAINER(dlg), GTK_WIDGET(hbox));
161   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
162
163   vbox = gtk_vbox_new (FALSE, 5);
164   gtk_widget_show (vbox);
165   gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0);
166
167   table = gtk_table_new (2, 2, FALSE);
168   gtk_widget_show (table);
169   gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), TRUE, TRUE, 0);
170   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
171   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
172
173   label = gtk_label_new ("Find:");
174   gtk_widget_show (label);
175   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
176                     (GtkAttachOptions) (GTK_FILL),
177                     (GtkAttachOptions) (0), 0, 0);
178   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
179
180   label = gtk_label_new ("Replace:");
181   gtk_widget_show (label);
182   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
183                     (GtkAttachOptions) (GTK_FILL),
184                     (GtkAttachOptions) (0), 0, 0);
185   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
186
187   entry = gtk_entry_new();
188   gtk_widget_show (entry);
189   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
190                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
191                     (GtkAttachOptions) (0), 0, 0);
192   g_signal_connect(G_OBJECT(entry), "focus_in_event",
193                       G_CALLBACK(find_focus_in), 0);
194   AddDialogData(*GTK_ENTRY(entry), m_strFind);
195   GlobalTextureEntryCompletion::instance().connect(GTK_ENTRY(entry));
196
197   entry = gtk_entry_new();
198   gtk_widget_show (entry);
199   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
200                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
201                     (GtkAttachOptions) (0), 0, 0);
202   g_signal_connect(G_OBJECT(entry), "focus_in_event",
203                       G_CALLBACK(replace_focus_in), 0);
204   AddDialogData(*GTK_ENTRY(entry), m_strReplace);
205   GlobalTextureEntryCompletion::instance().connect(GTK_ENTRY(entry));
206
207   check = gtk_check_button_new_with_label ("Within selected brushes only");
208   gtk_widget_show (check);
209   gtk_box_pack_start(GTK_BOX(vbox), check, TRUE, TRUE, 0);
210   AddDialogData(*GTK_TOGGLE_BUTTON(check), m_bSelectedOnly);
211
212   vbox = gtk_vbox_new (FALSE, 5);
213   gtk_widget_show (vbox);
214   gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), FALSE, FALSE, 0);
215
216   button = gtk_button_new_with_label ("Apply");
217   gtk_widget_show (button);
218   gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
219   g_signal_connect(G_OBJECT(button), "clicked",
220                       G_CALLBACK(OnApply), 0);
221   gtk_widget_set_usize (button, 60, -2);
222
223   button = gtk_button_new_with_label ("Close");
224   gtk_widget_show (button);
225   gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
226   g_signal_connect(G_OBJECT(button), "clicked",
227                       G_CALLBACK(OnClose), 0);
228   gtk_widget_set_usize (button, 60, -2);
229
230   return dlg;
231 }
232
233 void FindTextureDialog::updateTextures(const char* name)
234 {
235   if (isOpen())
236   {
237     if (g_bFindActive)
238     {
239       setFindStr(name + 9);
240     }
241     else
242     {
243       setReplaceStr(name + 9);
244     }
245   }
246 }
247
248 bool FindTextureDialog::isOpen()
249 {
250   return GTK_WIDGET_VISIBLE(g_FindTextureDialog.GetWidget()) == TRUE;
251 }
252
253 void FindTextureDialog::setFindStr(const char* name)
254 {
255   g_FindTextureDialog.exportData();
256   g_FindTextureDialog.m_strFind = name;
257   g_FindTextureDialog.importData();
258 }
259
260 void FindTextureDialog::setReplaceStr(const char* name)
261 {
262   g_FindTextureDialog.exportData();
263   g_FindTextureDialog.m_strReplace = name;
264   g_FindTextureDialog.importData();
265 }
266
267 void FindTextureDialog::show()
268 {
269   g_FindTextureDialog.ShowDlg();
270 }
271
272
273 void FindTextureDialog_constructWindow(GtkWindow* main_window)
274 {
275   g_FindTextureDialog.constructWindow(main_window);
276 }
277
278 void FindTextureDialog_destroyWindow()
279 {
280   g_FindTextureDialog.destroyWindow();
281 }
282
283 bool FindTextureDialog_isOpen()
284 {
285   return g_FindTextureDialog.isOpen();
286 }
287
288 void FindTextureDialog_selectTexture(const char* name)
289 {
290   g_FindTextureDialog.updateTextures(name);
291 }
292
293 void FindTextureDialog_Construct()
294 {
295   GlobalCommands_insert("FindReplaceTextures", FindTextureDialog::ShowCaller());
296 }
297
298 void FindTextureDialog_Destroy()
299 {
300 }
301