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