1 /* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */
2 
3 /* AbiWord
4  * Copyright (C) 1998 AbiSource, Inc.
5  * Copyright (C) 2003, 2005, 2009 Hubert Figuiere
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program 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 this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  */
22 
23 #include <stdlib.h>
24 #include <string.h>
25 #include "ut_string.h"
26 #include "ut_assert.h"
27 #include "ut_debugmsg.h"
28 
29 #include "gr_CocoaCairoGraphics.h"
30 #include "xap_Dialog_Id.h"
31 #include "xap_CocoaApp.h"
32 #include "xap_CocoaFrame.h"
33 
34 #include "ap_Strings.h"
35 #include "ap_Dialog_Id.h"
36 #include "ap_Dialog_Lists.h"
37 #include "ap_CocoaDialog_Lists.h"
38 #include "fp_Line.h"
39 #include "fp_Column.h"
40 
41 /*****************************************************************/
42 
43 enum {
44 	GUI_LIST_NONE = 0,
45 	GUI_LIST_BULLETED = 1,
46 	GUI_LIST_NUMBERED = 2
47 };
48 
49 
50 static AP_CocoaDialog_Lists * Current_Dialog;
51 
52 
AP_CocoaDialog_Lists(XAP_DialogFactory * pDlgFactory,XAP_Dialog_Id dlgid)53 AP_CocoaDialog_Lists::AP_CocoaDialog_Lists(XAP_DialogFactory * pDlgFactory,
54 										 XAP_Dialog_Id dlgid)
55 	: AP_Dialog_Lists(pDlgFactory,dlgid)
56 {
57 	Current_Dialog = this;
58 	m_pPreviewWidget = NULL;
59 	m_pAutoUpdateLists = NULL;
60 	m_bDontUpdate = false;
61 }
62 
static_constructor(XAP_DialogFactory * pFactory,XAP_Dialog_Id dlgid)63 XAP_Dialog * AP_CocoaDialog_Lists::static_constructor(XAP_DialogFactory * pFactory, XAP_Dialog_Id dlgid)
64 {
65 	AP_CocoaDialog_Lists * p = new AP_CocoaDialog_Lists(pFactory, dlgid);
66 	return p;
67 }
68 
69 
~AP_CocoaDialog_Lists(void)70 AP_CocoaDialog_Lists::~AP_CocoaDialog_Lists(void)
71 {
72 	if(m_pPreviewWidget != NULL)
73 		DELETEP (m_pPreviewWidget);
74 }
75 
76 
runModal(XAP_Frame *)77 void AP_CocoaDialog_Lists::runModal( XAP_Frame * /*pFrame*/)
78 {
79 	FL_ListType  savedListType;
80 	setModal();
81 	NSWindow* window;
82 	m_dlg = [[AP_CocoaDialog_ListsController alloc] initFromNib];
83 	[m_dlg setXAPOwner:this];
84 
85 	window = [m_dlg window];
86 
87 	clearDirty();
88 
89 	// Populate the dialog
90 	m_bDontUpdate = false;
91 	loadXPDataIntoLocal();
92 //
93 // Need this to stop this being stomped during the contruction of preview
94 // widget
95 //
96 	savedListType = getNewListType();
97 
98 
99 	NSView* preview = [m_dlg preview];
100 	GR_CocoaCairoAllocInfo ai(preview);
101 	m_pPreviewWidget = (GR_CocoaCairoGraphics*)XAP_App::getApp()->newGraphics(ai);
102 
103 	// let the widget materialize
104 
105 	NSRect rect = [preview bounds];
106 	_createPreviewFromGC(m_pPreviewWidget,
107 						 (UT_uint32) rect.size.width,
108 						 (UT_uint32) rect.size.height);
109 
110 //
111 // Restore our value
112 //
113 	setNewListType(savedListType);
114 	previewExposed();
115 	[NSApp runModalForWindow:window];
116 //
117 //  We've finished here.
118 //
119 	[m_dlg release];
120 	m_dlg = nil;
121 	DELETEP (m_pPreviewWidget);
122 }
123 
124 
runModeless(XAP_Frame *)125 void AP_CocoaDialog_Lists::runModeless (XAP_Frame * /*pFrame*/)
126 {
127 	m_dlg = [[AP_CocoaDialog_ListsController alloc] initFromNib];
128 	[m_dlg setXAPOwner:this];
129 
130 	clearDirty();
131 	// Save dialog the ID number and pointer to the widget
132 	UT_sint32 sid = (UT_sint32) getDialogId ();
133 	m_pApp->rememberModelessId(sid, (XAP_Dialog_Modeless *) m_pDialog);
134 
135 	NSPanel * window = (NSPanel *) [m_dlg window];
136 
137 	// Populate the dialog
138 	updateDialog();
139 	m_bDontUpdate = false;
140 
141 	// Now Display the dialog
142 	[window setBecomesKeyOnlyIfNeeded:YES];
143 	[window orderFront:m_dlg];
144 
145 	// make a new Cocoa GC
146 	NSView* preview = [m_dlg preview];
147 	GR_CocoaCairoAllocInfo ai(preview);
148 	m_pPreviewWidget = static_cast<GR_CocoaCairoGraphics*>(XAP_App::getApp()->newGraphics(ai));
149 
150 	// let the widget materialize
151 
152 	NSRect bounds = [preview bounds];
153 	_createPreviewFromGC(m_pPreviewWidget,
154 						 (UT_uint32) bounds.size.width,
155 						 (UT_uint32) bounds.size.height);
156 
157 	// Next construct a timer for auto-updating the dialog
158 	m_pAutoUpdateLists = UT_Timer::static_constructor(autoupdateLists,this);
159 	m_bDestroy_says_stopupdating = false;
160 
161 	// OK fire up the auto-updater for 0.5 secs
162 
163 	m_pAutoUpdateLists->set(500);
164 }
165 
166 
autoupdateLists(UT_Worker * pWorker)167 void AP_CocoaDialog_Lists::autoupdateLists(UT_Worker * pWorker)
168 {
169 	UT_ASSERT(pWorker);
170 	// this is a static callback method and does not have a 'this' pointer.
171 	AP_CocoaDialog_Lists * pDialog =  (AP_CocoaDialog_Lists *) pWorker->getInstanceData();
172 	// Handshaking code. Plus only update if something in the document
173 	// changed.
174 
175 	AP_Dialog_Lists * pList = ( AP_Dialog_Lists *) pDialog;
176 
177 	if(pList->isDirty())
178 		return;
179 	if(pDialog->getAvView()->getTick() != pDialog->getTick())
180 	{
181 		pDialog->setTick(pDialog->getAvView()->getTick());
182 		if( pDialog->m_bDestroy_says_stopupdating != true)
183 		{
184 			pDialog->m_bAutoUpdate_happening_now = true;
185 			pDialog->updateDialog();
186 			pDialog->previewExposed();
187 			pDialog->m_bAutoUpdate_happening_now = false;
188 		}
189 	}
190 }
191 
setFoldLevelInGUI(void)192 void AP_CocoaDialog_Lists::setFoldLevelInGUI(void)
193 {
194 	[m_dlg selectFolding:getCurrentFold()];
195 }
196 
isPageLists(void)197 bool AP_CocoaDialog_Lists::isPageLists(void)
198 {
199 	if(isModal())
200 	{
201 		return true;
202 	}
203 
204 	return [m_dlg selectedTab] == 0;
205 }
206 
previewExposed(void)207 void AP_CocoaDialog_Lists::previewExposed(void)
208 {
209 	if(m_pPreviewWidget)
210 	{
211 		setbisCustomized(true);
212 		event_PreviewAreaExposed();
213 	}
214 }
215 
destroy(void)216 void AP_CocoaDialog_Lists::destroy(void)
217 {
218 	if(isModal())
219 	{
220 		setAnswer(AP_Dialog_Lists::a_QUIT);
221 		[NSApp stopModal];
222 	}
223 	else
224 	{
225 		m_bDestroy_says_stopupdating = true;
226 		m_pAutoUpdateLists->stop();
227 		setAnswer(AP_Dialog_Lists::a_CLOSE);
228 
229 		modeless_cleanup();
230 
231 		[m_dlg close];
232 		[m_dlg release];
233 		m_dlg = 0;
234 
235 		DELETEP(m_pAutoUpdateLists);
236 		DELETEP(m_pPreviewWidget);
237 	}
238 }
239 
activate(void)240 void AP_CocoaDialog_Lists::activate (void)
241 {
242 	ConstructWindowName();
243 	[[m_dlg window] setTitle:[NSString stringWithUTF8String:getWindowName()]];
244 	m_bDontUpdate = false;
245 	updateDialog();
246 	[[m_dlg window] orderFront:m_dlg];
247 }
248 
notifyActiveFrame(XAP_Frame *)249 void AP_CocoaDialog_Lists::notifyActiveFrame(XAP_Frame */*pFrame*/)
250 {
251 	ConstructWindowName();
252 	[[m_dlg window] setTitle:[NSString stringWithUTF8String:getWindowName()]];
253 	m_bDontUpdate = false;
254 	updateDialog();
255 	previewExposed();
256 }
257 
typeChanged(int type)258 void  AP_CocoaDialog_Lists::typeChanged(int type)
259 {
260 	//
261 	// code to change list list
262 	//
263 	[m_dlg setStyleMenu:type];
264 
265 	switch (type) {
266 	case GUI_LIST_NONE:
267 		setNewListType(NOT_A_LIST);
268 		break;
269 	case GUI_LIST_BULLETED:
270 		setNewListType(BULLETED_LIST);
271 		break;
272 	case GUI_LIST_NUMBERED:
273 		setNewListType(NUMBERED_LIST);
274 		break;
275 	default:
276 		UT_ASSERT_NOT_REACHED();
277 	}
278 //
279 // This methods needs to be called from loadXPDataIntoLocal to set the correct
280 // list style. However if we are doing this we definately don't want to call
281 // loadXPDataIntoLocal again! Luckily we can just check this to make sure this is
282 // not happenning.
283 //
284 	if(!dontUpdate())
285 	{
286 		fillUncustomizedValues(); // Set defaults
287 		loadXPDataIntoLocal(); // load them into the widget
288 		previewExposed(); // Show current setting
289 	}
290 }
291 
292 /*!
293  * This method just sets the value of m_newListType. This is needed to
294  * make fillUncustomizedValues work.
295  */
setListTypeFromWidget(void)296 void  AP_CocoaDialog_Lists::setListTypeFromWidget(void)
297 {
298 	NSMenuItem* item = [m_dlg selectedListStyle];
299 
300 	setNewListType((FL_ListType)[item tag]);
301 }
302 
303 /*!
304  * This method reads out all the elements of the GUI and sets the XP member
305  * variables from them
306  */
setXPFromLocal(void)307 void  AP_CocoaDialog_Lists::setXPFromLocal(void)
308 {
309 	// Read m_newListType
310 
311 	setListTypeFromWidget();
312 //
313 // Read out GUI stuff in the customize box and load their values into the member
314 // variables.
315 //
316 	_gatherData();
317 //
318 // Now read the toggle button state and set the member variables from them
319 //
320 	switch ([m_dlg listAction]) {
321 	case GUI_LIST_NONE:
322 		setbStartNewList(true);
323 		setbApplyToCurrent(false);
324 		setbResumeList(false);
325 		break;
326 	case GUI_LIST_BULLETED:
327 		setbStartNewList(false);
328 		setbApplyToCurrent(true);
329 		setbResumeList(false);
330 		break;
331 	case GUI_LIST_NUMBERED:
332 		setbStartNewList(false);
333 		setbApplyToCurrent(false);
334 		setbResumeList(true);
335 		break;
336 	default:
337 		UT_ASSERT_NOT_REACHED();
338 		break;
339 	}
340 }
341 
342 
applyClicked(void)343 void  AP_CocoaDialog_Lists::applyClicked(void)
344 {
345 	setXPFromLocal();
346 	previewExposed();
347 	Apply();
348 	if(isModal())
349 	{
350 		setAnswer(AP_Dialog_Lists::a_OK);
351 		[NSApp stopModal];
352 	}
353 }
354 
customChanged(void)355 void  AP_CocoaDialog_Lists::customChanged(void)
356 {
357 	fillUncustomizedValues();
358 	loadXPDataIntoLocal();
359 }
360 
361 
updateFromDocument(void)362 void AP_CocoaDialog_Lists::updateFromDocument(void)
363 {
364 	PopulateDialogData();
365 	_setRadioButtonLabels();
366 	setNewListType(getDocListType());
367 	loadXPDataIntoLocal();
368 }
369 
updateDialog(void)370 void AP_CocoaDialog_Lists::updateDialog(void)
371 {
372 	if(!isDirty())
373 	{
374 	        updateFromDocument();
375 	}
376 	else
377 	{
378 		setXPFromLocal();
379 	}
380 }
381 
setAllSensitivity(void)382 void AP_CocoaDialog_Lists::setAllSensitivity(void)
383 {
384 	PopulateDialogData();
385 	if(getisListAtPoint())
386 	{
387 	}
388 }
389 
390 
_fillFontMenu(NSPopUpButton * menu)391 void AP_CocoaDialog_Lists::_fillFontMenu(NSPopUpButton* menu)
392 {
393 	int i;
394 	int nfonts;
395 	const XAP_StringSet * pSS = m_pApp->getStringSet();
396 
397 	[menu removeAllItems];
398 	AppendLocalizedMenuItem(menu, pSS, AP_STRING_ID_DLG_Lists_Current_Font, 0);
399 
400 	NSArray * list = [[[NSFontManager sharedFontManager] availableFontFamilies]
401 	                      sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
402 	nfonts = [list count];
403 
404 	for(i = 0; i < nfonts; i++)
405 	{
406 		[menu addItemWithTitle:[list objectAtIndex:i]];
407 		[[menu lastItem] setTag:(i + 1)];
408 #if 0
409 		NSMenuItem* item = [[NSMenuItem alloc] initWithTitle:[list objectAtIndex:i]
410 				action:nil keyEquivalent:@""];
411 		[item setTag:i+1];
412 		[[menu menu] addItem:item];
413 #endif
414 	}
415 }
416 
_fillNoneStyleMenu(NSMenu * listmenu)417 void AP_CocoaDialog_Lists::_fillNoneStyleMenu(NSMenu *listmenu)
418 {
419 	NSMenuItem*	item;
420 	const XAP_StringSet * pSS = m_pApp->getStringSet();
421 
422 	[listmenu removeItemAtIndex:0];
423 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Type_none)
424 			action:nil keyEquivalent:@""];
425 	[item setTag:(int)NOT_A_LIST];
426 	[listmenu addItem:item];
427 	[item release];
428 }
429 
_fillNumberedStyleMenu(NSMenu * listmenu)430 void AP_CocoaDialog_Lists::_fillNumberedStyleMenu(NSMenu *listmenu)
431 {
432 	NSMenuItem*	item;
433 	const XAP_StringSet * pSS = m_pApp->getStringSet();
434 
435 	[listmenu removeItemAtIndex:0];
436 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Numbered_List)
437 			action:nil keyEquivalent:@""];
438 	[item setTag:(int)NUMBERED_LIST];
439 	[listmenu addItem:item];
440 	[item release];
441 
442 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Lower_Case_List)
443 			action:nil keyEquivalent:@""];
444 	[item setTag:(int)LOWERCASE_LIST];
445 	[listmenu addItem:item];
446 	[item release];
447 
448 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Upper_Case_List)
449 			action:nil keyEquivalent:@""];
450 	[item setTag:(int)UPPERCASE_LIST];
451 	[listmenu addItem:item];
452 	[item release];
453 
454 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Lower_Roman_List)
455 			action:nil keyEquivalent:@""];
456 	[item setTag:(int)LOWERROMAN_LIST];
457 	[listmenu addItem:item];
458 	[item release];
459 
460 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Upper_Roman_List)
461 			action:nil keyEquivalent:@""];
462 	[item setTag:(int)UPPERROMAN_LIST];
463 	[listmenu addItem:item];
464 	[item release];
465 
466 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Hebrew_List)
467 			action:nil keyEquivalent:@""];
468 	[item setTag:(int)HEBREW_LIST];
469 	[listmenu addItem:item];
470 	[item release];
471 }
472 
473 
_fillBulletedStyleMenu(NSMenu * listmenu)474 void AP_CocoaDialog_Lists::_fillBulletedStyleMenu(NSMenu *listmenu)
475 {
476 	NSMenuItem*	item;
477 	const XAP_StringSet * pSS = m_pApp->getStringSet();
478 
479 	[listmenu removeItemAtIndex:0];
480 
481 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Bullet_List)
482 			action:nil keyEquivalent:@""];
483 	[item setTag:(int)BULLETED_LIST];
484 	[listmenu addItem:item];
485 	[item release];
486 
487 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Dashed_List)
488 			action:nil keyEquivalent:@""];
489 	[item setTag:(int)DASHED_LIST];
490 	[listmenu addItem:item];
491 	[item release];
492 
493 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Square_List)
494 			action:nil keyEquivalent:@""];
495 	[item setTag:(int)SQUARE_LIST];
496 	[listmenu addItem:item];
497 	[item release];
498 
499 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Triangle_List)
500 			action:nil keyEquivalent:@""];
501 	[item setTag:(int)TRIANGLE_LIST];
502 	[listmenu addItem:item];
503 	[item release];
504 
505 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Diamond_List)
506 			action:nil keyEquivalent:@""];
507 	[item setTag:(int)DIAMOND_LIST];
508 	[listmenu addItem:item];
509 	[item release];
510 
511 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Star_List)
512 			action:nil keyEquivalent:@""];
513 	[item setTag:(int)STAR_LIST];
514 	[listmenu addItem:item];
515 	[item release];
516 
517 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Implies_List)
518 			action:nil keyEquivalent:@""];
519 	[item setTag:(int)IMPLIES_LIST];
520 	[listmenu addItem:item];
521 	[item release];
522 
523 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Tick_List)
524 			action:nil keyEquivalent:@""];
525 	[item setTag:(int)TICK_LIST];
526 	[listmenu addItem:item];
527 	[item release];
528 
529 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Box_List)
530 			action:nil keyEquivalent:@""];
531 	[item setTag:(int)BOX_LIST];
532 	[listmenu addItem:item];
533 	[item release];
534 
535 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Hand_List)
536 			action:nil keyEquivalent:@""];
537 	[item setTag:(int)HAND_LIST];
538 	[listmenu addItem:item];
539 	[item release];
540 
541 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Heart_List)
542 			action:nil keyEquivalent:@""];
543 	[item setTag:(int)HEART_LIST];
544 	[listmenu addItem:item];
545 	[item release];
546 
547 	item = [[NSMenuItem alloc] initWithTitle:LocalizedString(pSS, AP_STRING_ID_DLG_Lists_Arrowhead_List)
548 			action:nil keyEquivalent:@""];
549 	[item setTag:(int)ARROWHEAD_LIST];
550 	[listmenu addItem:item];
551 	[item release];
552 }
553 
_setRadioButtonLabels(void)554 void AP_CocoaDialog_Lists::_setRadioButtonLabels(void)
555 {
556 //	const XAP_StringSet * pSS = m_pApp->getStringSet();
557 	PopulateDialogData();
558 	// Button 0 is Start New List, button 2 is resume list
559 //	gtk_label_set_text( GTK_LABEL(m_wStartNew_label), pSS->getValue(AP_STRING_ID_DLG_Lists_Start_New));
560 //	gtk_label_set_text( GTK_LABEL(m_wStartSub_label), pSS->getValue(AP_STRING_ID_DLG_Lists_Resume));
561 }
562 
loadXPDataIntoLocal(void)563 void AP_CocoaDialog_Lists::loadXPDataIntoLocal(void)
564 {
565 	//
566 	// This function reads the various memeber variables and loads them into
567 	// into the dialog variables.
568 	//
569 	m_bDontUpdate = true;
570 
571 	UT_DEBUGMSG(("loadXP newListType = %d \n",getNewListType()));
572 	[m_dlg->_textAlignData setFloatValue:getfAlign()];
573 	float indent = getfAlign() + getfIndent();
574 	[m_dlg->_labelAlignData setFloatValue:indent];
575 	if( (getfIndent() + getfAlign()) < 0.0)
576 	{
577 		setfIndent( - getfAlign());
578 		[m_dlg->_labelAlignData setFloatValue:0.0];
579 	}
580 	//
581 	// Code to work out which is active Font
582 	//
583 	if(getFont() == "NULL")
584 	{
585 		[m_dlg->_fontPopup selectItemAtIndex:0];
586 	}
587 	else
588 	{
589 		[m_dlg->_fontPopup selectItemWithTitle:[NSString stringWithUTF8String:getFont().c_str()]];
590 	}
591 	[m_dlg->_startAtData setIntValue:getiStartValue()];
592 
593 	[m_dlg->_levelDelimData setStringValue:[NSString stringWithUTF8String:getDecimal().c_str()]];
594 	[m_dlg->_formatData setStringValue:[NSString stringWithUTF8String:getDelim().c_str()]];
595 
596 	//
597 	// Now set the list type and style
598 	FL_ListType save = getNewListType();
599 	if(getNewListType() == NOT_A_LIST)
600 	{
601 		typeChanged(GUI_LIST_NONE);
602 		setNewListType(save);
603 		[m_dlg->_typePopup selectItemAtIndex:GUI_LIST_NONE];
604 		[m_dlg->_stylePopup selectItemAtIndex:[m_dlg->_stylePopup indexOfItemWithTag:(int)NOT_A_LIST]];
605 	}
606 	else if(getNewListType() >= BULLETED_LIST)
607 	{
608 		typeChanged(GUI_LIST_BULLETED);
609 		setNewListType(save);
610 		[m_dlg->_typePopup selectItemAtIndex:GUI_LIST_BULLETED];
611 		[m_dlg->_stylePopup selectItemAtIndex:[m_dlg->_stylePopup indexOfItemWithTag:(int)getNewListType()]];
612 	}
613 	else
614 	{
615 		typeChanged(GUI_LIST_NUMBERED);
616 	    setNewListType(save);
617 		[m_dlg->_typePopup selectItemAtIndex:GUI_LIST_NUMBERED];
618 		[m_dlg->_stylePopup selectItemAtIndex:[m_dlg->_stylePopup indexOfItemWithTag:(int)getNewListType()]];
619 	}
620 
621 	m_bDontUpdate = false;
622 }
623 
dontUpdate(void)624 bool    AP_CocoaDialog_Lists::dontUpdate(void)
625 {
626         return m_bDontUpdate;
627 }
628 
629 /*!
630  * This method reads the various elements in the Customize box and loads
631  * the XP member variables with them
632  */
_gatherData(void)633 void AP_CocoaDialog_Lists::_gatherData(void)
634 {
635 	UT_sint32 maxWidth = getBlock()->getFirstContainer()->getContainer()->getWidth();
636 
637 	float fmaxWidthIN = ((float) maxWidth / GR_CocoaCairoGraphics::_getScreenResolution()) - 0.6;
638 	setiLevel(1);
639 	float f = [m_dlg->_textAlignData floatValue];
640 	if(f >   fmaxWidthIN)
641 	{
642 		f = fmaxWidthIN;
643 		[m_dlg->_textAlignData setFloatValue:f];
644 	}
645 	setfAlign(f);
646 	float indent = 		[m_dlg->_labelAlignData floatValue];
647 	if((indent - f) > fmaxWidthIN )
648 	{
649 		indent = fmaxWidthIN + f;
650 		[m_dlg->_labelAlignData setFloatValue:indent];
651 	}
652 	setfIndent(indent - getfAlign());
653 	if( (getfIndent() + getfAlign()) < 0.0)
654 	{
655 		setfIndent(- getfAlign());
656 		[m_dlg->_labelAlignData setFloatValue:0.0];
657 	}
658 	int ifont =  [m_dlg->_fontPopup indexOfSelectedItem];
659 	if(ifont == 0)
660 	{
661 		copyCharToFont("NULL");
662 	}
663 	else
664 	{
665 		copyCharToFont([[[m_dlg->_fontPopup selectedItem] title] UTF8String]);
666 	}
667 	copyCharToDecimal([[m_dlg->_levelDelimData stringValue] UTF8String]);
668 	setiStartValue([m_dlg->_startAtData intValue]);
669 	copyCharToDelim([[m_dlg->_formatData stringValue] UTF8String]);
670 }
671 
672 
673 
674 
675 @implementation AP_CocoaDialog_ListsController
676 
677 - (id)initFromNib
678 {
679 	return [super initWithWindowNibName:@"ap_CocoaDialog_Lists"];
680 }
681 
682 - (void)setXAPOwner:(XAP_Dialog *)owner
683 {
684 	_xap = dynamic_cast<AP_CocoaDialog_Lists*>(owner);
685 	UT_ASSERT(_xap);
686 }
687 
688 - (void)discardXAP
689 {
690 	_xap = nil;
691 }
692 
693 - (void)windowDidLoad
694 {
695 	const XAP_StringSet * pSS = XAP_App::getApp()->getStringSet();
696 
697 //	[[self window] setTitle:[NSString stringWithUTF8String:_xap->getWindowName()]];
698 	if(!_xap->isModal()) {
699 		LocalizeControl(_applyBtn, pSS, XAP_STRING_ID_DLG_Apply);
700 		LocalizeControl(_cancelBtn, pSS, XAP_STRING_ID_DLG_Close);
701 	}
702 	else {
703 		LocalizeControl(_applyBtn, pSS, XAP_STRING_ID_DLG_OK);
704 		LocalizeControl(_cancelBtn, pSS, XAP_STRING_ID_DLG_Cancel);
705 	}
706 	[_typePopup removeAllItems];
707 	AppendLocalizedMenuItem(_typePopup, pSS, AP_STRING_ID_DLG_Lists_Type_none, GUI_LIST_NONE);
708 	AppendLocalizedMenuItem(_typePopup, pSS, AP_STRING_ID_DLG_Lists_Type_bullet, GUI_LIST_BULLETED);
709 	AppendLocalizedMenuItem(_typePopup, pSS, AP_STRING_ID_DLG_Lists_Type_numbered, GUI_LIST_NUMBERED);
710 	[_typePopup selectItemAtIndex:GUI_LIST_NONE];
711 	_xap->_fillNoneStyleMenu(m_listStyleNone_menu);
712 	_xap->_fillNumberedStyleMenu(m_listStyleNumbered_menu);
713 	_xap->_fillBulletedStyleMenu(m_listStyleBulleted_menu);
714 	[_stylePopup setMenu:m_listStyleNone_menu];
715 
716 	LocalizeControl(_typeLabel, pSS, AP_STRING_ID_DLG_Lists_Type);
717 	LocalizeControl(_styleLabel, pSS, AP_STRING_ID_DLG_Lists_Style);
718 	LocalizeControl(_setDefaultBtn, pSS, AP_STRING_ID_DLG_Lists_SetDefault);
719 	_xap->_fillFontMenu(_fontPopup);
720 	LocalizeControl(_formatLabel, pSS, AP_STRING_ID_DLG_Lists_Format);
721 	LocalizeControl(_fontLabel, pSS, AP_STRING_ID_DLG_Lists_Font);
722 	LocalizeControl(_levelDelimLabel, pSS, AP_STRING_ID_DLG_Lists_DelimiterString);
723 	LocalizeControl(_startAtLabel, pSS, AP_STRING_ID_DLG_Lists_Start);
724 	LocalizeControl(_textAlignLabel, pSS, AP_STRING_ID_DLG_Lists_Align);
725 	LocalizeControl(_labelAlignLabel, pSS, AP_STRING_ID_DLG_Lists_Indent);
726 	LocalizeControl(_previewBox, pSS, AP_STRING_ID_DLG_Lists_Preview);
727 	LocalizeControl(_startNewListBtn, pSS, AP_STRING_ID_DLG_Lists_Start_New);
728 	LocalizeControl(_applyToCurrentBtn, pSS, AP_STRING_ID_DLG_Lists_Apply_Current);
729 	LocalizeControl(_attachToPreviousBtn, pSS, AP_STRING_ID_DLG_Lists_Resume);
730 
731 	LocalizeControl([_mainTab tabViewItemAtIndex:0], pSS, AP_STRING_ID_DLG_Lists_PageProperties);
732 	LocalizeControl([_mainTab tabViewItemAtIndex:1], pSS, AP_STRING_ID_DLG_Lists_PageFolding);
733 
734 	LocalizeControl(_noFoldingBtn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevelexp);
735 	LocalizeControl(_noFoldingBtn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevel0);
736 	LocalizeControl(_foldLevel1Btn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevel1);
737 	LocalizeControl(_foldLevel2Btn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevel2);
738 	LocalizeControl(_foldLevel3Btn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevel3);
739 	LocalizeControl(_foldLevel4Btn, pSS, AP_STRING_ID_DLG_Lists_FoldingLevel4);
740 }
741 
742 - (XAP_CocoaNSView*)preview
743 {
744 	return _preview;
745 }
746 
747 - (NSMenuItem*)selectedListType
748 {
749 	return [_typePopup selectedItem];
750 }
751 
752 
753 - (NSMenuItem*)selectedListStyle
754 {
755 	return [_stylePopup selectedItem];
756 }
757 
758 - (void)setStyleMenu:(int)type
759 {
760 	switch(type) {
761 	case GUI_LIST_NONE:
762 		if ([_stylePopup menu] != m_listStyleNone_menu) {
763 			[_stylePopup selectItemAtIndex:0];	// make sure first item is selected before changing.
764 			[_stylePopup setMenu:m_listStyleNone_menu];
765 		}
766 		break;
767 	case GUI_LIST_BULLETED:
768 		if ([_stylePopup menu] != m_listStyleBulleted_menu) {
769 			[_stylePopup selectItemAtIndex:0];	// make sure first item is selected before changing.
770 			[_stylePopup setMenu:m_listStyleBulleted_menu];
771 		}
772 		break;
773 	case GUI_LIST_NUMBERED:
774 		if ([_stylePopup menu] != m_listStyleNumbered_menu) {
775 			[_stylePopup selectItemAtIndex:0];	// make sure first item is selected before changing.
776 			[_stylePopup setMenu:m_listStyleNumbered_menu];
777 		}
778 		break;
779 	default:
780 		UT_ASSERT_NOT_REACHED();
781 	}
782 }
783 
784 - (int)listAction
785 {
786 	return [_listActionMatrix selectedColumn];
787 }
788 
789 - (void)windowDidBecomeKey:(NSNotification *)aNotification
790 {
791 	UT_UNUSED(aNotification);
792 	if(Current_Dialog->isDirty()) {
793 		return;
794 	}
795 	if(Current_Dialog->getAvView()->getTick() != Current_Dialog->getTick()) {
796 		Current_Dialog->setTick(Current_Dialog->getAvView()->getTick());
797 		Current_Dialog->updateDialog();
798 	}
799 }
800 
801 - (void)selectFolding:(int)folding
802 {
803 	[_foldingMatrix selectCellWithTag:folding];
804 }
805 
806 
807 // return the tab that is selected.
808 - (int)selectedTab
809 {
810 	return [_mainTab indexOfTabViewItem: [_mainTab selectedTabViewItem]];
811 }
812 
813 - (IBAction)applyAction:(id)sender
814 {
815 	UT_UNUSED(sender);
816 	_xap->applyClicked();
817 	// [NSApp stopModal];
818 }
819 
820 - (IBAction)cancelAction:(id)sender
821 {
822 	UT_UNUSED(sender);
823 	_xap->destroy();
824 }
825 
826 - (IBAction)labelAlignAction:(id)sender
827 {
828 	[_labelAlignData setFloatValue:[_labelAlignStepper floatValue]];
829 	[self valueChangedAction:sender];
830 }
831 
832 - (IBAction)labelAlignActionStepper:(id)sender
833 {
834 	[_labelAlignStepper setFloatValue:[_labelAlignData floatValue]];
835 	[self valueChangedAction:sender];
836 }
837 
838 - (IBAction)setDefaultAction:(id)sender
839 {
840 	UT_UNUSED(sender);
841   	_xap->setDirty();
842 	_xap->customChanged();
843 }
844 
845 - (IBAction)startAtAction:(id)sender
846 {
847 	[_startAtStepper setFloatValue:[_startAtData floatValue]];
848 	[self valueChangedAction:sender];
849 }
850 
851 - (IBAction)startAtStepperAction:(id)sender
852 {
853 	[_startAtData setFloatValue:[_startAtStepper floatValue]];
854 	[self valueChangedAction:sender];
855 }
856 
857 - (IBAction)styleChangedAction:(id)sender
858 {
859 	UT_UNUSED(sender);
860 	if(_xap->dontUpdate()) {
861 		return;
862 	}
863   	_xap->setDirty();
864 	_xap->setListTypeFromWidget(); // Use this to set m_newListType
865 	_xap->fillUncustomizedValues(); // Use defaults to start.
866 	_xap->loadXPDataIntoLocal(); // Load them into our member variables
867 	_xap->previewExposed();
868 }
869 
870 - (IBAction)textAlignAction:(id)sender
871 {
872 	[_textAlignStepper setFloatValue:[_textAlignData floatValue]];
873 	[self valueChangedAction:sender];
874 }
875 
876 - (IBAction)textAlignActionStepper:(id)sender
877 {
878 	[_textAlignData setFloatValue:[_textAlignStepper floatValue]];
879 	[self valueChangedAction:sender];
880 }
881 
882 - (IBAction)typeChangedAction:(id)sender
883 {
884 	int style = [[sender selectedItem] tag];
885 	[self setStyleMenu:style];
886 	/* force the update.*/
887 	[self styleChangedAction:_stylePopup];
888 }
889 
890 - (IBAction)valueChangedAction:(id)sender
891 {
892 	UT_UNUSED(sender);
893 	if(_xap->dontUpdate()) {
894 		return;
895 	}
896   	_xap->setDirty();
897 	_xap->setXPFromLocal(); // Update member Variables
898 	_xap->previewExposed();
899 }
900 
901 
902 - (IBAction)foldingChanged:(id)sender
903 {
904 	NSMatrix *m = sender;
905 
906 	_xap->_foldingChanged([m selectedRow]);
907 }
908 
909 
910 @end
911 
912 
913 
914 
915 
916