18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef RenderFileUploadControl_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define RenderFileUploadControl_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FileChooser.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderBlock.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29692e5dbf12901edacf14812a6fae25462920af42Steve Blockclass Chrome;
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLInputElement;
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Each RenderFileUploadControl contains a RenderButton (for opening the file chooser), and
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// sufficient space to draw a file icon and filename. The RenderButton has a shadow node
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// associated with it to receive click/hover events.
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderFileUploadControl : public RenderBlock, private FileChooserClient {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderFileUploadControl(HTMLInputElement*);
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual ~RenderFileUploadControl();
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    virtual bool isFileUploadControl() const { return true; }
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void click();
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void receiveDroppedFiles(const Vector<String>&);
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String buttonValue();
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String fileTextValue() const;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual const char* renderName() const { return "RenderFileUploadControl"; }
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual void updateFromElement();
54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void computePreferredLogicalWidths();
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual void paintObject(PaintInfo&, int tx, int ty);
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual bool requiresForcedStyleRecalcPropagation() const { return true; }
60e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
61692e5dbf12901edacf14812a6fae25462920af42Steve Block    // FileChooserClient methods.
62692e5dbf12901edacf14812a6fae25462920af42Steve Block    void valueChanged();
63692e5dbf12901edacf14812a6fae25462920af42Steve Block    void repaint() { RenderBlock::repaint(); }
64692e5dbf12901edacf14812a6fae25462920af42Steve Block    bool allowsMultipleFiles();
65967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(DIRECTORY_UPLOAD)
66967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    bool allowsDirectoryUpload();
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void receiveDropForDirectoryUpload(const Vector<String>&);
68967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
69692e5dbf12901edacf14812a6fae25462920af42Steve Block    String acceptTypes();
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void chooseIconForFiles(FileChooser*, const Vector<String>&);
7116e49e63e74d9236b0d8b72846201697a8ebaedcBen Murdoch#if ENABLE(MEDIA_CAPTURE)
7216e49e63e74d9236b0d8b72846201697a8ebaedcBen Murdoch    String capture();
7316e49e63e74d9236b0d8b72846201697a8ebaedcBen Murdoch#endif
74692e5dbf12901edacf14812a6fae25462920af42Steve Block
75692e5dbf12901edacf14812a6fae25462920af42Steve Block    Chrome* chrome() const;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int maxFilenameWidth() const;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PassRefPtr<RenderStyle> createButtonStyle(const RenderStyle* parentStyle) const;
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual VisiblePosition positionForPoint(const IntPoint&);
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<HTMLInputElement> m_button;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<FileChooser> m_fileChooser;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline RenderFileUploadControl* toRenderFileUploadControl(RenderObject* object)
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!object || object->isFileUploadControl());
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<RenderFileUploadControl*>(object);
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockinline const RenderFileUploadControl* toRenderFileUploadControl(const RenderObject* object)
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!object || object->isFileUploadControl());
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return static_cast<const RenderFileUploadControl*>(object);
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will catch anyone doing an unnecessary cast.
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid toRenderFileUploadControl(const RenderFileUploadControl*);
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // RenderFileUploadControl_h
103