18#include <AppKit/AppKit.h>
19#include <objc/runtime.h>
63 return [NSDictionary dictionaryWithObjectsAndKeys:
64 [NSNumber numberWithInteger:
currentUnderline?kCTUnderlineStyleSingle:kCTUnderlineStyleNone], kCTUnderlineStyleAttributeName,
78- (void)drawRect:(NSRect)dirtyRect
80 NSFontManager *fm = [NSFontManager sharedFontManager];
81 NSFontPanel *fp = [fm fontPanel:YES];
84 [fp makeKeyAndOrderFront:nil];
87 [fm setSelectedFont:[NSFont fontWithName:currentFontName size:currentPointSize] isMultiple:NO];
88 [fm setSelectedAttributes:getCurrentAttributes() isMultiple:NO];
94- (NSUInteger)validModesForFontPanel:(NSFontPanel *)fontPanel
96 return NSFontPanelUnderlineEffectModeMask | NSFontPanelTextColorEffectModeMask | NSFontPanelCollectionModeMask | NSFontPanelFaceModeMask | NSFontPanelSizeModeMask;
102- (void)changeFont:(NSFontManager *)fm
104 NSFont *oldFont = [NSFont userFontOfSize:12];
105 NSFont *newFont = [fm convertFont:oldFont];
107 [currentFontName release];
117- (void)changeAttributes:(NSFontManager *)fm
119 NSDictionary *newAttributes = [fm convertAttributes:getCurrentAttributes()];
121 NSNumber *underlineNumber = [newAttributes objectForKey:(NSString *)kCTUnderlineStyleAttributeName];
122 if (underlineNumber && [underlineNumber integerValue] != kCTUnderlineStyleNone)
127 currentColor = [[newAttributes objectForKey:@"NSColor"] retain];
142- (id)initWithQDialog:(QDialog *)_dialog
147- (void)windowWillClose:(NSNotification *)notification
152- (void)okButtonPressed
156- (void)cancelButtonPressed
170- (void)alignmentChanged:(NSSegmentedControl *)control
176- (void)charSpacingChanged:(NSSlider *)control
181- (void)lineSpacingChanged:(NSSlider *)control
199 QDialog *dialog =
new QDialog;
201 dialog->setWindowFlags(Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);
207 NSView *d = (NSView *)dialog->winId();
210 [d addSubview:textEditView];
211 [[d window] makeFirstResponder:textEditView];
216 NSFontManager *fm = [NSFontManager sharedFontManager];
217 NSFontPanel *fp = [fm fontPanel:YES];
219 [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
226 [[NSColorPanel sharedColorPanel] setAlphaValue:0];
228 dialog.setOption(QColorDialog::NoButtons,
true);
231 [[NSColorPanel sharedColorPanel] setAlphaValue:1];
236 [fp setDelegate:delegate];
241 [currentFontName release];
244 currentFontName = [[NSString stringWithUTF8String:originalVuoFont.fontName] retain];
249 NSFont *originalFont = [NSFont userFontOfSize:12];
254 currentColor = [[NSColor colorWithCalibratedRed:originalVuoFont.color.r green:originalVuoFont.color.g blue:originalVuoFont.color.b alpha:originalVuoFont.color.a] retain];
267 NSSize panelSize = [fp frame].size;
268 NSSize screenSize = [[fp screen] frame].size;
269 [fp setFrameTopLeftPoint:NSMakePoint(portLeftCenter.x() - panelSize.width, screenSize.height - portLeftCenter.y() + panelSize.height/2)];
273 const unsigned int buttonWidth = 80;
274 const unsigned int buttonHeight = 24;
275 const unsigned int buttonSep = 12;
276 NSView *accessoryView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 4*buttonWidth+3*buttonSep, 2*buttonHeight+3*buttonSep)];
277 [fp setAccessoryView:accessoryView];
278 [accessoryView autorelease];
279 [fp setMinSize:NSMakeSize([accessoryView frame].size.width, [fp minSize].height)];
282 [accessoryDelegate autorelease];
286 NSSegmentedControl *alignmentControl = [[NSSegmentedControl alloc] initWithFrame:NSMakeRect(0, 0, buttonWidth+buttonSep+buttonWidth, buttonHeight)];
287 [alignmentControl setSegmentCount:3];
288 [alignmentControl setSelectedSegment:currentAlignment];
290 [alignmentControl setImage:[NSImage imageNamed:@"align-left"] forSegment:0];
291 [alignmentControl setImage:[NSImage imageNamed:@"align-center"] forSegment:1];
292 [alignmentControl setImage:[NSImage imageNamed:@"align-right"] forSegment:2];
294 [alignmentControl setTarget:accessoryDelegate];
295 [alignmentControl setAction:@selector(alignmentChanged:)];
297 [accessoryView addSubview:alignmentControl];
298 [alignmentControl autorelease];
301 int secondBaseline = buttonHeight+buttonSep;
302 int sliderWidth = buttonWidth+buttonSep+buttonWidth;
306 NSTextField *charSpacingLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(0, secondBaseline+buttonSep, sliderWidth, buttonHeight)];
307 [charSpacingLabel setEditable:NO];
308 [charSpacingLabel setBordered:NO];
309 [charSpacingLabel setDrawsBackground:NO];
310 [charSpacingLabel setStringValue:@"Character Spacing"];
311 [charSpacingLabel setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
312 [accessoryView addSubview:charSpacingLabel];
313 [charSpacingLabel autorelease];
315 NSSlider *charSpacingControl = [[NSSlider alloc] initWithFrame:NSMakeRect(0, secondBaseline, sliderWidth, buttonHeight)];
316 [charSpacingControl setNumberOfTickMarks:1];
317 [charSpacingControl setMinValue:0];
318 [charSpacingControl setMaxValue:2];
319 [charSpacingControl setDoubleValue:currentCharacterSpacing];
320 [[charSpacingControl cell] setControlSize:NSControlSizeSmall];
322 [charSpacingControl setTarget:accessoryDelegate];
323 [charSpacingControl setAction:@selector(charSpacingChanged:)];
325 [accessoryView addSubview:charSpacingControl];
326 [charSpacingControl autorelease];
331 NSTextField *lineSpacingLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(2*buttonWidth+2*buttonSep, secondBaseline+buttonSep, sliderWidth, buttonHeight)];
332 [lineSpacingLabel setEditable:NO];
333 [lineSpacingLabel setBordered:NO];
334 [lineSpacingLabel setDrawsBackground:NO];
335 [lineSpacingLabel setStringValue:@"Line Spacing"];
336 [lineSpacingLabel setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
337 [accessoryView addSubview:lineSpacingLabel];
338 [lineSpacingLabel autorelease];
340 NSSlider *lineSpacingControl = [[NSSlider alloc] initWithFrame:NSMakeRect(2*buttonWidth+2*buttonSep, secondBaseline, sliderWidth, buttonHeight)];
341 [lineSpacingControl setNumberOfTickMarks:1];
342 [lineSpacingControl setMinValue:0];
343 [lineSpacingControl setMaxValue:2];
344 [lineSpacingControl setDoubleValue:currentLineSpacing];
345 [[lineSpacingControl cell] setControlSize:NSControlSizeSmall];
347 [lineSpacingControl setTarget:accessoryDelegate];
348 [lineSpacingControl setAction:@selector(lineSpacingChanged:)];
350 [accessoryView addSubview:lineSpacingControl];
351 [lineSpacingControl autorelease];
358 NSButton *okButton = [[NSButton alloc] initWithFrame:NSMakeRect(3*buttonWidth+3*buttonSep,0,buttonWidth,buttonHeight)];
359 [okButton setKeyEquivalent:@"\r"];
360 [okButton setTitle:@"OK"];
361 [okButton setButtonType:NSButtonTypeMomentaryLight];
362 [okButton setBezelStyle:NSBezelStyleRounded];
363 [okButton setTarget:delegate];
364 [okButton setAction:@selector(okButtonPressed)];
365 [accessoryView addSubview:okButton];
366 [okButton autorelease];
369 NSButton *cancelButton = [[NSButton alloc] initWithFrame:NSMakeRect(2*buttonWidth+3*buttonSep,0,buttonWidth,buttonHeight)];
370 [cancelButton setKeyEquivalent:@"\E"];
371 [cancelButton setTitle:@"Cancel"];
372 [cancelButton setButtonType:NSButtonTypeMomentaryLight];
373 [cancelButton setBezelStyle:NSBezelStyleRounded];
374 [cancelButton setTarget:delegate];
375 [cancelButton setAction:@selector(cancelButtonPressed)];
376 [accessoryView addSubview:cancelButton];
377 [cancelButton autorelease];
382 int result = dialog->exec();
385 [[NSColorPanel sharedColorPanel] orderOut:nil];
396 if (result == QDialog::Accepted)
399 return json_object_get(originalValue);
408 emit valueChanged(valueAsJson);
409 json_object_put(valueAsJson);