source: webkit/trunk/WebCore/platform/mac/FileChooserMac.mm @ 16323

Last change on this file since 16323 was 16323, checked in by aroben, 18 years ago

Reviewed many times by darin, hyatt.

Switch to new engine-based implementation of <input type="file">

  • WebCore.exp: Remove obsolete symbol WebCoreFileButton
  • WebCore.xcodeproj/project.pbxproj: Remove files for old widget-based control, add files for new engine-based control
  • css/CSSSelector.cpp: Add support for new '-webkit-file-upload-button' pseudo element (WebCore::CSSSelector::extractPseudoType):
  • css/CSSSelector.h: Ditto. (WebCore::CSSSelector::):
  • css/cssstyleselector.cpp: Ditto. (WebCore::CSSStyleSelector::checkOneSelector):
  • html/HTMLInputElement.cpp: Send click events to new control (WebCore::HTMLInputElement::select): (WebCore::HTMLInputElement::click): (WebCore::HTMLInputElement::createRenderer): (WebCore::HTMLInputElement::valueWithDefault): (WebCore::HTMLInputElement::defaultEventHandler):
  • html/HTMLTextFieldInnerElement.h: Add 'virtual' keyword (WebCore::HTMLTextFieldInnerElement::shadowParentNode):
  • platform/FileButton.h: Removed.
  • platform/FileChooser.h: Added. This is the replacement for FileButton.h (WebCore::FileChooser::filename): (WebCore::FileChooser::icon): (WebCore::FileChooser::uploadControl): (WebCore::FileChooser::document):
  • platform/Icon.h: Added new platform-specific class representing a file icon.
  • platform/LocalizedStrings.h:
  • platform/mac/FileButtonMac.mm: Removed.
  • platform/mac/FileChooserMac.mm: Added. This is the replacement for FileButtonMac.mm (-[OpenPanelController initWithFileChooser:]): (-[OpenPanelController fileChooserDetachingSoon]): (-[OpenPanelController beginSheet]): (-[OpenPanelController chooseFilename:]): (-[OpenPanelController cancel]): (WebCore::FileChooser::FileChooser): (WebCore::FileChooser::~FileChooser): (WebCore::FileChooser::openFileChooser): (WebCore::FileChooser::basenameForWidth): (WebCore::FileChooser::uploadControlDetaching): (WebCore::FileChooser::chooseFile):
  • platform/mac/IconMac.mm: Added. (WebCore::Icon::Icon): (WebCore::Icon::~Icon): (WebCore::Icon::newIconForFile): (WebCore::Icon::paint):
  • platform/mac/LocalizedStringsMac.mm: Call across bridge to get localized strings. (WebCore::fileButtonChooseFileLabel): (WebCore::fileButtonNoFileSelectedLabel):
  • rendering/RenderButton.cpp: Extract method setText() from updateFromElement. (WebCore::RenderButton::updateFromElement): (WebCore::RenderButton::setText):
  • rendering/RenderButton.h: Add declaration for new setText method.
  • rendering/RenderFileButton.cpp: Removed.
  • rendering/RenderFileButton.h: Removed.
  • rendering/RenderFileUploadControl.cpp: Added. This is the replacement for RenderFileButton.cpp. (WebCore::RenderFileUploadInnerFileBox::renderName): (WebCore::HTMLFileUploadInnerButtonElement::isShadowNode): (WebCore::HTMLFileUploadInnerButtonElement::shadowParentNode): (WebCore::RenderFileUploadControl::RenderFileUploadControl): (WebCore::RenderFileUploadControl::~RenderFileUploadControl): (WebCore::RenderFileUploadControl::setStyle): (WebCore::RenderFileUploadControl::updateIconAndFilename): (WebCore::RenderFileUploadControl::click): (WebCore::RenderFileUploadControl::updateFromElement): (WebCore::RenderFileUploadControl::maxFilenameWidth): (WebCore::RenderFileUploadControl::createButtonStyle): (WebCore::RenderFileUploadControl::paintObject): (WebCore::RenderFileUploadInnerFileBox::RenderFileUploadInnerFileBox): (WebCore::RenderFileUploadInnerFileBox::setStyle): (WebCore::RenderFileUploadInnerFileBox::layout): (WebCore::RenderFileUploadInnerFileBox::setHasIcon): (WebCore::RenderFileUploadInnerFileBox::setFilename): (WebCore::RenderFileUploadInnerFileBox::calcMinMaxWidth): (WebCore::HTMLFileUploadInnerButtonElement::HTMLFileUploadInnerButtonElement): (WebCore::HTMLFileUploadInnerButtonElement::createRenderer):
  • rendering/RenderFileUploadControl.h: Added. This is the replacement for RenderFileButton.h. (WebCore::RenderFileUploadControl::renderName):
  • rendering/RenderStyle.cpp: Add support for -webkit-file-upload-button pseudo element. (WebCore::): (WebCore::pseudoBit):
  • rendering/RenderStyle.h: Ditto. (WebCore::RenderStyle::):
File size: 3.4 KB
Line 
1/*
2 * Copyright (C) 2006 Apple Computer, Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 *
19 */
20
21#import "config.h"
22#import "FileChooser.h"
23
24#import <AppKit/NSOpenPanel.h>
25#import "Document.h"
26#import "FontData.h"
27#import "FrameMac.h"
28#import "Icon.h"
29#import "LocalizedStrings.h"
30#import "RenderFileUploadControl.h"
31#import "WebCoreFrameBridge.h"
32#import "WebCoreStringTruncator.h"
33
34using namespace WebCore;
35
36@interface OpenPanelController : NSObject <WebCoreOpenPanelResultListener> {
37    FileChooser *_fileChooser;
38    WebCoreFrameBridge *_bridge;
39}
40- (id)initWithFileChooser:(FileChooser *)fileChooser;
41- (void)fileChooserDetachingSoon;
42- (void)beginSheet;
43@end
44
45@implementation OpenPanelController
46
47- (id)initWithFileChooser:(FileChooser *)fileChooser
48{
49    self = [super init];
50    if (!self)
51        return nil;
52   
53    _fileChooser = fileChooser;
54    return self;
55}
56
57- (void)fileChooserDetachingSoon
58{
59    _fileChooser = 0;
60}
61
62- (void)beginSheet
63{
64    if (!_fileChooser)
65        return;
66   
67    _bridge = Mac(_fileChooser->document()->frame())->bridge();
68    [_bridge retain];
69    [_bridge runOpenPanelForFileButtonWithResultListener:self];
70}
71
72- (void)chooseFilename:(NSString *)filename
73{
74    if (_fileChooser)
75        _fileChooser->chooseFile(filename);
76    [_bridge release];
77}
78
79- (void)cancel
80{
81    [_bridge release];
82}
83
84@end
85
86namespace WebCore {
87   
88FileChooser::FileChooser(Document* document, RenderFileUploadControl* uploadControl)
89    : m_document(document)
90    , m_icon(0)
91    , m_uploadControl(uploadControl)
92    , m_controller([[[OpenPanelController alloc] initWithFileChooser:this] retain])
93{
94}
95
96FileChooser::~FileChooser()
97{
98    [m_controller release];
99}
100
101void FileChooser::openFileChooser()
102{
103    [m_controller beginSheet];
104}
105
106String FileChooser::basenameForWidth(int width) const
107{
108    if (width <= 0)
109        return String();
110   
111    String strToTruncate;
112    if (m_filename.isEmpty())
113        strToTruncate = fileButtonNoFileSelectedLabel();
114    else
115        strToTruncate = [[NSFileManager defaultManager] displayNameAtPath:m_filename];
116   
117    return [WebCoreStringTruncator centerTruncateString:strToTruncate
118            toWidth:width withFont:m_uploadControl->style()->font().primaryFont()->getNSFont()];
119}
120
121void FileChooser::uploadControlDetaching()
122{
123    if (m_controller)
124        [m_controller fileChooserDetachingSoon];
125}
126
127void FileChooser::chooseFile(const String& filename)
128{
129    m_filename = filename;
130   
131    // Need unsigned 0 here to disambiguate String::operator[] from operator(NSString*, int)[]
132    if (!m_filename.length() || m_filename[0U] != '/')
133        m_icon.set(0);
134    else
135        m_icon.set(Icon::newIconForFile(m_filename).release());
136   
137    uploadControl()->updateIconAndFilename();
138}
139
140}
Note: See TracBrowser for help on using the repository browser.